| 1 |
!(function () { |
| 2 |
'use strict'; |
| 3 |
var r = function (e) { |
| 4 |
var t = e, |
| 5 |
n = function () { |
| 6 |
return t; |
| 7 |
}; |
| 8 |
return { |
| 9 |
get: n, |
| 10 |
set: function (e) { |
| 11 |
t = e; |
| 12 |
}, |
| 13 |
clone: function () { |
| 14 |
return r(n()); |
| 15 |
}, |
| 16 |
}; |
| 17 |
}, |
| 18 |
e = tinymce.util.Tools.resolve('tinymce.PluginManager'), |
| 19 |
p = tinymce.util.Tools.resolve('tinymce.util.Tools'); |
| 20 |
function h(e) { |
| 21 |
return e && 1 === e.nodeType && 'false' === e.contentEditable; |
| 22 |
} |
| 23 |
var u = { |
| 24 |
findAndReplaceDOMText: function (t, n, r, a, i) { |
| 25 |
var o, |
| 26 |
d, |
| 27 |
m, |
| 28 |
f, |
| 29 |
p, |
| 30 |
g, |
| 31 |
c = [], |
| 32 |
l = 0; |
| 33 |
function s(e, t) { |
| 34 |
if (((t = t || 0), !e[0])) |
| 35 |
throw new Error('findAndReplaceDOMText cannot handle zero-length matches'); |
| 36 |
var n = e.index; |
| 37 |
if (0 < t) { |
| 38 |
var r = e[t]; |
| 39 |
if (!r) throw new Error('Invalid capture group'); |
| 40 |
(n += e[0].indexOf(r)), (e[0] = r); |
| 41 |
} |
| 42 |
return [n, n + e[0].length, [e[0]]]; |
| 43 |
} |
| 44 |
if ( |
| 45 |
((m = n.ownerDocument), |
| 46 |
(f = i.getBlockElements()), |
| 47 |
(p = i.getWhiteSpaceElements()), |
| 48 |
(g = i.getShortEndedElements()), |
| 49 |
(d = (function e(t) { |
| 50 |
var n; |
| 51 |
if (3 === t.nodeType) return t.data; |
| 52 |
if (p[t.nodeName] && !f[t.nodeName]) return ''; |
| 53 |
if (((n = ''), h(t))) return '\n'; |
| 54 |
if (((f[t.nodeName] || g[t.nodeName]) && (n += '\n'), (t = t.firstChild))) |
| 55 |
for (; (n += e(t)), (t = t.nextSibling); ); |
| 56 |
return n; |
| 57 |
})(n))) |
| 58 |
) { |
| 59 |
if (t.global) for (; (o = t.exec(d)); ) c.push(s(o, a)); |
| 60 |
else (o = d.match(t)), c.push(s(o, a)); |
| 61 |
return ( |
| 62 |
c.length && |
| 63 |
((l = c.length), |
| 64 |
(function (e, t, n) { |
| 65 |
var r, |
| 66 |
a, |
| 67 |
i, |
| 68 |
o, |
| 69 |
d = [], |
| 70 |
c = 0, |
| 71 |
l = e, |
| 72 |
s = t.shift(), |
| 73 |
u = 0; |
| 74 |
e: for (;;) { |
| 75 |
if ( |
| 76 |
((f[l.nodeName] || g[l.nodeName] || h(l)) && c++, |
| 77 |
3 === l.nodeType && |
| 78 |
(!a && l.length + c >= s[1] ? ((a = l), (o = s[1] - c)) : r && d.push(l), |
| 79 |
!r && l.length + c > s[0] && ((r = l), (i = s[0] - c)), |
| 80 |
(c += l.length)), |
| 81 |
r && a) |
| 82 |
) { |
| 83 |
if ( |
| 84 |
((l = n({ |
| 85 |
startNode: r, |
| 86 |
startNodeIndex: i, |
| 87 |
endNode: a, |
| 88 |
endNodeIndex: o, |
| 89 |
innerNodes: d, |
| 90 |
match: s[2], |
| 91 |
matchIndex: u, |
| 92 |
})), |
| 93 |
(c -= a.length - o), |
| 94 |
(a = r = null), |
| 95 |
(d = []), |
| 96 |
u++, |
| 97 |
!(s = t.shift())) |
| 98 |
) |
| 99 |
break; |
| 100 |
} else if ((p[l.nodeName] && !f[l.nodeName]) || !l.firstChild) { |
| 101 |
if (l.nextSibling) { |
| 102 |
l = l.nextSibling; |
| 103 |
continue; |
| 104 |
} |
| 105 |
} else if (!h(l)) { |
| 106 |
l = l.firstChild; |
| 107 |
continue; |
| 108 |
} |
| 109 |
for (;;) { |
| 110 |
if (l.nextSibling) { |
| 111 |
l = l.nextSibling; |
| 112 |
break; |
| 113 |
} |
| 114 |
if (l.parentNode === e) break e; |
| 115 |
l = l.parentNode; |
| 116 |
} |
| 117 |
} |
| 118 |
})( |
| 119 |
n, |
| 120 |
c, |
| 121 |
(function (e) { |
| 122 |
var h; |
| 123 |
if ('function' != typeof e) { |
| 124 |
var r = e.nodeType ? e : m.createElement(e); |
| 125 |
h = function (e, t) { |
| 126 |
var n = r.cloneNode(!1); |
| 127 |
return ( |
| 128 |
n.setAttribute('data-mce-index', t), |
| 129 |
e && n.appendChild(m.createTextNode(e)), |
| 130 |
n |
| 131 |
); |
| 132 |
}; |
| 133 |
} else h = e; |
| 134 |
return function (e) { |
| 135 |
var t, |
| 136 |
n, |
| 137 |
r, |
| 138 |
a = e.startNode, |
| 139 |
i = e.endNode, |
| 140 |
o = e.matchIndex; |
| 141 |
if (a === i) { |
| 142 |
var d = a; |
| 143 |
(r = d.parentNode), |
| 144 |
0 < e.startNodeIndex && |
| 145 |
((t = m.createTextNode(d.data.substring(0, e.startNodeIndex))), |
| 146 |
r.insertBefore(t, d)); |
| 147 |
var c = h(e.match[0], o); |
| 148 |
return ( |
| 149 |
r.insertBefore(c, d), |
| 150 |
e.endNodeIndex < d.length && |
| 151 |
((n = m.createTextNode(d.data.substring(e.endNodeIndex))), |
| 152 |
r.insertBefore(n, d)), |
| 153 |
d.parentNode.removeChild(d), |
| 154 |
c |
| 155 |
); |
| 156 |
} |
| 157 |
(t = m.createTextNode(a.data.substring(0, e.startNodeIndex))), |
| 158 |
(n = m.createTextNode(i.data.substring(e.endNodeIndex))); |
| 159 |
for ( |
| 160 |
var l = h(a.data.substring(e.startNodeIndex), o), |
| 161 |
s = 0, |
| 162 |
u = e.innerNodes.length; |
| 163 |
s < u; |
| 164 |
++s |
| 165 |
) { |
| 166 |
var f = e.innerNodes[s], |
| 167 |
p = h(f.data, o); |
| 168 |
f.parentNode.replaceChild(p, f); |
| 169 |
} |
| 170 |
var g = h(i.data.substring(0, e.endNodeIndex), o); |
| 171 |
return ( |
| 172 |
(r = a.parentNode).insertBefore(t, a), |
| 173 |
r.insertBefore(l, a), |
| 174 |
r.removeChild(a), |
| 175 |
(r = i.parentNode).insertBefore(g, i), |
| 176 |
r.insertBefore(n, i), |
| 177 |
r.removeChild(i), |
| 178 |
g |
| 179 |
); |
| 180 |
}; |
| 181 |
})(r), |
| 182 |
)), |
| 183 |
l |
| 184 |
); |
| 185 |
} |
| 186 |
}, |
| 187 |
}, |
| 188 |
g = function (e) { |
| 189 |
var t = e.getAttribute('data-mce-index'); |
| 190 |
return 'number' == typeof t ? '' + t : t; |
| 191 |
}, |
| 192 |
m = function (e) { |
| 193 |
var t = e.parentNode; |
| 194 |
e.firstChild && t.insertBefore(e.firstChild, e), e.parentNode.removeChild(e); |
| 195 |
}, |
| 196 |
o = function (e, t) { |
| 197 |
var n, |
| 198 |
r = []; |
| 199 |
if ((n = p.toArray(e.getBody().getElementsByTagName('span'))).length) |
| 200 |
for (var a = 0; a < n.length; a++) { |
| 201 |
var i = g(n[a]); |
| 202 |
null !== i && i.length && i === t.toString() && r.push(n[a]); |
| 203 |
} |
| 204 |
return r; |
| 205 |
}, |
| 206 |
f = function (e, t, n) { |
| 207 |
var r = t.get(), |
| 208 |
a = e.dom; |
| 209 |
(n = !1 !== n) ? r++ : r--, a.removeClass(o(e, t.get()), 'mce-match-marker-selected'); |
| 210 |
var i = o(e, r); |
| 211 |
return i.length |
| 212 |
? (a.addClass(o(e, r), 'mce-match-marker-selected'), e.selection.scrollIntoView(i[0]), r) |
| 213 |
: -1; |
| 214 |
}, |
| 215 |
v = function (e, t) { |
| 216 |
var n = t.parentNode; |
| 217 |
e.remove(t), e.isEmpty(n) && e.remove(n); |
| 218 |
}, |
| 219 |
x = function (e, t) { |
| 220 |
var n = f(e, t, !0); |
| 221 |
-1 !== n && t.set(n); |
| 222 |
}, |
| 223 |
b = function (e, t) { |
| 224 |
var n = f(e, t, !1); |
| 225 |
-1 !== n && t.set(n); |
| 226 |
}, |
| 227 |
N = function (e) { |
| 228 |
var t = g(e); |
| 229 |
return null !== t && 0 < t.length; |
| 230 |
}, |
| 231 |
y = function (e, t, n) { |
| 232 |
var r, a, i, o; |
| 233 |
for (a = p.toArray(e.getBody().getElementsByTagName('span')), r = 0; r < a.length; r++) { |
| 234 |
var d = g(a[r]); |
| 235 |
null !== d && |
| 236 |
d.length && |
| 237 |
(d === t.get().toString() && (i || (i = a[r].firstChild), (o = a[r].firstChild)), |
| 238 |
m(a[r])); |
| 239 |
} |
| 240 |
if (i && o) { |
| 241 |
var c = e.dom.createRng(); |
| 242 |
return c.setStart(i, 0), c.setEnd(o, o.data.length), !1 !== n && e.selection.setRng(c), c; |
| 243 |
} |
| 244 |
}, |
| 245 |
k = function (e, t) { |
| 246 |
return 0 < o(e, t.get() + 1).length; |
| 247 |
}, |
| 248 |
C = function (e, t) { |
| 249 |
return 0 < o(e, t.get() - 1).length; |
| 250 |
}, |
| 251 |
T = { |
| 252 |
done: y, |
| 253 |
find: function (e, t, n, r, a) { |
| 254 |
(n = (n = n.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&')).replace( |
| 255 |
/\s/g, |
| 256 |
'[^\\S\\r\\n]', |
| 257 |
)), |
| 258 |
(n = a ? '\\b' + n + '\\b' : n); |
| 259 |
var i, |
| 260 |
o, |
| 261 |
d, |
| 262 |
c, |
| 263 |
l, |
| 264 |
s = |
| 265 |
((i = e), |
| 266 |
(o = t), |
| 267 |
(d = new RegExp(n, r ? 'g' : 'gi')), |
| 268 |
((l = i.dom.create('span', { 'data-mce-bogus': 1 })).className = 'mce-match-marker'), |
| 269 |
(c = i.getBody()), |
| 270 |
y(i, o, !1), |
| 271 |
u.findAndReplaceDOMText(d, c, l, !1, i.schema)); |
| 272 |
return s && (t.set(-1), t.set(f(e, t, !0))), s; |
| 273 |
}, |
| 274 |
next: x, |
| 275 |
prev: b, |
| 276 |
replace: function (e, t, n, r, a) { |
| 277 |
var i, |
| 278 |
o, |
| 279 |
d, |
| 280 |
c, |
| 281 |
l, |
| 282 |
s, |
| 283 |
u = t.get(); |
| 284 |
for ( |
| 285 |
r = !1 !== r, |
| 286 |
d = e.getBody(), |
| 287 |
o = p.grep(p.toArray(d.getElementsByTagName('span')), N), |
| 288 |
i = 0; |
| 289 |
i < o.length; |
| 290 |
i++ |
| 291 |
) { |
| 292 |
var f = g(o[i]); |
| 293 |
if (((c = l = parseInt(f, 10)), a || c === t.get())) { |
| 294 |
for (n.length ? ((o[i].firstChild.nodeValue = n), m(o[i])) : v(e.dom, o[i]); o[++i]; ) { |
| 295 |
if ((c = parseInt(g(o[i]), 10)) !== l) { |
| 296 |
i--; |
| 297 |
break; |
| 298 |
} |
| 299 |
v(e.dom, o[i]); |
| 300 |
} |
| 301 |
r && u--; |
| 302 |
} else l > t.get() && o[i].setAttribute('data-mce-index', l - 1); |
| 303 |
} |
| 304 |
return t.set(u), r ? ((s = k(e, t)), x(e, t)) : ((s = C(e, t)), b(e, t)), !a && s; |
| 305 |
}, |
| 306 |
hasNext: k, |
| 307 |
hasPrev: C, |
| 308 |
}, |
| 309 |
n = function (r, a) { |
| 310 |
return { |
| 311 |
done: function (e) { |
| 312 |
return T.done(r, a, e); |
| 313 |
}, |
| 314 |
find: function (e, t, n) { |
| 315 |
return T.find(r, a, e, t, n); |
| 316 |
}, |
| 317 |
next: function () { |
| 318 |
return T.next(r, a); |
| 319 |
}, |
| 320 |
prev: function () { |
| 321 |
return T.prev(r, a); |
| 322 |
}, |
| 323 |
replace: function (e, t, n) { |
| 324 |
return T.replace(r, a, e, t, n); |
| 325 |
}, |
| 326 |
}; |
| 327 |
}, |
| 328 |
a = function (i, o) { |
| 329 |
var e, |
| 330 |
d = {}; |
| 331 |
function c() { |
| 332 |
s.statusbar.find('#next').disabled(!1 === T.hasNext(i, o)), |
| 333 |
s.statusbar.find('#prev').disabled(!1 === T.hasPrev(i, o)); |
| 334 |
} |
| 335 |
function l() { |
| 336 |
i.windowManager.alert('Could not find the specified string.', function () { |
| 337 |
s.find('#find')[0].focus(); |
| 338 |
}); |
| 339 |
} |
| 340 |
i.undoManager.add(), (e = p.trim(i.selection.getContent({ format: 'text' }))); |
| 341 |
var s = i.windowManager.open({ |
| 342 |
layout: 'flex', |
| 343 |
pack: 'center', |
| 344 |
align: 'center', |
| 345 |
onClose: function () { |
| 346 |
i.focus(), T.done(i, o), i.undoManager.add(); |
| 347 |
}, |
| 348 |
onSubmit: function (e) { |
| 349 |
var t, n, r, a; |
| 350 |
return ( |
| 351 |
e.preventDefault(), |
| 352 |
(n = s.find('#case').checked()), |
| 353 |
(a = s.find('#words').checked()), |
| 354 |
(r = s.find('#find').value()).length |
| 355 |
? d.text === r && d.caseState === n && d.wholeWord === a |
| 356 |
? T.hasNext(i, o) |
| 357 |
? (T.next(i, o), void c()) |
| 358 |
: void l() |
| 359 |
: ((t = T.find(i, o, r, n, a)) || l(), |
| 360 |
s.statusbar |
| 361 |
.items() |
| 362 |
.slice(1) |
| 363 |
.disabled(0 === t), |
| 364 |
c(), |
| 365 |
void (d = { text: r, caseState: n, wholeWord: a })) |
| 366 |
: (T.done(i, o, !1), void s.statusbar.items().slice(1).disabled(!0)) |
| 367 |
); |
| 368 |
}, |
| 369 |
buttons: [ |
| 370 |
{ |
| 371 |
text: 'Find', |
| 372 |
subtype: 'primary', |
| 373 |
onclick: function () { |
| 374 |
s.submit(); |
| 375 |
}, |
| 376 |
}, |
| 377 |
{ |
| 378 |
text: 'Replace', |
| 379 |
disabled: !0, |
| 380 |
onclick: function () { |
| 381 |
T.replace(i, o, s.find('#replace').value()) || |
| 382 |
(s.statusbar.items().slice(1).disabled(!0), o.set(-1), (d = {})); |
| 383 |
}, |
| 384 |
}, |
| 385 |
{ |
| 386 |
text: 'Replace all', |
| 387 |
disabled: !0, |
| 388 |
onclick: function () { |
| 389 |
T.replace(i, o, s.find('#replace').value(), !0, !0), |
| 390 |
s.statusbar.items().slice(1).disabled(!0), |
| 391 |
(d = {}); |
| 392 |
}, |
| 393 |
}, |
| 394 |
{ type: 'spacer', flex: 1 }, |
| 395 |
{ |
| 396 |
text: 'Prev', |
| 397 |
name: 'prev', |
| 398 |
disabled: !0, |
| 399 |
onclick: function () { |
| 400 |
T.prev(i, o), c(); |
| 401 |
}, |
| 402 |
}, |
| 403 |
{ |
| 404 |
text: 'Next', |
| 405 |
name: 'next', |
| 406 |
disabled: !0, |
| 407 |
onclick: function () { |
| 408 |
T.next(i, o), c(); |
| 409 |
}, |
| 410 |
}, |
| 411 |
], |
| 412 |
title: 'Find and replace', |
| 413 |
items: { |
| 414 |
type: 'form', |
| 415 |
padding: 20, |
| 416 |
labelGap: 30, |
| 417 |
spacing: 10, |
| 418 |
items: [ |
| 419 |
{ type: 'textbox', name: 'find', size: 40, label: 'Find', value: e }, |
| 420 |
{ type: 'textbox', name: 'replace', size: 40, label: 'Replace with' }, |
| 421 |
{ type: 'checkbox', name: 'case', text: 'Match case', label: ' ' }, |
| 422 |
{ type: 'checkbox', name: 'words', text: 'Whole words', label: ' ' }, |
| 423 |
], |
| 424 |
}, |
| 425 |
}); |
| 426 |
}, |
| 427 |
i = function (e, t) { |
| 428 |
e.addCommand('SearchReplace', function () { |
| 429 |
a(e, t); |
| 430 |
}); |
| 431 |
}, |
| 432 |
d = function (e, t) { |
| 433 |
return function () { |
| 434 |
a(e, t); |
| 435 |
}; |
| 436 |
}, |
| 437 |
c = function (e, t) { |
| 438 |
e.addMenuItem('searchreplace', { |
| 439 |
text: 'Find and replace', |
| 440 |
shortcut: 'Meta+F', |
| 441 |
onclick: d(e, t), |
| 442 |
separator: 'before', |
| 443 |
context: 'edit', |
| 444 |
}), |
| 445 |
e.addButton('searchreplace', { tooltip: 'Find and replace', onclick: d(e, t) }), |
| 446 |
e.shortcuts.add('Meta+F', '', d(e, t)); |
| 447 |
}; |
| 448 |
e.add('searchreplace', function (e) { |
| 449 |
var t = r(-1); |
| 450 |
return i(e, t), c(e, t), n(e, t); |
| 451 |
}); |
| 452 |
})(); |
| 453 |
|