@@ -6,6 +6,8 @@ var escape = require('escape-string-regexp')
66
77var defaultIgnore = [ 'title' , 'script' , 'style' , 'svg' , 'math' ]
88
9+ var splice = [ ] . splice
10+
911module . exports = findAndReplace
1012
1113findAndReplace . ignore = defaultIgnore
@@ -36,82 +38,78 @@ function findAndReplace(tree, find, replace, options) {
3638 return handler
3739
3840 function handler ( node , parent ) {
39- var siblings = parent . children
40- var pos = siblings . indexOf ( node )
41- var value = node . value
4241 var find = pair [ 0 ]
4342 var replace = pair [ 1 ]
44- var lastIndex = 0
4543 var nodes = [ ]
46- var subvalue
47- var index
48- var length
44+ var start = 0
45+ var index = parent . children . indexOf ( node )
46+ var position
4947 var match
5048 var subhandler
49+ var value
5150
5251 find . lastIndex = 0
5352
54- match = find . exec ( value )
53+ match = find . exec ( node . value )
5554
5655 while ( match ) {
57- index = match . index
58- subvalue = value . slice ( lastIndex , index )
56+ position = match . index
57+ value = replace . apply (
58+ null ,
59+ [ ] . concat ( match , { index : match . index , input : match . input } )
60+ )
5961
60- if ( subvalue ) {
61- nodes . push ( { type : 'text' , value : subvalue } )
62- }
62+ if ( value !== false ) {
63+ if ( start !== position ) {
64+ nodes . push ( { type : 'text' , value : node . value . slice ( start , position ) } )
65+ }
6366
64- subvalue = replace . apply ( null , match )
67+ if ( typeof value === 'string' && value . length > 0 ) {
68+ value = { type : 'text' , value : value }
69+ }
6570
66- if ( subvalue ) {
67- if ( typeof subvalue === 'string' ) {
68- subvalue = { type : 'text' , value : subvalue }
71+ if ( value ) {
72+ nodes . push ( value )
6973 }
7074
71- nodes . push ( subvalue )
75+ start = position + match [ 0 ] . length
7276 }
7377
74- lastIndex = index + match [ 0 ] . length
75-
7678 if ( ! find . global ) {
7779 break
7880 }
7981
80- match = find . exec ( value )
82+ match = find . exec ( node . value )
8183 }
8284
83- if ( index === undefined ) {
85+ if ( position === undefined ) {
8486 nodes = [ node ]
87+ index --
8588 } else {
86- subvalue = value . slice ( lastIndex )
87-
88- if ( subvalue ) {
89- nodes . push ( { type : 'text' , value : subvalue } )
89+ if ( start < node . value . length ) {
90+ nodes . push ( { type : 'text' , value : node . value . slice ( start ) } )
9091 }
9192
92- parent . children = siblings
93- . slice ( 0 , pos )
94- . concat ( nodes )
95- . concat ( siblings . slice ( pos + 1 ) )
96- }
97-
98- if ( pairs . length <= 1 ) {
99- return
93+ nodes . unshift ( index , 1 )
94+ splice . apply ( parent . children , nodes )
10095 }
10196
102- length = nodes . length
103- index = - 1
104- subhandler = handlerFactory ( pairs . slice ( 1 ) )
97+ if ( pairs . length > 1 ) {
98+ subhandler = handlerFactory ( pairs . slice ( 1 ) )
99+ position = - 1
105100
106- while ( ++ index < length ) {
107- node = nodes [ index ]
101+ while ( ++ position < nodes . length ) {
102+ node = nodes [ position ]
108103
109- if ( node . type === 'text' ) {
110- subhandler ( node , parent )
111- } else {
112- search ( node , settings , subhandler )
104+ if ( node . type === 'text' ) {
105+ subhandler ( node , parent )
106+ } else {
107+ search ( node , settings , subhandler )
108+ }
113109 }
114110 }
111+
112+ return index + nodes . length + 1
115113 }
116114 }
117115}
@@ -125,12 +123,11 @@ function search(tree, options, handler) {
125123 return result
126124
127125 function visitor ( node , parents ) {
128- var length = parents . length
129126 var index = - 1
130127 var parent
131128 var grandparent
132129
133- while ( ++ index < length ) {
130+ while ( ++ index < parents . length ) {
134131 parent = parents [ index ]
135132
136133 if (
@@ -146,25 +143,23 @@ function search(tree, options, handler) {
146143 grandparent = parent
147144 }
148145
149- handler ( node , grandparent )
146+ return handler ( node , grandparent )
150147 }
151148}
152149
153150function toPairs ( schema ) {
154151 var result = [ ]
155152 var key
156- var length
157153 var index
158154
159155 if ( typeof schema !== 'object' ) {
160156 throw new Error ( 'Expected array or object as schema' )
161157 }
162158
163159 if ( 'length' in schema ) {
164- length = schema . length
165160 index = - 1
166161
167- while ( ++ index < length ) {
162+ while ( ++ index < schema . length ) {
168163 result . push ( [
169164 toExpression ( schema [ index ] [ 0 ] ) ,
170165 toFunction ( schema [ index ] [ 1 ] )
0 commit comments