AI-BOOK / libs /mark.js
ginipick's picture
Upload 6 files
fdc6c9c verified
/*
* Real3D FlipBook [https://real3dflipbook.com]
* @author creativeinteractivemedia [https://codecanyon.net/user/creativeinteractivemedia/portfolio]
* @version 4.10
* @date 2025-05-15
*/
/*!***************************************************
* mark.js v9.0.0
* https://markjs.io/
* Copyright (c) 2014–2018, Julian Kühnel
* Released under the MIT license https://git.io/vwTVl
*****************************************************/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory())
: typeof define === 'function' && define.amd
? define(factory)
: (global.Mark = factory());
})(this, function () {
'use strict';
function _typeof(obj) {
if (typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol') {
_typeof = function (obj) {
return typeof obj;
};
} else {
_typeof = function (obj) {
return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype
? 'symbol'
: typeof obj;
};
}
return _typeof(obj);
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError('Cannot call a class as a function');
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() {
_extends =
Object.assign ||
function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
var DOMIterator =
/*#__PURE__*/
(function () {
function DOMIterator(ctx) {
var iframes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var exclude = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var iframesTimeout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 5000;
_classCallCheck(this, DOMIterator);
this.ctx = ctx;
this.iframes = iframes;
this.exclude = exclude;
this.iframesTimeout = iframesTimeout;
}
_createClass(
DOMIterator,
[
{
key: 'getContexts',
value: function getContexts() {
var ctx,
filteredCtx = [];
if (typeof this.ctx === 'undefined' || !this.ctx) {
ctx = [];
} else if (NodeList.prototype.isPrototypeOf(this.ctx)) {
ctx = Array.prototype.slice.call(this.ctx);
} else if (Array.isArray(this.ctx)) {
ctx = this.ctx;
} else if (typeof this.ctx === 'string') {
ctx = Array.prototype.slice.call(document.querySelectorAll(this.ctx));
} else {
ctx = [this.ctx];
}
ctx.forEach(function (ctx) {
var isDescendant =
filteredCtx.filter(function (contexts) {
return contexts.contains(ctx);
}).length > 0;
if (filteredCtx.indexOf(ctx) === -1 && !isDescendant) {
filteredCtx.push(ctx);
}
});
return filteredCtx;
},
},
{
key: 'getIframeContents',
value: function getIframeContents(ifr, successFn) {
var errorFn =
arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
var doc;
try {
var ifrWin = ifr.contentWindow;
doc = ifrWin.document;
if (!ifrWin || !doc) {
throw new Error('iframe inaccessible');
}
} catch (e) {
errorFn();
}
if (doc) {
successFn(doc);
}
},
},
{
key: 'isIframeBlank',
value: function isIframeBlank(ifr) {
var bl = 'about:blank',
src = ifr.getAttribute('src').trim(),
href = ifr.contentWindow.location.href;
return href === bl && src !== bl && src;
},
},
{
key: 'observeIframeLoad',
value: function observeIframeLoad(ifr, successFn, errorFn) {
var _this = this;
var called = false,
tout = null;
var listener = function listener() {
if (called) {
return;
}
called = true;
clearTimeout(tout);
try {
if (!_this.isIframeBlank(ifr)) {
ifr.removeEventListener('load', listener);
_this.getIframeContents(ifr, successFn, errorFn);
}
} catch (e) {
errorFn();
}
};
ifr.addEventListener('load', listener);
tout = setTimeout(listener, this.iframesTimeout);
},
},
{
key: 'onIframeReady',
value: function onIframeReady(ifr, successFn, errorFn) {
try {
if (ifr.contentWindow.document.readyState === 'complete') {
if (this.isIframeBlank(ifr)) {
this.observeIframeLoad(ifr, successFn, errorFn);
} else {
this.getIframeContents(ifr, successFn, errorFn);
}
} else {
this.observeIframeLoad(ifr, successFn, errorFn);
}
} catch (e) {
errorFn();
}
},
},
{
key: 'waitForIframes',
value: function waitForIframes(ctx, done) {
var _this2 = this;
var eachCalled = 0;
this.forEachIframe(
ctx,
function () {
return true;
},
function (ifr) {
eachCalled++;
_this2.waitForIframes(ifr.querySelector('html'), function () {
if (!--eachCalled) {
done();
}
});
},
function (handled) {
if (!handled) {
done();
}
}
);
},
},
{
key: 'forEachIframe',
value: function forEachIframe(ctx, filter, each) {
var _this3 = this;
var end =
arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};
var ifr = ctx.querySelectorAll('iframe'),
open = ifr.length,
handled = 0;
ifr = Array.prototype.slice.call(ifr);
var checkEnd = function checkEnd() {
if (--open <= 0) {
end(handled);
}
};
if (!open) {
checkEnd();
}
ifr.forEach(function (ifr) {
if (DOMIterator.matches(ifr, _this3.exclude)) {
checkEnd();
} else {
_this3.onIframeReady(
ifr,
function (con) {
if (filter(ifr)) {
handled++;
each(con);
}
checkEnd();
},
checkEnd
);
}
});
},
},
{
key: 'createIterator',
value: function createIterator(ctx, whatToShow, filter) {
return document.createNodeIterator(ctx, whatToShow, filter, false);
},
},
{
key: 'createInstanceOnIframe',
value: function createInstanceOnIframe(contents) {
return new DOMIterator(contents.querySelector('html'), this.iframes);
},
},
{
key: 'compareNodeIframe',
value: function compareNodeIframe(node, prevNode, ifr) {
var compCurr = node.compareDocumentPosition(ifr),
prev = Node.DOCUMENT_POSITION_PRECEDING;
if (compCurr & prev) {
if (prevNode !== null) {
var compPrev = prevNode.compareDocumentPosition(ifr),
after = Node.DOCUMENT_POSITION_FOLLOWING;
if (compPrev & after) {
return true;
}
} else {
return true;
}
}
return false;
},
},
{
key: 'getIteratorNode',
value: function getIteratorNode(itr) {
var prevNode = itr.previousNode();
var node;
if (prevNode === null) {
node = itr.nextNode();
} else {
node = itr.nextNode() && itr.nextNode();
}
return {
prevNode: prevNode,
node: node,
};
},
},
{
key: 'checkIframeFilter',
value: function checkIframeFilter(node, prevNode, currIfr, ifr) {
var key = false,
handled = false;
ifr.forEach(function (ifrDict, i) {
if (ifrDict.val === currIfr) {
key = i;
handled = ifrDict.handled;
}
});
if (this.compareNodeIframe(node, prevNode, currIfr)) {
if (key === false && !handled) {
ifr.push({
val: currIfr,
handled: true,
});
} else if (key !== false && !handled) {
ifr[key].handled = true;
}
return true;
}
if (key === false) {
ifr.push({
val: currIfr,
handled: false,
});
}
return false;
},
},
{
key: 'handleOpenIframes',
value: function handleOpenIframes(ifr, whatToShow, eCb, fCb) {
var _this4 = this;
ifr.forEach(function (ifrDict) {
if (!ifrDict.handled) {
_this4.getIframeContents(ifrDict.val, function (con) {
_this4.createInstanceOnIframe(con).forEachNode(whatToShow, eCb, fCb);
});
}
});
},
},
{
key: 'iterateThroughNodes',
value: function iterateThroughNodes(whatToShow, ctx, eachCb, filterCb, doneCb) {
var _this5 = this;
var itr = this.createIterator(ctx, whatToShow, filterCb);
var ifr = [],
elements = [],
node,
prevNode,
retrieveNodes = function retrieveNodes() {
var _this5$getIteratorNod = _this5.getIteratorNode(itr);
prevNode = _this5$getIteratorNod.prevNode;
node = _this5$getIteratorNod.node;
return node;
};
while (retrieveNodes()) {
if (this.iframes) {
this.forEachIframe(
ctx,
function (currIfr) {
return _this5.checkIframeFilter(node, prevNode, currIfr, ifr);
},
function (con) {
_this5.createInstanceOnIframe(con).forEachNode(
whatToShow,
function (ifrNode) {
return elements.push(ifrNode);
},
filterCb
);
}
);
}
elements.push(node);
}
elements.forEach(function (node) {
eachCb(node);
});
if (this.iframes) {
this.handleOpenIframes(ifr, whatToShow, eachCb, filterCb);
}
doneCb();
},
},
{
key: 'forEachNode',
value: function forEachNode(whatToShow, each, filter) {
var _this6 = this;
var done =
arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};
var contexts = this.getContexts();
var open = contexts.length;
if (!open) {
done();
}
contexts.forEach(function (ctx) {
var ready = function ready() {
_this6.iterateThroughNodes(whatToShow, ctx, each, filter, function () {
if (--open <= 0) {
done();
}
});
};
if (_this6.iframes) {
_this6.waitForIframes(ctx, ready);
} else {
ready();
}
});
},
},
],
[
{
key: 'matches',
value: function matches(element, selector) {
var selectors = typeof selector === 'string' ? [selector] : selector,
fn =
element.matches ||
element.matchesSelector ||
element.msMatchesSelector ||
element.mozMatchesSelector ||
element.oMatchesSelector ||
element.webkitMatchesSelector;
if (fn) {
var match = false;
selectors.every(function (sel) {
if (fn.call(element, sel)) {
match = true;
return false;
}
return true;
});
return match;
} else {
return false;
}
},
},
]
);
return DOMIterator;
})();
var RegExpCreator =
/*#__PURE__*/
(function () {
function RegExpCreator(options) {
_classCallCheck(this, RegExpCreator);
this.opt = _extends(
{},
{
diacritics: true,
synonyms: {},
accuracy: 'partially',
caseSensitive: false,
ignoreJoiners: false,
ignorePunctuation: [],
wildcards: 'disabled',
},
options
);
}
_createClass(RegExpCreator, [
{
key: 'create',
value: function create(str) {
if (this.opt.wildcards !== 'disabled') {
str = this.setupWildcardsRegExp(str);
}
str = this.escapeStr(str);
if (Object.keys(this.opt.synonyms).length) {
str = this.createSynonymsRegExp(str);
}
if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) {
str = this.setupIgnoreJoinersRegExp(str);
}
if (this.opt.diacritics) {
str = this.createDiacriticsRegExp(str);
}
str = this.createMergedBlanksRegExp(str);
if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) {
str = this.createJoinersRegExp(str);
}
if (this.opt.wildcards !== 'disabled') {
str = this.createWildcardsRegExp(str);
}
str = this.createAccuracyRegExp(str);
return new RegExp(str, 'gm'.concat(this.opt.caseSensitive ? '' : 'i'));
},
},
{
key: 'sortByLength',
value: function sortByLength(arry) {
return arry.sort(function (a, b) {
return a.length === b.length ? (a > b ? 1 : -1) : b.length - a.length;
});
},
},
{
key: 'escapeStr',
value: function escapeStr(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
},
},
{
key: 'createSynonymsRegExp',
value: function createSynonymsRegExp(str) {
var _this = this;
var syn = this.opt.synonyms,
sens = this.opt.caseSensitive ? '' : 'i',
joinerPlaceholder = this.opt.ignoreJoiners || this.opt.ignorePunctuation.length ? '\0' : '';
for (var index in syn) {
if (syn.hasOwnProperty(index)) {
var keys = Array.isArray(syn[index]) ? syn[index] : [syn[index]];
keys.unshift(index);
keys = this.sortByLength(keys)
.map(function (key) {
if (_this.opt.wildcards !== 'disabled') {
key = _this.setupWildcardsRegExp(key);
}
key = _this.escapeStr(key);
return key;
})
.filter(function (k) {
return k !== '';
});
if (keys.length > 1) {
str = str.replace(
new RegExp(
'('.concat(
keys
.map(function (k) {
return _this.escapeStr(k);
})
.join('|'),
')'
),
'gm'.concat(sens)
),
joinerPlaceholder +
'('.concat(
keys
.map(function (k) {
return _this.processSynonyms(k);
})
.join('|'),
')'
) +
joinerPlaceholder
);
}
}
}
return str;
},
},
{
key: 'processSynonyms',
value: function processSynonyms(str) {
if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) {
str = this.setupIgnoreJoinersRegExp(str);
}
return str;
},
},
{
key: 'setupWildcardsRegExp',
value: function setupWildcardsRegExp(str) {
str = str.replace(/(?:\\)*\?/g, function (val) {
return val.charAt(0) === '\\' ? '?' : '\x01';
});
return str.replace(/(?:\\)*\*/g, function (val) {
return val.charAt(0) === '\\' ? '*' : '\x02';
});
},
},
{
key: 'createWildcardsRegExp',
value: function createWildcardsRegExp(str) {
var spaces = this.opt.wildcards === 'withSpaces';
return str
.replace(/\u0001/g, spaces ? '[\\S\\s]?' : '\\S?')
.replace(/\u0002/g, spaces ? '[\\S\\s]*?' : '\\S*');
},
},
{
key: 'setupIgnoreJoinersRegExp',
value: function setupIgnoreJoinersRegExp(str) {
return str.replace(/[^(|)\\]/g, function (val, indx, original) {
var nextChar = original.charAt(indx + 1);
if (/[(|)\\]/.test(nextChar) || nextChar === '') {
return val;
} else {
return val + '\0';
}
});
},
},
{
key: 'createJoinersRegExp',
value: function createJoinersRegExp(str) {
var joiner = [];
var ignorePunctuation = this.opt.ignorePunctuation;
if (Array.isArray(ignorePunctuation) && ignorePunctuation.length) {
joiner.push(this.escapeStr(ignorePunctuation.join('')));
}
if (this.opt.ignoreJoiners) {
joiner.push('\\u00ad\\u200b\\u200c\\u200d');
}
return joiner.length ? str.split(/\u0000+/).join('['.concat(joiner.join(''), ']*')) : str;
},
},
{
key: 'createDiacriticsRegExp',
value: function createDiacriticsRegExp(str) {
var sens = this.opt.caseSensitive ? '' : 'i',
dct = this.opt.caseSensitive
? [
'aàáảãạăằắẳẵặâầấẩẫậäåāą',
'AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ',
'cçćč',
'CÇĆČ',
'dđď',
'DĐĎ',
'eèéẻẽẹêềếểễệëěēę',
'EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ',
'iìíỉĩịîïī',
'IÌÍỈĨỊÎÏĪ',
'lł',
'LŁ',
'nñňń',
'NÑŇŃ',
'oòóỏõọôồốổỗộơởỡớờợöøō',
'OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ',
'rř',
'RŘ',
'sšśșş',
'SŠŚȘŞ',
'tťțţ',
'TŤȚŢ',
'uùúủũụưừứửữựûüůū',
'UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ',
'yýỳỷỹỵÿ',
'YÝỲỶỸỴŸ',
'zžżź',
'ZŽŻŹ',
]
: [
'aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ',
'cçćčCÇĆČ',
'dđďDĐĎ',
'eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ',
'iìíỉĩịîïīIÌÍỈĨỊÎÏĪ',
'lłLŁ',
'nñňńNÑŇŃ',
'oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ',
'rřRŘ',
'sšśșşSŠŚȘŞ',
'tťțţTŤȚŢ',
'uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ',
'yýỳỷỹỵÿYÝỲỶỸỴŸ',
'zžżźZŽŻŹ',
];
var handled = [];
str.split('').forEach(function (ch) {
dct.every(function (dct) {
if (dct.indexOf(ch) !== -1) {
if (handled.indexOf(dct) > -1) {
return false;
}
str = str.replace(
new RegExp('['.concat(dct, ']'), 'gm'.concat(sens)),
'['.concat(dct, ']')
);
handled.push(dct);
}
return true;
});
});
return str;
},
},
{
key: 'createMergedBlanksRegExp',
value: function createMergedBlanksRegExp(str) {
return str.replace(/[\s]+/gim, '[\\s]+');
},
},
{
key: 'createAccuracyRegExp',
value: function createAccuracyRegExp(str) {
var _this2 = this;
var chars = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~¡¿';
var acc = this.opt.accuracy,
val = typeof acc === 'string' ? acc : acc.value,
ls = typeof acc === 'string' ? [] : acc.limiters,
lsJoin = '';
ls.forEach(function (limiter) {
lsJoin += '|'.concat(_this2.escapeStr(limiter));
});
switch (val) {
case 'partially':
default:
return '()('.concat(str, ')');
case 'complementary':
lsJoin = '\\s' + (lsJoin ? lsJoin : this.escapeStr(chars));
return '()([^'.concat(lsJoin, ']*').concat(str, '[^').concat(lsJoin, ']*)');
case 'exactly':
return '(^|\\s'.concat(lsJoin, ')(').concat(str, ')(?=$|\\s').concat(lsJoin, ')');
}
},
},
]);
return RegExpCreator;
})();
var Mark =
/*#__PURE__*/
(function () {
function Mark(ctx) {
_classCallCheck(this, Mark);
this.ctx = ctx;
this.ie = false;
var ua = window.navigator.userAgent;
if (ua.indexOf('MSIE') > -1 || ua.indexOf('Trident') > -1) {
this.ie = true;
}
}
_createClass(Mark, [
{
key: 'log',
value: function log(msg) {
var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'debug';
var log = this.opt.log;
if (!this.opt.debug) {
return;
}
if (_typeof(log) === 'object' && typeof log[level] === 'function') {
log[level]('mark.js: '.concat(msg));
}
},
},
{
key: 'getSeparatedKeywords',
value: function getSeparatedKeywords(sv) {
var _this = this;
var stack = [];
sv.forEach(function (kw) {
if (!_this.opt.separateWordSearch) {
if (kw.trim() && stack.indexOf(kw) === -1) {
stack.push(kw);
}
} else {
kw.split(' ').forEach(function (kwSplitted) {
if (kwSplitted.trim() && stack.indexOf(kwSplitted) === -1) {
stack.push(kwSplitted);
}
});
}
});
return {
keywords: stack.sort(function (a, b) {
return b.length - a.length;
}),
length: stack.length,
};
},
},
{
key: 'isNumeric',
value: function isNumeric(value) {
return Number(parseFloat(value)) == value;
},
},
{
key: 'checkRanges',
value: function checkRanges(array) {
var _this2 = this;
if (!Array.isArray(array) || Object.prototype.toString.call(array[0]) !== '[object Object]') {
this.log('markRanges() will only accept an array of objects');
this.opt.noMatch(array);
return [];
}
var stack = [];
var last = 0;
array
.sort(function (a, b) {
return a.start - b.start;
})
.forEach(function (item) {
var _this2$callNoMatchOnI = _this2.callNoMatchOnInvalidRanges(item, last),
start = _this2$callNoMatchOnI.start,
end = _this2$callNoMatchOnI.end,
valid = _this2$callNoMatchOnI.valid;
if (valid) {
item.start = start;
item.length = end - start;
stack.push(item);
last = end;
}
});
return stack;
},
},
{
key: 'callNoMatchOnInvalidRanges',
value: function callNoMatchOnInvalidRanges(range, last) {
var start,
end,
valid = false;
if (range && typeof range.start !== 'undefined') {
start = parseInt(range.start, 10);
end = start + parseInt(range.length, 10);
if (
this.isNumeric(range.start) &&
this.isNumeric(range.length) &&
end - last > 0 &&
end - start > 0
) {
valid = true;
} else {
this.log('Ignoring invalid or overlapping range: ' + ''.concat(JSON.stringify(range)));
this.opt.noMatch(range);
}
} else {
this.log('Ignoring invalid range: '.concat(JSON.stringify(range)));
this.opt.noMatch(range);
}
return {
start: start,
end: end,
valid: valid,
};
},
},
{
key: 'checkWhitespaceRanges',
value: function checkWhitespaceRanges(range, originalLength, string) {
var end,
valid = true,
max = string.length,
offset = originalLength - max,
start = parseInt(range.start, 10) - offset;
start = start > max ? max : start;
end = start + parseInt(range.length, 10);
if (end > max) {
end = max;
this.log('End range automatically set to the max value of '.concat(max));
}
if (start < 0 || end - start < 0 || start > max || end > max) {
valid = false;
this.log('Invalid range: '.concat(JSON.stringify(range)));
this.opt.noMatch(range);
} else if (string.substring(start, end).replace(/\s+/g, '') === '') {
valid = false;
this.log('Skipping whitespace only range: ' + JSON.stringify(range));
this.opt.noMatch(range);
}
return {
start: start,
end: end,
valid: valid,
};
},
},
{
key: 'getTextNodes',
value: function getTextNodes(cb) {
var _this3 = this;
var val = '',
nodes = [];
this.iterator.forEachNode(
NodeFilter.SHOW_TEXT,
function (node) {
nodes.push({
start: val.length,
end: (val += node.textContent).length,
node: node,
});
},
function (node) {
if (_this3.matchesExclude(node.parentNode)) {
return NodeFilter.FILTER_REJECT;
} else {
return NodeFilter.FILTER_ACCEPT;
}
},
function () {
cb({
value: val,
nodes: nodes,
});
}
);
},
},
{
key: 'matchesExclude',
value: function matchesExclude(el) {
return DOMIterator.matches(
el,
this.opt.exclude.concat(['script', 'style', 'title', 'head', 'html'])
);
},
},
{
key: 'wrapRangeInTextNode',
value: function wrapRangeInTextNode(node, start, end) {
var hEl = !this.opt.element ? 'mark' : this.opt.element,
startNode = node.splitText(start),
ret = startNode.splitText(end - start);
var repl = document.createElement(hEl);
repl.setAttribute('data-markjs', 'true');
if (this.opt.className) {
repl.setAttribute('class', this.opt.className);
}
repl.textContent = startNode.textContent;
startNode.parentNode.replaceChild(repl, startNode);
return ret;
},
},
{
key: 'wrapRangeInMappedTextNode',
value: function wrapRangeInMappedTextNode(dict, start, end, filterCb, eachCb) {
var _this4 = this;
dict.nodes.every(function (n, i) {
var sibl = dict.nodes[i + 1];
if (typeof sibl === 'undefined' || sibl.start > start) {
if (!filterCb(n.node)) {
return false;
}
var s = start - n.start,
e = (end > n.end ? n.end : end) - n.start,
startStr = dict.value.substr(0, n.start),
endStr = dict.value.substr(e + n.start);
n.node = _this4.wrapRangeInTextNode(n.node, s, e);
dict.value = startStr + endStr;
dict.nodes.forEach(function (k, j) {
if (j >= i) {
if (dict.nodes[j].start > 0 && j !== i) {
dict.nodes[j].start -= e;
}
dict.nodes[j].end -= e;
}
});
end -= e;
eachCb(n.node.previousSibling, n.start);
if (end > n.end) {
start = n.end;
} else {
return false;
}
}
return true;
});
},
},
{
key: 'wrapGroups',
value: function wrapGroups(node, pos, len, eachCb) {
node = this.wrapRangeInTextNode(node, pos, pos + len);
eachCb(node.previousSibling);
return node;
},
},
{
key: 'separateGroups',
value: function separateGroups(node, match, matchIdx, filterCb, eachCb) {
var matchLen = match.length;
for (var i = 1; i < matchLen; i++) {
var pos = node.textContent.indexOf(match[i]);
if (match[i] && pos > -1 && filterCb(match[i], node)) {
node = this.wrapGroups(node, pos, match[i].length, eachCb);
}
}
return node;
},
},
{
key: 'wrapMatches',
value: function wrapMatches(regex, ignoreGroups, filterCb, eachCb, endCb) {
var _this5 = this;
var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1;
this.getTextNodes(function (dict) {
dict.nodes.forEach(function (node) {
node = node.node;
var match;
while ((match = regex.exec(node.textContent)) !== null && match[matchIdx] !== '') {
if (_this5.opt.separateGroups) {
node = _this5.separateGroups(node, match, matchIdx, filterCb, eachCb);
} else {
if (!filterCb(match[matchIdx], node)) {
continue;
}
var pos = match.index;
if (matchIdx !== 0) {
for (var i = 1; i < matchIdx; i++) {
pos += match[i].length;
}
}
node = _this5.wrapGroups(node, pos, match[matchIdx].length, eachCb);
}
regex.lastIndex = 0;
}
});
endCb();
});
},
},
{
key: 'wrapMatchesAcrossElements',
value: function wrapMatchesAcrossElements(regex, ignoreGroups, filterCb, eachCb, endCb) {
var _this6 = this;
var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1;
this.getTextNodes(function (dict) {
var match;
while ((match = regex.exec(dict.value)) !== null && match[matchIdx] !== '') {
var start = match.index;
if (matchIdx !== 0) {
for (var i = 1; i < matchIdx; i++) {
start += match[i].length;
}
}
var end = start + match[matchIdx].length;
_this6.wrapRangeInMappedTextNode(
dict,
start,
end,
function (node) {
return filterCb(match[matchIdx], node);
},
function (node, lastIndex) {
regex.lastIndex = lastIndex;
eachCb(node);
}
);
}
endCb();
});
},
},
{
key: 'wrapRangeFromIndex',
value: function wrapRangeFromIndex(ranges, filterCb, eachCb, endCb) {
var _this7 = this;
this.getTextNodes(function (dict) {
var originalLength = dict.value.length;
ranges.forEach(function (range, counter) {
var _this7$checkWhitespac = _this7.checkWhitespaceRanges(
range,
originalLength,
dict.value
),
start = _this7$checkWhitespac.start,
end = _this7$checkWhitespac.end,
valid = _this7$checkWhitespac.valid;
if (valid) {
_this7.wrapRangeInMappedTextNode(
dict,
start,
end,
function (node) {
return filterCb(node, range, dict.value.substring(start, end), counter);
},
function (node) {
eachCb(node, range);
}
);
}
});
endCb();
});
},
},
{
key: 'unwrapMatches',
value: function unwrapMatches(node) {
var parent = node.parentNode;
var docFrag = document.createDocumentFragment();
while (node.firstChild) {
docFrag.appendChild(node.removeChild(node.firstChild));
}
parent.replaceChild(docFrag, node);
if (!this.ie) {
parent.normalize();
} else {
this.normalizeTextNode(parent);
}
},
},
{
key: 'normalizeTextNode',
value: function normalizeTextNode(node) {
if (!node) {
return;
}
if (node.nodeType === 3) {
while (node.nextSibling && node.nextSibling.nodeType === 3) {
node.nodeValue += node.nextSibling.nodeValue;
node.parentNode.removeChild(node.nextSibling);
}
} else {
this.normalizeTextNode(node.firstChild);
}
this.normalizeTextNode(node.nextSibling);
},
},
{
key: 'markRegExp',
value: function markRegExp(regexp, opt) {
var _this8 = this;
this.opt = opt;
this.log('Searching with expression "'.concat(regexp, '"'));
var totalMatches = 0,
fn = 'wrapMatches';
var eachCb = function eachCb(element) {
totalMatches++;
_this8.opt.each(element);
};
if (this.opt.acrossElements) {
fn = 'wrapMatchesAcrossElements';
}
this[fn](
regexp,
this.opt.ignoreGroups,
function (match, node) {
return _this8.opt.filter(node, match, totalMatches);
},
eachCb,
function () {
if (totalMatches === 0) {
_this8.opt.noMatch(regexp);
}
_this8.opt.done(totalMatches);
}
);
},
},
{
key: 'mark',
value: function mark(sv, opt) {
var _this9 = this;
this.opt = opt;
var totalMatches = 0,
fn = 'wrapMatches';
var _this$getSeparatedKey = this.getSeparatedKeywords(typeof sv === 'string' ? [sv] : sv),
kwArr = _this$getSeparatedKey.keywords,
kwArrLen = _this$getSeparatedKey.length,
handler = function handler(kw) {
var regex = new RegExpCreator(_this9.opt).create(kw);
var matches = 0;
_this9.log('Searching with expression "'.concat(regex, '"'));
_this9[fn](
regex,
1,
function (term, node) {
return _this9.opt.filter(node, kw, totalMatches, matches);
},
function (element) {
matches++;
totalMatches++;
_this9.opt.each(element);
},
function () {
if (matches === 0) {
_this9.opt.noMatch(kw);
}
if (kwArr[kwArrLen - 1] === kw) {
_this9.opt.done(totalMatches);
} else {
handler(kwArr[kwArr.indexOf(kw) + 1]);
}
}
);
};
if (this.opt.acrossElements) {
fn = 'wrapMatchesAcrossElements';
}
if (kwArrLen === 0) {
this.opt.done(totalMatches);
} else {
handler(kwArr[0]);
}
},
},
{
key: 'markRanges',
value: function markRanges(rawRanges, opt) {
var _this10 = this;
this.opt = opt;
var totalMatches = 0,
ranges = this.checkRanges(rawRanges);
if (ranges && ranges.length) {
this.log('Starting to mark with the following ranges: ' + JSON.stringify(ranges));
this.wrapRangeFromIndex(
ranges,
function (node, range, match, counter) {
return _this10.opt.filter(node, range, match, counter);
},
function (element, range) {
totalMatches++;
_this10.opt.each(element, range);
},
function () {
_this10.opt.done(totalMatches);
}
);
} else {
this.opt.done(totalMatches);
}
},
},
{
key: 'unmark',
value: function unmark(opt) {
var _this11 = this;
this.opt = opt;
var sel = this.opt.element ? this.opt.element : '*';
sel += '[data-markjs]';
if (this.opt.className) {
sel += '.'.concat(this.opt.className);
}
this.log('Removal selector "'.concat(sel, '"'));
this.iterator.forEachNode(
NodeFilter.SHOW_ELEMENT,
function (node) {
_this11.unwrapMatches(node);
},
function (node) {
var matchesSel = DOMIterator.matches(node, sel),
matchesExclude = _this11.matchesExclude(node);
if (!matchesSel || matchesExclude) {
return NodeFilter.FILTER_REJECT;
} else {
return NodeFilter.FILTER_ACCEPT;
}
},
this.opt.done
);
},
},
{
key: 'opt',
set: function set(val) {
this._opt = _extends(
{},
{
element: '',
className: '',
exclude: [],
iframes: false,
iframesTimeout: 5000,
separateWordSearch: true,
acrossElements: false,
ignoreGroups: 0,
each: function each() {},
noMatch: function noMatch() {},
filter: function filter() {
return true;
},
done: function done() {},
debug: false,
log: window.console,
},
val
);
},
get: function get() {
return this._opt;
},
},
{
key: 'iterator',
get: function get() {
return new DOMIterator(this.ctx, this.opt.iframes, this.opt.exclude, this.opt.iframesTimeout);
},
},
]);
return Mark;
})();
function Mark$1(ctx) {
var _this = this;
var instance = new Mark(ctx);
this.mark = function (sv, opt) {
instance.mark(sv, opt);
return _this;
};
this.markRegExp = function (sv, opt) {
instance.markRegExp(sv, opt);
return _this;
};
this.markRanges = function (sv, opt) {
instance.markRanges(sv, opt);
return _this;
};
this.unmark = function (opt) {
instance.unmark(opt);
return _this;
};
return this;
}
return Mark$1;
});