|
26 | 26 | * @typedef {Array.<Pair>} Pairs |
27 | 27 | */ |
28 | 28 |
|
29 | | -/** |
30 | | - * @callback Handler |
31 | | - * @param {Text} node |
32 | | - * @param {Parent} parent |
33 | | - * @returns {VisitorResult} |
34 | | - */ |
35 | | - |
36 | 29 | /** |
37 | 30 | * @callback ReplaceFunction |
38 | 31 | * @param {...unknown} parameters |
@@ -73,115 +66,15 @@ export function findAndReplace(tree, find, replace, options) { |
73 | 66 | settings = {} |
74 | 67 | } |
75 | 68 |
|
76 | | - search(tree, settings, handlerFactory(toPairs(schema))) |
77 | | - |
78 | | - return tree |
79 | | - |
80 | | - /** |
81 | | - * @param {Pairs} pairs |
82 | | - * @returns {Handler} |
83 | | - */ |
84 | | - function handlerFactory(pairs) { |
85 | | - var pair = pairs[0] |
86 | | - |
87 | | - return handler |
88 | | - |
89 | | - /** |
90 | | - * @type {Handler} |
91 | | - */ |
92 | | - function handler(node, parent) { |
93 | | - var find = pair[0] |
94 | | - var replace = pair[1] |
95 | | - /** @type {Array.<Content>} */ |
96 | | - var nodes = [] |
97 | | - var start = 0 |
98 | | - var index = parent.children.indexOf(node) |
99 | | - /** @type {number} */ |
100 | | - var position |
101 | | - /** @type {RegExpMatchArray} */ |
102 | | - var match |
103 | | - /** @type {Handler} */ |
104 | | - var subhandler |
105 | | - /** @type {Content} */ |
106 | | - var child |
107 | | - /** @type {Array.<Content>|Content|string|false|undefined|null} */ |
108 | | - var value |
109 | | - |
110 | | - find.lastIndex = 0 |
111 | | - |
112 | | - match = find.exec(node.value) |
113 | | - |
114 | | - while (match) { |
115 | | - position = match.index |
116 | | - // @ts-expect-error this is perfectly fine, typescript. |
117 | | - value = replace(...match, {index: match.index, input: match.input}) |
118 | | - |
119 | | - if (typeof value === 'string' && value.length > 0) { |
120 | | - value = {type: 'text', value} |
121 | | - } |
122 | | - |
123 | | - if (value !== false) { |
124 | | - if (start !== position) { |
125 | | - nodes.push({type: 'text', value: node.value.slice(start, position)}) |
126 | | - } |
127 | | - |
128 | | - if (value) { |
129 | | - nodes = [].concat(nodes, value) |
130 | | - } |
131 | | - |
132 | | - start = position + match[0].length |
133 | | - } |
134 | | - |
135 | | - if (!find.global) { |
136 | | - break |
137 | | - } |
138 | | - |
139 | | - match = find.exec(node.value) |
140 | | - } |
141 | | - |
142 | | - if (position === undefined) { |
143 | | - nodes = [node] |
144 | | - index-- |
145 | | - } else { |
146 | | - if (start < node.value.length) { |
147 | | - nodes.push({type: 'text', value: node.value.slice(start)}) |
148 | | - } |
149 | | - |
150 | | - // @ts-expect-error This is a bug! |
151 | | - nodes = [index, 1, ...nodes] |
152 | | - ;[].splice.call(parent.children, ...nodes) |
153 | | - } |
154 | | - |
155 | | - if (pairs.length > 1) { |
156 | | - subhandler = handlerFactory(pairs.slice(1)) |
157 | | - position = -1 |
158 | | - |
159 | | - while (++position < nodes.length) { |
160 | | - child = nodes[position] |
161 | | - |
162 | | - if (child.type === 'text') { |
163 | | - subhandler(child, parent) |
164 | | - } else { |
165 | | - search(child, settings, subhandler) |
166 | | - } |
167 | | - } |
168 | | - } |
| 69 | + var ignored = convertElement(settings.ignore || defaultIgnore) |
| 70 | + var pairs = toPairs(schema) |
| 71 | + var pairIndex = -1 |
169 | 72 |
|
170 | | - return index + nodes.length + 1 |
171 | | - } |
| 73 | + while (++pairIndex < pairs.length) { |
| 74 | + visitParents(tree, 'text', visitor) |
172 | 75 | } |
173 | | -} |
174 | | - |
175 | | -/** |
176 | | - * @param {Node} tree |
177 | | - * @param {Options} options |
178 | | - * @param {Handler} handler |
179 | | - * @returns {void} |
180 | | - */ |
181 | | -function search(tree, options, handler) { |
182 | | - var ignored = convertElement(options.ignore || defaultIgnore) |
183 | 76 |
|
184 | | - visitParents(tree, 'text', visitor) |
| 77 | + return tree |
185 | 78 |
|
186 | 79 | /** @type {import('unist-util-visit-parents').Visitor<Text>} */ |
187 | 80 | function visitor(node, parents) { |
@@ -211,6 +104,71 @@ function search(tree, options, handler) { |
211 | 104 |
|
212 | 105 | return handler(node, grandparent) |
213 | 106 | } |
| 107 | + |
| 108 | + /** |
| 109 | + * @param {Text} node |
| 110 | + * @param {Parent} parent |
| 111 | + * @returns {VisitorResult} |
| 112 | + */ |
| 113 | + function handler(node, parent) { |
| 114 | + var find = pairs[pairIndex][0] |
| 115 | + var replace = pairs[pairIndex][1] |
| 116 | + /** @type {Array.<Content>} */ |
| 117 | + var nodes = [] |
| 118 | + var start = 0 |
| 119 | + var index = parent.children.indexOf(node) |
| 120 | + /** @type {number} */ |
| 121 | + var position |
| 122 | + /** @type {RegExpMatchArray} */ |
| 123 | + var match |
| 124 | + /** @type {Array.<Content>|Content|string|false|undefined|null} */ |
| 125 | + var value |
| 126 | + |
| 127 | + find.lastIndex = 0 |
| 128 | + |
| 129 | + match = find.exec(node.value) |
| 130 | + |
| 131 | + while (match) { |
| 132 | + position = match.index |
| 133 | + // @ts-expect-error this is perfectly fine, typescript. |
| 134 | + value = replace(...match, {index: match.index, input: match.input}) |
| 135 | + |
| 136 | + if (typeof value === 'string' && value.length > 0) { |
| 137 | + value = {type: 'text', value} |
| 138 | + } |
| 139 | + |
| 140 | + if (value !== false) { |
| 141 | + if (start !== position) { |
| 142 | + nodes.push({type: 'text', value: node.value.slice(start, position)}) |
| 143 | + } |
| 144 | + |
| 145 | + if (value) { |
| 146 | + nodes = [].concat(nodes, value) |
| 147 | + } |
| 148 | + |
| 149 | + start = position + match[0].length |
| 150 | + } |
| 151 | + |
| 152 | + if (!find.global) { |
| 153 | + break |
| 154 | + } |
| 155 | + |
| 156 | + match = find.exec(node.value) |
| 157 | + } |
| 158 | + |
| 159 | + if (position === undefined) { |
| 160 | + nodes = [node] |
| 161 | + index-- |
| 162 | + } else { |
| 163 | + if (start < node.value.length) { |
| 164 | + nodes.push({type: 'text', value: node.value.slice(start)}) |
| 165 | + } |
| 166 | + |
| 167 | + parent.children.splice(index, 1, ...nodes) |
| 168 | + } |
| 169 | + |
| 170 | + return index + nodes.length + 1 |
| 171 | + } |
214 | 172 | } |
215 | 173 |
|
216 | 174 | /** |
|
0 commit comments