User:Jack who built the house/worker-test.js.map.json
Jump to navigation
Jump to search
Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/js/cd.js","webpack:///./src/js/util.js","webpack:///./node_modules/@babel/runtime/helpers/classPrivateFieldGet.js","webpack:///./src/js/CdError.js","webpack:///./src/js/timestamp.js","webpack:///./node_modules/htmlparser2/lib/index.js","webpack:///./src/js/treeWalker.js","webpack:///./node_modules/@babel/runtime/helpers/classPrivateFieldSet.js","webpack:///./node_modules/domutils/lib/tagtypes.js","webpack:///./node_modules/domelementtype/lib/index.js","webpack:///./node_modules/htmlparser2/lib/Parser.js","webpack:///./node_modules/htmlparser2/lib/Tokenizer.js","webpack:///./node_modules/entities/lib/decode_codepoint.js","webpack:///./node_modules/domhandler/lib/index.js","webpack:///./node_modules/htmlparser2/lib/FeedHandler.js","webpack:///./node_modules/domutils/lib/index.js","webpack:///./node_modules/entities/lib/decode.js","webpack:///./node_modules/entities/lib/encode.js","webpack:///./node_modules/domutils/lib/querying.js","webpack:///./src/js/staticGlobals.js","webpack:///./src/js/debug.js","webpack:///./src/js/CommentSkeleton.js","webpack:///./src/js/SectionSkeleton.js","webpack:///./node_modules/locutus/php/strings/html_entity_decode.js","webpack:///./src/js/Parser.js","webpack:///./src/js/wikitext.js","webpack:///./src/js/htmlparser2Extended.js","webpack:///./src/js/worker.js","webpack:///./node_modules/events/events.js","webpack:///./node_modules/domhandler/lib/node.js","webpack:///./node_modules/domutils/lib/stringify.js","webpack:///./node_modules/dom-serializer/index.js","webpack:///./node_modules/entities/lib/index.js","webpack:///./node_modules/domutils/lib/traversal.js","webpack:///./node_modules/domutils/lib/manipulation.js","webpack:///./node_modules/domutils/lib/legacy.js","webpack:///./node_modules/domutils/lib/helpers.js","webpack:///./node_modules/htmlparser2/lib/CollectingHandler.js","webpack:///./node_modules/htmlparser2/lib/MultiplexHandler.js","webpack:///./node_modules/locutus/php/strings/get_html_translation_table.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","context","window","self","convenientDiscussions","isInline","node","countTextNodesAsInline","nodeType","Node","TEXT_NODE","ELEMENT_NODE","cd","g","POPULAR_INLINE_ELEMENTS","includes","tagName","POPULAR_NOT_INLINE_ELEMENTS","console","warn","getComputedStyle","display","defined","el","undefined","flat","arr","concat","underlinesToSpaces","replace","spacesToUnderlines","firstCharToUpperCase","length","char","PHP_CHAR_TO_UPPER_JSON","toUpperCase","phpCharToUpper","slice","getMessages","messages","map","mw","msg","hideText","text","regexp","hidden","useAlternativeMarker","pre","textToHide","push","receiver","privateMap","descriptor","TypeError","CdError","Error","constructor","data","message","type","code","apiData","error","super","this","parseTimestampRegexp","parseTimestampRegexpNoTimezone","parseTimestamp","timestamp","timezoneOffset","RegExp","TIMESTAMP_REGEXP","source","TIMESTAMP_REGEXP_NO_TIMEZONE","match","date","TIMESTAMP_PARSER","Date","getTime","MILLISECONDS_IN_A_MINUTE","zeroPad","number","generateCommentAnchor","author","resolveCollisions","year","getUTCFullYear","month","getUTCMonth","day","getUTCDate","hours","getUTCHours","minutes","getUTCMinutes","anchor","commentAnchors","anchorNum","base","registerCommentAnchor","resetCommentAnchors","__export","__importStar","mod","result","k","Parser_1","Parser","domhandler_1","DomHandler","DefaultHandler","parseDOM","options","handler","end","dom","createDomStream","cb","elementCb","Tokenizer_1","Tokenizer","default","ElementType","EVENTS","attribute","cdatastart","cdataend","processinginstruction","comment","commentend","closetag","opentag","opentagname","DomUtils","FeedHandler_1","RssHandler","FeedHandler","TreeWalker","root","acceptNode","onlyElementNodes","startNode","currentNode","firstChildProperty","lastChildProperty","previousSiblingProperty","nextSiblingProperty","tryMove","parentNode","firstChild","lastChild","previousSibling","nextSibling","nextNode","previousNode","ElementsTreeWalker","rootElement","ElementsAndTextTreeWalker","set","writable","domelementtype_1","isTag","isCDATA","isText","isComment","hasChildren","elem","Text","Directive","Comment","Script","Style","Tag","CDATA","Doctype","extendStatics","__extends","b","setPrototypeOf","__proto__","Array","__","__importDefault","events_1","formTags","Set","pTag","openImpliesClose","tr","th","td","body","li","h1","h2","h3","h4","h5","h6","select","input","output","button","datalist","textarea","option","optgroup","dd","dt","address","article","aside","blockquote","details","div","dl","fieldset","figcaption","figure","footer","form","header","hr","main","nav","ol","section","table","ul","rt","rp","tbody","tfoot","voidElements","foreignContextElements","htmlIntegrationElements","reNameEnd","_super","cbs","_this","_tagname","_attribname","_attribvalue","_attribs","_stack","_foreignContext","startIndex","endIndex","parseChunk","write","done","_options","_cbs","_lowerCaseTagNames","lowerCaseTags","xmlMode","_lowerCaseAttributeNames","lowerCaseAttributeNames","_tokenizer","onparserinit","_updatePosition","initialOffset","_sectionStart","getAbsoluteIndex","ontext","onopentagname","toLowerCase","has","onclosetag","onopentag","onopentagend","pop","pos","lastIndexOf","_closeCurrentTag","onselfclosingtag","recognizeSelfClosing","onattribname","onattribdata","onattribend","onattribute","_getInstructionName","idx","search","substr","ondeclaration","onprocessinginstruction","name_1","name_2","oncomment","oncommentend","oncdata","recognizeCDATA","oncdatastart","oncdataend","onerror","err","onend","reset","onreset","parseComplete","chunk","pause","resume","EventEmitter","decode_codepoint_1","entities_json_1","legacy_json_1","xml_json_1","whitespace","ifElseState","upper","SUCCESS","FAILURE","lower","_state","_index","consumeSpecialNameChar","NEXT_STATE","stateBeforeCdata1","stateBeforeCdata2","stateBeforeCdata3","stateBeforeCdata4","stateBeforeCdata5","stateBeforeScript1","stateBeforeScript2","stateBeforeScript3","stateBeforeScript4","stateAfterScript1","stateAfterScript2","stateAfterScript3","stateAfterScript4","stateBeforeStyle1","stateBeforeStyle2","stateBeforeStyle3","stateAfterStyle1","stateAfterStyle2","stateAfterStyle3","stateBeforeEntity","stateBeforeNumericEntity","_buffer","_bufferOffset","_baseState","_special","_running","_ended","_xmlMode","_decodeEntities","decodeEntities","_stateText","_getSection","_stateBeforeTagName","_stateInTagName","_emitToken","_stateBeforeClosingTagName","_stateInClosingTagName","_stateAfterClosingTagName","_stateBeforeAttributeName","_stateInSelfClosingTag","_stateInAttributeName","_stateAfterAttributeName","_stateBeforeAttributeValue","_stateInAttributeValueDoubleQuotes","_stateInAttributeValueSingleQuotes","_stateInAttributeValueNoQuotes","_stateBeforeDeclaration","_stateInDeclaration","_stateInProcessingInstruction","_stateBeforeComment","_stateInComment","_stateAfterComment1","_stateAfterComment2","substring","_stateBeforeCdata6","_stateInCdata","_stateAfterCdata1","_stateAfterCdata2","_stateBeforeSpecial","_stateBeforeSpecialEnd","_stateBeforeScript5","_stateAfterScript5","_stateBeforeStyle4","_stateAfterStyle4","_parseNamedEntityStrict","entity","_emitPartial","_parseLegacyEntity","start","limit","_stateInNamedEntity","_decodeNumericEntity","offset","sectionStart","parsed","parseInt","_stateInNumericEntity","_stateInHexEntity","_cleanup","_parse","charAt","_finish","_handleTrailingData","decode_json_1","codePoint","String","fromCharCode","node_1","Element","DataNode","NodeWithChildren","reWhitespace","defaultOpts","normalizeWhitespace","withStartIndices","withEndIndices","callback","elementCB","_done","_tagStack","_lastNode","_parser","_callback","_elementCB","parser","handleCallback","attribs","element","addNode","normalize","parent","ProcessingInstruction","siblings","children","prev","next","addDataNode","feed","feedRoot","getOneElement","isValidFeed","childs","addConditionally","href","getAttribute","link","updated","fetch","items","getElements","item","entry","description","pubDate","id","what","where","getElementsByTagName","recurse","getText","trim","obj","prop","tmp","defaultOptions","parseFeed","decodeXML","getStrictDecoder","decodeHTMLStrict","keys","join","getReplacer","re","str","sorter","a","decodeHTML","legacy","sort","j","replacer","inverseXML","getInverseObj","xmlReplacer","getInverseReplacer","encodeXML","getInverse","inverseHTML","htmlReplacer","encodeHTML","reduce","inverse","single","multiple","forEach","unshift","reNonASCII","reAstralSymbols","singleCharReplacer","charCodeAt","toString","astralReplacer","_","reXmlChars","escape","tagtypes_1","filter","test","Infinity","isArray","find","elems","findOneChild","findOne","checked","existsOne","findAll","rootElems","stack","shift","apply","LETTER_PATTERN","COMMENT_UNDERLAY_FOCUSED_COLOR","COMMENT_UNDERLAY_TARGET_COLOR","COMMENT_UNDERLAY_NEW_COLOR","COMMENT_UNDERLAY_OWN_COLOR","COMMENT_UNDERLAY_SIDE_MARGIN","HIGHLIGHT_NEW_COMMENTS_INTERVAL","CHECK_FOR_NEW_COMMENTS_INTERVAL","BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL","SECONDS_IN_A_DAY","UNHIGHLIGHTABLE_ELEMENTS_CLASSES","BAD_COMMENT_BEGINNINGS","FLOATING_ELEMENTS_SELECTORS","SIGN_CODE","init","timerTotal","timerStartTimestamps","timerRunCount","timerAllRunsTotal","initCounters","array","counters","Proxy","startTimer","label","now","stopTimer","thisTime","resetTimer","fullResetTimer","logAndResetTimer","debug","logAndResetEverything","timerLabels","counterLabels","averageTimerTime","average","toFixed","incrementCounter","CommentSkeleton","signature","parts","collectParts","removeNestedParts","encloseInlineParts","filterParts","reverse","replaceListsWithItems","comments","timestampText","authorName","own","CURRENT_USER_NAME","unsigned","elements","part","highlightables","some","classList","contains","addAttributes","setLevels","isHeading","followsHeading","level","splice","isOpeningSection","headingLevelMatch","openingSectionOfLevel","Number","setAttribute","add","levelElements","top","getLevelsUpTree","bottom","Math","min","getSection","sections","sourcePage","CURRENT_PAGE","SectionSkeleton","headingElement","headlineElement","getElementByClassName","classesToFilter","config","foreignElementsInHeadlinesClasses","nodes","from","childNodes","headline","textContent","levelMatch","treeWalker","headingNestingLevel","levelRegexp","firstCommentPart","lastCommentPart","hasSubsections","lastElementInFirstChunk","lastNode","firstCommentPartId","lastCommentPartId","findIndex","follows","commentsInFirstChunk","string","quoteStyle","getHtmlTranslationTable","tmpStr","symbol","hashMap","split","getUserNameFromLink","pageName","url","decodeURIComponent","e","uri","Uri","path","ARTICLE_PATH_REGEXP","query","title","getPageNameFromUrl","userName","USER_NAMESPACES_REGEXP","startsWith","CONTRIBS_PAGE","CONTRIBS_PAGE_LINK_REGEXP","createComment","CommentClass","createSection","watchedSectionsRequest","SectionClass","findTimestamps","blocksToExclude","elementsToExcludeClasses","className","getElementsByClassName","getAllTextNodes","block","finding","document","createElement","textNode","createTextNode","appendChild","remainedText","index","afterNode","insertBefore","findSignatures","timestamps","signatures","timestampElement","unsignedElement","closestNotInlineAncestor","unsignedClass","Boolean","cniaChildren","childElementsProperty","found","startElement","firstSignatureElement","signatureNodes","hasAuthorLinks","signatureScanLimit","firstSignatureElementIndex","indexOf","signatureContainer","startElementNextSibling","sig1","sig2","signatureElement","firstForeignComponentAfter","isTextNode","hasCurrentSignature","hasForeignComponents","lastStep","timezoneRegexp","TIMEZONE_REGEXP","previousPart","signatureEndingRegexp","dived","previousElementSibling","checkForCustomForeignComponents","nextDiveElementIndex","sequencesToBeEnclosed","encloseThis","sequence","wrapper","newNode","lastPart","partTextNoSpaces","current","every","child","newParts","assign","initialElement","findHeadings","headings","heading1","heading2","decodeHtmlEntities","html_entity_decode","walkThroughSubtree","checkSelf","dummyDom","NodeConstructor","getPrototypeOf","returnValue","getOuterHTML","remove","referenceNode","prepend","removeChild","removeElement","thisTree","nodeTree","sharedParent","thisSharedParentChild","nodeSharedParentChild","_classList","list","movedFromClassAttr","moveFromClassAttr","classAttr","names","our","Document","content","el1","el2","alarmTimeout","setAlarm","interval","clearTimeout","setTimeout","postMessage","parse","heading","specialElements","pageHasOutdents","targetComment","otherComment","sectionHeadline","sectionAnchor","targetCommentAuthorName","toMe","onMessageFromWindow","checker","eval","onmessage","ReflectOwnKeys","R","Reflect","ReflectApply","target","args","Function","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","NumberIsNaN","isNaN","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","arg","RangeError","setMaxListeners","_getMaxListeners","that","getMaxListeners","emit","arguments","doError","events","er","len","listeners","arrayClone","_addListener","existing","newListener","warned","w","emitter","count","warning","ProcessEmitWarning","addListener","on","prependListener","onceWrapper","fired","removeListener","wrapFn","_onceWrap","state","wrapped","once","prependOnceListener","position","originalListener","spliceOne","off","removeAllListeners","_listeners","unwrap","evlistener","ret","unwrapListeners","rawListeners","listenerCount","eventNames","copy","nodeTypes","Map","configurable","dom_serializer_1","getInnerHTML","entities","foreignNames","elementNames","attributeNames","unencodedElements","style","script","xmp","iframe","noembed","noframes","plaintext","noscript","singleTag","area","basefont","br","col","command","embed","frame","img","isindex","keygen","meta","param","track","wbr","render","opts","cheerio","renderTag","renderDirective","renderComment","renderCdata","renderText","foreignModeIntegrationPoints","tag","attributes","formatAttrs","decode_1","encode_1","decode","decodeStrict","encode","encode_2","encodeHTML4","encodeHTML5","decode_2","decodeHTML4","decodeHTML5","decodeHTML4Strict","decodeHTML5Strict","decodeXMLStrict","getChildren","getParent","getSiblings","getAttributeValue","hasAttrib","getName","replaceElement","replacement","sibling","append","currNext","querying_1","Checks","tag_name","tag_type","tag_contains","getAttribCheck","attrib","combineFuncs","compileTest","funcs","testElement","getElementById","getElementsByTagType","removeSubsets","ancestor","compareDocumentPosition","nodeA","nodeB","aParents","bParents","aSibling","bSibling","uniqueSort","relative","CollectingHandler","_a","_i","restart","_b","MultiplexHandler","func","_func","decimal","useTable","useQuoteStyle","constMappingTable","constMappingQuoteStyle"],"mappings":"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","file":"worker-test.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 29);\n","/**\r\n * @module cd\r\n */\r\n\r\n// Window or worker context\r\nconst context = typeof window === 'undefined' ? self : window;\r\n\r\n/**\r\n * @namespace convenientDiscussions\r\n */\r\ncontext.convenientDiscussions = context.convenientDiscussions || {};\r\nif (typeof context.convenientDiscussions !== 'object') {\r\n context.convenientDiscussions = {};\r\n}\r\n\r\nexport default context.convenientDiscussions;\r\n","/**\r\n * Utilities module. Utilities that go to the {@link module:cd~convenientDiscussions.util\r\n * convenientDiscussions.util} object are in {@link module:globalUtil}.\r\n *\r\n * @module util\r\n */\r\n\r\nimport CdError from './CdError';\r\nimport Page from './Page';\r\nimport cd from './cd';\r\n\r\nlet keptScrollPosition = null;\r\n\r\n/**\r\n * Removes duplicated elements from an array.\r\n *\r\n * @param {Array} arr\r\n * @returns {?Array}\r\n */\r\nexport function removeDuplicates(arr) {\r\n if (!arr || typeof arr !== 'object') {\r\n return null;\r\n }\r\n return arr.filter((value, i) => arr.indexOf(value) === i);\r\n}\r\n\r\n/**\r\n * Generates a transparent color for the given color to use it in a gradient.\r\n *\r\n * @param {string} color\r\n * @returns {string}\r\n */\r\nexport function transparentize(color) {\r\n const dummyElement = document.createElement('span');\r\n dummyElement.style.color = color;\r\n color = dummyElement.style.color;\r\n return color.includes('rgba') ?\r\n color.replace(/\\d+(?=\\))/, '0') :\r\n color\r\n .replace(/rgb/, 'rgba')\r\n .replace(/\\)/, ', 0)');\r\n}\r\n\r\n/**\r\n * Check if a node is an element with `display: inline` in the default browser styles. As an option,\r\n * it can also treat text nodes as inline elements.\r\n *\r\n * @param {Node} node\r\n * @param {boolean} countTextNodesAsInline\r\n * @returns {?boolean}\r\n */\r\nexport function isInline(node, countTextNodesAsInline) {\r\n if (countTextNodesAsInline && node.nodeType === Node.TEXT_NODE) {\r\n return true;\r\n }\r\n\r\n // Precaution\r\n if (node.nodeType !== Node.ELEMENT_NODE) {\r\n return null;\r\n }\r\n\r\n if (cd.g.POPULAR_INLINE_ELEMENTS.includes(node.tagName)) {\r\n return true;\r\n } else if (cd.g.POPULAR_NOT_INLINE_ELEMENTS.includes(node.tagName)) {\r\n return false;\r\n } else {\r\n // This can be called from a worker.\r\n if (typeof window !== 'undefined') {\r\n console.warn('Expensive operation: isInline() called for:', node);\r\n\r\n // This is very expensive. Avoid by any means.\r\n return window.getComputedStyle(node).display === 'inline';\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Generate a pattern for use in a regular expression from a string that is case-insensitive for the\r\n * first character only.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function caseInsensitiveFirstCharPattern(s) {\r\n const firstChar = s[0];\r\n return (\r\n (\r\n // Could be issues, probably not very serious, resulting from the difference of PHP's\r\n // mb_strtoupper and JavaScript's String#toUpperCase, see firstCharToUpperCase() and\r\n // https://phabricator.wikimedia.org/T141723#2513800.\r\n firstChar.toUpperCase() !== firstChar.toLowerCase() ?\r\n '[' + firstChar.toUpperCase() + firstChar.toLowerCase() + ']' :\r\n mw.util.escapeRegExp(firstChar)\r\n ) +\r\n mw.util.escapeRegExp(s.slice(1))\r\n );\r\n}\r\n\r\n/**\r\n * Check if the provided page is probably a talk page. The namespace number is required.\r\n *\r\n * This function exists mostly because we can't be sure the `mediawiki.Title` module is loaded when\r\n * the script has started executing (and can't use the {@link module:Page Page} constructor), and we\r\n * need to make this check fast. So, in most cases, {@link module:Page#isProbablyTalkPage} should be\r\n * used.\r\n *\r\n * @param {string} pageName\r\n * @param {number} namespaceNumber\r\n * @returns {boolean}\r\n */\r\nexport function isProbablyTalkPage(pageName, namespaceNumber) {\r\n return (\r\n (\r\n namespaceNumber % 2 === 1 ||\r\n (cd.g.PAGE_WHITE_LIST_REGEXP && cd.g.PAGE_WHITE_LIST_REGEXP.test(pageName)) ||\r\n !cd.g.PAGE_WHITE_LIST_REGEXP && cd.config.customTalkNamespaces.includes(namespaceNumber)\r\n ) &&\r\n (!cd.g.PAGE_BLACK_LIST_REGEXP || !cd.g.PAGE_BLACK_LIST_REGEXP.test(pageName))\r\n );\r\n}\r\n\r\n/**\r\n * Check by an edit summary if an edit is probably an edit of a comment.\r\n *\r\n * @param {string} summary\r\n * @returns {boolean}\r\n */\r\nexport function isCommentEdit(summary) {\r\n return (\r\n summary &&\r\n (\r\n summary.includes(`${cd.s('es-edit')} ${cd.s('es-reply-genitive')}`) ||\r\n summary.includes(`${cd.s('es-edit')} ${cd.s('es-addition-genitive')}`)\r\n )\r\n );\r\n}\r\n\r\n/**\r\n * Check by an edit summary if an edit is probably an undo.\r\n *\r\n * @param {string} summary\r\n * @returns {boolean}\r\n */\r\nexport function isUndo(summary) {\r\n return summary && cd.config.undoTexts.some((text) => summary.includes(text));\r\n}\r\n\r\n/**\r\n * Callback for `Array#filter` functions used with `Array#map`.\r\n *\r\n * @param {*} el\r\n * @returns {boolean}\r\n */\r\nexport function defined(el) {\r\n return el !== undefined;\r\n}\r\n\r\n/**\r\n * Callback for `Array#filter` functions used with `Array#map`.\r\n *\r\n * @param {*} el\r\n * @returns {boolean}\r\n */\r\nexport function notNull(el) {\r\n return el !== undefined && el !== null;\r\n}\r\n\r\n/**\r\n * Return an array with a changed start index (`[0, 1, 2, 3]` can be transformed into `[2, 3, 0,\r\n * 1]`) and optionally reversed while keeping the start index (`[0, 1, 2, 3]` can be transformed\r\n * into `[2, 1, 0, 3]`).\r\n *\r\n * @param {Array} arr\r\n * @param {number} startIndex\r\n * @param {boolean} [reverse=false]\r\n * @returns {Array}\r\n */\r\nexport function reorderArray(arr, startIndex, reverse = false) {\r\n return reverse ?\r\n arr\r\n .slice(startIndex + 1)\r\n .concat(arr.slice(0, startIndex + 1))\r\n .reverse() :\r\n arr\r\n .slice(startIndex)\r\n .concat(arr.slice(0, startIndex))\r\n}\r\n\r\n/**\r\n * Alternative to `Array#flat(1)`. That method is not yet supported by major browsers.\r\n *\r\n * @param {Array} arr\r\n * @returns {Array}\r\n */\r\nexport function flat(arr) {\r\n return [].concat(...arr);\r\n}\r\n\r\n/**\r\n * Callback used in the `.catch()` parts of `mw.Api` requests.\r\n *\r\n * @param {string} code\r\n * @param {object} data\r\n * @throws {CdError}\r\n */\r\nexport function handleApiReject(code, data) {\r\n // See parameters with which mw.Api() rejects:\r\n // https://phabricator.wikimedia.org/source/mediawiki/browse/master/resources/src/mediawiki.api/index.js;fbfa8f1a61c5ffba664e817701439affb4f6a388$245\r\n throw code === 'http' ?\r\n new CdError({ type: 'network' }) :\r\n new CdError({\r\n type: 'api',\r\n code: 'error',\r\n apiData: data,\r\n });\r\n}\r\n\r\n/**\r\n * Transforms underlines to spaces in a string.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function underlinesToSpaces(s) {\r\n return s.replace(/_/g, ' ');\r\n}\r\n\r\n/**\r\n * Transforms spaces to underlines in a string.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function spacesToUnderlines(s) {\r\n return s.replace(/ /g, '_');\r\n}\r\n\r\n/**\r\n * Replaces sequences of spaces to one spaces.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function removeDoubleSpaces(s) {\r\n return s.replace(/ {2,}/g, ' ');\r\n}\r\n\r\n/**\r\n * Attach callback functions to links with the provided class names given HTML code, wrap in a\r\n * `<span>` element, and return the resultant jQuery object.\r\n *\r\n * @param {string|JQuery} html\r\n * @param {...Array.<string, Function>} classToCallback\r\n * @returns {JQuery}\r\n */\r\nexport function animateLinks(html, ...classToCallback) {\r\n const $link = html instanceof $ ? html : cd.util.wrapInElement(html);\r\n classToCallback.forEach(([className, callback]) => {\r\n $link.find(`.${className}`).on('click', callback);\r\n });\r\n return $link;\r\n}\r\n\r\n/**\r\n * Provide `mw.Title.phpCharToUpper` functionality for the web worker context.\r\n *\r\n * @param {string} char\r\n * @returns {string}\r\n */\r\nfunction phpCharToUpper(char) {\r\n if (cd.g.PHP_CHAR_TO_UPPER_JSON[char] === '') {\r\n return char;\r\n }\r\n return cd.g.PHP_CHAR_TO_UPPER_JSON[char] || char.toUpperCase();\r\n}\r\n\r\n/**\r\n * Transform the first letter of a string to upper case, for example: `'wikilink'` → `'Wikilink'`.\r\n * Do it in PHP, not JavaScript, fashion to match the MediaWiki behavior, see {@link\r\n * https://phabricator.wikimedia.org/T141723#2513800}.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function firstCharToUpperCase(s) {\r\n return s.length ? phpCharToUpper(s[0]) + s.slice(1) : '';\r\n}\r\n\r\n/**\r\n * Get text of the localization messages.\r\n *\r\n * @param {string[]} messages\r\n * @returns {string[]}\r\n */\r\nexport function getMessages(messages) {\r\n return messages.map(mw.msg);\r\n}\r\n\r\n/**\r\n * `Array#findIndex` analog that looks for the _last_ index.\r\n *\r\n * @param {Array} arr\r\n * @param {Function} callback\r\n * @returns {?number}\r\n */\r\nexport function findLastIndex(arr, callback) {\r\n for (let i = arr.length - 1; i >= 0; i--) {\r\n if (callback(arr[i])) {\r\n return i;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Check if an input or editable element is focused.\r\n *\r\n * @returns {boolean}\r\n */\r\nexport function isInputFocused() {\r\n return $(':focus:input').length || $(':focus').prop('isContentEditable');\r\n}\r\n\r\n/**\r\n * Turn many regexps into one, putting it in `()` and separating individual expressions by `|`.\r\n *\r\n * @param {RegExp[]|string[]} arr\r\n * @returns {?RegExp}\r\n */\r\nexport function mergeRegexps(arr) {\r\n if (!arr) {\r\n return null;\r\n }\r\n const pattern = arr\r\n .map((regexpOrString) => regexpOrString.source || regexpOrString)\r\n .join('|');\r\n return pattern ? new RegExp(`(${pattern})`) : null;\r\n}\r\n\r\n/**\r\n * Replace text matched by a regexp with placeholders.\r\n *\r\n * @param {string} text\r\n * @param {RegExp} regexp\r\n * @param {string[]} hidden\r\n * @param {boolean} useAlternativeMarker\r\n * @returns {string}\r\n */\r\nexport function hideText(text, regexp, hidden, useAlternativeMarker) {\r\n return text.replace(regexp, (s, pre, textToHide) => {\r\n // If there is no groups, the offset is the second argument.\r\n if (typeof pre === 'number') {\r\n pre = '';\r\n textToHide = '';\r\n }\r\n // Handle tables separately\r\n return (\r\n (pre || '') +\r\n (useAlternativeMarker ? '\\x03' : '\\x01') +\r\n hidden.push(textToHide || s) +\r\n (useAlternativeMarker ? '\\x04' : '\\x02')\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Replace placeholders created by {@link module:util.hide}.\r\n *\r\n * @param {string} text\r\n * @param {string[]} hidden\r\n * @returns {string}\r\n */\r\nexport function unhideText(text, hidden) {\r\n while (text.match(/(?:\\x01|\\x03)\\d+(?:\\x02|\\x04)/)) {\r\n text = text.replace(/(?:\\x01|\\x03)(\\d+)(?:\\x02|\\x04)/g, (s, num) => hidden[num - 1]);\r\n }\r\n\r\n return text;\r\n}\r\n\r\n/**\r\n * Save the scroll position to restore it later with {@link module:util.restoreScrollPosition}.\r\n */\r\nexport function saveScrollPosition() {\r\n keptScrollPosition = window.pageYOffset;\r\n}\r\n\r\n/**\r\n * Restore the scroll position saved in {@link module:util.saveScrollPosition}.\r\n */\r\nexport function restoreScrollPosition() {\r\n if (keptScrollPosition === null) return;\r\n window.scrollTo(0, keptScrollPosition);\r\n keptScrollPosition = null;\r\n}\r\n","function _classPrivateFieldGet(receiver, privateMap) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n\n if (descriptor.get) {\n return descriptor.get.call(receiver);\n }\n\n return descriptor.value;\n}\n\nmodule.exports = _classPrivateFieldGet;","/**\r\n * Custom error class.\r\n *\r\n * @module CdError\r\n */\r\nexport default class CdError extends Error {\r\n constructor(data) {\r\n let message;\r\n if (data) {\r\n message = data.type;\r\n if (data.code) {\r\n message += `/${data.code}`;\r\n }\r\n if (data?.apiData?.error?.code) {\r\n message += `/${data.apiData.error.code}`;\r\n }\r\n } else {\r\n message = '';\r\n }\r\n super(message);\r\n this.name = 'CdError';\r\n this.data = data;\r\n }\r\n}\r\n","/**\r\n * Comment timestamp and author processing utilities. These are mostly format conversion utilities.\r\n * Listing of different formats of dates, digits, and timezones together with regexp and parser\r\n * generators go in {@link module:dateFormat}. Functions related to wikitext parsing go in {@link\r\n * module:wikitext}.\r\n *\r\n * Terminology used here (and in other modules):\r\n * - \"date\" is a `Date` object,\r\n * - \"timestamp\" is a string date as it is present on wiki pages (`23:29, 10 May 2019 (UTC)`).\r\n *\r\n * @module timestamp\r\n */\r\n\r\nimport cd from './cd';\r\nimport { getMessages, spacesToUnderlines } from './util';\r\n\r\nlet parseTimestampRegexp;\r\nlet parseTimestampRegexpNoTimezone;\r\n\r\n/**\r\n * @typedef {object} ParseTimestampReturn\r\n * @property {Date} date\r\n * @property {object} match\r\n */\r\n\r\n/**\r\n * Parse a timestamp, and return a date and the match object.\r\n *\r\n * @param {string} timestamp\r\n * @param {number} [timezoneOffset=0] Timezone offset in minutes.\r\n * @returns {?ParseTimestampReturn}\r\n */\r\nexport function parseTimestamp(timestamp, timezoneOffset) {\r\n // Creating these regexp every time takes too long, so we cache them.\r\n if (!parseTimestampRegexp) {\r\n parseTimestampRegexp = new RegExp(`^([^]*)(${cd.g.TIMESTAMP_REGEXP.source})`);\r\n }\r\n if (!parseTimestampRegexpNoTimezone) {\r\n parseTimestampRegexpNoTimezone = (\r\n new RegExp(`^([^]*)(${cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.source})`)\r\n );\r\n }\r\n\r\n const regexp = timezoneOffset === undefined ?\r\n parseTimestampRegexp :\r\n parseTimestampRegexpNoTimezone;\r\n const match = timestamp.match(regexp);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n let date = cd.g.TIMESTAMP_PARSER(match, cd);\r\n if (timezoneOffset) {\r\n date = new Date(date.getTime() - timezoneOffset * cd.g.MILLISECONDS_IN_A_MINUTE);\r\n }\r\n\r\n return { date, match };\r\n}\r\n\r\n/**\r\n * Pad a number with zeros like this: `4` → `04` or `0004`.\r\n *\r\n * @param {number} number Number to pad.\r\n * @param {number} length Length of the resultant string.\r\n * @returns {string}\r\n * @private\r\n */\r\nfunction zeroPad(number, length) {\r\n return ('0000' + number).slice(-length);\r\n}\r\n\r\n/**\r\n * Convert a date to a string in the timestamp format.\r\n *\r\n * @param {Date} date\r\n * @returns {string}\r\n */\r\nexport function formatDate(date) {\r\n const format = cd.g.DATE_FORMAT;\r\n\r\n let s = '';\r\n\r\n for (let p = 0; p < format.length; p++) {\r\n let code = format[p];\r\n if (code === 'x' && p < format.length - 1) {\r\n code += format[++p];\r\n }\r\n if (code === 'xk' && p < format.length - 1) {\r\n code += format[++p];\r\n }\r\n\r\n switch (code) {\r\n case 'xx':\r\n s += 'x';\r\n break;\r\n case 'xg':\r\n s += getMessages([\r\n 'january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',\r\n 'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen'\r\n ])[date.getUTCMonth()];\r\n break;\r\n case 'd':\r\n s += zeroPad(date.getUTCDate(), 2);\r\n break;\r\n case 'D':\r\n s += getMessages(['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'])[date.getUTCDay()];\r\n break;\r\n case 'j':\r\n s += date.getUTCDate();\r\n break;\r\n case 'l':\r\n s += getMessages([\r\n 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'\r\n ])[date.getDay()];\r\n break;\r\n case 'F':\r\n s += getMessages([\r\n 'january', 'february', 'march', 'april', 'may_long', 'june', 'july', 'august',\r\n 'september', 'october', 'november', 'december'\r\n ])[date.getUTCMonth()];\r\n break;\r\n case 'M':\r\n s += getMessages([\r\n 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'\r\n ])[date.getUTCMonth()];\r\n break;\r\n case 'n':\r\n s += date.getUTCMonth() + 1;\r\n break;\r\n case 'Y':\r\n s += date.getUTCFullYear();\r\n break;\r\n case 'xkY':\r\n s += date.getUTCFullYear() + 543;\r\n break;\r\n case 'G':\r\n s += date.getUTCHours();\r\n break;\r\n case 'H':\r\n s += zeroPad(date.getUTCHours(), 2);\r\n break;\r\n case 'i':\r\n s += zeroPad(date.getUTCMinutes(), 2);\r\n break;\r\n case '\\\\':\r\n // Backslash escaping\r\n if (p < format.length - 1) {\r\n s += format[++p];\r\n } else {\r\n s += '\\\\';\r\n }\r\n break;\r\n case '\"':\r\n // Quoted literal\r\n if (p < format.length - 1) {\r\n const endQuote = format.indexOf('\"', p + 1)\r\n if (endQuote === -1) {\r\n // No terminating quote, assume literal \"\r\n s += '\"';\r\n } else {\r\n s += format.substr(p + 1, endQuote - p - 1);\r\n p = endQuote;\r\n }\r\n } else {\r\n // Quote at end of string, assume literal \"\r\n s += '\"';\r\n }\r\n break;\r\n default:\r\n s += format[p];\r\n }\r\n }\r\n\r\n return s;\r\n}\r\n\r\n/**\r\n * Generate a comment anchor from a date and author.\r\n *\r\n * @param {Date} date\r\n * @param {string} [author]\r\n * @param {boolean} [resolveCollisions=false] If set to `true`, anchors that collide with anchors\r\n * already registered via {@link module:timestamp.registerCommentAnchor} will get a `_<number>`\r\n * postfix.\r\n * @returns {string}\r\n */\r\nexport function generateCommentAnchor(date, author, resolveCollisions = false) {\r\n let year = date.getUTCFullYear();\r\n let month = date.getUTCMonth();\r\n let day = date.getUTCDate();\r\n let hours = date.getUTCHours();\r\n let minutes = date.getUTCMinutes();\r\n\r\n let anchor = (\r\n zeroPad(year, 4) +\r\n zeroPad(month + 1, 2) +\r\n zeroPad(day, 2) +\r\n zeroPad(hours, 2) +\r\n zeroPad(minutes, 2) +\r\n (author ? '_' + spacesToUnderlines(author) : '')\r\n );\r\n if (resolveCollisions && commentAnchors.includes(anchor)) {\r\n let anchorNum = 2;\r\n const base = anchor;\r\n do {\r\n anchor = `${base}_${anchorNum}`;\r\n anchorNum++;\r\n } while (commentAnchors.includes(anchor));\r\n }\r\n return anchor;\r\n}\r\n\r\nlet commentAnchors = [];\r\n\r\n/**\r\n * Add a comment anchor to the registry to avoid collisions.\r\n *\r\n * @param {string} anchor\r\n */\r\nexport function registerCommentAnchor(anchor) {\r\n if (anchor) {\r\n commentAnchors.push(anchor);\r\n }\r\n}\r\n\r\n/**\r\n * Empty the comment anchor registry.\r\n *\r\n * Meant to be executed any time we start processing a new page. If we forget to run it, the newly\r\n * registered anchors can get extra `_2` or similar text at the end due to collisions with the\r\n * existing anchors that were not unloaded.\r\n */\r\nexport function resetCommentAnchors() {\r\n commentAnchors = [];\r\n}\r\n\r\n/**\r\n * @typedef {object} ParseCommentAnchorReturn\r\n * @property {Date} date\r\n * @property {string} author\r\n */\r\n\r\n/**\r\n * Extract a date and author from a comment anchor.\r\n *\r\n * @param {string} commentAnchor\r\n * @returns {?ParseCommentAnchorReturn}\r\n */\r\nexport function parseCommentAnchor(commentAnchor) {\r\n const match = commentAnchor.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})_(.+)$/);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const year = Number(match[1]);\r\n const month = Number(match[2]) - 1;\r\n const day = Number(match[3]);\r\n const hours = Number(match[4]);\r\n const minutes = Number(match[5]);\r\n const author = match[6];\r\n\r\n const date = new Date(Date.UTC(year, month, day, hours, minutes));\r\n\r\n return { date, author };\r\n}\r\n","\"use strict\";\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Parser_1 = require(\"./Parser\");\nexports.Parser = Parser_1.Parser;\nvar domhandler_1 = require(\"domhandler\");\nexports.DomHandler = domhandler_1.DomHandler;\nexports.DefaultHandler = domhandler_1.DomHandler;\n// Helper methods\n/**\n * Parses data, returns the resulting DOM.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM builder.\n */\nfunction parseDOM(data, options) {\n var handler = new domhandler_1.DomHandler(void 0, options);\n new Parser_1.Parser(handler, options).end(data);\n return handler.dom;\n}\nexports.parseDOM = parseDOM;\n/**\n * Creates a parser instance, with an attached DOM handler.\n *\n * @param cb A callback that will be called once parsing has been completed.\n * @param options Optional options for the parser and DOM builder.\n * @param elementCb An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nfunction createDomStream(cb, options, elementCb) {\n var handler = new domhandler_1.DomHandler(cb, options, elementCb);\n return new Parser_1.Parser(handler, options);\n}\nexports.createDomStream = createDomStream;\nvar Tokenizer_1 = require(\"./Tokenizer\");\nexports.Tokenizer = Tokenizer_1.default;\nvar ElementType = __importStar(require(\"domelementtype\"));\nexports.ElementType = ElementType;\n/**\n * List of all events that the parser emits.\n *\n * Format: eventname: number of arguments.\n */\nexports.EVENTS = {\n attribute: 2,\n cdatastart: 0,\n cdataend: 0,\n text: 1,\n processinginstruction: 2,\n comment: 1,\n commentend: 0,\n closetag: 1,\n opentag: 2,\n opentagname: 1,\n error: 1,\n end: 0\n};\n/*\n All of the following exports exist for backwards-compatibility.\n They should probably be removed eventually.\n*/\n__export(require(\"./FeedHandler\"));\n__export(require(\"./WritableStream\"));\n__export(require(\"./CollectingHandler\"));\nvar DomUtils = __importStar(require(\"domutils\"));\nexports.DomUtils = DomUtils;\nvar FeedHandler_1 = require(\"./FeedHandler\");\nexports.RssHandler = FeedHandler_1.FeedHandler;\n","/**\r\n * Tree walker classes.\r\n *\r\n * @module treeWalker\r\n */\r\n\r\nimport cd from './cd';\r\n\r\n/**\r\n * Generalization and simplification of the TreeWalker web API for the normal and worker contexts.\r\n */\r\nexport class TreeWalker {\r\n /**\r\n * Create a tree walker.\r\n *\r\n * @param {Node} root Node that limits where the tree walker can go within this document's tree:\r\n * only the root node and its descendants.\r\n * @param {Function} [acceptNode] Function that returns `true` if the tree walker should accept\r\n * the node, and `false` if it should reject.\r\n * @param {boolean} [onlyElementNodes=false] Walk only on element nodes, ignoring nodes of other\r\n * types.\r\n * @param {Node} [startNode=root] Node to set as a current node.\r\n */\r\n constructor(root, acceptNode, onlyElementNodes = false, startNode = root) {\r\n this.acceptNode = acceptNode;\r\n this.root = root;\r\n this.currentNode = startNode;\r\n\r\n if (onlyElementNodes) {\r\n this.firstChildProperty = 'firstElementChild';\r\n this.lastChildProperty = 'lastElementChild';\r\n this.previousSiblingProperty = 'previousElementSibling';\r\n this.nextSiblingProperty = 'nextElementSibling';\r\n } else {\r\n this.firstChildProperty = 'firstChild';\r\n this.lastChildProperty = 'lastChild';\r\n this.previousSiblingProperty = 'previousSibling';\r\n this.nextSiblingProperty = 'nextSibling';\r\n }\r\n }\r\n\r\n /**\r\n * Try changing the current node to a node specified by the property.\r\n *\r\n * @param {string} property\r\n * @returns {?Node}\r\n * @private\r\n */\r\n tryMove(property) {\r\n let node = this.currentNode;\r\n if (node === this.root && !property.includes('Child')) {\r\n return null;\r\n }\r\n do {\r\n node = node[property];\r\n } while (node && this.acceptNode && !this.acceptNode(node));\r\n if (node) {\r\n this.currentNode = node;\r\n }\r\n return node || null;\r\n }\r\n\r\n /**\r\n * Go to the parent node.\r\n *\r\n * @returns {?Node}\r\n */\r\n parentNode() {\r\n return this.tryMove('parentNode');\r\n }\r\n\r\n /**\r\n * Go to the first child node.\r\n *\r\n * @returns {?Node}\r\n */\r\n firstChild() {\r\n return this.tryMove(this.firstChildProperty);\r\n }\r\n\r\n /**\r\n * Go to the last child node.\r\n *\r\n * @returns {?Node}\r\n */\r\n lastChild() {\r\n return this.tryMove(this.lastChildProperty);\r\n }\r\n\r\n /**\r\n * Go to the previous sibling node.\r\n *\r\n * @returns {?Node}\r\n */\r\n previousSibling() {\r\n return this.tryMove(this.previousSiblingProperty);\r\n }\r\n\r\n /**\r\n * Go to the next sibling node.\r\n *\r\n * @returns {?Node}\r\n */\r\n nextSibling() {\r\n return this.tryMove(this.nextSiblingProperty);\r\n }\r\n\r\n /**\r\n * Go to the next node (don't confuse with the next sibling).\r\n *\r\n * @returns {?Node}\r\n */\r\n nextNode() {\r\n let node = this.currentNode;\r\n do {\r\n if (node[this.firstChildProperty]) {\r\n node = node[this.firstChildProperty];\r\n } else {\r\n while (node && !node[this.nextSiblingProperty] && node.parentNode !== this.root) {\r\n node = node.parentNode;\r\n }\r\n if (node) {\r\n node = node[this.nextSiblingProperty];\r\n }\r\n }\r\n } while (node && this.acceptNode && !this.acceptNode(node));\r\n if (node) {\r\n this.currentNode = node;\r\n }\r\n return node;\r\n }\r\n\r\n /**\r\n * Go to the previous node (don't confuse with the previous sibling).\r\n *\r\n * @returns {?Node}\r\n */\r\n previousNode() {\r\n let node = this.currentNode;\r\n if (node === this.root) return;\r\n do {\r\n if (node[this.previousSiblingProperty]) {\r\n node = node[this.previousSiblingProperty];\r\n while (node[this.lastChildProperty]) {\r\n node = node[this.lastChildProperty];\r\n }\r\n } else {\r\n node = node.parentNode;\r\n }\r\n } while (node && this.acceptNode && !this.acceptNode(node));\r\n if (node) {\r\n this.currentNode = node;\r\n }\r\n return node;\r\n }\r\n}\r\n\r\n/**\r\n * Tree walker that walks only on element nodes of the current document and ignores \"style\" and\r\n * \"link\" elements.\r\n *\r\n * @augments module:treeWalker.TreeWalker\r\n */\r\nexport class ElementsTreeWalker extends TreeWalker {\r\n /**\r\n * Create an elements {@link module:treeWalker.TreeWalker tree walker}.\r\n *\r\n * @param {Node} [startNode]\r\n */\r\n constructor(startNode) {\r\n super(\r\n cd.g.rootElement,\r\n (node) => !['STYLE', 'LINK'].includes(node.tagName),\r\n true\r\n );\r\n if (startNode) {\r\n this.currentNode = startNode;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Tree walker that walks on both element and text nodes of the current document and ignores\r\n * \"style\" and \"link\" elements.\r\n *\r\n * @augments module:treeWalker.TreeWalker\r\n */\r\nexport class ElementsAndTextTreeWalker extends TreeWalker {\r\n /**\r\n * Create an elements and text {@link module:treeWalker.TreeWalker tree walker}.\r\n *\r\n * @param {Node} [startNode]\r\n */\r\n constructor(startNode) {\r\n super(\r\n cd.g.rootElement,\r\n (node) => (\r\n node.nodeType === Node.TEXT_NODE ||\r\n (node.nodeType === Node.ELEMENT_NODE && !['STYLE', 'LINK'].includes(node.tagName))\r\n )\r\n );\r\n if (startNode) {\r\n this.currentNode = startNode;\r\n }\r\n }\r\n}\r\n","function _classPrivateFieldSet(receiver, privateMap, value) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n\n if (descriptor.set) {\n descriptor.set.call(receiver, value);\n } else {\n if (!descriptor.writable) {\n throw new TypeError(\"attempted to set read only private field\");\n }\n\n descriptor.value = value;\n }\n\n return value;\n}\n\nmodule.exports = _classPrivateFieldSet;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar domelementtype_1 = require(\"domelementtype\");\nfunction isTag(node) {\n return domelementtype_1.isTag(node);\n}\nexports.isTag = isTag;\nfunction isCDATA(node) {\n return \"cdata\" /* CDATA */ === node.type;\n}\nexports.isCDATA = isCDATA;\nfunction isText(node) {\n return node.type === \"text\" /* Text */;\n}\nexports.isText = isText;\nfunction isComment(node) {\n return node.type === \"comment\" /* Comment */;\n}\nexports.isComment = isComment;\nfunction hasChildren(node) {\n return Object.prototype.hasOwnProperty.call(node, \"children\");\n}\nexports.hasChildren = hasChildren;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nfunction isTag(elem) {\n return (elem.type === \"tag\" /* Tag */ ||\n elem.type === \"script\" /* Script */ ||\n elem.type === \"style\" /* Style */);\n}\nexports.isTag = isTag;\n// Exports for backwards compatibility\nexports.Text = \"text\" /* Text */; //Text\nexports.Directive = \"directive\" /* Directive */; //<? ... ?>\nexports.Comment = \"comment\" /* Comment */; //<!-- ... -->\nexports.Script = \"script\" /* Script */; //<script> tags\nexports.Style = \"style\" /* Style */; //<style> tags\nexports.Tag = \"tag\" /* Tag */; //Any tag\nexports.CDATA = \"cdata\" /* CDATA */; //<![CDATA[ ... ]]>\nexports.Doctype = \"doctype\" /* Doctype */;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Tokenizer_1 = __importDefault(require(\"./Tokenizer\"));\nvar events_1 = require(\"events\");\nvar formTags = new Set([\n \"input\",\n \"option\",\n \"optgroup\",\n \"select\",\n \"button\",\n \"datalist\",\n \"textarea\"\n]);\nvar pTag = new Set([\"p\"]);\nvar openImpliesClose = {\n tr: new Set([\"tr\", \"th\", \"td\"]),\n th: new Set([\"th\"]),\n td: new Set([\"thead\", \"th\", \"td\"]),\n body: new Set([\"head\", \"link\", \"script\"]),\n li: new Set([\"li\"]),\n p: pTag,\n h1: pTag,\n h2: pTag,\n h3: pTag,\n h4: pTag,\n h5: pTag,\n h6: pTag,\n select: formTags,\n input: formTags,\n output: formTags,\n button: formTags,\n datalist: formTags,\n textarea: formTags,\n option: new Set([\"option\"]),\n optgroup: new Set([\"optgroup\", \"option\"]),\n dd: new Set([\"dt\", \"dd\"]),\n dt: new Set([\"dt\", \"dd\"]),\n address: pTag,\n article: pTag,\n aside: pTag,\n blockquote: pTag,\n details: pTag,\n div: pTag,\n dl: pTag,\n fieldset: pTag,\n figcaption: pTag,\n figure: pTag,\n footer: pTag,\n form: pTag,\n header: pTag,\n hr: pTag,\n main: pTag,\n nav: pTag,\n ol: pTag,\n pre: pTag,\n section: pTag,\n table: pTag,\n ul: pTag,\n rt: new Set([\"rt\", \"rp\"]),\n rp: new Set([\"rt\", \"rp\"]),\n tbody: new Set([\"thead\", \"tbody\"]),\n tfoot: new Set([\"thead\", \"tbody\"])\n};\nvar voidElements = new Set([\n \"area\",\n \"base\",\n \"basefont\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"frame\",\n \"hr\",\n \"img\",\n \"input\",\n \"isindex\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\"\n]);\nvar foreignContextElements = new Set([\"math\", \"svg\"]);\nvar htmlIntegrationElements = new Set([\n \"mi\",\n \"mo\",\n \"mn\",\n \"ms\",\n \"mtext\",\n \"annotation-xml\",\n \"foreignObject\",\n \"desc\",\n \"title\"\n]);\nvar reNameEnd = /\\s|\\//;\nvar Parser = /** @class */ (function (_super) {\n __extends(Parser, _super);\n function Parser(cbs, options) {\n var _this = _super.call(this) || this;\n _this._tagname = \"\";\n _this._attribname = \"\";\n _this._attribvalue = \"\";\n _this._attribs = null;\n _this._stack = [];\n _this._foreignContext = [];\n _this.startIndex = 0;\n _this.endIndex = null;\n // Aliases for backwards compatibility\n _this.parseChunk = Parser.prototype.write;\n _this.done = Parser.prototype.end;\n _this._options = options || {};\n _this._cbs = cbs || {};\n _this._tagname = \"\";\n _this._attribname = \"\";\n _this._attribvalue = \"\";\n _this._attribs = null;\n _this._stack = [];\n _this._foreignContext = [];\n _this.startIndex = 0;\n _this.endIndex = null;\n _this._lowerCaseTagNames =\n \"lowerCaseTags\" in _this._options\n ? !!_this._options.lowerCaseTags\n : !_this._options.xmlMode;\n _this._lowerCaseAttributeNames =\n \"lowerCaseAttributeNames\" in _this._options\n ? !!_this._options.lowerCaseAttributeNames\n : !_this._options.xmlMode;\n _this._tokenizer = new (_this._options.Tokenizer || Tokenizer_1.default)(_this._options, _this);\n if (_this._cbs.onparserinit)\n _this._cbs.onparserinit(_this);\n return _this;\n }\n Parser.prototype._updatePosition = function (initialOffset) {\n if (this.endIndex === null) {\n if (this._tokenizer._sectionStart <= initialOffset) {\n this.startIndex = 0;\n }\n else {\n this.startIndex = this._tokenizer._sectionStart - initialOffset;\n }\n }\n else\n this.startIndex = this.endIndex + 1;\n this.endIndex = this._tokenizer.getAbsoluteIndex();\n };\n //Tokenizer event handlers\n Parser.prototype.ontext = function (data) {\n this._updatePosition(1);\n // @ts-ignore\n this.endIndex--;\n if (this._cbs.ontext)\n this._cbs.ontext(data);\n };\n Parser.prototype.onopentagname = function (name) {\n if (this._lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n this._tagname = name;\n if (!this._options.xmlMode &&\n Object.prototype.hasOwnProperty.call(openImpliesClose, name)) {\n for (var el = void 0; \n // @ts-ignore\n openImpliesClose[name].has((el = this._stack[this._stack.length - 1])); this.onclosetag(el))\n ;\n }\n if (this._options.xmlMode || !voidElements.has(name)) {\n this._stack.push(name);\n if (foreignContextElements.has(name)) {\n this._foreignContext.push(true);\n }\n else if (htmlIntegrationElements.has(name)) {\n this._foreignContext.push(false);\n }\n }\n if (this._cbs.onopentagname)\n this._cbs.onopentagname(name);\n if (this._cbs.onopentag)\n this._attribs = {};\n };\n Parser.prototype.onopentagend = function () {\n this._updatePosition(1);\n if (this._attribs) {\n if (this._cbs.onopentag) {\n this._cbs.onopentag(this._tagname, this._attribs);\n }\n this._attribs = null;\n }\n if (!this._options.xmlMode &&\n this._cbs.onclosetag &&\n voidElements.has(this._tagname)) {\n this._cbs.onclosetag(this._tagname);\n }\n this._tagname = \"\";\n };\n Parser.prototype.onclosetag = function (name) {\n this._updatePosition(1);\n if (this._lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n if (foreignContextElements.has(name) ||\n htmlIntegrationElements.has(name)) {\n this._foreignContext.pop();\n }\n if (this._stack.length &&\n (this._options.xmlMode || !voidElements.has(name))) {\n var pos = this._stack.lastIndexOf(name);\n if (pos !== -1) {\n if (this._cbs.onclosetag) {\n pos = this._stack.length - pos;\n // @ts-ignore\n while (pos--)\n this._cbs.onclosetag(this._stack.pop());\n }\n else\n this._stack.length = pos;\n }\n else if (name === \"p\" && !this._options.xmlMode) {\n this.onopentagname(name);\n this._closeCurrentTag();\n }\n }\n else if (!this._options.xmlMode && (name === \"br\" || name === \"p\")) {\n this.onopentagname(name);\n this._closeCurrentTag();\n }\n };\n Parser.prototype.onselfclosingtag = function () {\n if (this._options.xmlMode ||\n this._options.recognizeSelfClosing ||\n this._foreignContext[this._foreignContext.length - 1]) {\n this._closeCurrentTag();\n }\n else {\n this.onopentagend();\n }\n };\n Parser.prototype._closeCurrentTag = function () {\n var name = this._tagname;\n this.onopentagend();\n //self-closing tags will be on the top of the stack\n //(cheaper check than in onclosetag)\n if (this._stack[this._stack.length - 1] === name) {\n if (this._cbs.onclosetag) {\n this._cbs.onclosetag(name);\n }\n this._stack.pop();\n }\n };\n Parser.prototype.onattribname = function (name) {\n if (this._lowerCaseAttributeNames) {\n name = name.toLowerCase();\n }\n this._attribname = name;\n };\n Parser.prototype.onattribdata = function (value) {\n this._attribvalue += value;\n };\n Parser.prototype.onattribend = function () {\n if (this._cbs.onattribute)\n this._cbs.onattribute(this._attribname, this._attribvalue);\n if (this._attribs &&\n !Object.prototype.hasOwnProperty.call(this._attribs, this._attribname)) {\n this._attribs[this._attribname] = this._attribvalue;\n }\n this._attribname = \"\";\n this._attribvalue = \"\";\n };\n Parser.prototype._getInstructionName = function (value) {\n var idx = value.search(reNameEnd);\n var name = idx < 0 ? value : value.substr(0, idx);\n if (this._lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n return name;\n };\n Parser.prototype.ondeclaration = function (value) {\n if (this._cbs.onprocessinginstruction) {\n var name_1 = this._getInstructionName(value);\n this._cbs.onprocessinginstruction(\"!\" + name_1, \"!\" + value);\n }\n };\n Parser.prototype.onprocessinginstruction = function (value) {\n if (this._cbs.onprocessinginstruction) {\n var name_2 = this._getInstructionName(value);\n this._cbs.onprocessinginstruction(\"?\" + name_2, \"?\" + value);\n }\n };\n Parser.prototype.oncomment = function (value) {\n this._updatePosition(4);\n if (this._cbs.oncomment)\n this._cbs.oncomment(value);\n if (this._cbs.oncommentend)\n this._cbs.oncommentend();\n };\n Parser.prototype.oncdata = function (value) {\n this._updatePosition(1);\n if (this._options.xmlMode || this._options.recognizeCDATA) {\n if (this._cbs.oncdatastart)\n this._cbs.oncdatastart();\n if (this._cbs.ontext)\n this._cbs.ontext(value);\n if (this._cbs.oncdataend)\n this._cbs.oncdataend();\n }\n else {\n this.oncomment(\"[CDATA[\" + value + \"]]\");\n }\n };\n Parser.prototype.onerror = function (err) {\n if (this._cbs.onerror)\n this._cbs.onerror(err);\n };\n Parser.prototype.onend = function () {\n if (this._cbs.onclosetag) {\n for (var i = this._stack.length; i > 0; this._cbs.onclosetag(this._stack[--i]))\n ;\n }\n if (this._cbs.onend)\n this._cbs.onend();\n };\n //Resets the parser to a blank state, ready to parse a new HTML document\n Parser.prototype.reset = function () {\n if (this._cbs.onreset)\n this._cbs.onreset();\n this._tokenizer.reset();\n this._tagname = \"\";\n this._attribname = \"\";\n this._attribs = null;\n this._stack = [];\n if (this._cbs.onparserinit)\n this._cbs.onparserinit(this);\n };\n //Parses a complete HTML document and pushes it to the handler\n Parser.prototype.parseComplete = function (data) {\n this.reset();\n this.end(data);\n };\n Parser.prototype.write = function (chunk) {\n this._tokenizer.write(chunk);\n };\n Parser.prototype.end = function (chunk) {\n this._tokenizer.end(chunk);\n };\n Parser.prototype.pause = function () {\n this._tokenizer.pause();\n };\n Parser.prototype.resume = function () {\n this._tokenizer.resume();\n };\n return Parser;\n}(events_1.EventEmitter));\nexports.Parser = Parser;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_codepoint_1 = __importDefault(require(\"entities/lib/decode_codepoint\"));\nvar entities_json_1 = __importDefault(require(\"entities/lib/maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"entities/lib/maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"entities/lib/maps/xml.json\"));\nfunction whitespace(c) {\n return c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\f\" || c === \"\\r\";\n}\nfunction ifElseState(upper, SUCCESS, FAILURE) {\n var lower = upper.toLowerCase();\n if (upper === lower) {\n return function (t, c) {\n if (c === lower) {\n t._state = SUCCESS;\n }\n else {\n t._state = FAILURE;\n t._index--;\n }\n };\n }\n else {\n return function (t, c) {\n if (c === lower || c === upper) {\n t._state = SUCCESS;\n }\n else {\n t._state = FAILURE;\n t._index--;\n }\n };\n }\n}\nfunction consumeSpecialNameChar(upper, NEXT_STATE) {\n var lower = upper.toLowerCase();\n return function (t, c) {\n if (c === lower || c === upper) {\n t._state = NEXT_STATE;\n }\n else {\n t._state = 3 /* InTagName */;\n t._index--; //consume the token again\n }\n };\n}\nvar stateBeforeCdata1 = ifElseState(\"C\", 23 /* BeforeCdata2 */, 16 /* InDeclaration */);\nvar stateBeforeCdata2 = ifElseState(\"D\", 24 /* BeforeCdata3 */, 16 /* InDeclaration */);\nvar stateBeforeCdata3 = ifElseState(\"A\", 25 /* BeforeCdata4 */, 16 /* InDeclaration */);\nvar stateBeforeCdata4 = ifElseState(\"T\", 26 /* BeforeCdata5 */, 16 /* InDeclaration */);\nvar stateBeforeCdata5 = ifElseState(\"A\", 27 /* BeforeCdata6 */, 16 /* InDeclaration */);\nvar stateBeforeScript1 = consumeSpecialNameChar(\"R\", 34 /* BeforeScript2 */);\nvar stateBeforeScript2 = consumeSpecialNameChar(\"I\", 35 /* BeforeScript3 */);\nvar stateBeforeScript3 = consumeSpecialNameChar(\"P\", 36 /* BeforeScript4 */);\nvar stateBeforeScript4 = consumeSpecialNameChar(\"T\", 37 /* BeforeScript5 */);\nvar stateAfterScript1 = ifElseState(\"R\", 39 /* AfterScript2 */, 1 /* Text */);\nvar stateAfterScript2 = ifElseState(\"I\", 40 /* AfterScript3 */, 1 /* Text */);\nvar stateAfterScript3 = ifElseState(\"P\", 41 /* AfterScript4 */, 1 /* Text */);\nvar stateAfterScript4 = ifElseState(\"T\", 42 /* AfterScript5 */, 1 /* Text */);\nvar stateBeforeStyle1 = consumeSpecialNameChar(\"Y\", 44 /* BeforeStyle2 */);\nvar stateBeforeStyle2 = consumeSpecialNameChar(\"L\", 45 /* BeforeStyle3 */);\nvar stateBeforeStyle3 = consumeSpecialNameChar(\"E\", 46 /* BeforeStyle4 */);\nvar stateAfterStyle1 = ifElseState(\"Y\", 48 /* AfterStyle2 */, 1 /* Text */);\nvar stateAfterStyle2 = ifElseState(\"L\", 49 /* AfterStyle3 */, 1 /* Text */);\nvar stateAfterStyle3 = ifElseState(\"E\", 50 /* AfterStyle4 */, 1 /* Text */);\nvar stateBeforeEntity = ifElseState(\"#\", 52 /* BeforeNumericEntity */, 53 /* InNamedEntity */);\nvar stateBeforeNumericEntity = ifElseState(\"X\", 55 /* InHexEntity */, 54 /* InNumericEntity */);\nvar Tokenizer = /** @class */ (function () {\n function Tokenizer(options, cbs) {\n /** The current state the tokenizer is in. */\n this._state = 1 /* Text */;\n /** The read buffer. */\n this._buffer = \"\";\n /** The beginning of the section that is currently being read. */\n this._sectionStart = 0;\n /** The index within the buffer that we are currently looking at. */\n this._index = 0;\n /**\n * Data that has already been processed will be removed from the buffer occasionally.\n * `_bufferOffset` keeps track of how many characters have been removed, to make sure position information is accurate.\n */\n this._bufferOffset = 0;\n /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n this._baseState = 1 /* Text */;\n /** For special parsing behavior inside of script and style tags. */\n this._special = 1 /* None */;\n /** Indicates whether the tokenizer has been paused. */\n this._running = true;\n /** Indicates whether the tokenizer has finished running / `.end` has been called. */\n this._ended = false;\n this._cbs = cbs;\n this._xmlMode = !!(options && options.xmlMode);\n this._decodeEntities = !!(options && options.decodeEntities);\n }\n Tokenizer.prototype.reset = function () {\n this._state = 1 /* Text */;\n this._buffer = \"\";\n this._sectionStart = 0;\n this._index = 0;\n this._bufferOffset = 0;\n this._baseState = 1 /* Text */;\n this._special = 1 /* None */;\n this._running = true;\n this._ended = false;\n };\n Tokenizer.prototype._stateText = function (c) {\n if (c === \"<\") {\n if (this._index > this._sectionStart) {\n this._cbs.ontext(this._getSection());\n }\n this._state = 2 /* BeforeTagName */;\n this._sectionStart = this._index;\n }\n else if (this._decodeEntities &&\n this._special === 1 /* None */ &&\n c === \"&\") {\n if (this._index > this._sectionStart) {\n this._cbs.ontext(this._getSection());\n }\n this._baseState = 1 /* Text */;\n this._state = 51 /* BeforeEntity */;\n this._sectionStart = this._index;\n }\n };\n Tokenizer.prototype._stateBeforeTagName = function (c) {\n if (c === \"/\") {\n this._state = 5 /* BeforeClosingTagName */;\n }\n else if (c === \"<\") {\n this._cbs.ontext(this._getSection());\n this._sectionStart = this._index;\n }\n else if (c === \">\" ||\n this._special !== 1 /* None */ ||\n whitespace(c)) {\n this._state = 1 /* Text */;\n }\n else if (c === \"!\") {\n this._state = 15 /* BeforeDeclaration */;\n this._sectionStart = this._index + 1;\n }\n else if (c === \"?\") {\n this._state = 17 /* InProcessingInstruction */;\n this._sectionStart = this._index + 1;\n }\n else {\n this._state =\n !this._xmlMode && (c === \"s\" || c === \"S\")\n ? 31 /* BeforeSpecial */\n : 3 /* InTagName */;\n this._sectionStart = this._index;\n }\n };\n Tokenizer.prototype._stateInTagName = function (c) {\n if (c === \"/\" || c === \">\" || whitespace(c)) {\n this._emitToken(\"onopentagname\");\n this._state = 8 /* BeforeAttributeName */;\n this._index--;\n }\n };\n Tokenizer.prototype._stateBeforeClosingTagName = function (c) {\n if (whitespace(c)) {\n // ignore\n }\n else if (c === \">\") {\n this._state = 1 /* Text */;\n }\n else if (this._special !== 1 /* None */) {\n if (c === \"s\" || c === \"S\") {\n this._state = 32 /* BeforeSpecialEnd */;\n }\n else {\n this._state = 1 /* Text */;\n this._index--;\n }\n }\n else {\n this._state = 6 /* InClosingTagName */;\n this._sectionStart = this._index;\n }\n };\n Tokenizer.prototype._stateInClosingTagName = function (c) {\n if (c === \">\" || whitespace(c)) {\n this._emitToken(\"onclosetag\");\n this._state = 7 /* AfterClosingTagName */;\n this._index--;\n }\n };\n Tokenizer.prototype._stateAfterClosingTagName = function (c) {\n //skip everything until \">\"\n if (c === \">\") {\n this._state = 1 /* Text */;\n this._sectionStart = this._index + 1;\n }\n };\n Tokenizer.prototype._stateBeforeAttributeName = function (c) {\n if (c === \">\") {\n this._cbs.onopentagend();\n this._state = 1 /* Text */;\n this._sectionStart = this._index + 1;\n }\n else if (c === \"/\") {\n this._state = 4 /* InSelfClosingTag */;\n }\n else if (!whitespace(c)) {\n this._state = 9 /* InAttributeName */;\n this._sectionStart = this._index;\n }\n };\n Tokenizer.prototype._stateInSelfClosingTag = function (c) {\n if (c === \">\") {\n this._cbs.onselfclosingtag();\n this._state = 1 /* Text */;\n this._sectionStart = this._index + 1;\n }\n else if (!whitespace(c)) {\n this._state = 8 /* BeforeAttributeName */;\n this._index--;\n }\n };\n Tokenizer.prototype._stateInAttributeName = function (c) {\n if (c === \"=\" || c === \"/\" || c === \">\" || whitespace(c)) {\n this._cbs.onattribname(this._getSection());\n this._sectionStart = -1;\n this._state = 10 /* AfterAttributeName */;\n this._index--;\n }\n };\n Tokenizer.prototype._stateAfterAttributeName = function (c) {\n if (c === \"=\") {\n this._state = 11 /* BeforeAttributeValue */;\n }\n else if (c === \"/\" || c === \">\") {\n this._cbs.onattribend();\n this._state = 8 /* BeforeAttributeName */;\n this._index--;\n }\n else if (!whitespace(c)) {\n this._cbs.onattribend();\n this._state = 9 /* InAttributeName */;\n this._sectionStart = this._index;\n }\n };\n Tokenizer.prototype._stateBeforeAttributeValue = function (c) {\n if (c === '\"') {\n this._state = 12 /* InAttributeValueDq */;\n this._sectionStart = this._index + 1;\n }\n else if (c === \"'\") {\n this._state = 13 /* InAttributeValueSq */;\n this._sectionStart = this._index + 1;\n }\n else if (!whitespace(c)) {\n this._state = 14 /* InAttributeValueNq */;\n this._sectionStart = this._index;\n this._index--; //reconsume token\n }\n };\n Tokenizer.prototype._stateInAttributeValueDoubleQuotes = function (c) {\n if (c === '\"') {\n this._emitToken(\"onattribdata\");\n this._cbs.onattribend();\n this._state = 8 /* BeforeAttributeName */;\n }\n else if (this._decodeEntities && c === \"&\") {\n this._emitToken(\"onattribdata\");\n this._baseState = this._state;\n this._state = 51 /* BeforeEntity */;\n this._sectionStart = this._index;\n }\n };\n Tokenizer.prototype._stateInAttributeValueSingleQuotes = function (c) {\n if (c === \"'\") {\n this._emitToken(\"onattribdata\");\n this._cbs.onattribend();\n this._state = 8 /* BeforeAttributeName */;\n }\n else if (this._decodeEntities && c === \"&\") {\n this._emitToken(\"onattribdata\");\n this._baseState = this._state;\n this._state = 51 /* BeforeEntity */;\n this._sectionStart = this._index;\n }\n };\n Tokenizer.prototype._stateInAttributeValueNoQuotes = function (c) {\n if (whitespace(c) || c === \">\") {\n this._emitToken(\"onattribdata\");\n this._cbs.onattribend();\n this._state = 8 /* BeforeAttributeName */;\n this._index--;\n }\n else if (this._decodeEntities && c === \"&\") {\n this._emitToken(\"onattribdata\");\n this._baseState = this._state;\n this._state = 51 /* BeforeEntity */;\n this._sectionStart = this._index;\n }\n };\n Tokenizer.prototype._stateBeforeDeclaration = function (c) {\n this._state =\n c === \"[\"\n ? 22 /* BeforeCdata1 */\n : c === \"-\"\n ? 18 /* BeforeComment */\n : 16 /* InDeclaration */;\n };\n Tokenizer.prototype._stateInDeclaration = function (c) {\n if (c === \">\") {\n this._cbs.ondeclaration(this._getSection());\n this._state = 1 /* Text */;\n this._sectionStart = this._index + 1;\n }\n };\n Tokenizer.prototype._stateInProcessingInstruction = function (c) {\n if (c === \">\") {\n this._cbs.onprocessinginstruction(this._getSection());\n this._state = 1 /* Text */;\n this._sectionStart = this._index + 1;\n }\n };\n Tokenizer.prototype._stateBeforeComment = function (c) {\n if (c === \"-\") {\n this._state = 19 /* InComment */;\n this._sectionStart = this._index + 1;\n }\n else {\n this._state = 16 /* InDeclaration */;\n }\n };\n Tokenizer.prototype._stateInComment = function (c) {\n if (c === \"-\")\n this._state = 20 /* AfterComment1 */;\n };\n Tokenizer.prototype._stateAfterComment1 = function (c) {\n if (c === \"-\") {\n this._state = 21 /* AfterComment2 */;\n }\n else {\n this._state = 19 /* InComment */;\n }\n };\n Tokenizer.prototype._stateAfterComment2 = function (c) {\n if (c === \">\") {\n //remove 2 trailing chars\n this._cbs.oncomment(this._buffer.substring(this._sectionStart, this._index - 2));\n this._state = 1 /* Text */;\n this._sectionStart = this._index + 1;\n }\n else if (c !== \"-\") {\n this._state = 19 /* InComment */;\n }\n // else: stay in AFTER_COMMENT_2 (`--->`)\n };\n Tokenizer.prototype._stateBeforeCdata6 = function (c) {\n if (c === \"[\") {\n this._state = 28 /* InCdata */;\n this._sectionStart = this._index + 1;\n }\n else {\n this._state = 16 /* InDeclaration */;\n this._index--;\n }\n };\n Tokenizer.prototype._stateInCdata = function (c) {\n if (c === \"]\")\n this._state = 29 /* AfterCdata1 */;\n };\n Tokenizer.prototype._stateAfterCdata1 = function (c) {\n if (c === \"]\")\n this._state = 30 /* AfterCdata2 */;\n else\n this._state = 28 /* InCdata */;\n };\n Tokenizer.prototype._stateAfterCdata2 = function (c) {\n if (c === \">\") {\n //remove 2 trailing chars\n this._cbs.oncdata(this._buffer.substring(this._sectionStart, this._index - 2));\n this._state = 1 /* Text */;\n this._sectionStart = this._index + 1;\n }\n else if (c !== \"]\") {\n this._state = 28 /* InCdata */;\n }\n //else: stay in AFTER_CDATA_2 (`]]]>`)\n };\n Tokenizer.prototype._stateBeforeSpecial = function (c) {\n if (c === \"c\" || c === \"C\") {\n this._state = 33 /* BeforeScript1 */;\n }\n else if (c === \"t\" || c === \"T\") {\n this._state = 43 /* BeforeStyle1 */;\n }\n else {\n this._state = 3 /* InTagName */;\n this._index--; //consume the token again\n }\n };\n Tokenizer.prototype._stateBeforeSpecialEnd = function (c) {\n if (this._special === 2 /* Script */ && (c === \"c\" || c === \"C\")) {\n this._state = 38 /* AfterScript1 */;\n }\n else if (this._special === 3 /* Style */ &&\n (c === \"t\" || c === \"T\")) {\n this._state = 47 /* AfterStyle1 */;\n }\n else\n this._state = 1 /* Text */;\n };\n Tokenizer.prototype._stateBeforeScript5 = function (c) {\n if (c === \"/\" || c === \">\" || whitespace(c)) {\n this._special = 2 /* Script */;\n }\n this._state = 3 /* InTagName */;\n this._index--; //consume the token again\n };\n Tokenizer.prototype._stateAfterScript5 = function (c) {\n if (c === \">\" || whitespace(c)) {\n this._special = 1 /* None */;\n this._state = 6 /* InClosingTagName */;\n this._sectionStart = this._index - 6;\n this._index--; //reconsume the token\n }\n else\n this._state = 1 /* Text */;\n };\n Tokenizer.prototype._stateBeforeStyle4 = function (c) {\n if (c === \"/\" || c === \">\" || whitespace(c)) {\n this._special = 3 /* Style */;\n }\n this._state = 3 /* InTagName */;\n this._index--; //consume the token again\n };\n Tokenizer.prototype._stateAfterStyle4 = function (c) {\n if (c === \">\" || whitespace(c)) {\n this._special = 1 /* None */;\n this._state = 6 /* InClosingTagName */;\n this._sectionStart = this._index - 5;\n this._index--; //reconsume the token\n }\n else\n this._state = 1 /* Text */;\n };\n //for entities terminated with a semicolon\n Tokenizer.prototype._parseNamedEntityStrict = function () {\n //offset = 1\n if (this._sectionStart + 1 < this._index) {\n var entity = this._buffer.substring(this._sectionStart + 1, this._index), map = this._xmlMode ? xml_json_1.default : entities_json_1.default;\n if (Object.prototype.hasOwnProperty.call(map, entity)) {\n // @ts-ignore\n this._emitPartial(map[entity]);\n this._sectionStart = this._index + 1;\n }\n }\n };\n //parses legacy entities (without trailing semicolon)\n Tokenizer.prototype._parseLegacyEntity = function () {\n var start = this._sectionStart + 1;\n var limit = this._index - start;\n if (limit > 6)\n limit = 6; // The max length of legacy entities is 6\n while (limit >= 2) {\n // The min length of legacy entities is 2\n var entity = this._buffer.substr(start, limit);\n if (Object.prototype.hasOwnProperty.call(legacy_json_1.default, entity)) {\n // @ts-ignore\n this._emitPartial(legacy_json_1.default[entity]);\n this._sectionStart += limit + 1;\n return;\n }\n else {\n limit--;\n }\n }\n };\n Tokenizer.prototype._stateInNamedEntity = function (c) {\n if (c === \";\") {\n this._parseNamedEntityStrict();\n if (this._sectionStart + 1 < this._index && !this._xmlMode) {\n this._parseLegacyEntity();\n }\n this._state = this._baseState;\n }\n else if ((c < \"a\" || c > \"z\") &&\n (c < \"A\" || c > \"Z\") &&\n (c < \"0\" || c > \"9\")) {\n if (this._xmlMode || this._sectionStart + 1 === this._index) {\n // ignore\n }\n else if (this._baseState !== 1 /* Text */) {\n if (c !== \"=\") {\n this._parseNamedEntityStrict();\n }\n }\n else {\n this._parseLegacyEntity();\n }\n this._state = this._baseState;\n this._index--;\n }\n };\n Tokenizer.prototype._decodeNumericEntity = function (offset, base) {\n var sectionStart = this._sectionStart + offset;\n if (sectionStart !== this._index) {\n //parse entity\n var entity = this._buffer.substring(sectionStart, this._index);\n var parsed = parseInt(entity, base);\n this._emitPartial(decode_codepoint_1.default(parsed));\n this._sectionStart = this._index;\n }\n else {\n this._sectionStart--;\n }\n this._state = this._baseState;\n };\n Tokenizer.prototype._stateInNumericEntity = function (c) {\n if (c === \";\") {\n this._decodeNumericEntity(2, 10);\n this._sectionStart++;\n }\n else if (c < \"0\" || c > \"9\") {\n if (!this._xmlMode) {\n this._decodeNumericEntity(2, 10);\n }\n else {\n this._state = this._baseState;\n }\n this._index--;\n }\n };\n Tokenizer.prototype._stateInHexEntity = function (c) {\n if (c === \";\") {\n this._decodeNumericEntity(3, 16);\n this._sectionStart++;\n }\n else if ((c < \"a\" || c > \"f\") &&\n (c < \"A\" || c > \"F\") &&\n (c < \"0\" || c > \"9\")) {\n if (!this._xmlMode) {\n this._decodeNumericEntity(3, 16);\n }\n else {\n this._state = this._baseState;\n }\n this._index--;\n }\n };\n Tokenizer.prototype._cleanup = function () {\n if (this._sectionStart < 0) {\n this._buffer = \"\";\n this._bufferOffset += this._index;\n this._index = 0;\n }\n else if (this._running) {\n if (this._state === 1 /* Text */) {\n if (this._sectionStart !== this._index) {\n this._cbs.ontext(this._buffer.substr(this._sectionStart));\n }\n this._buffer = \"\";\n this._bufferOffset += this._index;\n this._index = 0;\n }\n else if (this._sectionStart === this._index) {\n //the section just started\n this._buffer = \"\";\n this._bufferOffset += this._index;\n this._index = 0;\n }\n else {\n //remove everything unnecessary\n this._buffer = this._buffer.substr(this._sectionStart);\n this._index -= this._sectionStart;\n this._bufferOffset += this._sectionStart;\n }\n this._sectionStart = 0;\n }\n };\n //TODO make events conditional\n Tokenizer.prototype.write = function (chunk) {\n if (this._ended)\n this._cbs.onerror(Error(\".write() after done!\"));\n this._buffer += chunk;\n this._parse();\n };\n // Iterates through the buffer, calling the function corresponding to the current state.\n // States that are more likely to be hit are higher up, as a performance improvement.\n Tokenizer.prototype._parse = function () {\n while (this._index < this._buffer.length && this._running) {\n var c = this._buffer.charAt(this._index);\n if (this._state === 1 /* Text */) {\n this._stateText(c);\n }\n else if (this._state === 12 /* InAttributeValueDq */) {\n this._stateInAttributeValueDoubleQuotes(c);\n }\n else if (this._state === 9 /* InAttributeName */) {\n this._stateInAttributeName(c);\n }\n else if (this._state === 19 /* InComment */) {\n this._stateInComment(c);\n }\n else if (this._state === 8 /* BeforeAttributeName */) {\n this._stateBeforeAttributeName(c);\n }\n else if (this._state === 3 /* InTagName */) {\n this._stateInTagName(c);\n }\n else if (this._state === 6 /* InClosingTagName */) {\n this._stateInClosingTagName(c);\n }\n else if (this._state === 2 /* BeforeTagName */) {\n this._stateBeforeTagName(c);\n }\n else if (this._state === 10 /* AfterAttributeName */) {\n this._stateAfterAttributeName(c);\n }\n else if (this._state === 13 /* InAttributeValueSq */) {\n this._stateInAttributeValueSingleQuotes(c);\n }\n else if (this._state === 11 /* BeforeAttributeValue */) {\n this._stateBeforeAttributeValue(c);\n }\n else if (this._state === 5 /* BeforeClosingTagName */) {\n this._stateBeforeClosingTagName(c);\n }\n else if (this._state === 7 /* AfterClosingTagName */) {\n this._stateAfterClosingTagName(c);\n }\n else if (this._state === 31 /* BeforeSpecial */) {\n this._stateBeforeSpecial(c);\n }\n else if (this._state === 20 /* AfterComment1 */) {\n this._stateAfterComment1(c);\n }\n else if (this._state === 14 /* InAttributeValueNq */) {\n this._stateInAttributeValueNoQuotes(c);\n }\n else if (this._state === 4 /* InSelfClosingTag */) {\n this._stateInSelfClosingTag(c);\n }\n else if (this._state === 16 /* InDeclaration */) {\n this._stateInDeclaration(c);\n }\n else if (this._state === 15 /* BeforeDeclaration */) {\n this._stateBeforeDeclaration(c);\n }\n else if (this._state === 21 /* AfterComment2 */) {\n this._stateAfterComment2(c);\n }\n else if (this._state === 18 /* BeforeComment */) {\n this._stateBeforeComment(c);\n }\n else if (this._state === 32 /* BeforeSpecialEnd */) {\n this._stateBeforeSpecialEnd(c);\n }\n else if (this._state === 38 /* AfterScript1 */) {\n stateAfterScript1(this, c);\n }\n else if (this._state === 39 /* AfterScript2 */) {\n stateAfterScript2(this, c);\n }\n else if (this._state === 40 /* AfterScript3 */) {\n stateAfterScript3(this, c);\n }\n else if (this._state === 33 /* BeforeScript1 */) {\n stateBeforeScript1(this, c);\n }\n else if (this._state === 34 /* BeforeScript2 */) {\n stateBeforeScript2(this, c);\n }\n else if (this._state === 35 /* BeforeScript3 */) {\n stateBeforeScript3(this, c);\n }\n else if (this._state === 36 /* BeforeScript4 */) {\n stateBeforeScript4(this, c);\n }\n else if (this._state === 37 /* BeforeScript5 */) {\n this._stateBeforeScript5(c);\n }\n else if (this._state === 41 /* AfterScript4 */) {\n stateAfterScript4(this, c);\n }\n else if (this._state === 42 /* AfterScript5 */) {\n this._stateAfterScript5(c);\n }\n else if (this._state === 43 /* BeforeStyle1 */) {\n stateBeforeStyle1(this, c);\n }\n else if (this._state === 28 /* InCdata */) {\n this._stateInCdata(c);\n }\n else if (this._state === 44 /* BeforeStyle2 */) {\n stateBeforeStyle2(this, c);\n }\n else if (this._state === 45 /* BeforeStyle3 */) {\n stateBeforeStyle3(this, c);\n }\n else if (this._state === 46 /* BeforeStyle4 */) {\n this._stateBeforeStyle4(c);\n }\n else if (this._state === 47 /* AfterStyle1 */) {\n stateAfterStyle1(this, c);\n }\n else if (this._state === 48 /* AfterStyle2 */) {\n stateAfterStyle2(this, c);\n }\n else if (this._state === 49 /* AfterStyle3 */) {\n stateAfterStyle3(this, c);\n }\n else if (this._state === 50 /* AfterStyle4 */) {\n this._stateAfterStyle4(c);\n }\n else if (this._state === 17 /* InProcessingInstruction */) {\n this._stateInProcessingInstruction(c);\n }\n else if (this._state === 53 /* InNamedEntity */) {\n this._stateInNamedEntity(c);\n }\n else if (this._state === 22 /* BeforeCdata1 */) {\n stateBeforeCdata1(this, c);\n }\n else if (this._state === 51 /* BeforeEntity */) {\n stateBeforeEntity(this, c);\n }\n else if (this._state === 23 /* BeforeCdata2 */) {\n stateBeforeCdata2(this, c);\n }\n else if (this._state === 24 /* BeforeCdata3 */) {\n stateBeforeCdata3(this, c);\n }\n else if (this._state === 29 /* AfterCdata1 */) {\n this._stateAfterCdata1(c);\n }\n else if (this._state === 30 /* AfterCdata2 */) {\n this._stateAfterCdata2(c);\n }\n else if (this._state === 25 /* BeforeCdata4 */) {\n stateBeforeCdata4(this, c);\n }\n else if (this._state === 26 /* BeforeCdata5 */) {\n stateBeforeCdata5(this, c);\n }\n else if (this._state === 27 /* BeforeCdata6 */) {\n this._stateBeforeCdata6(c);\n }\n else if (this._state === 55 /* InHexEntity */) {\n this._stateInHexEntity(c);\n }\n else if (this._state === 54 /* InNumericEntity */) {\n this._stateInNumericEntity(c);\n }\n else if (this._state === 52 /* BeforeNumericEntity */) {\n stateBeforeNumericEntity(this, c);\n }\n else {\n this._cbs.onerror(Error(\"unknown _state\"), this._state);\n }\n this._index++;\n }\n this._cleanup();\n };\n Tokenizer.prototype.pause = function () {\n this._running = false;\n };\n Tokenizer.prototype.resume = function () {\n this._running = true;\n if (this._index < this._buffer.length) {\n this._parse();\n }\n if (this._ended) {\n this._finish();\n }\n };\n Tokenizer.prototype.end = function (chunk) {\n if (this._ended)\n this._cbs.onerror(Error(\".end() after done!\"));\n if (chunk)\n this.write(chunk);\n this._ended = true;\n if (this._running)\n this._finish();\n };\n Tokenizer.prototype._finish = function () {\n //if there is remaining data, emit it in a reasonable way\n if (this._sectionStart < this._index) {\n this._handleTrailingData();\n }\n this._cbs.onend();\n };\n Tokenizer.prototype._handleTrailingData = function () {\n var data = this._buffer.substr(this._sectionStart);\n if (this._state === 28 /* InCdata */ ||\n this._state === 29 /* AfterCdata1 */ ||\n this._state === 30 /* AfterCdata2 */) {\n this._cbs.oncdata(data);\n }\n else if (this._state === 19 /* InComment */ ||\n this._state === 20 /* AfterComment1 */ ||\n this._state === 21 /* AfterComment2 */) {\n this._cbs.oncomment(data);\n }\n else if (this._state === 53 /* InNamedEntity */ && !this._xmlMode) {\n this._parseLegacyEntity();\n if (this._sectionStart < this._index) {\n this._state = this._baseState;\n this._handleTrailingData();\n }\n }\n else if (this._state === 54 /* InNumericEntity */ && !this._xmlMode) {\n this._decodeNumericEntity(2, 10);\n if (this._sectionStart < this._index) {\n this._state = this._baseState;\n this._handleTrailingData();\n }\n }\n else if (this._state === 55 /* InHexEntity */ && !this._xmlMode) {\n this._decodeNumericEntity(3, 16);\n if (this._sectionStart < this._index) {\n this._state = this._baseState;\n this._handleTrailingData();\n }\n }\n else if (this._state !== 3 /* InTagName */ &&\n this._state !== 8 /* BeforeAttributeName */ &&\n this._state !== 11 /* BeforeAttributeValue */ &&\n this._state !== 10 /* AfterAttributeName */ &&\n this._state !== 9 /* InAttributeName */ &&\n this._state !== 13 /* InAttributeValueSq */ &&\n this._state !== 12 /* InAttributeValueDq */ &&\n this._state !== 14 /* InAttributeValueNq */ &&\n this._state !== 6 /* InClosingTagName */) {\n this._cbs.ontext(data);\n }\n //else, ignore remaining data\n //TODO add a way to remove current tag\n };\n Tokenizer.prototype.getAbsoluteIndex = function () {\n return this._bufferOffset + this._index;\n };\n Tokenizer.prototype._getSection = function () {\n return this._buffer.substring(this._sectionStart, this._index);\n };\n Tokenizer.prototype._emitToken = function (name) {\n this._cbs[name](this._getSection());\n this._sectionStart = -1;\n };\n Tokenizer.prototype._emitPartial = function (value) {\n if (this._baseState !== 1 /* Text */) {\n this._cbs.onattribdata(value); //TODO implement the new event\n }\n else {\n this._cbs.ontext(value);\n }\n };\n return Tokenizer;\n}());\nexports.default = Tokenizer;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault(require(\"./maps/decode.json\"));\n// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nfunction decodeCodePoint(codePoint) {\n if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n return \"\\uFFFD\";\n }\n if (codePoint in decode_json_1.default) {\n // @ts-ignore\n codePoint = decode_json_1.default[codePoint];\n }\n var output = \"\";\n if (codePoint > 0xffff) {\n codePoint -= 0x10000;\n output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n codePoint = 0xdc00 | (codePoint & 0x3ff);\n }\n output += String.fromCharCode(codePoint);\n return output;\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar node_1 = require(\"./node\");\nexports.Node = node_1.Node;\nexports.Element = node_1.Element;\nexports.DataNode = node_1.DataNode;\nexports.NodeWithChildren = node_1.NodeWithChildren;\nvar reWhitespace = /\\s+/g;\n// Default options\nvar defaultOpts = {\n normalizeWhitespace: false,\n withStartIndices: false,\n withEndIndices: false\n};\nvar DomHandler = /** @class */ (function () {\n /**\n * Initiate a new DomHandler.\n *\n * @param callback Called once parsing has completed.\n * @param options Settings for the handler.\n * @param elementCB Callback whenever a tag is closed.\n */\n function DomHandler(callback, options, elementCB) {\n /** The constructed DOM */\n this.dom = [];\n /** Indicated whether parsing has been completed. */\n this._done = false;\n /** Stack of open tags. */\n this._tagStack = [];\n /** A data node that is still being written to. */\n this._lastNode = null;\n /** Reference to the parser instance. Used for location information. */\n this._parser = null;\n // Make it possible to skip arguments, for backwards-compatibility\n if (typeof options === \"function\") {\n elementCB = options;\n options = defaultOpts;\n }\n if (typeof callback === \"object\") {\n options = callback;\n callback = undefined;\n }\n this._callback = callback || null;\n this._options = options || defaultOpts;\n this._elementCB = elementCB || null;\n }\n DomHandler.prototype.onparserinit = function (parser) {\n this._parser = parser;\n };\n // Resets the handler back to starting state\n DomHandler.prototype.onreset = function () {\n this.dom = [];\n this._done = false;\n this._tagStack = [];\n this._lastNode = null;\n this._parser = this._parser || null;\n };\n // Signals the handler that parsing is done\n DomHandler.prototype.onend = function () {\n if (this._done)\n return;\n this._done = true;\n this._parser = null;\n this.handleCallback(null);\n };\n DomHandler.prototype.onerror = function (error) {\n this.handleCallback(error);\n };\n DomHandler.prototype.onclosetag = function () {\n this._lastNode = null;\n // If(this._tagStack.pop().name !== name) this.handleCallback(Error(\"Tagname didn't match!\"));\n var elem = this._tagStack.pop();\n if (!elem || !this._parser) {\n return;\n }\n if (this._options.withEndIndices) {\n elem.endIndex = this._parser.endIndex;\n }\n if (this._elementCB)\n this._elementCB(elem);\n };\n DomHandler.prototype.onopentag = function (name, attribs) {\n var element = new node_1.Element(name, attribs);\n this.addNode(element);\n this._tagStack.push(element);\n };\n DomHandler.prototype.ontext = function (data) {\n var normalize = this._options.normalizeWhitespace;\n var _lastNode = this._lastNode;\n if (_lastNode && _lastNode.type === \"text\" /* Text */) {\n if (normalize) {\n _lastNode.data = (_lastNode.data + data).replace(reWhitespace, \" \");\n }\n else {\n _lastNode.data += data;\n }\n }\n else {\n if (normalize) {\n data = data.replace(reWhitespace, \" \");\n }\n var node = new node_1.DataNode(\"text\" /* Text */, data);\n this.addNode(node);\n this._lastNode = node;\n }\n };\n DomHandler.prototype.oncomment = function (data) {\n if (this._lastNode && this._lastNode.type === \"comment\" /* Comment */) {\n this._lastNode.data += data;\n return;\n }\n var node = new node_1.DataNode(\"comment\" /* Comment */, data);\n this.addNode(node);\n this._lastNode = node;\n };\n DomHandler.prototype.oncommentend = function () {\n this._lastNode = null;\n };\n DomHandler.prototype.oncdatastart = function () {\n var text = new node_1.DataNode(\"text\" /* Text */, \"\");\n var node = new node_1.NodeWithChildren(\"cdata\" /* CDATA */, [text]);\n this.addNode(node);\n text.parent = node;\n this._lastNode = text;\n };\n DomHandler.prototype.oncdataend = function () {\n this._lastNode = null;\n };\n DomHandler.prototype.onprocessinginstruction = function (name, data) {\n var node = new node_1.ProcessingInstruction(name, data);\n this.addNode(node);\n };\n DomHandler.prototype.handleCallback = function (error) {\n if (typeof this._callback === \"function\") {\n this._callback(error, this.dom);\n }\n else if (error) {\n throw error;\n }\n };\n DomHandler.prototype.addNode = function (node) {\n var parent = this._tagStack[this._tagStack.length - 1];\n var siblings = parent ? parent.children : this.dom;\n var previousSibling = siblings[siblings.length - 1];\n if (this._parser) {\n if (this._options.withStartIndices) {\n node.startIndex = this._parser.startIndex;\n }\n if (this._options.withEndIndices) {\n node.endIndex = this._parser.endIndex;\n }\n }\n siblings.push(node);\n if (previousSibling) {\n node.prev = previousSibling;\n previousSibling.next = node;\n }\n if (parent) {\n node.parent = parent;\n }\n this._lastNode = null;\n };\n DomHandler.prototype.addDataNode = function (node) {\n this.addNode(node);\n this._lastNode = node;\n };\n return DomHandler;\n}());\nexports.DomHandler = DomHandler;\nexports.default = DomHandler;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar domhandler_1 = __importDefault(require(\"domhandler\"));\nvar DomUtils = __importStar(require(\"domutils\"));\nvar Parser_1 = require(\"./Parser\");\n//TODO: Consume data as it is coming in\nvar FeedHandler = /** @class */ (function (_super) {\n __extends(FeedHandler, _super);\n /**\n *\n * @param callback\n * @param options\n */\n function FeedHandler(callback, options) {\n var _this = this;\n if (typeof callback === \"object\" && callback !== null) {\n callback = undefined;\n options = callback;\n }\n _this = _super.call(this, callback, options) || this;\n return _this;\n }\n FeedHandler.prototype.onend = function () {\n var feed = {};\n var feedRoot = getOneElement(isValidFeed, this.dom);\n if (feedRoot) {\n if (feedRoot.name === \"feed\") {\n var childs = feedRoot.children;\n feed.type = \"atom\";\n addConditionally(feed, \"id\", \"id\", childs);\n addConditionally(feed, \"title\", \"title\", childs);\n var href = getAttribute(\"href\", getOneElement(\"link\", childs));\n if (href) {\n feed.link = href;\n }\n addConditionally(feed, \"description\", \"subtitle\", childs);\n var updated = fetch(\"updated\", childs);\n if (updated) {\n feed.updated = new Date(updated);\n }\n addConditionally(feed, \"author\", \"email\", childs, true);\n feed.items = getElements(\"entry\", childs).map(function (item) {\n var entry = {};\n var children = item.children;\n addConditionally(entry, \"id\", \"id\", children);\n addConditionally(entry, \"title\", \"title\", children);\n var href = getAttribute(\"href\", getOneElement(\"link\", children));\n if (href) {\n entry.link = href;\n }\n var description = fetch(\"summary\", children) ||\n fetch(\"content\", children);\n if (description) {\n entry.description = description;\n }\n var pubDate = fetch(\"updated\", children);\n if (pubDate) {\n entry.pubDate = new Date(pubDate);\n }\n return entry;\n });\n }\n else {\n var childs = getOneElement(\"channel\", feedRoot.children)\n .children;\n feed.type = feedRoot.name.substr(0, 3);\n feed.id = \"\";\n addConditionally(feed, \"title\", \"title\", childs);\n addConditionally(feed, \"link\", \"link\", childs);\n addConditionally(feed, \"description\", \"description\", childs);\n var updated = fetch(\"lastBuildDate\", childs);\n if (updated) {\n feed.updated = new Date(updated);\n }\n addConditionally(feed, \"author\", \"managingEditor\", childs, true);\n feed.items = getElements(\"item\", feedRoot.children).map(function (item) {\n var entry = {};\n var children = item.children;\n addConditionally(entry, \"id\", \"guid\", children);\n addConditionally(entry, \"title\", \"title\", children);\n addConditionally(entry, \"link\", \"link\", children);\n addConditionally(entry, \"description\", \"description\", children);\n var pubDate = fetch(\"pubDate\", children);\n if (pubDate)\n entry.pubDate = new Date(pubDate);\n return entry;\n });\n }\n }\n this.feed = feed;\n this.handleCallback(feedRoot ? null : Error(\"couldn't find root of feed\"));\n };\n return FeedHandler;\n}(domhandler_1.default));\nexports.FeedHandler = FeedHandler;\nfunction getElements(what, where) {\n return DomUtils.getElementsByTagName(what, where, true);\n}\nfunction getOneElement(what, where) {\n return DomUtils.getElementsByTagName(what, where, true, 1)[0];\n}\nfunction fetch(what, where, recurse) {\n if (recurse === void 0) { recurse = false; }\n return DomUtils.getText(DomUtils.getElementsByTagName(what, where, recurse, 1)).trim();\n}\nfunction getAttribute(name, elem) {\n if (!elem) {\n return null;\n }\n var attribs = elem.attribs;\n return attribs[name];\n}\nfunction addConditionally(obj, prop, what, where, recurse) {\n if (recurse === void 0) { recurse = false; }\n var tmp = fetch(what, where, recurse);\n // @ts-ignore\n if (tmp)\n obj[prop] = tmp;\n}\nfunction isValidFeed(value) {\n return value === \"rss\" || value === \"feed\" || value === \"rdf:RDF\";\n}\nvar defaultOptions = { xmlMode: true };\n/**\n * Parse a feed.\n *\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this option, you probably want to set `xmlMode` to `true`.\n */\nfunction parseFeed(feed, options) {\n if (options === void 0) { options = defaultOptions; }\n var handler = new FeedHandler(options);\n new Parser_1.Parser(handler, options).end(feed);\n return handler.feed;\n}\nexports.parseFeed = parseFeed;\n","\"use strict\";\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./stringify\"));\n__export(require(\"./traversal\"));\n__export(require(\"./manipulation\"));\n__export(require(\"./querying\"));\n__export(require(\"./legacy\"));\n__export(require(\"./helpers\"));\n__export(require(\"./tagtypes\"));\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"./maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nexports.decodeXML = getStrictDecoder(xml_json_1.default);\nexports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\nfunction getStrictDecoder(map) {\n var keys = Object.keys(map).join(\"|\");\n var replace = getReplacer(map);\n keys += \"|#[xX][\\\\da-fA-F]+|#\\\\d+\";\n var re = new RegExp(\"&(?:\" + keys + \");\", \"g\");\n return function (str) { return String(str).replace(re, replace); };\n}\nvar sorter = function (a, b) { return (a < b ? 1 : -1); };\nexports.decodeHTML = (function () {\n var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n var keys = Object.keys(entities_json_1.default).sort(sorter);\n for (var i = 0, j = 0; i < keys.length; i++) {\n if (legacy[j] === keys[i]) {\n keys[i] += \";?\";\n j++;\n }\n else {\n keys[i] += \";\";\n }\n }\n var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n var replace = getReplacer(entities_json_1.default);\n function replacer(str) {\n if (str.substr(-1) !== \";\")\n str += \";\";\n return replace(str);\n }\n //TODO consider creating a merged map\n return function (str) {\n return String(str).replace(re, replacer);\n };\n})();\nfunction getReplacer(map) {\n return function replace(str) {\n if (str.charAt(1) === \"#\") {\n if (str.charAt(2) === \"X\" || str.charAt(2) === \"x\") {\n return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n }\n return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n }\n return map[str.slice(1, -1)];\n };\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\nexports.encodeXML = getInverse(inverseXML, xmlReplacer);\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\nexports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\nfunction getInverseObj(obj) {\n return Object.keys(obj)\n .sort()\n .reduce(function (inverse, name) {\n inverse[obj[name]] = \"&\" + name + \";\";\n return inverse;\n }, {});\n}\nfunction getInverseReplacer(inverse) {\n var single = [];\n var multiple = [];\n Object.keys(inverse).forEach(function (k) {\n return k.length === 1\n ? // Add value to single array\n single.push(\"\\\\\" + k)\n : // Add value to multiple array\n multiple.push(k);\n });\n //TODO add ranges\n multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n return new RegExp(multiple.join(\"|\"), \"g\");\n}\nvar reNonASCII = /[^\\0-\\x7F]/g;\nvar reAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\nfunction singleCharReplacer(c) {\n return \"&#x\" + c\n .charCodeAt(0)\n .toString(16)\n .toUpperCase() + \";\";\n}\n// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\nfunction astralReplacer(c, _) {\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n var high = c.charCodeAt(0);\n var low = c.charCodeAt(1);\n var codePoint = (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000;\n return \"&#x\" + codePoint.toString(16).toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n return function (data) {\n return data\n .replace(re, function (name) { return inverse[name]; })\n .replace(reAstralSymbols, astralReplacer)\n .replace(reNonASCII, singleCharReplacer);\n };\n}\nvar reXmlChars = getInverseReplacer(inverseXML);\nfunction escape(data) {\n return data\n .replace(reXmlChars, singleCharReplacer)\n .replace(reAstralSymbols, astralReplacer)\n .replace(reNonASCII, singleCharReplacer);\n}\nexports.escape = escape;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tagtypes_1 = require(\"./tagtypes\");\nfunction filter(test, element, recurse, limit) {\n if (recurse === void 0) { recurse = true; }\n if (limit === void 0) { limit = Infinity; }\n if (!Array.isArray(element))\n element = [element];\n return find(test, element, recurse, limit);\n}\nexports.filter = filter;\nfunction find(test, elems, recurse, limit) {\n var result = [];\n for (var i = 0; i < elems.length; i++) {\n var elem = elems[i];\n if (test(elem)) {\n result.push(elem);\n if (--limit <= 0)\n break;\n }\n if (recurse && tagtypes_1.hasChildren(elem) && elem.children.length > 0) {\n var children = find(test, elem.children, recurse, limit);\n result = result.concat(children);\n limit -= children.length;\n if (limit <= 0)\n break;\n }\n }\n return result;\n}\nexports.find = find;\nfunction findOneChild(test, elems) {\n for (var i = 0; i < elems.length; i++) {\n if (test(elems[i]))\n return elems[i];\n }\n return null;\n}\nexports.findOneChild = findOneChild;\nfunction findOne(test, elems, recurse) {\n if (recurse === void 0) { recurse = true; }\n var elem = null;\n for (var i = 0; i < elems.length && !elem; i++) {\n var checked = elems[i];\n if (!tagtypes_1.isTag(checked)) {\n continue;\n }\n else if (test(checked)) {\n elem = checked;\n }\n else if (recurse && checked.children.length > 0) {\n elem = findOne(test, checked.children);\n }\n }\n return elem;\n}\nexports.findOne = findOne;\nfunction existsOne(test, elems) {\n for (var i = 0; i < elems.length; i++) {\n var checked = elems[i];\n if (tagtypes_1.isTag(checked) &&\n (test(checked) ||\n (checked.children.length > 0 &&\n existsOne(test, checked.children)))) {\n return true;\n }\n }\n return false;\n}\nexports.existsOne = existsOne;\nfunction findAll(test, rootElems) {\n var result = [];\n var stack = rootElems.slice();\n while (stack.length) {\n var elem = stack.shift();\n if (!elem || !tagtypes_1.isTag(elem))\n continue;\n if (elem.children && elem.children.length > 0) {\n stack.unshift.apply(stack, elem.children);\n }\n if (test(elem))\n result.push(elem);\n }\n return result;\n}\nexports.findAll = findAll;\n","/**\r\n * To-be-properties of the {@link module:cd~convenientDiscussions.g} object. These are those of them\r\n * that are known from the beginning and can be safely imported in a web worker (that doesn't have\r\n * access to the window scope). We assume that there is no point to make these properties subject to\r\n * change by site administrators although that may be disputable. Some of them are extensible in the\r\n * config (such as `UNHIGHLIGHTABLE_ELEMENTS_CLASSES`).\r\n *\r\n * @module staticGlobals\r\n */\r\n\r\n/**\r\n * Properties of the `convenientDiscussions.g` object (incomplete list). Static (i.e., known from\r\n * the beginning) ones are declared in {@link module:staticGlobals}.\r\n *\r\n * @namespace g\r\n * @memberof module:cd~convenientDiscussions\r\n */\r\n\r\nexport default {\r\n /**\r\n * A replacement for {@link\r\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes\r\n * unicode property escapes} while they are not supported in major browsers. {@link\r\n * https://github.com/slevithan/xregexp} can be used also.\r\n *\r\n * @type {string}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n LETTER_PATTERN: 'A-Za-z\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B4\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0AF9\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58-\\\\u0C5A\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D5F-\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F5\\\\u13F8-\\\\u13FD\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16F1-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FD5\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6E5\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA7AD\\\\uA7B0-\\\\uA7B7\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA8FD\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB65\\\\uAB70-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC',\r\n\r\n /**\r\n * Underlay color for focused (hovered) comments.\r\n *\r\n * @type {string}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n COMMENT_UNDERLAY_FOCUSED_COLOR: '#eaf3ff',\r\n\r\n /**\r\n * Underlay color for target comments.\r\n *\r\n * @type {string}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n COMMENT_UNDERLAY_TARGET_COLOR: '#ffedb8',\r\n\r\n /**\r\n * Underlay color for new comments.\r\n *\r\n * @type {string}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n COMMENT_UNDERLAY_NEW_COLOR: '#e8ffd1',\r\n\r\n /**\r\n * Underlay color for own comments.\r\n *\r\n * @type {string}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n COMMENT_UNDERLAY_OWN_COLOR: '#f7ebff',\r\n\r\n /**\r\n * Size of the underlay's side margin in pixels.\r\n *\r\n * @type {string}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n COMMENT_UNDERLAY_SIDE_MARGIN: 5,\r\n\r\n /**\r\n * How long a comment should be considered new and have a corresponding background on newly loaded\r\n * pages. In minutes.\r\n *\r\n * @type {number}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n HIGHLIGHT_NEW_COMMENTS_INTERVAL: 15,\r\n\r\n /**\r\n * Number of seconds between new comments checks when the tab is not hidden.\r\n *\r\n * @type {number}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n CHECK_FOR_NEW_COMMENTS_INTERVAL: 15,\r\n\r\n /**\r\n * Number of seconds between new comments checks when the tab is hidden.\r\n *\r\n * @type {number}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL: 60,\r\n\r\n /**\r\n * Number of seconds in a day.\r\n *\r\n * @type {number}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n SECONDS_IN_A_DAY: 60 * 60 * 24,\r\n\r\n /**\r\n * Number of milliseconds in a minute.\r\n *\r\n * @type {number}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n MILLISECONDS_IN_A_MINUTE: 1000 * 60,\r\n\r\n /**\r\n * Popular elements that don't have the `display: inline` property in the default browser styles.\r\n *\r\n * @type {string[]}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n POPULAR_NOT_INLINE_ELEMENTS: [\r\n 'BLOCKQUOTE', 'DD', 'DIV', 'DL', 'FORM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'INPUT',\r\n 'LI', 'OL', 'P', 'PRE', 'TABLE', 'TBODY', 'TR', 'TH', 'TD', 'UL'\r\n ],\r\n\r\n /**\r\n * Popular elements that do have the `display: inline` property in the default browser styles.\r\n *\r\n * @type {string[]}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n POPULAR_INLINE_ELEMENTS: [\r\n 'A', 'ABBR', 'B', 'BIG', 'BR', 'CITE', 'CODE', 'EM', 'FONT', 'I', 'IMG', 'KBD', 'Q', 'S',\r\n 'SAMP', 'SMALL', 'SPAN', 'STRIKE', 'STRONG', 'SUB', 'SUP', 'TT', 'U', 'VAR'\r\n ],\r\n\r\n /**\r\n * Classes of elements that shouldn't be highlighted. Only MediaWiki-assigned classes go here.\r\n * Wiki-specific classes go in the configuration.\r\n *\r\n * @type {string[]}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n UNHIGHLIGHTABLE_ELEMENTS_CLASSES: [\r\n 'mw-empty-elt',\r\n 'tleft',\r\n 'tright',\r\n 'floatleft',\r\n 'floatright',\r\n ],\r\n\r\n /**\r\n * Regexps for strings that should be cut out of comment beginnings (not considered parts of\r\n * them).\r\n *\r\n * @type {RegExp[]}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n BAD_COMMENT_BEGINNINGS: [\r\n /^<!--[^]*?--> *\\n*/,\r\n /^(?:----+|<hr>) *\\n*/,\r\n /^\\{\\|.*?\\|\\} *\\n*(?=[*:#])/,\r\n ],\r\n\r\n /**\r\n * Selectors of floating elements. This is needed to display the comment's underlay and overlay\r\n * correctly.\r\n *\r\n * @type {string[]}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n FLOATING_ELEMENTS_SELECTORS: [\r\n '.cd-floating',\r\n '.tright',\r\n '.floatright',\r\n '*[style*=\"float:right\"]',\r\n '*[style*=\"float: right\"]',\r\n '*[style*=\"float:left\"]',\r\n '*[style*=\"float: left\"]',\r\n ],\r\n\r\n /**\r\n * Auxiliary property to keep the sign code: \"\\~\\~\\~\\~\". If written as plain text, it gets\r\n * transformed into the edit author's signature when saved. Note that the minifier translates\r\n * \"~\\~\\\\~\" and \"'\\~\\~' + '\\~'\" into \"\\~\\~\\~\".\r\n *\r\n * @type {string}\r\n * @memberof module:cd~convenientDiscussions.g\r\n */\r\n SIGN_CODE: '~~'.concat('~~'),\r\n};\r\n","/**\r\n * A number of methods to simplify measuring time that it takes to run certain routines as well as\r\n * counting the number of times certain instructions run.\r\n *\r\n * @module debug\r\n */\r\n\r\nexport default {\r\n\t/**\r\n\t * Init/reset all properties of the debug object.\r\n\t */\r\n\tinit() {\r\n\t\t/**\r\n\t\t * Total time for every timer.\r\n\t\t *\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.timerTotal = {};\r\n\r\n\t\t/**\r\n\t\t * Timer start timestamps for every timer.\r\n\t\t *\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.timerStartTimestamps = {};\r\n\r\n\t\t/**\r\n\t\t * The number of times a timer has run.\r\n\t\t *\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.timerRunCount = {};\r\n\r\n\t\t/**\r\n\t\t * Total time for all timer runs, ignoring timer resets (but not full resets).\r\n\t\t *\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.timerAllRunsTotal = {};\r\n\r\n\t\tthis.initCounters();\r\n\r\n\t\t/**\r\n\t\t * An array to keep any values sequentially.\r\n\t\t *\r\n\t\t * @type {Array}\r\n\t\t */\r\n\t\tthis.array = [];\r\n\r\n\t\t/**\r\n\t\t * An object to keep any values by key.\r\n\t\t *\r\n\t\t * @type {Array}\r\n\t\t */\r\n\t\tthis.object = {};\r\n\t},\r\n\r\n\t/**\r\n\t * Init counters object to have incrementation work with any of its properties without the need to\r\n\t * assign 0 to it first.\r\n\t */\r\n\tinitCounters() {\r\n\t\tthis.counters = typeof Proxy === 'undefined' ?\r\n\t\t\t{} :\r\n\t\t\tnew Proxy({}, { get: (obj, prop) => prop in obj ? obj[prop] : 0 });\r\n\t},\r\n\r\n\t/**\r\n\t * Start the specified timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tstartTimer(label) {\r\n\t\tthis.timerStartTimestamps[label] = Date.now();\r\n\t},\r\n\r\n\t/**\r\n\t * Stop the specified timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tstopTimer(label) {\r\n\t\tif (this.timerStartTimestamps[label] === undefined) return;\r\n\t\tif (this.timerTotal[label] === undefined) {\r\n\t\t\tthis.timerTotal[label] = 0;\r\n\t\t}\r\n\t\tconst thisTime = Date.now() - this.timerStartTimestamps[label];\r\n\t\tthis.timerTotal[label] += thisTime;\r\n\t\tdelete this.timerStartTimestamps[label];\r\n\r\n\t\tif (this.timerAllRunsTotal[label] === undefined) {\r\n\t\t\tthis.timerAllRunsTotal[label] = 0;\r\n\t\t\tthis.timerRunCount[label] = 0;\r\n\t\t}\r\n\t\tthis.timerAllRunsTotal[label] += thisTime;\r\n\t\tthis.timerRunCount[label]++;\r\n\t},\r\n\r\n\t/**\r\n\t * Reset the total time value for the timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tresetTimer(label) {\r\n\t\tif (this.timerStartTimestamps[label] !== undefined) {\r\n\t\t\tthis.stopTimer(label);\r\n\t\t}\r\n\t\tdelete this.timerTotal[label];\r\n\t},\r\n\r\n\t/**\r\n\t * Remove all data associated with the timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tfullResetTimer(label) {\r\n\t\tthis.resetTimer(label);\r\n\t\tdelete this.timerAllRunsTotal[label];\r\n\t\tdelete this.timerRunCount[label];\r\n\t},\r\n\r\n\t/**\r\n\t * Log and reset the specified timer.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tlogAndResetTimer(label) {\r\n\t\tif (this.timerStartTimestamps[label] !== undefined) {\r\n\t\t\tthis.stopTimer(label);\r\n\t\t}\r\n\t\tif (this.timerTotal[label] !== undefined) {\r\n\t\t\tconsole.debug(`${label}: ${this.timerTotal[label]}`);\r\n\t\t\tthis.resetTimer(label);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Log and reset all timers, as well as counters and other collected values.\r\n\t *\r\n\t * @param {boolean} sort Whether to sort timers and counters alphabetically.\r\n\t */\r\n\tlogAndResetEverything(sort) {\r\n\t\tconst timerLabels = Object.keys(this.timerTotal);\r\n\t\tif (sort) {\r\n\t\t\ttimerLabels.sort();\r\n\t\t}\r\n\t\ttimerLabels.forEach((label) => {\r\n\t\t\tthis.logAndResetTimer(label);\r\n\t\t});\r\n\r\n\t\tconst counterLabels = Object.keys(this.counters);\r\n\t\tif (sort) {\r\n\t\t\tcounterLabels.sort();\r\n\t\t}\r\n\t\tcounterLabels.forEach((label) => {\r\n\t\t\tconsole.debug(`counter ${label}: ${this.counters[label]}`);\r\n\t\t});\r\n\t\tthis.initCounters();\r\n\r\n\t\tif (this.array.length) {\r\n\t\t\tconsole.debug(`array: `, this.array);\r\n\t\t\tthis.array = [];\r\n\t\t}\r\n\r\n\t\tif (Object.keys(this.object).length) {\r\n\t\t\tconsole.debug(`object: `, this.object);\r\n\t\t\tthis.object = {};\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Log the average time one run of the specified timer takes. All runs of the timer are taken into\r\n\t * account unless a [full reset]{@link module:debug.fullResetTimer} has been performed.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\taverageTimerTime(label) {\r\n\t\tif (!this.timerAllRunsTotal[label]) {\r\n\t\t\tconsole.error(`No data for timer ${label}`);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst average = this.timerAllRunsTotal[label] / this.timerRunCount[label];\r\n\t\tconsole.debug(`${label}: ${average.toFixed(1)} average for ${this.timerRunCount[label]} runs`);\r\n\t},\r\n\r\n\t/**\r\n\t * Increment the specified counter.\r\n\t *\r\n\t * @param {string} label\r\n\t */\r\n\tincrementCounter(label) {\r\n\t\tthis.counters[label]++;\r\n\t},\r\n};\r\n","/**\r\n * Comment skeleton class.\r\n *\r\n * @module CommentSkeleton\r\n */\r\n\r\nimport CdError from './CdError';\r\nimport cd from './cd';\r\n\r\n/**\r\n * Class containing the main properties of a comment. This class is the only one used in the worker\r\n * context for comments.\r\n *\r\n * @class\r\n */\r\nexport default class CommentSkeleton {\r\n #parser\r\n #cachedSection\r\n\r\n /**\r\n * Create a comment skeleton instance.\r\n *\r\n * @param {Parser} parser\r\n * @param {object} signature Signature object returned by {@link module:Parser#findSignatures}.\r\n * @throws {CdError}\r\n */\r\n constructor(parser, signature) {\r\n this.#parser = parser;\r\n\r\n // Identify all comment nodes and save the path to them.\r\n let parts = this.#parser.collectParts(signature.element);\r\n\r\n // Remove parts contained by other parts\r\n parts = this.#parser.removeNestedParts(parts);\r\n\r\n // We may need to enclose sibling sequences in a <div> tag in order for them not to be bare (we\r\n // can't get bounding client rectangle for text nodes, can't specify margins for them etc.).\r\n parts = this.#parser.encloseInlineParts(parts, signature.element);\r\n\r\n // At this point, we can safely remove unnecessary nodes.\r\n parts = this.#parser.filterParts(parts);\r\n\r\n parts.reverse();\r\n\r\n // dd, li instead of dl, ul, ol where appropriate.\r\n parts = this.#parser.replaceListsWithItems(parts, signature.element);\r\n\r\n /**\r\n * Comment ID. Same as the comment index in {@link module:cd~convenientDiscussions.comments\r\n * convenientDiscussions.comments}.\r\n *\r\n * @type {number}\r\n */\r\n this.id = cd.comments.length;\r\n\r\n /**\r\n * Comment date.\r\n *\r\n * @type {?Date}\r\n */\r\n this.date = signature.date || null;\r\n\r\n /**\r\n * Comment timestamp as present on the page.\r\n *\r\n * @type {string}\r\n */\r\n this.timestamp = signature.timestampText;\r\n\r\n /**\r\n * Comment author name.\r\n *\r\n * @type {string}\r\n */\r\n this.authorName = signature.authorName;\r\n\r\n /**\r\n * Does the comment belong to the current user.\r\n *\r\n * @type {boolean}\r\n */\r\n this.own = this.authorName === cd.g.CURRENT_USER_NAME;\r\n\r\n /**\r\n * Comment anchor.\r\n *\r\n * @type {?string}\r\n */\r\n this.anchor = signature.anchor;\r\n\r\n /**\r\n * Is the comment unsigned or not properly signed (an unsigned template class is present).\r\n *\r\n * Not used anywhere in the script yet.\r\n *\r\n * @type {boolean}\r\n */\r\n this.unsigned = signature.unsigned;\r\n\r\n /**\r\n * Comment parts.\r\n *\r\n * @type {object[]}\r\n */\r\n this.parts = parts;\r\n\r\n /**\r\n * Comment elements.\r\n *\r\n * @type {Element[]}\r\n */\r\n this.elements = this.parts.map((part) => part.node);\r\n\r\n const isHighlightable = (el) => (\r\n !/^H[1-6]$/.test(el.tagName) &&\r\n !cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES.some((name) => el.classList.contains(name)) &&\r\n !/float: *(?:left|right)/.test(el.getAttribute('style'))\r\n );\r\n\r\n /**\r\n * Comment elements that are highlightable.\r\n *\r\n * Keep in mind that the elements may be replaced, and the property values will need to be\r\n * updated. See mergeAdjacentCommentLevels() in {@link module:modifyDom}.\r\n *\r\n * @type {Element[]}\r\n */\r\n this.highlightables = this.elements.filter(isHighlightable);\r\n\r\n // That which cannot be highlighted should not be considered existent.\r\n if (!this.highlightables.length) {\r\n throw new CdError();\r\n }\r\n\r\n this.addAttributes();\r\n\r\n this.setLevels();\r\n\r\n if (this.parts[0].isHeading) {\r\n /**\r\n * Is the comment followed by a heading.\r\n *\r\n * @type {boolean}\r\n */\r\n this.followsHeading = true;\r\n\r\n if (this.level !== 0) {\r\n this.parts.splice(0, 1);\r\n this.elements.splice(0, 1);\r\n }\r\n } else {\r\n this.followsHeading = true;\r\n }\r\n if (this.parts[0].isHeading) {\r\n /**\r\n * Does the comment open a section (has a heading as the first element and is placed at the\r\n * zeroth level).\r\n *\r\n * @type {boolean}\r\n */\r\n this.isOpeningSection = true;\r\n const headingLevelMatch = this.parts[0].node.tagName.match(/^H([1-6])$/);\r\n this.openingSectionOfLevel = headingLevelMatch && Number(headingLevelMatch[1]);\r\n } else {\r\n this.isOpeningSection = false;\r\n }\r\n }\r\n\r\n /**\r\n * Add necessary attributes to the comment elements.\r\n *\r\n * @private\r\n */\r\n addAttributes() {\r\n if (this.anchor && !this.elements[0].getAttribute('id')) {\r\n this.elements[0].setAttribute('id', this.anchor);\r\n }\r\n this.elements[0].classList.add('cd-commentPart-first');\r\n this.elements[this.elements.length - 1].classList.add('cd-commentPart-last');\r\n this.elements.forEach((el) => {\r\n el.classList.add('cd-commentPart');\r\n el.setAttribute('data-comment-id', String(this.id));\r\n });\r\n }\r\n\r\n /**\r\n * Set necessary classes to parent elements of the comment elements to make a visible tree\r\n * structure.\r\n *\r\n * @private\r\n */\r\n setLevels() {\r\n // We make sure the level on the top and on the bottom of the comment are the same, and add\r\n // corresponding classes.\r\n const levelElements = {};\r\n levelElements.top = this.#parser.getLevelsUpTree(this.highlightables[0]);\r\n levelElements.bottom = this.highlightables.length > 1 ?\r\n this.#parser.getLevelsUpTree(this.highlightables[this.highlightables.length - 1]) :\r\n levelElements.top;\r\n\r\n /**\r\n * Comment level. A level is a number representing the number of indentation characters\r\n * preceding the comment (no indentation means zeroth level).\r\n *\r\n * @type {number}\r\n */\r\n this.level = Math.min(levelElements.top.length, levelElements.bottom.length);\r\n for (let i = 0; i < this.level; i++) {\r\n if (levelElements.top[i]) {\r\n levelElements.top[i].classList.add('cd-commentLevel', `cd-commentLevel-${i + 1}`);\r\n }\r\n if (levelElements.bottom[i] && levelElements.bottom[i] !== levelElements.top[i]) {\r\n levelElements.bottom[i].classList.add('cd-commentLevel', `cd-commentLevel-${i + 1}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the lowest level (= with the biggest level number) section that the comment is in.\r\n *\r\n * @returns {?Section}\r\n * @private\r\n */\r\n getSection() {\r\n return (\r\n cd.sections\r\n .slice()\r\n .reverse()\r\n .find((section) => section.comments.includes(this)) ||\r\n null\r\n );\r\n }\r\n\r\n /**\r\n * Lowest level section that this comment belongs to.\r\n *\r\n * @type {?Section}\r\n */\r\n get section() {\r\n if (this.#cachedSection === undefined) {\r\n this.#cachedSection = this.getSection();\r\n }\r\n return this.#cachedSection;\r\n }\r\n\r\n /**\r\n * Wiki page that has the source code of the comment (may be different from the current page if\r\n * the comment is transcluded from another page).\r\n *\r\n * @type {string}\r\n */\r\n get sourcePage() {\r\n return this.section ? this.section.sourcePage : cd.g.CURRENT_PAGE;\r\n }\r\n}\r\n","/**\r\n * Section skeleton class.\r\n *\r\n * @module SectionSkeleton\r\n */\r\n\r\nimport CdError from './CdError';\r\nimport cd from './cd';\r\nimport { TreeWalker } from './treeWalker';\r\n\r\n/**\r\n * Class containing the main properties of a section. This class is the only one used in the worker\r\n * context for sections.\r\n */\r\nexport default class SectionSkeleton {\r\n #parser\r\n\r\n /**\r\n * Create a section skeleton instance.\r\n *\r\n * @param {Parser} parser\r\n * @param {Element} headingElement\r\n */\r\n constructor(parser, headingElement) {\r\n this.#parser = parser;\r\n\r\n /**\r\n * Headline element.\r\n *\r\n * @type {Element}\r\n */\r\n this.headlineElement = this.#parser.context\r\n .getElementByClassName(headingElement, 'mw-headline');\r\n if (!this.headlineElement) {\r\n throw new CdError();\r\n }\r\n\r\n /**\r\n * Section anchor.\r\n *\r\n * @type {string}\r\n */\r\n this.anchor = this.headlineElement.getAttribute('id');\r\n\r\n const classesToFilter = ['mw-headline-number', ...cd.config.foreignElementsInHeadlinesClasses];\r\n const nodes = Array.from(this.headlineElement.childNodes).filter((node) => (\r\n node.nodeType !== Node.ELEMENT_NODE ||\r\n !Array.from(node.classList).some((name) => classesToFilter.includes(name))\r\n ));\r\n\r\n /**\r\n * Section headline.\r\n *\r\n * @type {string}\r\n */\r\n this.headline = nodes\r\n .map((node) => node.textContent)\r\n .join('')\r\n .trim();\r\n\r\n const levelMatch = headingElement.tagName.match(/^H([2-6])$/);\r\n\r\n /**\r\n * Section level. A level is a number representing the number of `=` characters in the section\r\n * heading's code.\r\n *\r\n * @type {number}\r\n */\r\n this.level = levelMatch && Number(levelMatch[1]);\r\n\r\n const treeWalker = new TreeWalker(\r\n cd.g.rootElement,\r\n (node) => (\r\n !['STYLE', 'LINK'].includes(node.tagName) &&\r\n // .cd-sectionButtonContainer elements are added to level 2 sections, which means they won't\r\n // have them as elements but their last subsections can if they are included. So we better\r\n // don't include them at all.\r\n !node.classList.contains('cd-sectionButtonContainer')\r\n ),\r\n true,\r\n headingElement\r\n );\r\n\r\n this.headingNestingLevel = 0;\r\n while (treeWalker.parentNode()) {\r\n this.headingNestingLevel++;\r\n }\r\n\r\n treeWalker.currentNode = headingElement;\r\n const elements = [headingElement];\r\n const levelRegexp = new RegExp(`^H[1-${this.level}]$`);\r\n\r\n // The last element before the next heading if we start from the heading of this section. That\r\n // heading which may be a part of the next section of the same level, or the subsection of this\r\n // section.\r\n let hasSubsections = false;\r\n while (treeWalker.nextSibling() && !levelRegexp.test(treeWalker.currentNode.tagName)) {\r\n if (\r\n this.lastElementInFirstChunk === undefined &&\r\n /^H[3-6]$/.test(treeWalker.currentNode.tagName)\r\n ) {\r\n hasSubsections = true;\r\n this.lastElementInFirstChunk = elements[elements.length - 1];\r\n }\r\n elements.push(treeWalker.currentNode);\r\n }\r\n\r\n /**\r\n * Last element in the first chunk of the section, i.e. all elements up to the first subheading\r\n * if it is present, or all elements if it is not.\r\n *\r\n * @type {Element}\r\n */\r\n this.lastElementInFirstChunk = this.lastElementInFirstChunk || elements[elements.length - 1];\r\n\r\n if (!elements.length) {\r\n throw new CdError();\r\n }\r\n\r\n // We only need the first and the last comment parts to determine comments in the section.\r\n let firstCommentPart;\r\n let lastCommentPart;\r\n if (elements[1]) {\r\n treeWalker.currentNode = elements[elements.length - 1];\r\n while (treeWalker.lastChild());\r\n const lastNode = treeWalker.currentNode;\r\n\r\n treeWalker.currentNode = elements[1];\r\n do {\r\n if (treeWalker.currentNode.classList.contains('cd-commentPart')) {\r\n firstCommentPart = treeWalker.currentNode;\r\n }\r\n } while (!firstCommentPart && treeWalker.currentNode !== lastNode && treeWalker.nextNode());\r\n\r\n treeWalker.currentNode = lastNode;\r\n do {\r\n if (treeWalker.currentNode.classList.contains('cd-commentPart')) {\r\n lastCommentPart = treeWalker.currentNode;\r\n }\r\n } while (\r\n !lastCommentPart &&\r\n treeWalker.currentNode !== elements[1] &&\r\n treeWalker.previousNode()\r\n );\r\n }\r\n\r\n if (firstCommentPart) {\r\n const firstCommentPartId = Number(firstCommentPart.getAttribute('data-comment-id'));\r\n const lastCommentPartId = Number(lastCommentPart.getAttribute('data-comment-id'));\r\n\r\n this.comments = cd.comments.slice(firstCommentPartId, lastCommentPartId + 1);\r\n if (hasSubsections) {\r\n const endIndex = this.comments.findIndex((comment) => !(\r\n this.#parser.context.follows(this.lastElementInFirstChunk, comment.elements[0]) ||\r\n this.lastElementInFirstChunk.contains(comment.elements[0])\r\n ));\r\n this.commentsInFirstChunk = this.comments.slice(0, endIndex || 0);\r\n }\r\n }\r\n\r\n /**\r\n * Section ID. Same as the section index in {@link module:cd~convenientDiscussions.sections\r\n * convenientDiscussions.sections}.\r\n *\r\n * @type {number}\r\n */\r\n this.id = cd.sections.length;\r\n\r\n /**\r\n * Comments contained in the section.\r\n *\r\n * @type {Comment[]}\r\n */\r\n this.comments = this.comments || [];\r\n\r\n /**\r\n * Comments contained in the first chunk of the section, i.e. all elements up to the first\r\n * subheading if it is present, or all elements if it is not.\r\n *\r\n * @type {Comment[]}\r\n */\r\n this.commentsInFirstChunk = this.commentsInFirstChunk || this.comments;\r\n\r\n /**\r\n * Section elements.\r\n *\r\n * @type {Element[]}\r\n */\r\n this.elements = elements;\r\n }\r\n}\r\n","'use strict';\n\nmodule.exports = function html_entity_decode(string, quoteStyle) {\n // eslint-disable-line camelcase\n // discuss at: http://locutus.io/php/html_entity_decode/\n // original by: john (http://www.jd-tech.net)\n // input by: ger\n // input by: Ratheous\n // input by: Nick Kolosov (http://sammy.ru)\n // improved by: Kevin van Zonneveld (http://kvz.io)\n // improved by: marc andreu\n // revised by: Kevin van Zonneveld (http://kvz.io)\n // revised by: Kevin van Zonneveld (http://kvz.io)\n // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)\n // bugfixed by: Brett Zamir (http://brett-zamir.me)\n // bugfixed by: Fox\n // example 1: html_entity_decode('Kevin & van Zonneveld')\n // returns 1: 'Kevin & van Zonneveld'\n // example 2: html_entity_decode('&lt;')\n // returns 2: '<'\n\n var getHtmlTranslationTable = require('../strings/get_html_translation_table');\n var tmpStr = '';\n var entity = '';\n var symbol = '';\n tmpStr = string.toString();\n\n var hashMap = getHtmlTranslationTable('HTML_ENTITIES', quoteStyle);\n if (hashMap === false) {\n return false;\n }\n\n // @todo: & problem\n // http://locutus.io/php/get_html_translation_table:416#comment_97660\n delete hashMap['&'];\n hashMap['&'] = '&';\n\n for (symbol in hashMap) {\n entity = hashMap[symbol];\n tmpStr = tmpStr.split(entity).join(symbol);\n }\n tmpStr = tmpStr.split(''').join(\"'\");\n\n return tmpStr;\n};\n//# sourceMappingURL=html_entity_decode.js.map","/**\r\n * Web page (not wikitext) parsing module. Parsing here means \"extracting meaningful parts from the\r\n * page\". Functions that are more about modification of the DOM go in {@link module:modifyDom}.\r\n * Functions related to wikitext parsing go in {@link module:wikitext}.\r\n *\r\n * Here, we use vanilla JavaScript for recurring operations that together take up a lot of time.\r\n *\r\n * @module Parser\r\n */\r\n\r\nimport cd from './cd';\r\nimport { ElementsAndTextTreeWalker, ElementsTreeWalker } from './treeWalker';\r\nimport { defined, firstCharToUpperCase, flat, isInline, underlinesToSpaces } from './util';\r\nimport { generateCommentAnchor, parseTimestamp, registerCommentAnchor } from './timestamp';\r\n\r\n/**\r\n * Get the page name from a URL.\r\n *\r\n * @param {string} url\r\n * @returns {?string}\r\n * @private\r\n */\r\nfunction getPageNameFromUrl(url) {\r\n // Are only WMF wikis guaranteed to have the format we need?\r\n if (\r\n typeof mw === 'undefined' ||\r\n (mw.config.get('wgArticlePath') === '/wiki/$1' && mw.config.get('wgScript') === '/w/index.php')\r\n ) {\r\n url = url\r\n .replace(/^(?:https?:)?\\/\\/[^/]+/, '')\r\n .replace(/^\\/wiki\\//, '')\r\n .replace(/^\\/w\\/index.php\\?title=/, '')\r\n .replace(/&action=edit.*/, '')\r\n .replace(/#.*/, '')\r\n .replace(/_/g, ' ');\r\n try {\r\n url = decodeURIComponent(url);\r\n } catch (e) {\r\n return null;\r\n }\r\n return url;\r\n } else {\r\n const uri = new mw.Uri(url);\r\n const match = uri.path.match(cd.g.ARTICLE_PATH_REGEXP);\r\n if (match) {\r\n try {\r\n return decodeURIComponent(match[1]);\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n if (uri.query.title) {\r\n return uri.query.title;\r\n }\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Get the user name from a link.\r\n *\r\n * @param {Element} element\r\n * @returns {string}\r\n * @private\r\n */\r\nfunction getUserNameFromLink(element) {\r\n const href = element.getAttribute('href');\r\n if (!href) {\r\n return null;\r\n }\r\n const pageName = getPageNameFromUrl(href);\r\n if (!pageName) {\r\n return null;\r\n }\r\n let userName;\r\n const match = pageName.match(cd.g.USER_NAMESPACES_REGEXP);\r\n if (match) {\r\n userName = match[1];\r\n } else if (pageName.startsWith(cd.g.CONTRIBS_PAGE + '/')) {\r\n userName = pageName.replace(cd.g.CONTRIBS_PAGE_LINK_REGEXP, '');\r\n }\r\n return userName && firstCharToUpperCase(underlinesToSpaces(userName.replace(/\\/.*/, ''))).trim();\r\n}\r\n\r\n/**\r\n * Generalization of a page parser for the window and worker contexts.\r\n */\r\nexport default class Parser {\r\n /**\r\n * Create a page parser in the provided context.\r\n *\r\n * @param {object} context Collection of classes, functions, and other properties that perform the\r\n * tasks we need in the current context (window or worker).\r\n */\r\n constructor(context) {\r\n this.context = context;\r\n }\r\n\r\n /**\r\n * Create a comment instance.\r\n *\r\n * @param {Element} signature\r\n * @returns {*}\r\n */\r\n createComment(signature) {\r\n return new this.context.CommentClass(this, signature);\r\n }\r\n\r\n /**\r\n * Create a section instance.\r\n *\r\n * @param {Element} headingElement\r\n * @param {Promise} watchedSectionsRequest\r\n * @returns {*}\r\n */\r\n createSection(headingElement, watchedSectionsRequest) {\r\n return new this.context.SectionClass(this, headingElement, watchedSectionsRequest);\r\n }\r\n\r\n /**\r\n * @typedef {object} Timestamp\r\n * @property {Element} element\r\n * @property {Date} date\r\n */\r\n\r\n /**\r\n * @typedef {Timestamp[]} FindTimestampsReturn\r\n */\r\n\r\n /**\r\n * Find timestamps under the root element.\r\n *\r\n * @returns {FindTimestampsReturn}\r\n */\r\n findTimestamps() {\r\n const blocksToExclude = [\r\n ...Array.from(cd.g.rootElement.getElementsByTagName('blockquote')),\r\n ...flat(\r\n cd.config.elementsToExcludeClasses\r\n .map((className) => Array.from(cd.g.rootElement.getElementsByClassName(className)))\r\n ),\r\n ];\r\n\r\n return this.context.getAllTextNodes()\r\n .map((node) => {\r\n const text = node.textContent;\r\n const { date, match } = parseTimestamp(text) || {};\r\n if (date && !blocksToExclude.some((block) => block.contains(node))) {\r\n return { node, date, match };\r\n }\r\n })\r\n .filter(defined)\r\n .map((finding) => {\r\n const { node, match, date } = finding;\r\n const element = this.context.document.createElement('span');\r\n element.classList.add('cd-timestamp');\r\n const textNode = this.context.document.createTextNode(match[2]);\r\n element.appendChild(textNode);\r\n const remainedText = node.textContent.slice(match.index + match[0].length);\r\n let afterNode;\r\n if (remainedText) {\r\n afterNode = this.context.document.createTextNode(remainedText);\r\n }\r\n node.textContent = node.textContent.slice(0, match.index + match[1].length);\r\n node.parentNode.insertBefore(element, node.nextSibling);\r\n if (afterNode) {\r\n node.parentNode.insertBefore(afterNode, element.nextSibling);\r\n }\r\n return { element, date };\r\n });\r\n }\r\n\r\n /**\r\n * Find signatures under the root element given timestamps.\r\n *\r\n * Characters before the author link, like \"—\", aren't considered a part of the signature.\r\n *\r\n * @param {object[]} timestamps\r\n * @returns {object[]}\r\n */\r\n findSignatures(timestamps) {\r\n const signatures = timestamps\r\n .map((timestamp) => {\r\n const date = timestamp.date;\r\n const timestampElement = timestamp.element;\r\n const timestampText = timestamp.element.textContent;\r\n let unsignedElement;\r\n\r\n // If the closest not inline timestamp element ancestor has more than one signature, we\r\n // choose the last signature to consider it the signature of the comment author. There is no\r\n // point for us to parse them as distinct comments as a reply posted using our script will\r\n // go below all of them anyway.\r\n let closestNotInlineAncestor;\r\n for (let el = timestamp.element; !closestNotInlineAncestor; el = el.parentNode) {\r\n if (isInline(el)) {\r\n // Simultaneously check if we are inside an unsigned template.\r\n if (el.classList.contains(cd.config.unsignedClass)) {\r\n unsignedElement = el;\r\n }\r\n } else {\r\n closestNotInlineAncestor = el;\r\n }\r\n }\r\n const unsigned = Boolean(unsignedElement);\r\n\r\n if (closestNotInlineAncestor) {\r\n const cniaChildren = Array.from(\r\n closestNotInlineAncestor[this.context.childElementsProperty]\r\n );\r\n\r\n const treeWalker = new ElementsTreeWalker(timestamp.element);\r\n // Found other timestamp after this timestamp\r\n let found = false;\r\n while (\r\n !found &&\r\n treeWalker.nextNode() &&\r\n closestNotInlineAncestor.contains(treeWalker.currentNode) &&\r\n (!cniaChildren.includes(treeWalker.currentNode) || isInline(treeWalker.currentNode))\r\n ) {\r\n if (treeWalker.currentNode.classList.contains('cd-timestamp')) {\r\n found = true;\r\n }\r\n }\r\n if (found) return;\r\n }\r\n\r\n const startElement = unsignedElement || timestamp.element;\r\n const treeWalker = new ElementsAndTextTreeWalker(startElement);\r\n let authorName;\r\n let length = 0;\r\n let firstSignatureElement;\r\n const signatureNodes = [];\r\n if (unsignedElement) {\r\n firstSignatureElement = startElement;\r\n } else {\r\n signatureNodes.push(startElement);\r\n treeWalker.previousSibling();\r\n }\r\n\r\n // Unsigned template may be of the \"undated\" kind - containing a timestamp but no author\r\n // name, so we need to walk the tree anyway.\r\n do {\r\n const node = treeWalker.currentNode;\r\n length += node.textContent.length;\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n if (node.classList.contains('cd-timestamp')) break;\r\n let hasAuthorLinks = false;\r\n if (node.tagName === 'A') {\r\n const userName = getUserNameFromLink(node);\r\n if (userName) {\r\n if (!authorName) {\r\n authorName = userName;\r\n }\r\n if (authorName === userName) {\r\n // That's not some other user link that is not a part of the signature.\r\n hasAuthorLinks = true;\r\n }\r\n }\r\n } else {\r\n const links = Array.from(node.getElementsByTagName('a'));\r\n links.some((link) => {\r\n const userName = getUserNameFromLink(link);\r\n if (userName) {\r\n if (!authorName) {\r\n authorName = userName;\r\n }\r\n if (authorName === userName) {\r\n // That's not some other user link that is not a part of the signature.\r\n hasAuthorLinks = true;\r\n return true;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (hasAuthorLinks) {\r\n firstSignatureElement = node;\r\n }\r\n }\r\n signatureNodes.push(node);\r\n } while (treeWalker.previousSibling() && length < cd.config.signatureScanLimit);\r\n\r\n const firstSignatureElementIndex = signatureNodes.indexOf(firstSignatureElement);\r\n signatureNodes.splice(\r\n firstSignatureElementIndex === -1 ? 1 : firstSignatureElementIndex + 1\r\n );\r\n\r\n const anchor = generateCommentAnchor(timestamp.date, authorName, true);\r\n registerCommentAnchor(anchor);\r\n const signatureContainer = startElement.parentNode;\r\n const startElementNextSibling = startElement.nextSibling;\r\n const element = this.context.document.createElement('span');\r\n element.classList.add('cd-signature');\r\n signatureNodes\r\n .reverse()\r\n .forEach(element.appendChild.bind(element));\r\n signatureContainer.insertBefore(element, startElementNextSibling);\r\n\r\n // If there is no author, we add the class to prevent the element from being considered a\r\n // part of other comment but don't append to the list of signatures.\r\n if (!authorName) return;\r\n\r\n return { element, timestampElement, timestampText, date, authorName, anchor, unsigned };\r\n })\r\n .filter(defined);\r\n\r\n if (cd.config.unsignedClass) {\r\n Array.from(cd.g.rootElement.getElementsByClassName(cd.config.unsignedClass))\r\n .forEach((element) => {\r\n // Only templates with no timestamp interest us.\r\n if (!this.context.getElementByClassName(element, 'cd-timestamp')) {\r\n const links = Array.from(element.getElementsByTagName('a'));\r\n links.some((link) => {\r\n const authorName = getUserNameFromLink(link);\r\n if (authorName) {\r\n element.classList.add('cd-signature');\r\n const unsigned = true;\r\n signatures.push({ element, authorName, unsigned });\r\n return true;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Sort signatures according to their position in the DOM. sig1 and sig2 are expected not to be\r\n // the same elements.\r\n signatures.sort((sig1, sig2) => this.context.follows(sig1.element, sig2.element) ? 1 : -1);\r\n\r\n return signatures;\r\n }\r\n\r\n /**\r\n * Collect the parts of the comment given a signature element.\r\n *\r\n * @param {Element} signatureElement\r\n * @returns {object[]}\r\n */\r\n collectParts(signatureElement) {\r\n const treeWalker = new ElementsAndTextTreeWalker(signatureElement);\r\n let parts = [];\r\n let firstForeignComponentAfter;\r\n\r\n // The code:\r\n // * Smth. [signature]\r\n // ** Smth.\r\n // *: Smth. [signature]\r\n // or\r\n // ** Smth. [signature]\r\n // ** Smth.\r\n // *: Smth. [signature]\r\n // produces a DOM where the second line is not a part of the first comment, but there is only\r\n // the first comment's signature in the DOM subtree related to the second line. We need to\r\n // acknowledge there is a foreign not inline element here to be able to tell comment boundaries\r\n // accurately (inline elements in most cases are continuations of the same comment).\r\n while (!firstForeignComponentAfter) {\r\n while (!treeWalker.currentNode.nextSibling && treeWalker.parentNode());\r\n if (!treeWalker.nextSibling()) break;\r\n if (!isInline(treeWalker.currentNode, true)) {\r\n firstForeignComponentAfter = treeWalker.currentNode;\r\n }\r\n }\r\n\r\n // As an optimization, avoid adding every text node of the comment to the array of its parts if\r\n // possible. Add their common container instead.\r\n if (\r\n firstForeignComponentAfter &&\r\n signatureElement.parentNode.contains(firstForeignComponentAfter)\r\n ) {\r\n // Collect inline parts after the signature\r\n treeWalker.currentNode = signatureElement;\r\n while (treeWalker.nextSibling()) {\r\n if (isInline(treeWalker.currentNode, true)) {\r\n parts.push({\r\n node: treeWalker.currentNode,\r\n isTextNode: treeWalker.currentNode.nodeType === Node.TEXT_NODE,\r\n isHeading: false,\r\n hasCurrentSignature: false,\r\n hasForeignComponents: false,\r\n lastStep: 'start',\r\n });\r\n } else {\r\n break;\r\n }\r\n }\r\n parts.reverse();\r\n\r\n treeWalker.currentNode = signatureElement;\r\n } else {\r\n treeWalker.currentNode = signatureElement.parentNode;\r\n }\r\n parts.push({\r\n node: treeWalker.currentNode,\r\n isTextNode: false,\r\n isHeading: false,\r\n hasCurrentSignature: true,\r\n hasForeignComponents: false,\r\n lastStep: 'start',\r\n });\r\n\r\n const timezoneRegexp = new RegExp(cd.g.TIMEZONE_REGEXP.source + '\\\\s*$');\r\n\r\n // 500 seems to be a safe enough value in case of any weird reasons for an infinite loop.\r\n for (let i = 0; i < 500; i++) {\r\n // lastStep may be:\r\n // * \"start\" (parts added at the beginning)\r\n // * \"back\" (go to the previous sibling)\r\n // * \"up\" (go to the parent element)\r\n // * \"dive\" (recursively go to the last not inline/text child)\r\n // * \"replaced\" (obtained as a result of manipulations after node traversal)\r\n let lastStep;\r\n const previousPart = parts[parts.length - 1];\r\n\r\n if (!previousPart.isTextNode && !previousPart.hasCurrentSignature) {\r\n // A simple check before we go: a timestamp or signature ending at the end of the line means\r\n // a foreign signature; nothing more to search for in that case.\r\n const text = previousPart.node.textContent;\r\n if (\r\n // Filter out additions to the end of a comment like:\r\n // https://ru.wikipedia.org/w/index.php?diff=107450915\r\n // https://ru.wikipedia.org/w/index.php?diff=107487558\r\n !isInline(previousPart.node, true) &&\r\n\r\n (\r\n timezoneRegexp.test(text) ||\r\n cd.config.signatureEndingRegexp && cd.config.signatureEndingRegexp.test(text)\r\n )\r\n ) {\r\n previousPart.hasForeignComponents = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!previousPart.hasCurrentSignature && previousPart.hasForeignComponents) {\r\n // Here we dive to the bottom of the element subtree to find parts of the _current_ comment\r\n // that may be present. This happens with a code like this:\r\n // :* Smth. [signature]\r\n // :* Smth. <!-- The comment part that we need to grab while it's in the same element as the\r\n // signature above. -->\r\n // :: Smth. [signature] <!-- The comment part we are at. -->\r\n\r\n // Get the last not inline child of the current node.\r\n let previousNode;\r\n let dived = false;\r\n while ((previousNode = treeWalker.currentNode) && treeWalker.lastChild()) {\r\n if (isInline(treeWalker.currentNode, true)) {\r\n treeWalker.currentNode = previousNode;\r\n break;\r\n }\r\n dived = true;\r\n }\r\n if (dived) {\r\n lastStep = 'dive';\r\n } else {\r\n break;\r\n }\r\n } else if (treeWalker.previousSibling()) {\r\n lastStep = 'back';\r\n } else {\r\n if (!treeWalker.parentNode()) break;\r\n lastStep = 'up';\r\n }\r\n\r\n const node = treeWalker.currentNode;\r\n const isTextNode = node.nodeType === Node.TEXT_NODE;\r\n\r\n /*\r\n Cases like:\r\n === Section title ===\r\n Section introduction. Not a comment.\r\n # Vote. [signature]\r\n Without the following code, the section introduction would be a part of the comment. The\r\n same may happen inside a discussion thread (often because one of the users didn't sign).\r\n */\r\n if (\r\n lastStep === 'back' &&\r\n ['OL', 'UL'].includes(previousPart.node.tagName) &&\r\n\r\n // Exceptions like https://ru.wikipedia.org/w/index.php?diff=105007602\r\n !(\r\n ['DL', 'OL', 'UL'].includes(node.tagName) ||\r\n (\r\n isTextNode &&\r\n node.previousSibling &&\r\n ['DL', 'OL', 'UL'].includes(node.previousSibling.tagName)\r\n )\r\n ) &&\r\n\r\n previousPart.node[this.context.childElementsProperty].length &&\r\n previousPart.node[this.context.childElementsProperty][0].contains(signatureElement)\r\n ) {\r\n break;\r\n }\r\n\r\n let isHeading = null;\r\n let hasCurrentSignature = null;\r\n let hasForeignComponents = null;\r\n if (!isTextNode) {\r\n if (\r\n node.classList.contains('cd-commentPart') ||\r\n node.getAttribute('id') === 'toc' ||\r\n node.tagName === 'TD' ||\r\n\r\n // Horizontal lines sometimes separate different section blocks.\r\n (\r\n node.tagName === 'HR' &&\r\n node.previousElementSibling &&\r\n this.context.getElementByClassName(node.previousElementSibling, 'cd-signature')\r\n ) ||\r\n\r\n (\r\n cd.config.checkForCustomForeignComponents &&\r\n cd.config.checkForCustomForeignComponents(node, this.context)\r\n )\r\n ) {\r\n break;\r\n }\r\n\r\n isHeading = /^H[1-6]$/.test(node.tagName);\r\n hasCurrentSignature = node.contains(signatureElement);\r\n // The second parameter of getElementsByClassName is an optimization for the worker context.\r\n const signaturesCount = (\r\n node.getElementsByClassName('cd-signature', Number(hasCurrentSignature) + 1).length\r\n );\r\n hasForeignComponents = (\r\n signaturesCount - Number(hasCurrentSignature) > 0 ||\r\n (firstForeignComponentAfter && node.contains(firstForeignComponentAfter))\r\n );\r\n }\r\n\r\n // We save all data related to the nodes on the path to reuse it.\r\n parts.push({\r\n node,\r\n isTextNode,\r\n isHeading,\r\n hasCurrentSignature,\r\n hasForeignComponents,\r\n lastStep,\r\n });\r\n\r\n if (isHeading) break;\r\n }\r\n\r\n return parts;\r\n }\r\n\r\n /**\r\n * Remove the comment parts that are inside of other parts.\r\n *\r\n * @param {object[]} parts\r\n * @returns {object[]}\r\n */\r\n removeNestedParts(parts) {\r\n for (let i = parts.length - 1; i >= 0; i--) {\r\n const part = parts[i];\r\n if (part.lastStep === 'up' && !part.hasForeignComponents) {\r\n let nextDiveElementIndex = 0;\r\n for (let j = i - 1; j > 0; j--) {\r\n if (parts[j].lastStep === 'dive') {\r\n nextDiveElementIndex = j;\r\n break;\r\n }\r\n }\r\n parts.splice(nextDiveElementIndex, i - nextDiveElementIndex);\r\n i = nextDiveElementIndex;\r\n }\r\n }\r\n\r\n return parts;\r\n }\r\n\r\n /**\r\n * Wrap the text and inline nodes into block elements.\r\n *\r\n * @param {object[]} parts\r\n * @param {Element} signatureElement\r\n * @returns {object[]}\r\n */\r\n encloseInlineParts(parts, signatureElement) {\r\n const sequencesToBeEnclosed = [];\r\n let start = null;\r\n let encloseThis = false;\r\n for (let i = 0; i <= parts.length; i++) {\r\n const part = parts[i];\r\n if (\r\n part &&\r\n (start === null || (['back', 'start'].includes(part.lastStep))) &&\r\n !part.hasForeignComponents &&\r\n !part.isHeading\r\n ) {\r\n if (start === null) {\r\n // Don't enclose nodes whose parent is an inline element.\r\n if (isInline(part.node.parentNode)) {\r\n for (let j = i + 1; j < parts.length; j++) {\r\n if (parts[j].lastStep === 'up') {\r\n i = j - 1;\r\n continue;\r\n }\r\n }\r\n break;\r\n } else {\r\n start = i;\r\n }\r\n }\r\n\r\n // We should only enclose if there is a need: there is at least one inline or non-empty text\r\n // node in the sequence.\r\n if (\r\n !encloseThis &&\r\n ((part.isTextNode && part.node.textContent.trim()) || isInline(part.node))\r\n ) {\r\n encloseThis = true;\r\n }\r\n } else {\r\n if (start !== null) {\r\n if (encloseThis) {\r\n const end = i - 1;\r\n sequencesToBeEnclosed.push({ start, end });\r\n }\r\n start = null;\r\n encloseThis = false;\r\n }\r\n }\r\n }\r\n\r\n for (let i = sequencesToBeEnclosed.length - 1; i >= 0; i--) {\r\n const sequence = sequencesToBeEnclosed[i];\r\n const wrapper = this.context.document.createElement('div');\r\n const nextSibling = parts[sequence.start].node.nextSibling;\r\n const parent = parts[sequence.start].node.parentNode;\r\n for (let j = sequence.end; j >= sequence.start; j--) {\r\n wrapper.appendChild(parts[j].node);\r\n }\r\n parent.insertBefore(wrapper, nextSibling);\r\n const newNode = {\r\n node: wrapper,\r\n isTextNode: false,\r\n isHeading: false,\r\n hasCurrentSignature: wrapper.contains(signatureElement),\r\n hasForeignComponents: false,\r\n lastStep: 'replaced',\r\n };\r\n parts.splice(sequence.start, sequence.end - sequence.start + 1, newNode);\r\n }\r\n\r\n return parts;\r\n }\r\n\r\n /**\r\n * Remove unnecessary and incorrect parts from the collection.\r\n *\r\n * @param {object[]} parts\r\n * @returns {object[]}\r\n */\r\n filterParts(parts) {\r\n parts = parts.filter((part) => !part.hasForeignComponents && !part.isTextNode);\r\n for (let i = parts.length - 1; i > 0; i--) {\r\n const part = parts[i];\r\n if (part.node.tagName === 'P' && !part.node.textContent.trim()) {\r\n parts.splice(i, 1);\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return parts;\r\n }\r\n\r\n /**\r\n * Replace the list elements with collections of their items if appropriate.\r\n *\r\n * @param {object[]} parts\r\n * @param {Element} signatureElement\r\n * @returns {object[]}\r\n */\r\n replaceListsWithItems(parts, signatureElement) {\r\n const lastPart = parts[parts.length - 1];\r\n for (let i = parts.length - 1; i >= 0; i--) {\r\n const part = parts[i];\r\n if (\r\n // 'LI', 'DD' are in this list too for this kind of structures:\r\n // https://ru.wikipedia.org/w/index.php?diff=103584477.\r\n ['UL', 'DL', 'OL', 'LI', 'DD'].includes(part.node.tagName) &&\r\n // The check for 'DD' rescues us here:\r\n // https://ru.wikipedia.org/wiki/Википедия:Форум/Общий#201911201924_Vcohen.\r\n // The check for 'DL' rescues us here:\r\n // https://ru.wikipedia.org/wiki/Википедия:Форум/Общий#202003090945_Serhio_Magpie. The check\r\n // for 'P' rescues us here:\r\n // https://ru.wikipedia.org/wiki/Википедия:Форум/Правила#201910270736_S.m.46.\r\n // The check for \"!parts[i + 1]...\" rescues us here:\r\n // https://ru.wikipedia.org/wiki/Википедия:Технические_запросы#201912081049_Sunpriat.\r\n (\r\n (part.lastStep === 'up' && (!parts[i - 1] || parts[i - 1].lastStep !== 'back')) ||\r\n (\r\n (\r\n lastPart.node.tagName === 'DD' ||\r\n lastPart.node.parentNode.tagName === 'DD' ||\r\n lastPart.node.tagName === 'DL'\r\n ) &&\r\n !parts.slice(i + 1).some((part) => part.node.tagName === 'P')\r\n )\r\n )\r\n ) {\r\n // We ignore all spaces as an easy way to ignore only whitespace text nodes between element\r\n // nodes (this is a bad idea if we deal with inline nodes, but here we deal with lists).\r\n const partTextNoSpaces = part.node.textContent.replace(/\\s+/g, '');\r\n\r\n let current = [part.node];\r\n let children;\r\n\r\n // With code like this:\r\n // * Smth. [signature]\r\n // :: Smth. [signature]\r\n // ...one comment (preceded by :: in this case) creates its own list tree, not a subtree,\r\n // even though it's a reply to a reply. So we dive to the bottom of the hierarchy of nested\r\n // lists to get the bottom node (and therefore draw the comment layers more neatly). One of\r\n // the most complex tree structures is this:\r\n // * Smth. [signature]\r\n // :* Smth.\r\n // :: Smth. [signature]\r\n // (seen here:\r\n // https://ru.wikipedia.org/w/index.php?title=Википедия:Форум/Общий&oldid=103760740#201912010211_Mikhail_Ryazanov)\r\n // It has a branchy structure that requires a tricky algorithm to be parsed correctly.\r\n do {\r\n children = current.reduce(\r\n (arr, element) => arr.concat(Array.from(element[this.context.childElementsProperty])),\r\n []\r\n );\r\n } while (\r\n children.length &&\r\n children.every((child) => ['UL', 'DL', 'OL', 'LI', 'DD'].includes(child.tagName)) &&\r\n (\r\n children.map((child) => child.textContent).join('').replace(/\\s+/g, '') ===\r\n partTextNoSpaces\r\n ) &&\r\n (current = children)\r\n );\r\n\r\n if (current.length > 1) {\r\n const newParts = current.map((el) => ({\r\n node: el,\r\n isTextNode: false,\r\n hasCurrentSignature: el.contains(signatureElement),\r\n hasForeignComponents: false,\r\n lastStep: 'replaced',\r\n }));\r\n parts.splice(i, 1, ...newParts);\r\n } else if (current[0] !== part.node) {\r\n Object.assign(part, {\r\n node: current[0],\r\n lastStep: 'replaced',\r\n });\r\n }\r\n }\r\n }\r\n\r\n return parts;\r\n }\r\n\r\n /**\r\n * Get the \".cd-commentLevel\" elements up the DOM tree.\r\n *\r\n * @param {Element} initialElement\r\n * @returns {Element[]}\r\n */\r\n getLevelsUpTree(initialElement) {\r\n const levelElements = [];\r\n const treeWalker = new ElementsTreeWalker(initialElement);\r\n while (treeWalker.parentNode()) {\r\n const el = treeWalker.currentNode;\r\n if (['UL', 'DL', 'OL'].includes(el.tagName)) {\r\n if (el.classList.contains('cd-commentLevel')) {\r\n const classAttr = el.getAttribute('class');\r\n const match = classAttr.match(/cd-commentLevel-(\\d+)/);\r\n if (match) {\r\n levelElements.unshift(...Array(Number(match[1])));\r\n }\r\n return levelElements;\r\n } else {\r\n levelElements.unshift(el);\r\n }\r\n }\r\n }\r\n return levelElements;\r\n }\r\n\r\n /**\r\n * Get all headings on the page.\r\n *\r\n * @returns {Element[]}\r\n */\r\n // The worker context doesn't support .querySelector(), so we have to use .getElementsByTagName().\r\n findHeadings() {\r\n const headings = [\r\n ...cd.g.rootElement.getElementsByTagName('h2'),\r\n ...cd.g.rootElement.getElementsByTagName('h3'),\r\n ...cd.g.rootElement.getElementsByTagName('h4'),\r\n ...cd.g.rootElement.getElementsByTagName('h5'),\r\n ...cd.g.rootElement.getElementsByTagName('h6'),\r\n ];\r\n headings.sort((heading1, heading2) => this.context.follows(heading1, heading2) ? 1 : -1);\r\n return headings;\r\n }\r\n}\r\n\r\n/**\r\n * Get all text nodes under the root element in the window (not worker) context.\r\n *\r\n * @returns {Node[]}\r\n */\r\nexport function windowGetAllTextNodes() {\r\n const result = document.evaluate(\r\n // './/text()' doesn't work in Edge.\r\n './/descendant::text()',\r\n cd.g.rootElement,\r\n null,\r\n XPathResult.ANY_TYPE,\r\n null\r\n );\r\n const textNodes = [];\r\n let node;\r\n while ((node = result.iterateNext())) {\r\n textNodes.push(node);\r\n }\r\n return textNodes;\r\n}\r\n\r\n/**\r\n * Find some types of special elements on the page (floating elements, closed discussions, outdent\r\n * templates).\r\n *\r\n * @returns {object}\r\n */\r\nexport function findSpecialElements() {\r\n // Describe all floating elements on the page in order to calculate the right border (temporarily\r\n // setting \"overflow: hidden\") for all comments that they intersect with.\r\n const floatingElementsSelector = [\r\n ...cd.g.FLOATING_ELEMENTS_SELECTORS,\r\n ...cd.config.customFloatingElementsSelectors,\r\n ]\r\n .join(', ');\r\n const floating = cd.g.$root\r\n .find(floatingElementsSelector)\r\n .get()\r\n // Remove all known elements that never intersect comments from the collection.\r\n .filter((el) => !el.classList.contains('cd-ignoreFloating'));\r\n floating.forEach((el) => {\r\n const style = window.getComputedStyle(el);\r\n el.setAttribute('data-margin-top', parseFloat(style.marginTop));\r\n el.setAttribute('data-margin-bottom', parseFloat(style.marginBottom));\r\n });\r\n\r\n const closedDiscussionsSelector = cd.config.closedDiscussionsClasses\r\n .map((name) => `.${name}`)\r\n .join(', ');\r\n const closedDiscussions = cd.g.$root.find(closedDiscussionsSelector).get();\r\n\r\n const pageHasOutdents = Boolean(cd.g.$root.find('.outdent-template').length);\r\n\r\n return { floating, closedDiscussions, pageHasOutdents };\r\n}\r\n","/**\r\n * Wikitext parsing and processing functions.\r\n *\r\n * @module wikitext\r\n */\r\n\r\nimport html_entity_decode from 'locutus/php/strings/html_entity_decode';\r\n\r\nimport cd from './cd';\r\nimport userRegistry from './userRegistry';\r\nimport {\r\n generateCommentAnchor,\r\n parseTimestamp,\r\n registerCommentAnchor,\r\n resetCommentAnchors,\r\n} from './timestamp';\r\nimport { hideText } from './util';\r\n\r\n/**\r\n * Conceal HTML comments (`<!-- -->`) in the code.\r\n *\r\n * This is used to ignore comment contents (there could be section code examples for novices there\r\n * that could confuse search results) but get right positions and code in the result.\r\n *\r\n * @param {string} code\r\n * @returns {string}\r\n */\r\nexport function hideHtmlComments(code) {\r\n return code\r\n .replace(/<!--([^]*?)-->/g, (s, content) => '<!--' + ' '.repeat(content.length) + '-->');\r\n}\r\n\r\n/**\r\n * Find the first timestamp related to a comment in the code.\r\n *\r\n * @param {string} code\r\n * @returns {?string}\r\n */\r\nexport function findFirstTimestamp(code) {\r\n const signatures = extractSignatures(code);\r\n return signatures.length ? signatures[0].timestamp : null;\r\n}\r\n\r\n/**\r\n * Remove certain kinds of wiki markup from code, such as formatting, links, tags, and comments.\r\n * Also replace multiple spaces with one and trim the input. The product of this function is not for\r\n * display (for example, it just removes template names making the resulting code look silly), but\r\n * for comparing purposes.\r\n *\r\n * @param {string} code\r\n * @returns {string}\r\n */\r\nexport function removeWikiMarkup(code) {\r\n return code\r\n // Remove comments\r\n .replace(/<!--[^]*?-->/g, '')\r\n // Pipe trick\r\n .replace(/(\\[\\[:?(?:[^|[\\]<>\\n:]+:)?([^|[\\]<>\\n]+)\\|)(\\]\\])/g, '$1$2$3')\r\n // Extract displayed text from file embeddings\r\n .replace(cd.g.FILE_LINK_REGEXP, '$1')\r\n // Extract displayed text from [[wikilinks]]\r\n .replace(/\\[\\[:?(?:[^|[\\]<>\\n]+\\|)?(.+?)\\]\\]/g, '$1')\r\n // For optimization purposes, remove template names\r\n .replace(/\\{\\{:?(?:[^|{}<>\\n]+)(?:\\|(.+?))?\\}\\}/g, '$1')\r\n // Extract displayed text from [links]\r\n .replace(/\\[https?:\\/\\/[^[\\]<>\"\\n ]+ *([^\\]]*)\\]/g, '$1')\r\n // Remove bold\r\n .replace(/'''(.+?)'''/g, '$1')\r\n // Remove italics\r\n .replace(/''(.+?)''/g, '$1')\r\n // Replace <br> with a space\r\n .replace(/<br ?\\/?>/g, ' ')\r\n // Remove opening tags (won't work with <smth param=\">\">, but wikiparser fails too)\r\n .replace(/<\\w+(?: [\\w ]+?=[^<>]+?| ?\\/?)>/g, '')\r\n // Remove closing tags\r\n .replace(/<\\/\\w+ ?>/g, '')\r\n // Replace multiple spaces with one space\r\n .replace(/ {2,}/g, ' ')\r\n .trim();\r\n}\r\n\r\n/**\r\n * Replace HTML entities with corresponding characters. Also replace different kinds of spaces,\r\n * including multiple, with one normal space.\r\n *\r\n * @param {string} text\r\n * @returns {string}\r\n */\r\nexport function normalizeCode(text) {\r\n return decodeHtmlEntities(text).replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/**\r\n * Encode link text to put it in a `[[wikilink]]`.\r\n *\r\n * @param {string} link\r\n * @returns {string}\r\n */\r\nexport function encodeWikilink(link) {\r\n return link\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\\[/g, '[')\r\n .replace(/\\]/g, ']')\r\n .replace(/\\{/g, '{')\r\n .replace(/\\|/g, '|')\r\n .replace(/\\}/g, '}')\r\n .replace(/\\s+/g, ' ');\r\n}\r\n\r\n/**\r\n * Extract signatures that don't come from the unsigned templates from wikitext.\r\n *\r\n * @param {string} code\r\n * @returns {object[]}\r\n * @private\r\n */\r\nfunction extractRegularSignatures(code) {\r\n const timestampRegexp = new RegExp(\r\n `^((.*)(${cd.g.TIMESTAMP_REGEXP.source})(?:\\\\}\\\\}|</small>)?).*(?:\\n*|$)`,\r\n 'igm'\r\n );\r\n\r\n // \".*\" helps to get the last author link. But after that we make another capture to make sure we\r\n // take the first link to the comment author. 251 is not arbitrary: it's 255 (maximum allowed\r\n // signature length) minus '[[u:a'.length plus ' '.length (the space before the timestamp).\r\n const signatureScanLimitWikitext = 251;\r\n const signatureRegexp = new RegExp(\r\n /*\r\n Captures:\r\n 1 - the whole line with the signature\r\n 2 - text before the last user link\r\n 3 - unprocessed signature\r\n 4 - author name (inside cd.g.CAPTURE_USER_NAME_PATTERN)\r\n 5 - sometimes, a slash appears here (inside cd.g.CAPTURE_USER_NAME_PATTERN)\r\n 6 - timestamp + small template ending characters / ending small tag\r\n 7 - timestamp\r\n 8 - new line characters or empty string\r\n */\r\n `^((.*)(${cd.g.CAPTURE_USER_NAME_PATTERN}.{1,${signatureScanLimitWikitext}}((${cd.g.TIMESTAMP_REGEXP.source})(?:\\\\}\\\\}|</small>)?)).*)(\\n*|$)`,\r\n 'igm'\r\n );\r\n const authorLinkRegexp = new RegExp(cd.g.CAPTURE_USER_NAME_PATTERN, 'ig');\r\n\r\n let signatures = [];\r\n let timestampMatch;\r\n while ((timestampMatch = timestampRegexp.exec(code))) {\r\n const line = timestampMatch[0];\r\n signatureRegexp.lastIndex = 0;\r\n const authorTimestampMatch = signatureRegexp.exec(line);\r\n\r\n let author;\r\n let timestamp;\r\n let startIndex;\r\n let endIndex;\r\n let nextCommentStartIndex;\r\n let dirtyCode;\r\n if (authorTimestampMatch) {\r\n author = userRegistry.getUser(decodeHtmlEntities(authorTimestampMatch[4]));\r\n timestamp = authorTimestampMatch[7];\r\n startIndex = timestampMatch.index + authorTimestampMatch[2].length;\r\n endIndex = timestampMatch.index + authorTimestampMatch[1].length;\r\n nextCommentStartIndex = timestampMatch.index + authorTimestampMatch[0].length;\r\n dirtyCode = authorTimestampMatch[3];\r\n\r\n // Find the first link to this author in the preceding text.\r\n let authorLinkMatch;\r\n authorLinkRegexp.lastIndex = 0;\r\n const commentEndingStartIndex = Math.max(\r\n 0,\r\n authorTimestampMatch[0].length - authorTimestampMatch[6].length -\r\n authorTimestampMatch[authorTimestampMatch.length - 1].length - signatureScanLimitWikitext\r\n );\r\n const commentEnding = authorTimestampMatch[0].slice(commentEndingStartIndex);\r\n while ((authorLinkMatch = authorLinkRegexp.exec(commentEnding))) {\r\n // Slash can be present in authorLinkMatch[2]. It often indicates a link to a page in the\r\n // author's userspace that is not part of the signature (while some such links are, and we\r\n // don't want to eliminate those cases).\r\n if (authorLinkMatch[2]) continue;\r\n const testAuthor = userRegistry.getUser(decodeHtmlEntities(authorLinkMatch[1]));\r\n if (testAuthor === author) {\r\n startIndex = timestampMatch.index + commentEndingStartIndex + authorLinkMatch.index;\r\n dirtyCode = code.slice(startIndex, endIndex);\r\n break;\r\n }\r\n }\r\n } else {\r\n timestamp = timestampMatch[3];\r\n startIndex = timestampMatch.index + timestampMatch[2].length;\r\n endIndex = timestampMatch.index + timestampMatch[1].length;\r\n nextCommentStartIndex = timestampMatch.index + timestampMatch[0].length;\r\n dirtyCode = timestamp;\r\n }\r\n\r\n signatures.push({ author, timestamp, startIndex, endIndex, dirtyCode, nextCommentStartIndex });\r\n }\r\n\r\n return signatures;\r\n}\r\n\r\n/**\r\n * Extract signatures that come from the unsigned templates from wikitext.\r\n *\r\n * @param {string} code Page code.\r\n * @param {object[]} signatures Existing signatures.\r\n * @returns {object[]}\r\n * @private\r\n */\r\nfunction extractUnsigneds(code, signatures) {\r\n const unsigneds = [];\r\n\r\n if (cd.g.UNSIGNED_TEMPLATES_REGEXP) {\r\n let match;\r\n while ((match = cd.g.UNSIGNED_TEMPLATES_REGEXP.exec(code))) {\r\n let author;\r\n let timestamp;\r\n if (cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.test(match[2])) {\r\n timestamp = match[2];\r\n author = match[3];\r\n } else if (cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.test(match[3])) {\r\n timestamp = match[3];\r\n author = match[2];\r\n } else {\r\n author = match[2];\r\n }\r\n author = userRegistry.getUser(decodeHtmlEntities(author));\r\n\r\n let startIndex = match.index;\r\n const endIndex = match.index + match[1].length;\r\n let dirtyCode = match[1];\r\n const nextCommentStartIndex = match.index + match[0].length;\r\n\r\n // \"[5 tildes] {{unsigned|}}\" cases. In these cases, both the signature and {{unsigned|}} are\r\n // considered signatures and added to the array. We could combine them but that would need\r\n // corresponding code in Parser.js which could be tricky, so for now we just remove the\r\n // duplicate. That still allows to reply to the comment.\r\n const relevantSignatureIndex = (\r\n signatures.findIndex((sig) => sig.nextCommentStartIndex === nextCommentStartIndex)\r\n );\r\n if (relevantSignatureIndex !== -1) {\r\n signatures.splice(relevantSignatureIndex, 1);\r\n }\r\n\r\n unsigneds.push({\r\n author,\r\n timestamp,\r\n startIndex,\r\n endIndex,\r\n dirtyCode,\r\n nextCommentStartIndex,\r\n });\r\n }\r\n }\r\n\r\n return unsigneds;\r\n}\r\n\r\n/**\r\n * Extract signatures from wikitext.\r\n *\r\n * Only basic signature parsing is performed here; more precise signature text identification is\r\n * performed in {@link module:Comment#adjustCommentCodeData}. See also {@link\r\n * module:Comment#adjustCommentBeginning}, called before that.\r\n *\r\n * @param {string} code Code to extract signatures from.\r\n * @param {boolean} generateCommentAnchors Whether to generate and register comment anchors.\r\n * @returns {object[]}\r\n */\r\nexport function extractSignatures(code, generateCommentAnchors) {\r\n // Hide HTML comments, quotes and lines containing antipatterns.\r\n const adjustedCode = hideHtmlComments(code)\r\n .replace(cd.g.QUOTE_REGEXP, (s, beginning, content, ending) => (\r\n beginning +\r\n ' '.repeat(content.length) +\r\n ending\r\n ))\r\n .replace(cd.g.COMMENT_ANTIPATTERNS_REGEXP, (s) => ' '.repeat(s.length));\r\n\r\n let signatures = extractRegularSignatures(adjustedCode);\r\n const unsigneds = extractUnsigneds(adjustedCode, signatures);\r\n signatures.push(...unsigneds);\r\n\r\n if (unsigneds.length) {\r\n signatures.sort((sig1, sig2) => sig1.startIndex > sig2.startIndex ? 1 : -1);\r\n }\r\n\r\n signatures = signatures.filter((sig) => sig.author);\r\n signatures.forEach((sig, i) => {\r\n sig.commentStartIndex = i === 0 ? 0 : signatures[i - 1].nextCommentStartIndex;\r\n });\r\n if (generateCommentAnchors) {\r\n resetCommentAnchors();\r\n }\r\n signatures.forEach((sig, i) => {\r\n const { date } = sig.timestamp && parseTimestamp(sig.timestamp) || {};\r\n sig.id = i;\r\n sig.date = date;\r\n delete sig.nextCommentStartIndex;\r\n\r\n if (generateCommentAnchors) {\r\n const anchor = date && generateCommentAnchor(date, sig.author.name, true);\r\n sig.anchor = anchor;\r\n registerCommentAnchor(anchor);\r\n }\r\n });\r\n\r\n return signatures;\r\n}\r\n\r\n/**\r\n * Decode HTML entities in a string.\r\n *\r\n * It should work as fast as possible, so we use String#indexOf, not String#includes.\r\n *\r\n * @param {string} s\r\n * @returns {string}\r\n */\r\nexport function decodeHtmlEntities(s) {\r\n if (s.indexOf('&') === -1) {\r\n return s;\r\n } else {\r\n let result = s;\r\n if (result.indexOf('&amp;') !== -1) {\r\n result = result.replace(/&amp;/g, '&amp;')\r\n }\r\n if (result.indexOf('&#') !== -1) {\r\n result = result.replace(/&#(\\d+);/g, (s, code) => String.fromCharCode(code));\r\n }\r\n if (result.indexOf('&') !== -1) {\r\n result = html_entity_decode(result);\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * @typedef {object} HideSensitiveCodeReturn\r\n * @property {string} code\r\n * @property {string[]} hidden\r\n */\r\n\r\n/**\r\n * Replace code that should not be modified when processing it with placeholders.\r\n *\r\n * @param {string} code\r\n * @returns {HideSensitiveCodeReturn}\r\n */\r\nexport function hideSensitiveCode(code) {\r\n const hidden = [];\r\n\r\n const hide = (regexp, isTable) => {\r\n code = hideText(code, regexp, hidden, isTable);\r\n };\r\n\r\n // Taken from\r\n // https://ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&oldid=102530721\r\n const hideTemplates = () => {\r\n // Simple regexp for hiding templates that have no nested ones.\r\n hide(/\\{\\{(?:[^{]\\{?)+?\\}\\}/g);\r\n\r\n let pos = 0;\r\n const stack = [];\r\n let template;\r\n let left;\r\n let right;\r\n while (true) {\r\n left = code.indexOf('{{', pos);\r\n right = code.indexOf('}}', pos);\r\n if (left === -1 && right === -1 && !stack.length) {\r\n break;\r\n }\r\n if (left !== -1 && (left < right || right === -1)) {\r\n stack.push(left);\r\n pos = left + 2;\r\n } else {\r\n left = stack.pop();\r\n if (typeof left === 'undefined') {\r\n if (right === -1) {\r\n pos += 2;\r\n continue;\r\n } else {\r\n left = 0;\r\n }\r\n }\r\n if (right === -1) {\r\n right = code.length;\r\n }\r\n right += 2;\r\n template = code.substring(left, right);\r\n code = (\r\n code.substring(0, left) +\r\n '\\x01' +\r\n hidden.push(template) +\r\n '\\x02' +\r\n code.substr(right)\r\n );\r\n pos = right - template.length;\r\n }\r\n }\r\n };\r\n\r\n const hideTags = (...args) => {\r\n args.forEach((arg) => {\r\n hide(new RegExp(`<${arg}(?: [^>]+)?>[\\\\s\\\\S]+?<\\\\/${arg}>`, 'gi'));\r\n });\r\n };\r\n\r\n hideTemplates();\r\n\r\n // Hide tables\r\n hide(/^(:* *)(\\{\\|[^]*?\\n\\|\\})/gm, true);\r\n\r\n hideTags('nowiki', 'pre', 'source', 'syntaxhighlight');\r\n\r\n return { code, hidden };\r\n}\r\n\r\n/**\r\n * Modify or leave unchanged the string to have two newlines in the end of it.\r\n *\r\n * @param {string} code\r\n * @returns {string}\r\n */\r\nexport function endWithTwoNewlines(code) {\r\n return code.replace(/([^\\n])\\n?$/, '$1\\n\\n');\r\n}\r\n","import { DomUtils, parseDOM } from 'htmlparser2';\r\n\r\nimport cd from './cd';\r\nimport { decodeHtmlEntities } from './wikitext';\r\n\r\nself.Node = {\r\n TEXT_NODE: 3,\r\n ELEMENT_NODE: 1,\r\n};\r\n\r\n/**\r\n * Iterate over child nodes, testing the node using the provided callback.\r\n *\r\n * Returns `true` to stop walking through subtree (after founding the required amounts for elements,\r\n * for instance).\r\n *\r\n * @param {Node} base\r\n * @param {Function} callback\r\n * @param {boolean} checkSelf\r\n * @returns {boolean}\r\n * @private\r\n */\r\nfunction walkThroughSubtree(base, callback, checkSelf) {\r\n if (checkSelf && callback(base)) {\r\n return true;\r\n }\r\n for (let n = base.firstChild; n; n = n.nextSibling) {\r\n if (walkThroughSubtree(n, callback, true)) {\r\n return true;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get all text nodes under the root element.\r\n *\r\n * @returns {Array}\r\n * @private\r\n */\r\nfunction getAllTextNodes() {\r\n let nodes = [];\r\n walkThroughSubtree(cd.g.rootElement, (node) => {\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n nodes.push(node);\r\n }\r\n });\r\n return nodes;\r\n}\r\n\r\nconst dummyDom = parseDOM('<a>a</a>');\r\nconst Element = dummyDom[0].constructor;\r\nconst DataNode = dummyDom[0].childNodes[0].constructor;\r\nconst NodeConstructor = Object.getPrototypeOf(DataNode);\r\n\r\n// We extend the prototype after parsing the html (parsing goes a bit faster with the default\r\n// setup).\r\nObject.defineProperty(Element.prototype, 'childElements', {\r\n get: function () {\r\n return this.childNodes.filter((node) => node.nodeType === Node.ELEMENT_NODE);\r\n },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'previousElementSibling', {\r\n get: function () {\r\n for (let n = this.previousSibling; n; n = n.previousSibling) {\r\n if (n.nodeType === Node.ELEMENT_NODE) {\r\n return n;\r\n }\r\n }\r\n return null;\r\n },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'nextElementSibling', {\r\n get: function () {\r\n for (let n = this.nextSibling; n; n = n.nextSibling) {\r\n if (n.nodeType === Node.ELEMENT_NODE) {\r\n return n;\r\n }\r\n }\r\n return null;\r\n },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'firstElementChild', {\r\n get: function () {\r\n let n;\r\n for (n = this.firstChild; n && n.nodeType !== Node.ELEMENT_NODE; n = n.nextSibling);\r\n return n || null;\r\n },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'lastElementChild', {\r\n get: function () {\r\n let n;\r\n for (n = this.lastChild; n && n.nodeType !== Node.ELEMENT_NODE; n = n.previousSibling);\r\n return n || null;\r\n },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'textContent', {\r\n get: function () {\r\n cd.debug.startTimer('textContent');\r\n // const returnValue = DomUtils.getText(this);\r\n // const returnValue = this.childNodes.map((node) => node.textContent).join('');\r\n let returnValue = '';\r\n // This runs pretty often, so we microoptimize it.\r\n this.childNodes.forEach((node) => {\r\n returnValue += node.textContent;\r\n });\r\n cd.debug.stopTimer('textContent');\r\n return returnValue;\r\n },\r\n});\r\n\r\nObject.defineProperty(Element.prototype, 'outerHTML', {\r\n get: function () {\r\n return DomUtils.getOuterHTML(this);\r\n },\r\n});\r\n\r\nElement.prototype.getAttribute = function (name) {\r\n let value = this.attribs[name];\r\n if (value && typeof value === 'string' && value.indexOf('&') !== -1) {\r\n value = value\r\n .replace(/&/g, '&')\r\n .replace(/"/g, '\"');\r\n }\r\n return value;\r\n};\r\n\r\nElement.prototype.setAttribute = function (name, value) {\r\n if (value && typeof value === 'string') {\r\n if (value.indexOf('&') !== -1) {\r\n value = value.replace(/&/g, '&');\r\n }\r\n if (value.indexOf('\"') !== -1) {\r\n value = value.replace(/\"/g, '"');\r\n }\r\n }\r\n this.attribs[name] = value || '';\r\n};\r\n\r\nElement.prototype.appendChild = function (node) {\r\n cd.debug.startTimer('appendChild');\r\n if (node.parentNode) {\r\n node.remove();\r\n }\r\n DomUtils.appendChild(this, node);\r\n cd.debug.stopTimer('appendChild');\r\n};\r\n\r\nElement.prototype.insertBefore = function (node, referenceNode) {\r\n cd.debug.startTimer('insertBefore');\r\n if (referenceNode) {\r\n if (node.parentNode) {\r\n node.remove();\r\n }\r\n DomUtils.prepend(referenceNode, node);\r\n } else {\r\n this.appendChild(node);\r\n }\r\n cd.debug.stopTimer('insertBefore');\r\n};\r\n\r\nElement.prototype.removeChild = function (node) {\r\n if (node.parentNode === this) {\r\n DomUtils.removeElement(node);\r\n }\r\n};\r\n\r\nElement.prototype.contains = function (node) {\r\n cd.debug.startTimer('contains');\r\n if (node === this) {\r\n return true;\r\n }\r\n if (!this.childNodes.length) return false;\r\n for (let n = node; n; n = n.parentNode) {\r\n if (n === this) {\r\n return true;\r\n }\r\n }\r\n cd.debug.stopTimer('contains');\r\n return false;\r\n};\r\n\r\nElement.prototype.follows = function (node) {\r\n cd.debug.startTimer('follows');\r\n if (this.startIndex && node.startIndex) {\r\n return this.startIndex > node.startIndex;\r\n }\r\n if (this === node) {\r\n return false;\r\n }\r\n\r\n const thisTree = [];\r\n const nodeTree = [];\r\n let sharedParent;\r\n let thisSharedParentChild;\r\n let nodeSharedParentChild;\r\n\r\n for (let current = this; current; current = current.parentNode) {\r\n if (current === node) {\r\n return true;\r\n }\r\n thisTree.unshift(current);\r\n }\r\n for (let current = node; current; current = current.parentNode) {\r\n nodeTree.unshift(current);\r\n if (thisTree.includes(current)) {\r\n sharedParent = current;\r\n thisSharedParentChild = thisTree[thisTree.indexOf(current) + 1];\r\n // nodeTree must have at least 2 elements, this is guaranteed by the check\r\n // \"current === node\" above.\r\n nodeSharedParentChild = nodeTree[1];\r\n break;\r\n }\r\n }\r\n const returnValue = (\r\n !sharedParent ||\r\n (\r\n sharedParent.childNodes.indexOf(thisSharedParentChild) >\r\n sharedParent.childNodes.indexOf(nodeSharedParentChild)\r\n )\r\n );\r\n // const returnValue = null;\r\n cd.debug.stopTimer('follows');\r\n return returnValue;\r\n};\r\n\r\nObject.defineProperty(Element.prototype, 'tagName', {\r\n get: function () {\r\n return this.name.toUpperCase();\r\n },\r\n});\r\n\r\n// We have to create a getter as there is no way to access an object from a method of that object's\r\n// property (Element#classList.add() and such in this case).\r\nObject.defineProperty(Element.prototype, 'classList', {\r\n get: function () {\r\n if (this._classList) {\r\n return this._classList;\r\n } else {\r\n this._classList = {\r\n list: [],\r\n\r\n movedFromClassAttr: false,\r\n\r\n moveFromClassAttr(classAttr) {\r\n this.list = (classAttr || '').split(' ');\r\n this.movedFromClassAttr = true;\r\n },\r\n\r\n add: (...names) => {\r\n names.forEach((name) => {\r\n cd.debug.startTimer('addClass');\r\n let classAttr = this.getAttribute('class') || '';\r\n if (classAttr) {\r\n classAttr += ' ';\r\n }\r\n classAttr += name;\r\n this.setAttribute('class', classAttr);\r\n if (this._classList.movedFromClassAttr) {\r\n this._classList.list.push(name);\r\n } else {\r\n this._classList.moveFromClassAttr(classAttr);\r\n }\r\n cd.debug.stopTimer('addClass');\r\n });\r\n },\r\n\r\n contains: (name) => {\r\n cd.debug.startTimer('containsClass');\r\n const classAttr = this.getAttribute('class');\r\n if (!classAttr) {\r\n cd.debug.stopTimer('containsClass');\r\n return false;\r\n }\r\n if (!this._classList.movedFromClassAttr) {\r\n this._classList.moveFromClassAttr(classAttr);\r\n }\r\n // This can run tens of thousand times, so we microoptimize it (don't use template strings\r\n // and String#includes).\r\n const returnValue = (\r\n Boolean(this._classList.list.length) &&\r\n this._classList.list.indexOf(name) !== -1\r\n );\r\n cd.debug.stopTimer('containsClass');\r\n return returnValue;\r\n },\r\n };\r\n return this._classList;\r\n }\r\n },\r\n});\r\n\r\nElement.prototype.getElementsByClassName = function (name, limit, our) {\r\n cd.debug.startTimer('getElementsByClassName');\r\n let nodes = [];\r\n walkThroughSubtree(this, (node) => {\r\n if (node.nodeType !== Node.ELEMENT_NODE) return;\r\n if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains(name, our)) {\r\n nodes.push(node);\r\n if (limit && nodes.length === limit) {\r\n return true;\r\n }\r\n }\r\n });\r\n cd.debug.stopTimer('getElementsByClassName');\r\n return nodes;\r\n};\r\n\r\nElement.prototype.getElementsByTagName = function (name) {\r\n cd.debug.startTimer('getElementsByTagName');\r\n const returnValue = DomUtils.getElementsByTagName(name, this);\r\n cd.debug.stopTimer('getElementsByTagName');\r\n return returnValue;\r\n};\r\n\r\nObject.defineProperty(DataNode.prototype, 'textContent', {\r\n get: function () {\r\n return decodeHtmlEntities(this.data);\r\n },\r\n set: function (value) {\r\n this.data = value;\r\n },\r\n});\r\n\r\nNodeConstructor.prototype.remove = function () {\r\n // removeElement doesn't clean up \"prev\" and \"next\".\r\n DomUtils.removeElement(this);\r\n this.prev = null;\r\n this.next = null;\r\n};\r\n\r\n// We need the \"Document\" class to imitate window.document for the code to be more easily ported to\r\n// other library if needed. Here, we also extend the prototype of the Element and DataNode classes\r\n// that htmlparser2 library uses. Note that the Element class already has the \"children\" property\r\n// containing all child nodes, which differs from what this property stands for in the browser DOM\r\n// representation (only element children), but we can't replace it as it would intervene in the\r\n// internal workings of the class. So we use the \"childElements\" property instead for this purpose.\r\nclass Document extends Element {\r\n constructor(dom) {\r\n super('body', {});\r\n for (const el of dom) {\r\n this.appendChild(el);\r\n }\r\n }\r\n\r\n createElement(name) {\r\n return new Element(name, {});\r\n }\r\n\r\n createTextNode(content) {\r\n return new DataNode('text', content);\r\n }\r\n}\r\n\r\nDocument.prototype.getElementsByClassName = Element.prototype.getElementsByClassName;\r\n\r\nself.Document = Document;\r\n\r\nexport { getAllTextNodes, parseDOM };\r\n","/**\r\n * Web worker entry point.\r\n *\r\n * Note that currently there may be difficulties in testing the web worker in the \"local\" mode with\r\n * custom config functions such as {@link module:defaultConfig.checkForCustomForeignComponents} due to\r\n * the (unfortunate) use of `eval()` here and the fact that webpack renames some objects in some\r\n * contexts resulting in a lost tie between them.\r\n *\r\n * @module worker\r\n */\r\n\r\nimport CdError from './CdError';\r\nimport CommentSkeleton from './CommentSkeleton';\r\nimport Parser from './Parser';\r\nimport SectionSkeleton from './SectionSkeleton';\r\nimport cd from './cd';\r\nimport debug from './debug';\r\nimport g from './staticGlobals';\r\nimport { ElementsTreeWalker } from './treeWalker';\r\nimport { getAllTextNodes, parseDOM } from './htmlparser2Extended';\r\nimport { resetCommentAnchors } from './timestamp';\r\n\r\nself.cd = cd;\r\ncd.g = g;\r\ncd.debug = debug;\r\ncd.debug.init();\r\n\r\nconst context = {\r\n CommentClass: CommentSkeleton,\r\n SectionClass: SectionSkeleton,\r\n childElementsProperty: 'childElements',\r\n follows: (el1, el2) => el1.follows(el2),\r\n getAllTextNodes,\r\n getElementByClassName: (node, className) => {\r\n const elements = node.getElementsByClassName(className, 1);\r\n return elements[0] || null;\r\n },\r\n};\r\n\r\nlet alarmTimeout;\r\n\r\n/**\r\n * Send a \"wake up\" message to the window after the specified interval.\r\n *\r\n * @param {number} interval\r\n * @private\r\n */\r\nfunction setAlarm(interval) {\r\n clearTimeout(alarmTimeout);\r\n alarmTimeout = setTimeout(() => {\r\n postMessage({ type: 'wakeUp' });\r\n }, interval);\r\n}\r\n\r\n/**\r\n * Parse the page and send a message to the window.\r\n *\r\n * @private\r\n */\r\nfunction parse() {\r\n cd.comments = [];\r\n cd.sections = [];\r\n resetCommentAnchors();\r\n\r\n cd.debug.startTimer('processing comments');\r\n\r\n const parser = new Parser(context);\r\n\r\n cd.debug.startTimer('find timestamps');\r\n const timestamps = parser.findTimestamps();\r\n cd.debug.stopTimer('find timestamps');\r\n\r\n cd.debug.startTimer('find signatures');\r\n const signatures = parser.findSignatures(timestamps);\r\n cd.debug.stopTimer('find signatures');\r\n\r\n signatures.forEach((signature) => {\r\n try {\r\n const comment = parser.createComment(signature);\r\n if (comment.id !== undefined) {\r\n cd.comments.push(comment);\r\n }\r\n } catch (e) {\r\n if (!(e instanceof CdError)) {\r\n console.error(e);\r\n }\r\n }\r\n });\r\n\r\n cd.debug.stopTimer('processing comments');\r\n cd.debug.startTimer('processing sections');\r\n\r\n parser.findHeadings().forEach((heading) => {\r\n try {\r\n const section = parser.createSection(heading);\r\n if (section.id !== undefined) {\r\n cd.sections.push(section);\r\n }\r\n } catch (e) {\r\n if (!(e instanceof CdError)) {\r\n console.error(e);\r\n }\r\n }\r\n });\r\n\r\n cd.comments.forEach((comment, i) => {\r\n // Determine which comments reply to which.\r\n if (i !== cd.comments.length - 1) {\r\n if (cd.g.specialElements.pageHasOutdents) {\r\n const treeWalker = new ElementsTreeWalker(comment.elements[comment.elements.length - 1]);\r\n let found;\r\n while (\r\n !found &&\r\n treeWalker.nextNode() &&\r\n !treeWalker.currentNode.classList.contains('cd-commentPart')\r\n ) {\r\n found = treeWalker.currentNode.classList.contains('outdent-template');\r\n }\r\n if (found) {\r\n cd.comments[comment.id + 1].targetComment = comment;\r\n }\r\n }\r\n\r\n if (cd.comments[comment.id + 1].targetComment !== comment) {\r\n cd.comments\r\n .slice(comment.id + 1)\r\n .some((otherComment) => {\r\n if (otherComment.section === comment.section && otherComment.level > comment.level) {\r\n if (\r\n otherComment.level === comment.level + 1 ||\r\n // Comments mistakenly indented more than one level\r\n otherComment.id === comment.id + 1\r\n ) {\r\n otherComment.targetComment = comment;\r\n }\r\n } else {\r\n return true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n if (comment.section) {\r\n comment.sectionHeadline = comment.section.headline;\r\n comment.sectionAnchor = comment.section.anchor;\r\n delete comment.section;\r\n }\r\n if (comment.targetComment) {\r\n comment.targetCommentAuthorName = comment.targetComment.authorName;\r\n comment.toMe = comment.targetComment.own;\r\n delete comment.targetComment;\r\n }\r\n delete comment.elements;\r\n delete comment.parts;\r\n delete comment.highlightables;\r\n delete comment.addAttributes;\r\n delete comment.setLevels;\r\n delete comment.getSection;\r\n });\r\n\r\n cd.debug.stopTimer('processing sections');\r\n cd.debug.startTimer('post message from the worker');\r\n\r\n postMessage({\r\n type: 'parse',\r\n comments: cd.comments,\r\n });\r\n\r\n cd.debug.stopTimer('post message from the worker');\r\n cd.debug.stopTimer('worker operations');\r\n cd.debug.logAndResetEverything();\r\n}\r\n\r\n/**\r\n * Callback for messages from the window.\r\n *\r\n * @param {Event} e\r\n * @private\r\n */\r\nfunction onMessageFromWindow(e) {\r\n const message = e.data;\r\n\r\n if (message.type === 'setAlarm') {\r\n setAlarm(message.interval);\r\n }\r\n\r\n if (message.type === 'removeAlarm') {\r\n clearTimeout(alarmTimeout);\r\n }\r\n\r\n if (message.type === 'parse') {\r\n cd.debug.startTimer('worker operations');\r\n\r\n Object.assign(cd.g, message.g);\r\n cd.config = message.config;\r\n\r\n // FIXME: Any idea how to avoid using eval() here?\r\n let checker = cd.config.checkForCustomForeignComponents;\r\n if (checker && !/^ *function +/.test(checker) && !/^.+=>/.test(checker)) {\r\n checker = 'function ' + checker;\r\n }\r\n cd.config.checkForCustomForeignComponents = eval(checker);\r\n\r\n cd.g.TIMESTAMP_PARSER = eval(cd.g.TIMESTAMP_PARSER);\r\n\r\n cd.debug.startTimer('parse html');\r\n\r\n const dom = parseDOM(message.text, {\r\n withStartIndices: true,\r\n withEndIndices: true,\r\n });\r\n\r\n cd.debug.stopTimer('parse html');\r\n\r\n cd.g.rootElement = new Document(dom);\r\n context.document = cd.g.rootElement;\r\n cd.g.specialElements = {\r\n pageHasOutdents: Boolean(\r\n cd.g.rootElement.getElementsByClassName('outdent-template', 1).length\r\n ),\r\n };\r\n\r\n parse();\r\n }\r\n}\r\n\r\nonmessage = onMessageFromWindow;\r\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar nodeTypes = new Map([\n [\"tag\" /* Tag */, 1],\n [\"script\" /* Script */, 1],\n [\"style\" /* Style */, 1],\n [\"directive\" /* Directive */, 1],\n [\"text\" /* Text */, 3],\n [\"cdata\" /* CDATA */, 4],\n [\"comment\" /* Comment */, 8]\n]);\n// This object will be used as the prototype for Nodes when creating a\n// DOM-Level-1-compliant structure.\nvar Node = /** @class */ (function () {\n /**\n *\n * @param type The type of the node.\n */\n function Node(type) {\n this.type = type;\n /** Parent of the node */\n this.parent = null;\n /** Previous sibling */\n this.prev = null;\n /** Next sibling */\n this.next = null;\n /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n this.startIndex = null;\n /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n this.endIndex = null;\n }\n Object.defineProperty(Node.prototype, \"nodeType\", {\n // Read-only aliases\n get: function () {\n return nodeTypes.get(this.type) || 1;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Node.prototype, \"parentNode\", {\n // Read-write aliases for properties\n get: function () {\n return this.parent || null;\n },\n set: function (parent) {\n this.parent = parent;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Node.prototype, \"previousSibling\", {\n get: function () {\n return this.prev || null;\n },\n set: function (prev) {\n this.prev = prev;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Node.prototype, \"nextSibling\", {\n get: function () {\n return this.next || null;\n },\n set: function (next) {\n this.next = next;\n },\n enumerable: true,\n configurable: true\n });\n return Node;\n}());\nexports.Node = Node;\nvar DataNode = /** @class */ (function (_super) {\n __extends(DataNode, _super);\n /**\n *\n * @param type The type of the node\n * @param data The content of the data node\n */\n function DataNode(type, data) {\n var _this = _super.call(this, type) || this;\n _this.data = data;\n return _this;\n }\n Object.defineProperty(DataNode.prototype, \"nodeValue\", {\n get: function () {\n return this.data;\n },\n set: function (data) {\n this.data = data;\n },\n enumerable: true,\n configurable: true\n });\n return DataNode;\n}(Node));\nexports.DataNode = DataNode;\nvar ProcessingInstruction = /** @class */ (function (_super) {\n __extends(ProcessingInstruction, _super);\n function ProcessingInstruction(name, data) {\n var _this = _super.call(this, \"directive\" /* Directive */, data) || this;\n _this.name = name;\n return _this;\n }\n return ProcessingInstruction;\n}(DataNode));\nexports.ProcessingInstruction = ProcessingInstruction;\nvar NodeWithChildren = /** @class */ (function (_super) {\n __extends(NodeWithChildren, _super);\n /**\n *\n * @param type Type of the node.\n * @param children Children of the node. Only certain node types can have children.\n */\n function NodeWithChildren(type, children) {\n var _this = _super.call(this, type) || this;\n _this.children = children;\n return _this;\n }\n Object.defineProperty(NodeWithChildren.prototype, \"firstChild\", {\n // Aliases\n get: function () {\n return this.children[0] || null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NodeWithChildren.prototype, \"lastChild\", {\n get: function () {\n return this.children[this.children.length - 1] || null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NodeWithChildren.prototype, \"childNodes\", {\n get: function () {\n return this.children;\n },\n set: function (children) {\n this.children = children;\n },\n enumerable: true,\n configurable: true\n });\n return NodeWithChildren;\n}(Node));\nexports.NodeWithChildren = NodeWithChildren;\nvar Element = /** @class */ (function (_super) {\n __extends(Element, _super);\n /**\n *\n * @param name Name of the tag, eg. `div`, `span`\n * @param attribs Object mapping attribute names to attribute values\n */\n function Element(name, attribs) {\n var _this = _super.call(this, name === \"script\"\n ? \"script\" /* Script */\n : name === \"style\"\n ? \"style\" /* Style */\n : \"tag\" /* Tag */, []) || this;\n _this.name = name;\n _this.attribs = attribs;\n _this.attribs = attribs;\n return _this;\n }\n Object.defineProperty(Element.prototype, \"tagName\", {\n // DOM Level 1 aliases\n get: function () {\n return this.name;\n },\n set: function (name) {\n this.name = name;\n },\n enumerable: true,\n configurable: true\n });\n return Element;\n}(NodeWithChildren));\nexports.Element = Element;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tagtypes_1 = require(\"./tagtypes\");\nvar dom_serializer_1 = __importDefault(require(\"dom-serializer\"));\nexports.getOuterHTML = dom_serializer_1.default;\nfunction getInnerHTML(node, options) {\n return tagtypes_1.hasChildren(node)\n ? node.children.map(function (node) { return exports.getOuterHTML(node, options); }).join(\"\")\n : \"\";\n}\nexports.getInnerHTML = getInnerHTML;\nfunction getText(node) {\n if (Array.isArray(node))\n return node.map(getText).join(\"\");\n if (tagtypes_1.isTag(node))\n return node.name === \"br\" ? \"\\n\" : getText(node.children);\n if (tagtypes_1.isCDATA(node))\n return getText(node.children);\n if (tagtypes_1.isText(node))\n return node.data;\n return \"\";\n}\nexports.getText = getText;\n","/*\n Module dependencies\n*/\nvar ElementType = require('domelementtype');\nvar entities = require('entities');\n\n/* mixed-case SVG and MathML tags & attributes\n recognized by the HTML parser, see\n https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n*/\nvar foreignNames = require('./foreignNames.json');\nforeignNames.elementNames.__proto__ = null; /* use as a simple dictionary */\nforeignNames.attributeNames.__proto__ = null;\n\nvar unencodedElements = {\n __proto__: null,\n style: true,\n script: true,\n xmp: true,\n iframe: true,\n noembed: true,\n noframes: true,\n plaintext: true,\n noscript: true\n};\n\n/*\n Format attributes\n*/\nfunction formatAttrs(attributes, opts) {\n if (!attributes) return;\n\n var output = '';\n var value;\n\n // Loop through the attributes\n for (var key in attributes) {\n value = attributes[key];\n if (output) {\n output += ' ';\n }\n\n if (opts.xmlMode === 'foreign') {\n /* fix up mixed-case attribute names */\n key = foreignNames.attributeNames[key] || key;\n }\n output += key;\n if ((value !== null && value !== '') || opts.xmlMode) {\n output +=\n '=\"' +\n (opts.decodeEntities\n ? entities.encodeXML(value)\n : value.replace(/\\\"/g, '"')) +\n '\"';\n }\n }\n\n return output;\n}\n\n/*\n Self-enclosing tags (stolen from node-htmlparser)\n*/\nvar singleTag = {\n __proto__: null,\n area: true,\n base: true,\n basefont: true,\n br: true,\n col: true,\n command: true,\n embed: true,\n frame: true,\n hr: true,\n img: true,\n input: true,\n isindex: true,\n keygen: true,\n link: true,\n meta: true,\n param: true,\n source: true,\n track: true,\n wbr: true\n};\n\nvar render = (module.exports = function(dom, opts) {\n if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];\n opts = opts || {};\n\n var output = '';\n\n for (var i = 0; i < dom.length; i++) {\n var elem = dom[i];\n\n if (elem.type === 'root') output += render(elem.children, opts);\n else if (ElementType.isTag(elem)) output += renderTag(elem, opts);\n else if (elem.type === ElementType.Directive)\n output += renderDirective(elem);\n else if (elem.type === ElementType.Comment) output += renderComment(elem);\n else if (elem.type === ElementType.CDATA) output += renderCdata(elem);\n else output += renderText(elem, opts);\n }\n\n return output;\n});\n\nvar foreignModeIntegrationPoints = [\n 'mi',\n 'mo',\n 'mn',\n 'ms',\n 'mtext',\n 'annotation-xml',\n 'foreignObject',\n 'desc',\n 'title'\n];\n\nfunction renderTag(elem, opts) {\n // Handle SVG / MathML in HTML\n if (opts.xmlMode === 'foreign') {\n /* fix up mixed-case element names */\n elem.name = foreignNames.elementNames[elem.name] || elem.name;\n /* exit foreign mode at integration points */\n if (\n elem.parent &&\n foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0\n )\n opts = Object.assign({}, opts, { xmlMode: false });\n }\n if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {\n opts = Object.assign({}, opts, { xmlMode: 'foreign' });\n }\n\n var tag = '<' + elem.name;\n var attribs = formatAttrs(elem.attribs, opts);\n\n if (attribs) {\n tag += ' ' + attribs;\n }\n\n if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {\n tag += '/>';\n } else {\n tag += '>';\n if (elem.children) {\n tag += render(elem.children, opts);\n }\n\n if (!singleTag[elem.name] || opts.xmlMode) {\n tag += '</' + elem.name + '>';\n }\n }\n\n return tag;\n}\n\nfunction renderDirective(elem) {\n return '<' + elem.data + '>';\n}\n\nfunction renderText(elem, opts) {\n var data = elem.data || '';\n\n // if entities weren't decoded, no need to encode them back\n if (\n opts.decodeEntities &&\n !(elem.parent && elem.parent.name in unencodedElements)\n ) {\n data = entities.encodeXML(data);\n }\n\n return data;\n}\n\nfunction renderCdata(elem) {\n return '<![CDATA[' + elem.children[0].data + ']]>';\n}\n\nfunction renderComment(elem) {\n return '<!--' + elem.data + '-->';\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\nfunction decode(data, level) {\n return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n}\nexports.decode = decode;\nfunction decodeStrict(data, level) {\n return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n}\nexports.decodeStrict = decodeStrict;\nfunction encode(data, level) {\n return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nexports.encodeXML = encode_2.encodeXML;\nexports.encodeHTML = encode_2.encodeHTML;\nexports.escape = encode_2.escape;\n// Legacy aliases\nexports.encodeHTML4 = encode_2.encodeHTML;\nexports.encodeHTML5 = encode_2.encodeHTML;\nvar decode_2 = require(\"./decode\");\nexports.decodeXML = decode_2.decodeXML;\nexports.decodeHTML = decode_2.decodeHTML;\nexports.decodeHTMLStrict = decode_2.decodeHTMLStrict;\n// Legacy aliases\nexports.decodeHTML4 = decode_2.decodeHTML;\nexports.decodeHTML5 = decode_2.decodeHTML;\nexports.decodeHTML4Strict = decode_2.decodeHTMLStrict;\nexports.decodeHTML5Strict = decode_2.decodeHTMLStrict;\nexports.decodeXMLStrict = decode_2.decodeXML;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction getChildren(elem) {\n // @ts-ignore\n return elem.children || null;\n}\nexports.getChildren = getChildren;\nfunction getParent(elem) {\n return elem.parent || null;\n}\nexports.getParent = getParent;\nfunction getSiblings(elem) {\n var parent = getParent(elem);\n return parent ? getChildren(parent) : [elem];\n}\nexports.getSiblings = getSiblings;\nfunction getAttributeValue(elem, name) {\n return elem.attribs && elem.attribs[name];\n}\nexports.getAttributeValue = getAttributeValue;\nfunction hasAttrib(elem, name) {\n return !!getAttributeValue(elem, name);\n}\nexports.hasAttrib = hasAttrib;\n/***\n * Returns the name property of an element\n *\n * @argument elem The element to get the name for\n */\nfunction getName(elem) {\n return elem.name;\n}\nexports.getName = getName;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/***\n * Remove an element from the dom\n *\n * @argument elem The element to be removed\n */\nfunction removeElement(elem) {\n if (elem.prev)\n elem.prev.next = elem.next;\n if (elem.next)\n elem.next.prev = elem.prev;\n if (elem.parent) {\n var childs = elem.parent.children;\n childs.splice(childs.lastIndexOf(elem), 1);\n }\n}\nexports.removeElement = removeElement;\n/***\n * Replace an element in the dom\n *\n * @argument elem The element to be replaced\n * @argument replacement The element to be added\n */\nfunction replaceElement(elem, replacement) {\n var prev = (replacement.prev = elem.prev);\n if (prev) {\n prev.next = replacement;\n }\n var next = (replacement.next = elem.next);\n if (next) {\n next.prev = replacement;\n }\n var parent = (replacement.parent = elem.parent);\n if (parent) {\n var childs = parent.children;\n childs[childs.lastIndexOf(elem)] = replacement;\n }\n}\nexports.replaceElement = replaceElement;\n/***\n * Append a child to an element\n *\n * @argument elem The element to append to\n * @argument child The element to be added as a child\n */\nfunction appendChild(elem, child) {\n child.parent = elem;\n if (elem.children.push(child) !== 1) {\n var sibling = elem.children[elem.children.length - 2];\n sibling.next = child;\n child.prev = sibling;\n child.next = null;\n }\n}\nexports.appendChild = appendChild;\n/***\n * Append an element after another\n *\n * @argument elem The element to append to\n * @argument next The element be added\n */\nfunction append(elem, next) {\n var parent = elem.parent, currNext = elem.next;\n next.next = currNext;\n next.prev = elem;\n elem.next = next;\n next.parent = parent;\n if (currNext) {\n currNext.prev = next;\n if (parent) {\n var childs = parent.children;\n childs.splice(childs.lastIndexOf(currNext), 0, next);\n }\n }\n else if (parent) {\n parent.children.push(next);\n }\n}\nexports.append = append;\n/***\n * Prepend an element before another\n *\n * @argument elem The element to append to\n * @argument prev The element be added\n */\nfunction prepend(elem, prev) {\n var parent = elem.parent;\n if (parent) {\n var childs = parent.children;\n childs.splice(childs.lastIndexOf(elem), 0, prev);\n }\n if (elem.prev) {\n elem.prev.next = prev;\n }\n prev.parent = parent;\n prev.prev = elem.prev;\n prev.next = elem;\n elem.prev = prev;\n}\nexports.prepend = prepend;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar querying_1 = require(\"./querying\");\nvar tagtypes_1 = require(\"./tagtypes\");\nfunction isTextNode(node) {\n return node.type === \"text\" /* Text */;\n}\n/* eslint-disable @typescript-eslint/camelcase */\nvar Checks = {\n tag_name: function (name) {\n if (typeof name === \"function\") {\n return function (elem) { return tagtypes_1.isTag(elem) && name(elem.name); };\n }\n else if (name === \"*\") {\n return tagtypes_1.isTag;\n }\n else {\n return function (elem) { return tagtypes_1.isTag(elem) && elem.name === name; };\n }\n },\n tag_type: function (type) {\n if (typeof type === \"function\") {\n return function (elem) { return type(elem.type); };\n }\n else {\n return function (elem) { return elem.type === type; };\n }\n },\n tag_contains: function (data) {\n if (typeof data === \"function\") {\n return function (elem) { return isTextNode(elem) && data(elem.data); };\n }\n else {\n return function (elem) { return isTextNode(elem) && elem.data === data; };\n }\n }\n};\n/* eslint-enable @typescript-eslint/camelcase */\nfunction getAttribCheck(attrib, value) {\n if (typeof value === \"function\") {\n return function (elem) { return tagtypes_1.isTag(elem) && value(elem.attribs[attrib]); };\n }\n else {\n return function (elem) { return tagtypes_1.isTag(elem) && elem.attribs[attrib] === value; };\n }\n}\nfunction combineFuncs(a, b) {\n return function (elem) { return a(elem) || b(elem); };\n}\nfunction compileTest(options) {\n var funcs = Object.keys(options).map(function (key) {\n var value = options[key];\n // @ts-ignore\n return key in Checks ? Checks[key](value) : getAttribCheck(key, value);\n });\n return funcs.length === 0 ? null : funcs.reduce(combineFuncs);\n}\nfunction testElement(options, element) {\n var test = compileTest(options);\n return test ? test(element) : true;\n}\nexports.testElement = testElement;\nfunction getElements(options, element, recurse, limit) {\n if (limit === void 0) { limit = Infinity; }\n var test = compileTest(options);\n return test ? querying_1.filter(test, element, recurse, limit) : [];\n}\nexports.getElements = getElements;\nfunction getElementById(id, element, recurse) {\n if (recurse === void 0) { recurse = true; }\n if (!Array.isArray(element))\n element = [element];\n return querying_1.findOne(getAttribCheck(\"id\", id), element, recurse);\n}\nexports.getElementById = getElementById;\nfunction getElementsByTagName(name, element, recurse, limit) {\n if (limit === void 0) { limit = Infinity; }\n return querying_1.filter(Checks.tag_name(name), element, recurse, limit);\n}\nexports.getElementsByTagName = getElementsByTagName;\nfunction getElementsByTagType(type, element, recurse, limit) {\n if (recurse === void 0) { recurse = true; }\n if (limit === void 0) { limit = Infinity; }\n return querying_1.filter(Checks.tag_type(type), element, recurse, limit);\n}\nexports.getElementsByTagType = getElementsByTagType;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tagtypes_1 = require(\"./tagtypes\");\n/**\n * Given an array of nodes, remove any member that is contained by another.\n *\n * @param nodes — Nodes to filter.\n */\nfunction removeSubsets(nodes) {\n var idx = nodes.length;\n // Check if each node (or one of its ancestors) is already contained in the\n // array.\n while (--idx >= 0) {\n var node = nodes[idx];\n // Remove the node if it is not unique.\n // We are going through the array from the end, so we only\n // have to check nodes that preceed the node under consideration in the array.\n if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) {\n nodes.splice(idx, 1);\n continue;\n }\n for (var ancestor = node.parent; ancestor; ancestor = ancestor.parent) {\n if (nodes.indexOf(ancestor) > -1) {\n nodes.splice(idx, 1);\n break;\n }\n }\n }\n return nodes;\n}\nexports.removeSubsets = removeSubsets;\n/***\n * Compare the position of one node against another node in any other document.\n * The return value is a bitmask with the following values:\n *\n * document order:\n * > There is an ordering, document order, defined on all the nodes in the\n * > document corresponding to the order in which the first character of the\n * > XML representation of each node occurs in the XML representation of the\n * > document after expansion of general entities. Thus, the document element\n * > node will be the first node. Element nodes occur before their children.\n * > Thus, document order orders element nodes in order of the occurrence of\n * > their start-tag in the XML (after expansion of entities). The attribute\n * > nodes of an element occur after the element and before its children. The\n * > relative order of attribute nodes is implementation-dependent./\n *\n * Source:\n * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n * @argument nodaA The first node to use in the comparison\n * @argument nodeB The second node to use in the comparison\n *\n * @return A bitmask describing the input nodes' relative position.\n *\n * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n * a description of these values.\n */\nfunction compareDocumentPosition(nodeA, nodeB) {\n var aParents = [];\n var bParents = [];\n if (nodeA === nodeB) {\n return 0;\n }\n var current = tagtypes_1.hasChildren(nodeA) ? nodeA : nodeA.parent;\n while (current) {\n aParents.unshift(current);\n current = current.parent;\n }\n current = tagtypes_1.hasChildren(nodeB) ? nodeB : nodeB.parent;\n while (current) {\n bParents.unshift(current);\n current = current.parent;\n }\n var idx = 0;\n while (aParents[idx] === bParents[idx]) {\n idx++;\n }\n if (idx === 0) {\n return 1 /* DISCONNECTED */;\n }\n var sharedParent = aParents[idx - 1];\n var siblings = sharedParent.children;\n var aSibling = aParents[idx];\n var bSibling = bParents[idx];\n if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n if (sharedParent === nodeB) {\n return 4 /* FOLLOWING */ | 16 /* CONTAINED_BY */;\n }\n return 4 /* FOLLOWING */;\n }\n else {\n if (sharedParent === nodeA) {\n return 2 /* PRECEDING */ | 8 /* CONTAINS */;\n }\n return 2 /* PRECEDING */;\n }\n}\nexports.compareDocumentPosition = compareDocumentPosition;\n/***\n * Sort an array of nodes based on their relative position in the document and\n * remove any duplicate nodes. If the array contains nodes that do not belong\n * to the same document, sort order is unspecified.\n *\n * @argument nodes Array of DOM nodes\n * @returns collection of unique nodes, sorted in document order\n */\nfunction uniqueSort(nodes) {\n nodes = nodes.filter(function (node, i, arr) { return !arr.includes(node, i + 1); });\n nodes.sort(function (a, b) {\n var relative = compareDocumentPosition(a, b);\n if (relative & 2 /* PRECEDING */) {\n return -1;\n }\n else if (relative & 4 /* FOLLOWING */) {\n return 1;\n }\n return 0;\n });\n return nodes;\n}\nexports.uniqueSort = uniqueSort;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MultiplexHandler_1 = __importDefault(require(\"./MultiplexHandler\"));\nvar CollectingHandler = /** @class */ (function (_super) {\n __extends(CollectingHandler, _super);\n function CollectingHandler(cbs) {\n if (cbs === void 0) { cbs = {}; }\n var _this = _super.call(this, function (name) {\n var _a;\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n _this.events.push([name].concat(args));\n // @ts-ignore\n if (_this._cbs[name])\n (_a = _this._cbs)[name].apply(_a, args);\n }) || this;\n _this._cbs = cbs;\n _this.events = [];\n return _this;\n }\n CollectingHandler.prototype.onreset = function () {\n this.events = [];\n if (this._cbs.onreset)\n this._cbs.onreset();\n };\n CollectingHandler.prototype.restart = function () {\n var _a;\n if (this._cbs.onreset)\n this._cbs.onreset();\n for (var i = 0; i < this.events.length; i++) {\n var _b = this.events[i], name_1 = _b[0], args = _b.slice(1);\n if (!this._cbs[name_1]) {\n continue;\n }\n // @ts-ignore\n (_a = this._cbs)[name_1].apply(_a, args);\n }\n };\n return CollectingHandler;\n}(MultiplexHandler_1.default));\nexports.CollectingHandler = CollectingHandler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Calls a specific handler function for all events that are encountered.\n *\n * @param func — The function to multiplex all events to.\n */\nvar MultiplexHandler = /** @class */ (function () {\n function MultiplexHandler(func) {\n this._func = func;\n }\n /* Format: eventname: number of arguments */\n MultiplexHandler.prototype.onattribute = function (name, value) {\n this._func(\"onattribute\", name, value);\n };\n MultiplexHandler.prototype.oncdatastart = function () {\n this._func(\"oncdatastart\");\n };\n MultiplexHandler.prototype.oncdataend = function () {\n this._func(\"oncdataend\");\n };\n MultiplexHandler.prototype.ontext = function (text) {\n this._func(\"ontext\", text);\n };\n MultiplexHandler.prototype.onprocessinginstruction = function (name, value) {\n this._func(\"onprocessinginstruction\", name, value);\n };\n MultiplexHandler.prototype.oncomment = function (comment) {\n this._func(\"oncomment\", comment);\n };\n MultiplexHandler.prototype.oncommentend = function () {\n this._func(\"oncommentend\");\n };\n MultiplexHandler.prototype.onclosetag = function (name) {\n this._func(\"onclosetag\", name);\n };\n MultiplexHandler.prototype.onopentag = function (name, attribs) {\n this._func(\"onopentag\", name, attribs);\n };\n MultiplexHandler.prototype.onopentagname = function (name) {\n this._func(\"onopentagname\", name);\n };\n MultiplexHandler.prototype.onerror = function (error) {\n this._func(\"onerror\", error);\n };\n MultiplexHandler.prototype.onend = function () {\n this._func(\"onend\");\n };\n MultiplexHandler.prototype.onparserinit = function (parser) {\n this._func(\"onparserinit\", parser);\n };\n MultiplexHandler.prototype.onreset = function () {\n this._func(\"onreset\");\n };\n return MultiplexHandler;\n}());\nexports.default = MultiplexHandler;\n","'use strict';\n\nmodule.exports = function get_html_translation_table(table, quoteStyle) {\n // eslint-disable-line camelcase\n // discuss at: http://locutus.io/php/get_html_translation_table/\n // original by: Philip Peterson\n // revised by: Kevin van Zonneveld (http://kvz.io)\n // bugfixed by: noname\n // bugfixed by: Alex\n // bugfixed by: Marco\n // bugfixed by: madipta\n // bugfixed by: Brett Zamir (http://brett-zamir.me)\n // bugfixed by: T.Wild\n // improved by: KELAN\n // improved by: Brett Zamir (http://brett-zamir.me)\n // input by: Frank Forte\n // input by: Ratheous\n // note 1: It has been decided that we're not going to add global\n // note 1: dependencies to Locutus, meaning the constants are not\n // note 1: real constants, but strings instead. Integers are also supported if someone\n // note 1: chooses to create the constants themselves.\n // example 1: get_html_translation_table('HTML_SPECIALCHARS')\n // returns 1: {'\"': '"', '&': '&', '<': '<', '>': '>'}\n\n var entities = {};\n var hashMap = {};\n var decimal;\n var constMappingTable = {};\n var constMappingQuoteStyle = {};\n var useTable = {};\n var useQuoteStyle = {};\n\n // Translate arguments\n constMappingTable[0] = 'HTML_SPECIALCHARS';\n constMappingTable[1] = 'HTML_ENTITIES';\n constMappingQuoteStyle[0] = 'ENT_NOQUOTES';\n constMappingQuoteStyle[2] = 'ENT_COMPAT';\n constMappingQuoteStyle[3] = 'ENT_QUOTES';\n\n useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';\n\n useQuoteStyle = !isNaN(quoteStyle) ? constMappingQuoteStyle[quoteStyle] : quoteStyle ? quoteStyle.toUpperCase() : 'ENT_COMPAT';\n\n if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') {\n throw new Error('Table: ' + useTable + ' not supported');\n }\n\n entities['38'] = '&';\n if (useTable === 'HTML_ENTITIES') {\n entities['160'] = ' ';\n entities['161'] = '¡';\n entities['162'] = '¢';\n entities['163'] = '£';\n entities['164'] = '¤';\n entities['165'] = '¥';\n entities['166'] = '¦';\n entities['167'] = '§';\n entities['168'] = '¨';\n entities['169'] = '©';\n entities['170'] = 'ª';\n entities['171'] = '«';\n entities['172'] = '¬';\n entities['173'] = '­';\n entities['174'] = '®';\n entities['175'] = '¯';\n entities['176'] = '°';\n entities['177'] = '±';\n entities['178'] = '²';\n entities['179'] = '³';\n entities['180'] = '´';\n entities['181'] = 'µ';\n entities['182'] = '¶';\n entities['183'] = '·';\n entities['184'] = '¸';\n entities['185'] = '¹';\n entities['186'] = 'º';\n entities['187'] = '»';\n entities['188'] = '¼';\n entities['189'] = '½';\n entities['190'] = '¾';\n entities['191'] = '¿';\n entities['192'] = 'À';\n entities['193'] = 'Á';\n entities['194'] = 'Â';\n entities['195'] = 'Ã';\n entities['196'] = 'Ä';\n entities['197'] = 'Å';\n entities['198'] = 'Æ';\n entities['199'] = 'Ç';\n entities['200'] = 'È';\n entities['201'] = 'É';\n entities['202'] = 'Ê';\n entities['203'] = 'Ë';\n entities['204'] = 'Ì';\n entities['205'] = 'Í';\n entities['206'] = 'Î';\n entities['207'] = 'Ï';\n entities['208'] = 'Ð';\n entities['209'] = 'Ñ';\n entities['210'] = 'Ò';\n entities['211'] = 'Ó';\n entities['212'] = 'Ô';\n entities['213'] = 'Õ';\n entities['214'] = 'Ö';\n entities['215'] = '×';\n entities['216'] = 'Ø';\n entities['217'] = 'Ù';\n entities['218'] = 'Ú';\n entities['219'] = 'Û';\n entities['220'] = 'Ü';\n entities['221'] = 'Ý';\n entities['222'] = 'Þ';\n entities['223'] = 'ß';\n entities['224'] = 'à';\n entities['225'] = 'á';\n entities['226'] = 'â';\n entities['227'] = 'ã';\n entities['228'] = 'ä';\n entities['229'] = 'å';\n entities['230'] = 'æ';\n entities['231'] = 'ç';\n entities['232'] = 'è';\n entities['233'] = 'é';\n entities['234'] = 'ê';\n entities['235'] = 'ë';\n entities['236'] = 'ì';\n entities['237'] = 'í';\n entities['238'] = 'î';\n entities['239'] = 'ï';\n entities['240'] = 'ð';\n entities['241'] = 'ñ';\n entities['242'] = 'ò';\n entities['243'] = 'ó';\n entities['244'] = 'ô';\n entities['245'] = 'õ';\n entities['246'] = 'ö';\n entities['247'] = '÷';\n entities['248'] = 'ø';\n entities['249'] = 'ù';\n entities['250'] = 'ú';\n entities['251'] = 'û';\n entities['252'] = 'ü';\n entities['253'] = 'ý';\n entities['254'] = 'þ';\n entities['255'] = 'ÿ';\n }\n\n if (useQuoteStyle !== 'ENT_NOQUOTES') {\n entities['34'] = '"';\n }\n if (useQuoteStyle === 'ENT_QUOTES') {\n entities['39'] = ''';\n }\n entities['60'] = '<';\n entities['62'] = '>';\n\n // ascii decimals to real symbols\n for (decimal in entities) {\n if (entities.hasOwnProperty(decimal)) {\n hashMap[String.fromCharCode(decimal)] = entities[decimal];\n }\n }\n\n return hashMap;\n};\n//# sourceMappingURL=get_html_translation_table.js.map"],"sourceRoot":""}