@templatical/editor 0.21.0 → 0.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/{AiFeatureMenu-CPdNpHpZ.js → AiFeatureMenu-CcqQDHzJ.js} +1 -1
  2. package/dist/{CloudEditor-3a7mqMhe.js → CloudEditor-DOjGJwPe.js} +24 -24
  3. package/dist/{CollaboratorBar-Ds0YZWzV.js → CollaboratorBar-Bj4NZiie.js} +1 -1
  4. package/dist/CountdownBlock-J_Q9JRQM.js +91 -0
  5. package/dist/{ParagraphEditor-CkwBirNl.js → ParagraphEditor--_zWfxps.js} +1 -1
  6. package/dist/{SaveBlockDialog-Cc5BSUBx.js → SaveBlockDialog-CYIEHABH.js} +3 -3
  7. package/dist/{SavedBlockPreviewCanvas-ubttfmKr.js → SavedBlockPreviewCanvas-2-mzAnZE.js} +1 -1
  8. package/dist/{SavedBlocksBrowserModal-LkY_U3lY.js → SavedBlocksBrowserModal-D5V5yF_3.js} +4 -4
  9. package/dist/{SavedBlocksPanels-CET0zvH6.js → SavedBlocksPanels-Dff38YXu.js} +1 -1
  10. package/dist/{SavedBlocksPickBar-poGS4PoI.js → SavedBlocksPickBar-rB6iyji6.js} +1 -1
  11. package/dist/{SnapshotHistory-BvF5IXn1.js → SnapshotHistory-FtzDq8f0.js} +1 -1
  12. package/dist/{TestEmailModal-BRaM_eko.js → TestEmailModal-DL2O1H8M.js} +2 -2
  13. package/dist/{TitleEditor-Bhgzh-iQ.js → TitleEditor-CPda5lh-.js} +1 -1
  14. package/dist/{TplModal-BA-Zsg0O.js → TplModal-C7Koj5gM.js} +1 -1
  15. package/dist/{blockTypeIcons-B1-Yzp-a.js → blockTypeIcons-CgwECCut.js} +1 -1
  16. package/dist/bundle-stats.json +8 -8
  17. package/dist/cdn/chunks/AiChatSidebar-A1CuWGY0.js +203 -0
  18. package/dist/cdn/chunks/AiChatSidebar-A1CuWGY0.js.map +1 -0
  19. package/dist/cdn/chunks/{AiFeatureMenu--PdArSnv.js → AiFeatureMenu-Duwg413F.js} +9 -5
  20. package/dist/cdn/chunks/{AiFeatureMenu--PdArSnv.js.map → AiFeatureMenu-Duwg413F.js.map} +1 -1
  21. package/dist/cdn/chunks/{BlockIssueBadge-DMSd0SIl.js → BlockIssueBadge-Da4yR-mh.js} +7 -5
  22. package/dist/cdn/chunks/{BlockIssueBadge-DMSd0SIl.js.map → BlockIssueBadge-Da4yR-mh.js.map} +1 -1
  23. package/dist/cdn/chunks/{CloudEditor-DnTfI5GU.js → CloudEditor-C0Y4RD4c.js} +162 -153
  24. package/dist/cdn/chunks/CloudEditor-C0Y4RD4c.js.map +1 -0
  25. package/dist/cdn/chunks/{CollaboratorBar-CBqd7ldq.js → CollaboratorBar-BS3rJy6-.js} +7 -6
  26. package/dist/cdn/chunks/{CollaboratorBar-CBqd7ldq.js.map → CollaboratorBar-BS3rJy6-.js.map} +1 -1
  27. package/dist/cdn/chunks/{ColorPicker-DCdWP8YB.js → ColorPicker-DZSzZ5ZP.js} +107 -103
  28. package/dist/cdn/chunks/{ColorPicker-DCdWP8YB.js.map → ColorPicker-DZSzZ5ZP.js.map} +1 -1
  29. package/dist/cdn/chunks/CommentsSidebar-DHdRiGPX.js +412 -0
  30. package/dist/cdn/chunks/CommentsSidebar-DHdRiGPX.js.map +1 -0
  31. package/dist/cdn/chunks/CountdownBlock-Bffpoppw.js +93 -0
  32. package/dist/cdn/chunks/{CountdownBlock-BDnWMAME.js.map → CountdownBlock-Bffpoppw.js.map} +1 -1
  33. package/dist/cdn/chunks/{CountdownToolbar-BbLoo22S.js → CountdownToolbar-DAnmIZjq.js} +4 -4
  34. package/dist/cdn/chunks/{CountdownToolbar-BbLoo22S.js.map → CountdownToolbar-DAnmIZjq.js.map} +1 -1
  35. package/dist/cdn/chunks/DesignReferenceSidebar-Dre99DTH.js +223 -0
  36. package/dist/cdn/chunks/DesignReferenceSidebar-Dre99DTH.js.map +1 -0
  37. package/dist/cdn/chunks/{IssuesPanel-CfudrI3T.js → IssuesPanel-D80JedOj.js} +11 -10
  38. package/dist/cdn/chunks/{IssuesPanel-CfudrI3T.js.map → IssuesPanel-D80JedOj.js.map} +1 -1
  39. package/dist/cdn/chunks/LoadingTrack-D-CW2tUa.js +12 -0
  40. package/dist/cdn/chunks/LoadingTrack-D-CW2tUa.js.map +1 -0
  41. package/dist/cdn/chunks/{NumberWithSuffix-BmMx9_n_.js → NumberWithSuffix-CjlVNIEe.js} +2 -2
  42. package/dist/cdn/chunks/{NumberWithSuffix-BmMx9_n_.js.map → NumberWithSuffix-CjlVNIEe.js.map} +1 -1
  43. package/dist/cdn/chunks/{ParagraphEditor-DPCUSXpx.js → ParagraphEditor-CtaRa1vr.js} +73 -68
  44. package/dist/cdn/chunks/{ParagraphEditor-DPCUSXpx.js.map → ParagraphEditor-CtaRa1vr.js.map} +1 -1
  45. package/dist/cdn/chunks/{RichTextEditorContent-B8dOiv_D.js → RichTextEditorContent-BbdgJqWM.js} +9 -6
  46. package/dist/cdn/chunks/{RichTextEditorContent-B8dOiv_D.js.map → RichTextEditorContent-BbdgJqWM.js.map} +1 -1
  47. package/dist/cdn/chunks/{SaveBlockDialog-BY3SMnNV.js → SaveBlockDialog-Bb3fdUEZ.js} +30 -26
  48. package/dist/cdn/chunks/{SaveBlockDialog-BY3SMnNV.js.map → SaveBlockDialog-Bb3fdUEZ.js.map} +1 -1
  49. package/dist/cdn/chunks/{SavedBlockPreviewCanvas-LpaOcusq.js → SavedBlockPreviewCanvas-DZOMgNsz.js} +33 -32
  50. package/dist/cdn/chunks/{SavedBlockPreviewCanvas-LpaOcusq.js.map → SavedBlockPreviewCanvas-DZOMgNsz.js.map} +1 -1
  51. package/dist/cdn/chunks/{SavedBlocksBrowserModal-CfIcmyzF.js → SavedBlocksBrowserModal-CeUWcPv0.js} +14 -10
  52. package/dist/cdn/chunks/{SavedBlocksBrowserModal-CfIcmyzF.js.map → SavedBlocksBrowserModal-CeUWcPv0.js.map} +1 -1
  53. package/dist/cdn/chunks/{SavedBlocksPanels-kIowCfh_.js → SavedBlocksPanels-D-pA_wfk.js} +2 -2
  54. package/dist/cdn/chunks/{SavedBlocksPanels-kIowCfh_.js.map → SavedBlocksPanels-D-pA_wfk.js.map} +1 -1
  55. package/dist/cdn/chunks/{SavedBlocksPickBar-WSGe1GiZ.js → SavedBlocksPickBar-1rf1KpqS.js} +6 -4
  56. package/dist/cdn/chunks/{SavedBlocksPickBar-WSGe1GiZ.js.map → SavedBlocksPickBar-1rf1KpqS.js.map} +1 -1
  57. package/dist/cdn/chunks/SnapshotHistory-Bf1uovti.js +121 -0
  58. package/dist/cdn/chunks/SnapshotHistory-Bf1uovti.js.map +1 -0
  59. package/dist/cdn/chunks/TemplateScoringPanel-CTk8WwxU.js +231 -0
  60. package/dist/cdn/chunks/TemplateScoringPanel-CTk8WwxU.js.map +1 -0
  61. package/dist/cdn/chunks/TestEmailModal-BJTDxFHh.js +96 -0
  62. package/dist/cdn/chunks/TestEmailModal-BJTDxFHh.js.map +1 -0
  63. package/dist/cdn/chunks/{TitleEditor-iwd-O9sO.js → TitleEditor-BJ7LFykI.js} +15 -12
  64. package/dist/cdn/chunks/{TitleEditor-iwd-O9sO.js.map → TitleEditor-BJ7LFykI.js.map} +1 -1
  65. package/dist/cdn/chunks/TplModal-CH9RzKF7.js +50 -0
  66. package/dist/cdn/chunks/TplModal-CH9RzKF7.js.map +1 -0
  67. package/dist/cdn/chunks/_plugin-vue_export-helper-B3ysoDQm.js +8 -0
  68. package/dist/cdn/chunks/blockTypeIcons-etMMQoVv.js +21 -0
  69. package/dist/cdn/chunks/{blockTypeIcons-BYz0fgLz.js.map → blockTypeIcons-etMMQoVv.js.map} +1 -1
  70. package/dist/cdn/chunks/cloud-BJlbXGTJ.js +1787 -0
  71. package/dist/cdn/chunks/cloud-BJlbXGTJ.js.map +1 -0
  72. package/dist/cdn/chunks/dist-CiBEt0VR.js +163 -0
  73. package/dist/cdn/chunks/dist-CiBEt0VR.js.map +1 -0
  74. package/dist/cdn/chunks/dist-CxTt8FRE.js +403 -0
  75. package/dist/cdn/chunks/dist-CxTt8FRE.js.map +1 -0
  76. package/dist/cdn/chunks/{extensions-DeJh3E9b.js → extensions-ZX2oarW6.js} +17 -15
  77. package/dist/cdn/chunks/{extensions-DeJh3E9b.js.map → extensions-ZX2oarW6.js.map} +1 -1
  78. package/dist/cdn/chunks/formatRelativeTime-CtUU-QZ8.js +12 -0
  79. package/dist/cdn/chunks/formatRelativeTime-CtUU-QZ8.js.map +1 -0
  80. package/dist/cdn/chunks/htmlparser-CZa2V5cF.js +1008 -0
  81. package/dist/cdn/chunks/htmlparser-CZa2V5cF.js.map +1 -0
  82. package/dist/cdn/chunks/icons-CYWw8Xfp.js +1190 -0
  83. package/dist/cdn/chunks/icons-CYWw8Xfp.js.map +1 -0
  84. package/dist/cdn/chunks/keys-D7kUmfpE.js +12 -0
  85. package/dist/cdn/chunks/keys-D7kUmfpE.js.map +1 -0
  86. package/dist/cdn/chunks/src-BKI1x1k7.js +546 -0
  87. package/dist/cdn/chunks/src-BKI1x1k7.js.map +1 -0
  88. package/dist/cdn/chunks/{renderer-Yg1XhsBN.js → src-BuC_IHzN.js} +118 -134
  89. package/dist/cdn/chunks/src-BuC_IHzN.js.map +1 -0
  90. package/dist/cdn/chunks/src-CM0gCvAS.js +1176 -0
  91. package/dist/cdn/chunks/src-CM0gCvAS.js.map +1 -0
  92. package/dist/cdn/chunks/{media-library-mCCZieYO.js → src-D6F_3XkE.js} +1782 -1280
  93. package/dist/cdn/chunks/src-D6F_3XkE.js.map +1 -0
  94. package/dist/cdn/chunks/{styles-Bp5Jsu9J.js → styles-DMOEiSX9.js} +867 -859
  95. package/dist/cdn/chunks/styles-DMOEiSX9.js.map +1 -0
  96. package/dist/cdn/chunks/timeouts-Bmi_yePw.js +6 -0
  97. package/dist/cdn/chunks/timeouts-Bmi_yePw.js.map +1 -0
  98. package/dist/cdn/chunks/useAliveFlag-aanU8uqB.js +12 -0
  99. package/dist/cdn/chunks/useAliveFlag-aanU8uqB.js.map +1 -0
  100. package/dist/cdn/chunks/useCloudI18n-BjNENqkM.js +25 -0
  101. package/dist/cdn/chunks/useCloudI18n-BjNENqkM.js.map +1 -0
  102. package/dist/cdn/chunks/useEditorCore-BA6mspzD.js +3019 -0
  103. package/dist/cdn/chunks/useEditorCore-BA6mspzD.js.map +1 -0
  104. package/dist/cdn/chunks/useI18n-8Wd7G-cq.js +19 -0
  105. package/dist/cdn/chunks/useI18n-8Wd7G-cq.js.map +1 -0
  106. package/dist/cdn/chunks/useMergeTag-C7G31KV-.js +46 -0
  107. package/dist/cdn/chunks/useMergeTag-C7G31KV-.js.map +1 -0
  108. package/dist/cdn/chunks/usePopoverPosition-Bx0QewTv.js +61 -0
  109. package/dist/cdn/chunks/usePopoverPosition-Bx0QewTv.js.map +1 -0
  110. package/dist/cdn/editor.css +1 -1
  111. package/dist/cdn/editor.js +72 -69
  112. package/dist/cdn/editor.js.map +1 -1
  113. package/dist/index.d.ts +15 -1
  114. package/dist/style.css +1 -1
  115. package/dist/{styles-DIDAJdkj.js → styles-PcOPXvLO.js} +547 -549
  116. package/dist/templatical-editor.js +5 -5
  117. package/dist/{useEditorCore-Bd9CA4L_.js → useEditorCore-CT1slufs.js} +3 -3
  118. package/package.json +7 -7
  119. package/dist/CountdownBlock-BUHYIAe9.js +0 -92
  120. package/dist/cdn/chunks/CloudEditor-DnTfI5GU.js.map +0 -1
  121. package/dist/cdn/chunks/CountdownBlock-BDnWMAME.js +0 -93
  122. package/dist/cdn/chunks/blockTypeIcons-BYz0fgLz.js +0 -22
  123. package/dist/cdn/chunks/features-pLfGJWIB.js +0 -7813
  124. package/dist/cdn/chunks/features-pLfGJWIB.js.map +0 -1
  125. package/dist/cdn/chunks/icons-FLemooQz.js +0 -690
  126. package/dist/cdn/chunks/icons-FLemooQz.js.map +0 -1
  127. package/dist/cdn/chunks/media-library-mCCZieYO.js.map +0 -1
  128. package/dist/cdn/chunks/quality-BRbHtAk1.js +0 -2180
  129. package/dist/cdn/chunks/quality-BRbHtAk1.js.map +0 -1
  130. package/dist/cdn/chunks/renderer-Yg1XhsBN.js.map +0 -1
  131. package/dist/cdn/chunks/src-BDJeYiVE.js +0 -509
  132. package/dist/cdn/chunks/src-BDJeYiVE.js.map +0 -1
  133. package/dist/cdn/chunks/styles-Bp5Jsu9J.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htmlparser-CZa2V5cF.js","names":["CharCodes"],"sources":["../../../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/decode-codepoint.js","../../../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/internal/decode-shared.js","../../../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/generated/decode-data-html.js","../../../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/generated/decode-data-xml.js","../../../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/internal/bin-trie-flags.js","../../../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/decode.js","../../../../../node_modules/.pnpm/htmlparser2@12.0.0/node_modules/htmlparser2/dist/Tokenizer.js","../../../../../node_modules/.pnpm/htmlparser2@12.0.0/node_modules/htmlparser2/dist/Parser.js"],"sourcesContent":["// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\nconst decodeMap = new Map([\n [0, 65_533],\n // C1 Unicode control character reference replacements\n [128, 8364],\n [130, 8218],\n [131, 402],\n [132, 8222],\n [133, 8230],\n [134, 8224],\n [135, 8225],\n [136, 710],\n [137, 8240],\n [138, 352],\n [139, 8249],\n [140, 338],\n [142, 381],\n [145, 8216],\n [146, 8217],\n [147, 8220],\n [148, 8221],\n [149, 8226],\n [150, 8211],\n [151, 8212],\n [152, 732],\n [153, 8482],\n [154, 353],\n [155, 8250],\n [156, 339],\n [158, 382],\n [159, 376],\n]);\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n * @param codePoint Unicode code point to convert.\n */\nexport function replaceCodePoint(codePoint) {\n if ((codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) ||\n codePoint > 0x10_ff_ff) {\n return 0xff_fd;\n }\n return decodeMap.get(codePoint) ?? codePoint;\n}\n//# sourceMappingURL=decode-codepoint.js.map","/**\n * Shared base64 decode helper for generated decode data.\n * Assumes global atob is available.\n * @param input Input string to encode or decode.\n */\nexport function decodeBase64(input) {\n const binary = atob(input);\n const evenLength = binary.length & ~1; // Round down to even length\n const out = new Uint16Array(evenLength / 2);\n for (let index = 0, outIndex = 0; index < evenLength; index += 2) {\n const lo = binary.charCodeAt(index);\n const hi = binary.charCodeAt(index + 1);\n out[outIndex++] = lo | (hi << 8);\n }\n return out;\n}\n//# sourceMappingURL=decode-shared.js.map","// Generated using scripts/write-decode-map.ts\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\n/** Packed HTML decode trie data. */\nexport const htmlDecodeTree = /* #__PURE__ */ decodeBase64(\"QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWls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ZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg\");\n//# sourceMappingURL=decode-data-html.js.map","// Generated using scripts/write-decode-map.ts\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\n/** Packed XML decode trie data. */\nexport const xmlDecodeTree = /* #__PURE__ */ decodeBase64(\"AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg\");\n//# sourceMappingURL=decode-data-xml.js.map","/**\n * Bit flags & masks for the binary trie encoding used for entity decoding.\n *\n * Bit layout (16 bits total):\n * 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)\n * 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').\n * If valueLength==0: compact run flag.\n * 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)\n * 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char\n */\nexport var BinTrieFlags;\n(function (BinTrieFlags) {\n BinTrieFlags[BinTrieFlags[\"VALUE_LENGTH\"] = 49152] = \"VALUE_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"FLAG13\"] = 8192] = \"FLAG13\";\n BinTrieFlags[BinTrieFlags[\"BRANCH_LENGTH\"] = 8064] = \"BRANCH_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"JUMP_TABLE\"] = 127] = \"JUMP_TABLE\";\n})(BinTrieFlags || (BinTrieFlags = {}));\n//# sourceMappingURL=bin-trie-flags.js.map","import { replaceCodePoint } from \"./decode-codepoint.js\";\nimport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nimport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\nimport { BinTrieFlags } from \"./internal/bin-trie-flags.js\";\nvar CharCodes;\n(function (CharCodes) {\n CharCodes[CharCodes[\"NUM\"] = 35] = \"NUM\";\n CharCodes[CharCodes[\"SEMI\"] = 59] = \"SEMI\";\n CharCodes[CharCodes[\"EQUALS\"] = 61] = \"EQUALS\";\n CharCodes[CharCodes[\"ZERO\"] = 48] = \"ZERO\";\n CharCodes[CharCodes[\"NINE\"] = 57] = \"NINE\";\n CharCodes[CharCodes[\"LOWER_A\"] = 97] = \"LOWER_A\";\n CharCodes[CharCodes[\"LOWER_F\"] = 102] = \"LOWER_F\";\n CharCodes[CharCodes[\"LOWER_X\"] = 120] = \"LOWER_X\";\n CharCodes[CharCodes[\"LOWER_Z\"] = 122] = \"LOWER_Z\";\n CharCodes[CharCodes[\"UPPER_A\"] = 65] = \"UPPER_A\";\n CharCodes[CharCodes[\"UPPER_F\"] = 70] = \"UPPER_F\";\n CharCodes[CharCodes[\"UPPER_Z\"] = 90] = \"UPPER_Z\";\n})(CharCodes || (CharCodes = {}));\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b10_0000;\nfunction isNumber(code) {\n return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\nfunction isHexadecimalCharacter(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F));\n}\nfunction isAsciiAlphaNumeric(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n isNumber(code));\n}\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n * @param code Code point to decode.\n */\nfunction isEntityInAttributeInvalidEnd(code) {\n return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\nvar EntityDecoderState;\n(function (EntityDecoderState) {\n EntityDecoderState[EntityDecoderState[\"EntityStart\"] = 0] = \"EntityStart\";\n EntityDecoderState[EntityDecoderState[\"NumericStart\"] = 1] = \"NumericStart\";\n EntityDecoderState[EntityDecoderState[\"NumericDecimal\"] = 2] = \"NumericDecimal\";\n EntityDecoderState[EntityDecoderState[\"NumericHex\"] = 3] = \"NumericHex\";\n EntityDecoderState[EntityDecoderState[\"NamedEntity\"] = 4] = \"NamedEntity\";\n})(EntityDecoderState || (EntityDecoderState = {}));\n/**\n * Decoding mode for named entities.\n */\nexport var DecodingMode;\n(function (DecodingMode) {\n /** Entities in text nodes that can end with any character. */\n DecodingMode[DecodingMode[\"Legacy\"] = 0] = \"Legacy\";\n /** Only allow entities terminated with a semicolon. */\n DecodingMode[DecodingMode[\"Strict\"] = 1] = \"Strict\";\n /** Entities in attributes have limitations on ending characters. */\n DecodingMode[DecodingMode[\"Attribute\"] = 2] = \"Attribute\";\n})(DecodingMode || (DecodingMode = {}));\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n decodeTree;\n emitCodePoint;\n errors;\n constructor(\n /** The tree used to decode entities. */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive\n decodeTree, \n /**\n * The function that is called when a codepoint is decoded.\n *\n * For multi-byte named entities, this will be called multiple times,\n * with the second codepoint, and the same `consumed` value.\n * @param codepoint The decoded codepoint.\n * @param consumed The number of bytes consumed by the decoder.\n */\n emitCodePoint, \n /** An object that is used to produce errors. */\n errors) {\n this.decodeTree = decodeTree;\n this.emitCodePoint = emitCodePoint;\n this.errors = errors;\n }\n /** The current state of the decoder. */\n state = EntityDecoderState.EntityStart;\n /** Characters that were consumed while parsing an entity. */\n consumed = 1;\n /**\n * The result of the entity.\n *\n * Either the result index of a numeric entity, or the codepoint of a\n * numeric entity.\n */\n result = 0;\n /** The current index in the decode tree. */\n treeIndex = 0;\n /** The number of characters that were consumed in excess. */\n excess = 1;\n /** The mode in which the decoder is operating. */\n decodeMode = DecodingMode.Strict;\n /** The number of characters that have been consumed in the current run. */\n runConsumed = 0;\n /**\n * Resets the instance to make it reusable.\n * @param decodeMode Entity decoding mode to use.\n */\n startEntity(decodeMode) {\n this.decodeMode = decodeMode;\n this.state = EntityDecoderState.EntityStart;\n this.result = 0;\n this.treeIndex = 0;\n this.excess = 1;\n this.consumed = 1;\n this.runConsumed = 0;\n }\n /**\n * Write an entity to the decoder. This can be called multiple times with partial entities.\n * If the entity is incomplete, the decoder will return -1.\n *\n * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n * entity is incomplete, and resume when the next string is written.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n write(input, offset) {\n switch (this.state) {\n case EntityDecoderState.EntityStart: {\n if (input.charCodeAt(offset) === CharCodes.NUM) {\n this.state = EntityDecoderState.NumericStart;\n this.consumed += 1;\n return this.stateNumericStart(input, offset + 1);\n }\n this.state = EntityDecoderState.NamedEntity;\n return this.stateNamedEntity(input, offset);\n }\n case EntityDecoderState.NumericStart: {\n return this.stateNumericStart(input, offset);\n }\n case EntityDecoderState.NumericDecimal: {\n return this.stateNumericDecimal(input, offset);\n }\n case EntityDecoderState.NumericHex: {\n return this.stateNumericHex(input, offset);\n }\n case EntityDecoderState.NamedEntity: {\n return this.stateNamedEntity(input, offset);\n }\n }\n }\n /**\n * Switches between the numeric decimal and hexadecimal states.\n *\n * Equivalent to the `Numeric character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericStart(input, offset) {\n if (offset >= input.length) {\n return -1;\n }\n if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n this.state = EntityDecoderState.NumericHex;\n this.consumed += 1;\n return this.stateNumericHex(input, offset + 1);\n }\n this.state = EntityDecoderState.NumericDecimal;\n return this.stateNumericDecimal(input, offset);\n }\n /**\n * Parses a hexadecimal numeric entity.\n *\n * Equivalent to the `Hexademical character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericHex(input, offset) {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char) || isHexadecimalCharacter(char)) {\n // Convert hex digit to value (0-15); 'a'/'A' -> 10.\n const digit = char <= CharCodes.NINE\n ? char - CharCodes.ZERO\n : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;\n this.result = this.result * 16 + digit;\n this.consumed++;\n offset++;\n }\n else {\n return this.emitNumericEntity(char, 3);\n }\n }\n return -1; // Incomplete entity\n }\n /**\n * Parses a decimal numeric entity.\n *\n * Equivalent to the `Decimal character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericDecimal(input, offset) {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char)) {\n this.result = this.result * 10 + (char - CharCodes.ZERO);\n this.consumed++;\n offset++;\n }\n else {\n return this.emitNumericEntity(char, 2);\n }\n }\n return -1; // Incomplete entity\n }\n /**\n * Validate and emit a numeric entity.\n *\n * Implements the logic from the `Hexademical character reference start\n * state` and `Numeric character reference end state` in the HTML spec.\n * @param lastCp The last code point of the entity. Used to see if the\n * entity was terminated with a semicolon.\n * @param expectedLength The minimum number of characters that should be\n * consumed. Used to validate that at least one digit\n * was consumed.\n * @returns The number of characters that were consumed.\n */\n emitNumericEntity(lastCp, expectedLength) {\n // Ensure we consumed at least one digit.\n if (this.consumed <= expectedLength) {\n this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n // Figure out if this is a legit end of the entity\n if (lastCp === CharCodes.SEMI) {\n this.consumed += 1;\n }\n else if (this.decodeMode === DecodingMode.Strict) {\n return 0;\n }\n this.emitCodePoint(replaceCodePoint(this.result), this.consumed);\n if (this.errors) {\n if (lastCp !== CharCodes.SEMI) {\n this.errors.missingSemicolonAfterCharacterReference();\n }\n this.errors.validateNumericCharacterReference(this.result);\n }\n return this.consumed;\n }\n /**\n * Parses a named entity.\n *\n * Equivalent to the `Named character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNamedEntity(input, offset) {\n const { decodeTree } = this;\n let current = decodeTree[this.treeIndex];\n // The length is the number of bytes of the value, including the current byte.\n let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n while (offset < input.length) {\n // Handle compact runs (possibly inline): valueLength == 0 and SEMI_REQUIRED bit set.\n if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {\n const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7; /* 2..63 */\n // If we are starting a run, check the first char.\n if (this.runConsumed === 0) {\n const firstChar = current & BinTrieFlags.JUMP_TABLE;\n if (input.charCodeAt(offset) !== firstChar) {\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n // Check remaining characters in the run.\n while (this.runConsumed < runLength) {\n if (offset >= input.length) {\n return -1;\n }\n const charIndexInPacked = this.runConsumed - 1;\n const packedWord = decodeTree[this.treeIndex + 1 + (charIndexInPacked >> 1)];\n const expectedChar = charIndexInPacked % 2 === 0\n ? packedWord & 0xff\n : (packedWord >> 8) & 0xff;\n if (input.charCodeAt(offset) !== expectedChar) {\n this.runConsumed = 0;\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n this.runConsumed = 0;\n this.treeIndex += 1 + (runLength >> 1);\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n }\n if (offset >= input.length)\n break;\n const char = input.charCodeAt(offset);\n /*\n * Implicit semicolon handling for nodes that require a semicolon but\n * don't have an explicit ';' branch stored in the trie. If we have\n * a value on the current node, it requires a semicolon, and the\n * current input character is a semicolon, emit the entity using the\n * current node (without descending further).\n */\n if (char === CharCodes.SEMI &&\n valueLength !== 0 &&\n (current & BinTrieFlags.FLAG13) !== 0) {\n return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n }\n this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);\n if (this.treeIndex < 0) {\n return this.result === 0 ||\n // If we are parsing an attribute\n (this.decodeMode === DecodingMode.Attribute &&\n // We shouldn't have consumed any characters after the entity,\n (valueLength === 0 ||\n // And there should be no invalid characters.\n isEntityInAttributeInvalidEnd(char)))\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n // If the branch is a value, store it and continue\n if (valueLength !== 0) {\n // If the entity is terminated by a semicolon, we are done.\n if (char === CharCodes.SEMI) {\n return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n }\n // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n if (this.decodeMode !== DecodingMode.Strict &&\n (current & BinTrieFlags.FLAG13) === 0) {\n this.result = this.treeIndex;\n this.consumed += this.excess;\n this.excess = 0;\n }\n }\n // Increment offset & excess for next iteration\n offset++;\n this.excess++;\n }\n return -1;\n }\n /**\n * Emit a named entity that was not terminated with a semicolon.\n * @returns The number of characters consumed.\n */\n emitNotTerminatedNamedEntity() {\n const { result, decodeTree } = this;\n const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n this.emitNamedEntityData(result, valueLength, this.consumed);\n this.errors?.missingSemicolonAfterCharacterReference();\n return this.consumed;\n }\n /**\n * Emit a named entity.\n * @param result The index of the entity in the decode tree.\n * @param valueLength The number of bytes in the entity.\n * @param consumed The number of characters consumed.\n * @returns The number of characters consumed.\n */\n emitNamedEntityData(result, valueLength, consumed) {\n const { decodeTree } = this;\n this.emitCodePoint(valueLength === 1\n ? decodeTree[result] &\n ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)\n : decodeTree[result + 1], consumed);\n if (valueLength === 3) {\n // For multi-byte values, we need to emit the second byte.\n this.emitCodePoint(decodeTree[result + 2], consumed);\n }\n return consumed;\n }\n /**\n * Signal to the parser that the end of the input was reached.\n *\n * Remaining data will be emitted and relevant errors will be produced.\n * @returns The number of characters consumed.\n */\n end() {\n switch (this.state) {\n case EntityDecoderState.NamedEntity: {\n // Emit a named entity if we have one.\n return this.result !== 0 &&\n (this.decodeMode !== DecodingMode.Attribute ||\n this.result === this.treeIndex)\n ? this.emitNotTerminatedNamedEntity()\n : 0;\n }\n // Otherwise, emit a numeric entity if we have one.\n case EntityDecoderState.NumericDecimal: {\n return this.emitNumericEntity(0, 2);\n }\n case EntityDecoderState.NumericHex: {\n return this.emitNumericEntity(0, 3);\n }\n case EntityDecoderState.NumericStart: {\n this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n case EntityDecoderState.EntityStart: {\n // Return 0 if we have no entity.\n return 0;\n }\n }\n }\n}\n/**\n * Creates a function that decodes entities in a string.\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree) {\n let returnValue = \"\";\n const decoder = new EntityDecoder(decodeTree, (data) => (returnValue += String.fromCodePoint(data)));\n return function decodeWithTrie(input, decodeMode) {\n let lastIndex = 0;\n let offset = 0;\n while ((offset = input.indexOf(\"&\", offset)) >= 0) {\n returnValue += input.slice(lastIndex, offset);\n decoder.startEntity(decodeMode);\n const length = decoder.write(input, \n // Skip the \"&\"\n offset + 1);\n if (length < 0) {\n lastIndex = offset + decoder.end();\n break;\n }\n lastIndex = offset + length;\n // If `length` is 0, skip the current `&` and continue.\n offset = length === 0 ? lastIndex + 1 : lastIndex;\n }\n const result = returnValue + input.slice(lastIndex);\n // Make sure we don't keep a reference to the final string.\n returnValue = \"\";\n return result;\n };\n}\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIndex Index immediately after the current node header.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(decodeTree, current, nodeIndex, char) {\n const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n // Case 1: Single branch encoded in jump offset\n if (branchCount === 0) {\n return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;\n }\n // Case 2: Multiple branches encoded in jump table\n if (jumpOffset) {\n const value = char - jumpOffset;\n return value < 0 || value >= branchCount\n ? -1\n : decodeTree[nodeIndex + value] - 1;\n }\n // Case 3: Multiple branches encoded in packed dictionary (two keys per uint16)\n const packedKeySlots = (branchCount + 1) >> 1;\n /*\n * Treat packed keys as a virtual sorted array of length `branchCount`.\n * Key(i) = low byte for even i, high byte for odd i in slot i>>1.\n */\n let lo = 0;\n let hi = branchCount - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const slot = mid >> 1;\n const packed = decodeTree[nodeIndex + slot];\n const midKey = (packed >> ((mid & 1) * 8)) & 0xff;\n if (midKey < char) {\n lo = mid + 1;\n }\n else if (midKey > char) {\n hi = mid - 1;\n }\n else {\n return decodeTree[nodeIndex + packedKeySlots + mid];\n }\n }\n return -1;\n}\nconst htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree);\nconst xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree);\n/**\n * Decodes an HTML string.\n * @param htmlString The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(htmlString, mode = DecodingMode.Legacy) {\n return htmlDecoder(htmlString, mode);\n}\n/**\n * Decodes an HTML string in an attribute.\n * @param htmlAttribute The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(htmlAttribute) {\n return htmlDecoder(htmlAttribute, DecodingMode.Attribute);\n}\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n * @param htmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(htmlString) {\n return htmlDecoder(htmlString, DecodingMode.Strict);\n}\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n * @param xmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(xmlString) {\n return xmlDecoder(xmlString, DecodingMode.Strict);\n}\nexport { replaceCodePoint } from \"./decode-codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nexport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\n//# sourceMappingURL=decode.js.map","import { DecodingMode, EntityDecoder, htmlDecodeTree, xmlDecodeTree, } from \"entities/decode\";\nvar CharCodes;\n(function (CharCodes) {\n CharCodes[CharCodes[\"Tab\"] = 9] = \"Tab\";\n CharCodes[CharCodes[\"NewLine\"] = 10] = \"NewLine\";\n CharCodes[CharCodes[\"FormFeed\"] = 12] = \"FormFeed\";\n CharCodes[CharCodes[\"CarriageReturn\"] = 13] = \"CarriageReturn\";\n CharCodes[CharCodes[\"Space\"] = 32] = \"Space\";\n CharCodes[CharCodes[\"ExclamationMark\"] = 33] = \"ExclamationMark\";\n CharCodes[CharCodes[\"Number\"] = 35] = \"Number\";\n CharCodes[CharCodes[\"Amp\"] = 38] = \"Amp\";\n CharCodes[CharCodes[\"SingleQuote\"] = 39] = \"SingleQuote\";\n CharCodes[CharCodes[\"DoubleQuote\"] = 34] = \"DoubleQuote\";\n CharCodes[CharCodes[\"Dash\"] = 45] = \"Dash\";\n CharCodes[CharCodes[\"Slash\"] = 47] = \"Slash\";\n CharCodes[CharCodes[\"Zero\"] = 48] = \"Zero\";\n CharCodes[CharCodes[\"Nine\"] = 57] = \"Nine\";\n CharCodes[CharCodes[\"Semi\"] = 59] = \"Semi\";\n CharCodes[CharCodes[\"Lt\"] = 60] = \"Lt\";\n CharCodes[CharCodes[\"Eq\"] = 61] = \"Eq\";\n CharCodes[CharCodes[\"Gt\"] = 62] = \"Gt\";\n CharCodes[CharCodes[\"Questionmark\"] = 63] = \"Questionmark\";\n CharCodes[CharCodes[\"UpperA\"] = 65] = \"UpperA\";\n CharCodes[CharCodes[\"LowerA\"] = 97] = \"LowerA\";\n CharCodes[CharCodes[\"UpperF\"] = 70] = \"UpperF\";\n CharCodes[CharCodes[\"LowerF\"] = 102] = \"LowerF\";\n CharCodes[CharCodes[\"UpperZ\"] = 90] = \"UpperZ\";\n CharCodes[CharCodes[\"LowerZ\"] = 122] = \"LowerZ\";\n CharCodes[CharCodes[\"LowerX\"] = 120] = \"LowerX\";\n CharCodes[CharCodes[\"OpeningSquareBracket\"] = 91] = \"OpeningSquareBracket\";\n})(CharCodes || (CharCodes = {}));\n/** All the states the tokenizer can be in. */\nvar State;\n(function (State) {\n State[State[\"Text\"] = 1] = \"Text\";\n State[State[\"BeforeTagName\"] = 2] = \"BeforeTagName\";\n State[State[\"InTagName\"] = 3] = \"InTagName\";\n State[State[\"InSelfClosingTag\"] = 4] = \"InSelfClosingTag\";\n State[State[\"BeforeClosingTagName\"] = 5] = \"BeforeClosingTagName\";\n State[State[\"InClosingTagName\"] = 6] = \"InClosingTagName\";\n State[State[\"AfterClosingTagName\"] = 7] = \"AfterClosingTagName\";\n // Attributes\n State[State[\"BeforeAttributeName\"] = 8] = \"BeforeAttributeName\";\n State[State[\"InAttributeName\"] = 9] = \"InAttributeName\";\n State[State[\"AfterAttributeName\"] = 10] = \"AfterAttributeName\";\n State[State[\"BeforeAttributeValue\"] = 11] = \"BeforeAttributeValue\";\n State[State[\"InAttributeValueDq\"] = 12] = \"InAttributeValueDq\";\n State[State[\"InAttributeValueSq\"] = 13] = \"InAttributeValueSq\";\n State[State[\"InAttributeValueNq\"] = 14] = \"InAttributeValueNq\";\n // Declarations\n State[State[\"BeforeDeclaration\"] = 15] = \"BeforeDeclaration\";\n State[State[\"InDeclaration\"] = 16] = \"InDeclaration\";\n // Processing instructions\n State[State[\"InProcessingInstruction\"] = 17] = \"InProcessingInstruction\";\n // Comments & CDATA\n State[State[\"BeforeComment\"] = 18] = \"BeforeComment\";\n State[State[\"CDATASequence\"] = 19] = \"CDATASequence\";\n State[State[\"DeclarationSequence\"] = 20] = \"DeclarationSequence\";\n State[State[\"InSpecialComment\"] = 21] = \"InSpecialComment\";\n State[State[\"InCommentLike\"] = 22] = \"InCommentLike\";\n // Special tags\n State[State[\"SpecialStartSequence\"] = 23] = \"SpecialStartSequence\";\n State[State[\"InSpecialTag\"] = 24] = \"InSpecialTag\";\n State[State[\"InPlainText\"] = 25] = \"InPlainText\";\n State[State[\"InEntity\"] = 26] = \"InEntity\";\n})(State || (State = {}));\nfunction isWhitespace(c) {\n return (c === CharCodes.Space ||\n c === CharCodes.NewLine ||\n c === CharCodes.Tab ||\n c === CharCodes.FormFeed ||\n c === CharCodes.CarriageReturn);\n}\nfunction isEndOfTagSection(c) {\n return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);\n}\nfunction isASCIIAlpha(c) {\n return ((c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||\n (c >= CharCodes.UpperA && c <= CharCodes.UpperZ));\n}\n/**\n * Quote style used for parsed attributes.\n */\nexport var QuoteType;\n(function (QuoteType) {\n QuoteType[QuoteType[\"NoValue\"] = 0] = \"NoValue\";\n QuoteType[QuoteType[\"Unquoted\"] = 1] = \"Unquoted\";\n QuoteType[QuoteType[\"Single\"] = 2] = \"Single\";\n QuoteType[QuoteType[\"Double\"] = 3] = \"Double\";\n})(QuoteType || (QuoteType = {}));\n/**\n * Sequences used to match longer strings.\n *\n * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End\n * sequences with an increased offset.\n */\nconst Sequences = {\n Empty: new Uint8Array(0),\n Cdata: new Uint8Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[\n CdataEnd: new Uint8Array([0x5d, 0x5d, 0x3e]), // ]]>\n CommentEnd: new Uint8Array([0x2d, 0x2d, 0x21, 0x3e]), // `--!>`\n Doctype: new Uint8Array([0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65]), // `doctype`\n IframeEnd: new Uint8Array([0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65]), // `</iframe`\n NoembedEnd: new Uint8Array([\n 0x3c, 0x2f, 0x6e, 0x6f, 0x65, 0x6d, 0x62, 0x65, 0x64,\n ]), // `</noembed`\n NoframesEnd: new Uint8Array([\n 0x3c, 0x2f, 0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73,\n ]), // `</noframes`\n Plaintext: new Uint8Array([\n 0x3c, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74,\n ]), // `</plaintext`\n ScriptEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74]), // `</script`\n StyleEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65]), // `</style`\n TitleEnd: new Uint8Array([0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65]), // `</title`\n TextareaEnd: new Uint8Array([\n 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,\n ]), // `</textarea`\n XmpEnd: new Uint8Array([0x3c, 0x2f, 0x78, 0x6d, 0x70]), // `</xmp`\n};\n/**\n * Maps the first lowercase character of an HTML tag name to the sequence\n * used for special-tag detection. All sequences share a common layout\n * where index 2 is the first tag-name character, so matching always\n * continues from offset 3.\n */\nconst specialStartSequences = new Map([\n [Sequences.IframeEnd[2], Sequences.IframeEnd],\n [Sequences.NoembedEnd[2], Sequences.NoembedEnd],\n [Sequences.Plaintext[2], Sequences.Plaintext],\n [Sequences.ScriptEnd[2], Sequences.ScriptEnd],\n [Sequences.TitleEnd[2], Sequences.TitleEnd],\n [Sequences.XmpEnd[2], Sequences.XmpEnd],\n]);\n/**\n * Tokenizer implementation used by `Parser`.\n */\nexport default class Tokenizer {\n cbs;\n /** The current state the tokenizer is in. */\n state = State.Text;\n /** The read buffer. */\n buffer = \"\";\n /** The beginning of the section that is currently being read. */\n sectionStart = 0;\n /** The index within the buffer that we are currently looking at. */\n index = 0;\n /** The start of the last entity. */\n entityStart = 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 baseState = State.Text;\n /** For special parsing behavior inside of script and style tags. */\n isSpecial = false;\n /** Indicates whether the tokenizer has been paused. */\n running = true;\n /** The offset of the current buffer. */\n offset = 0;\n xmlMode;\n decodeEntities;\n recognizeSelfClosing;\n entityDecoder;\n constructor({ xmlMode = false, decodeEntities = true, recognizeSelfClosing = xmlMode, }, cbs) {\n this.cbs = cbs;\n this.xmlMode = xmlMode;\n this.decodeEntities = decodeEntities;\n this.recognizeSelfClosing = recognizeSelfClosing;\n this.entityDecoder = new EntityDecoder(xmlMode ? xmlDecodeTree : htmlDecodeTree, (cp, consumed) => this.emitCodePoint(cp, consumed));\n }\n reset() {\n this.state = State.Text;\n this.buffer = \"\";\n this.sectionStart = 0;\n this.index = 0;\n this.baseState = State.Text;\n this.isSpecial = false;\n this.currentSequence = Sequences.Empty;\n this.sequenceIndex = 0;\n this.running = true;\n this.offset = 0;\n }\n write(chunk) {\n this.offset += this.buffer.length;\n this.buffer = chunk;\n this.parse();\n }\n end() {\n if (this.running)\n this.finish();\n }\n pause() {\n this.running = false;\n }\n resume() {\n this.running = true;\n if (this.index < this.buffer.length + this.offset) {\n this.parse();\n }\n }\n stateText(c) {\n if (c === CharCodes.Lt ||\n (!this.decodeEntities && this.fastForwardTo(CharCodes.Lt))) {\n if (this.index > this.sectionStart) {\n this.cbs.ontext(this.sectionStart, this.index);\n }\n this.state = State.BeforeTagName;\n this.sectionStart = this.index;\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n currentSequence = Sequences.Empty;\n sequenceIndex = 0;\n enterTagBody() {\n if (this.currentSequence === Sequences.Plaintext) {\n this.currentSequence = Sequences.Empty;\n this.state = State.InPlainText;\n }\n else if (this.isSpecial) {\n this.state = State.InSpecialTag;\n this.sequenceIndex = 0;\n }\n else {\n this.state = State.Text;\n }\n }\n /**\n * Match the opening tag name against an HTML text-only tag sequence.\n *\n * Some tags share an initial prefix (`script`/`style`, `title`/`textarea`,\n * `noembed`/`noframes`), so we may switch to an alternate sequence at the\n * first distinguishing byte. On a successful full match we fall back to\n * the normal tag-name state; a later `>` will enter raw-text, RCDATA, or\n * plaintext mode based on `currentSequence` / `isSpecial`.\n * @param c Current character code point.\n */\n stateSpecialStartSequence(c) {\n const lower = c | 0x20;\n // Still matching — check for an alternate sequence at branch points.\n if (this.sequenceIndex < this.currentSequence.length) {\n if (lower === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex++;\n return;\n }\n if (this.sequenceIndex === 3) {\n if (this.currentSequence === Sequences.ScriptEnd &&\n lower === Sequences.StyleEnd[3]) {\n this.currentSequence = Sequences.StyleEnd;\n this.sequenceIndex = 4;\n return;\n }\n if (this.currentSequence === Sequences.TitleEnd &&\n lower === Sequences.TextareaEnd[3]) {\n this.currentSequence = Sequences.TextareaEnd;\n this.sequenceIndex = 4;\n return;\n }\n }\n else if (this.sequenceIndex === 4 &&\n this.currentSequence === Sequences.NoembedEnd &&\n lower === Sequences.NoframesEnd[4]) {\n this.currentSequence = Sequences.NoframesEnd;\n this.sequenceIndex = 5;\n return;\n }\n }\n else if (isEndOfTagSection(c)) {\n // Full match on a valid tag boundary — keep the sequence.\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n return;\n }\n // No match — abandon special-tag detection.\n this.isSpecial = false;\n this.currentSequence = Sequences.Empty;\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n }\n stateCDATASequence(c) {\n if (c === Sequences.Cdata[this.sequenceIndex]) {\n if (++this.sequenceIndex === Sequences.Cdata.length) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CdataEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n }\n else {\n this.sequenceIndex = 0;\n if (this.xmlMode) {\n this.state = State.InDeclaration;\n this.stateInDeclaration(c); // Reconsume the character\n }\n else {\n this.state = State.InSpecialComment;\n this.stateInSpecialComment(c); // Reconsume the character\n }\n }\n }\n /**\n * When we wait for one specific character, we can speed things up\n * by skipping through the buffer until we find it.\n * @param c Current character code point.\n * @returns Whether the character was found.\n */\n fastForwardTo(c) {\n while (++this.index < this.buffer.length + this.offset) {\n if (this.buffer.charCodeAt(this.index - this.offset) === c) {\n return true;\n }\n }\n /*\n * We increment the index at the end of the `parse` loop,\n * so set it to `buffer.length - 1` here.\n *\n * TODO: Refactor `parse` to increment index before calling states.\n */\n this.index = this.buffer.length + this.offset - 1;\n return false;\n }\n /**\n * Emit a comment token and return to the text state.\n * @param offset Number of characters in the end sequence that have already been matched.\n */\n emitComment(offset) {\n this.cbs.oncomment(this.sectionStart, this.index, offset);\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n /**\n * Comments and CDATA end with `-->` and `]]>`.\n *\n * Their common qualities are:\n * - Their end sequences have a distinct character they start with.\n * - That character is then repeated, so we have to check multiple repeats.\n * - All characters but the start character of the sequence can be skipped.\n * @param c Current character code point.\n */\n stateInCommentLike(c) {\n if (!this.xmlMode &&\n this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex <= 1 &&\n /*\n * We're still at the very start of the comment: the only\n * characters consumed since `<!--` are the dashes that\n * advanced sequenceIndex (0 for `<!-->`, 1 for `<!--->`).\n */\n this.index === this.sectionStart + this.sequenceIndex &&\n c === CharCodes.Gt) {\n // Abruptly closed empty HTML comment.\n this.emitComment(this.sequenceIndex);\n }\n else if (this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex === 2 &&\n c === CharCodes.Gt) {\n // `!` is optional here, so the same sequence also accepts `-->`.\n this.emitComment(2);\n }\n else if (this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex === this.currentSequence.length - 1 &&\n c !== CharCodes.Gt) {\n this.sequenceIndex = Number(c === CharCodes.Dash);\n }\n else if (c === this.currentSequence[this.sequenceIndex]) {\n if (++this.sequenceIndex === this.currentSequence.length) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, this.index, 2);\n }\n else {\n this.cbs.oncomment(this.sectionStart, this.index, 3);\n }\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n }\n else if (this.sequenceIndex === 0) {\n // Fast-forward to the first character of the sequence\n if (this.fastForwardTo(this.currentSequence[0])) {\n this.sequenceIndex = 1;\n }\n }\n else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n // Allow long sequences, eg. --->, ]]]>\n this.sequenceIndex = 0;\n }\n }\n /**\n * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.\n *\n * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).\n * We allow anything that wouldn't end the tag.\n * @param c Current character code point.\n */\n isTagStartChar(c) {\n return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);\n }\n /**\n * Scan raw-text / RCDATA content for the matching end tag.\n *\n * For RCDATA tags (`<title>`, `<textarea>`) entities are decoded inline.\n * For raw-text tags (`<script>`, `<style>`, etc.) we fast-forward to `<`.\n * @param c Current character code point.\n */\n stateInSpecialTag(c) {\n if (this.sequenceIndex === this.currentSequence.length) {\n if (isEndOfTagSection(c)) {\n const endOfText = this.index - this.currentSequence.length;\n if (this.sectionStart < endOfText) {\n // Spoof the index so that reported locations match up.\n const actualIndex = this.index;\n this.index = endOfText;\n this.cbs.ontext(this.sectionStart, endOfText);\n this.index = actualIndex;\n }\n this.isSpecial = false;\n this.sectionStart = endOfText + 2; // Skip over the `</`\n this.stateInClosingTagName(c);\n return; // We are done; skip the rest of the function.\n }\n this.sequenceIndex = 0;\n }\n if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n }\n else if (this.sequenceIndex === 0) {\n if (this.currentSequence === Sequences.TitleEnd ||\n this.currentSequence === Sequences.TextareaEnd) {\n // RCDATA tags have to parse entities while still looking for their end tag.\n if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n else if (this.fastForwardTo(CharCodes.Lt)) {\n // Outside of RCDATA tags, we can fast-forward.\n this.sequenceIndex = 1;\n }\n }\n else {\n // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`.\n this.sequenceIndex = Number(c === CharCodes.Lt);\n }\n }\n stateBeforeTagName(c) {\n if (c === CharCodes.ExclamationMark) {\n this.state = State.BeforeDeclaration;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Questionmark) {\n if (this.xmlMode) {\n this.state = State.InProcessingInstruction;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n else if (this.isTagStartChar(c)) {\n this.sectionStart = this.index;\n const special = this.xmlMode || this.cbs.isInForeignContext?.()\n ? undefined\n : specialStartSequences.get(c | 0x20);\n if (special === undefined) {\n this.state = State.InTagName;\n }\n else {\n this.isSpecial = true;\n this.currentSequence = special;\n this.sequenceIndex = 3;\n this.state = State.SpecialStartSequence;\n }\n }\n else if (c === CharCodes.Slash) {\n this.state = State.BeforeClosingTagName;\n }\n else {\n this.state = State.Text;\n this.stateText(c);\n }\n }\n stateInTagName(c) {\n if (isEndOfTagSection(c)) {\n this.cbs.onopentagname(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n stateBeforeClosingTagName(c) {\n if (isWhitespace(c)) {\n if (this.xmlMode) {\n // Ignore\n }\n else {\n this.state = State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n else if (c === CharCodes.Gt) {\n this.state = State.Text;\n if (!this.xmlMode) {\n this.sectionStart = this.index + 1;\n }\n }\n else {\n this.state = this.isTagStartChar(c)\n ? State.InClosingTagName\n : State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n stateInClosingTagName(c) {\n if (isEndOfTagSection(c)) {\n this.cbs.onclosetag(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.AfterClosingTagName;\n this.stateAfterClosingTagName(c);\n }\n }\n stateAfterClosingTagName(c) {\n // Skip everything until \">\"\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n stateBeforeAttributeName(c) {\n if (c === CharCodes.Gt) {\n this.cbs.onopentagend(this.index);\n this.enterTagBody();\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Slash) {\n this.state = State.InSelfClosingTag;\n }\n else if (!isWhitespace(c)) {\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n /**\n * Handle `/` before `>` in an opening tag.\n *\n * In HTML mode, text-only tags ignore the self-closing flag and still enter\n * their raw-text/RCDATA/plaintext state unless self-closing tags are being\n * recognized. In XML mode, or for ordinary tags, the tokenizer returns to\n * regular text parsing after emitting the self-closing callback.\n * @param c Current character code point.\n */\n stateInSelfClosingTag(c) {\n if (c === CharCodes.Gt) {\n this.cbs.onselfclosingtag(this.index);\n this.sectionStart = this.index + 1;\n if (!this.recognizeSelfClosing) {\n this.enterTagBody();\n return;\n }\n this.state = State.Text;\n this.isSpecial = false; // Reset special state, in case of self-closing special tags\n this.currentSequence = Sequences.Empty;\n }\n else if (!isWhitespace(c)) {\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n stateInAttributeName(c) {\n if (c === CharCodes.Eq || isEndOfTagSection(c)) {\n this.cbs.onattribname(this.sectionStart, this.index);\n this.sectionStart = this.index;\n this.state = State.AfterAttributeName;\n this.stateAfterAttributeName(c);\n }\n }\n stateAfterAttributeName(c) {\n if (c === CharCodes.Eq) {\n this.state = State.BeforeAttributeValue;\n }\n else if (c === CharCodes.Slash || c === CharCodes.Gt) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n else if (!isWhitespace(c)) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n stateBeforeAttributeValue(c) {\n if (c === CharCodes.DoubleQuote) {\n this.state = State.InAttributeValueDq;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.SingleQuote) {\n this.state = State.InAttributeValueSq;\n this.sectionStart = this.index + 1;\n }\n else if (!isWhitespace(c)) {\n this.sectionStart = this.index;\n this.state = State.InAttributeValueNq;\n this.stateInAttributeValueNoQuotes(c); // Reconsume token\n }\n }\n handleInAttributeValue(c, quote) {\n if (c === quote ||\n (!this.decodeEntities && this.fastForwardTo(quote))) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(quote === CharCodes.DoubleQuote\n ? QuoteType.Double\n : QuoteType.Single, this.index + 1);\n this.state = State.BeforeAttributeName;\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n stateInAttributeValueDoubleQuotes(c) {\n this.handleInAttributeValue(c, CharCodes.DoubleQuote);\n }\n stateInAttributeValueSingleQuotes(c) {\n this.handleInAttributeValue(c, CharCodes.SingleQuote);\n }\n stateInAttributeValueNoQuotes(c) {\n if (isWhitespace(c) || c === CharCodes.Gt) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(QuoteType.Unquoted, this.index);\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n /**\n * Distinguish between CDATA, declarations, HTML comments, and HTML bogus\n * comments after `<!`.\n *\n * In HTML mode, only real comments and doctypes stay on declaration paths;\n * everything else becomes a bogus comment terminated by the next `>`.\n * @param c Current character code point.\n */\n stateBeforeDeclaration(c) {\n if (c === CharCodes.OpeningSquareBracket) {\n this.state = State.CDATASequence;\n this.sequenceIndex = 0;\n }\n else if (this.xmlMode) {\n this.state =\n c === CharCodes.Dash\n ? State.BeforeComment\n : State.InDeclaration;\n }\n else if ((c | 0x20) === Sequences.Doctype[0]) {\n this.state = State.DeclarationSequence;\n this.currentSequence = Sequences.Doctype;\n this.sequenceIndex = 1;\n }\n else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Dash) {\n this.state = State.BeforeComment;\n }\n else {\n this.state = State.InSpecialComment;\n }\n }\n /**\n * Continue matching `doctype` after `<!d`.\n *\n * A full `doctype` match stays on the declaration path; any other name falls\n * back to an HTML bogus comment, which matches browser behavior for\n * non-doctype `<!...>` constructs.\n * @param c Current character code point.\n */\n stateDeclarationSequence(c) {\n if (this.sequenceIndex === this.currentSequence.length) {\n this.state = State.InDeclaration;\n this.stateInDeclaration(c);\n }\n else if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n }\n else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InSpecialComment;\n }\n }\n stateInDeclaration(c) {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.ondeclaration(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n /**\n * XML processing instructions (`<?...?>`).\n *\n * In HTML mode `<?` is routed to `InSpecialComment` instead, so this\n * state is only reachable in XML mode.\n * @param c Current character code point.\n */\n stateInProcessingInstruction(c) {\n if (c === CharCodes.Questionmark) {\n // Remember that we just consumed `?`, so the next `>` closes the PI.\n this.sequenceIndex = 1;\n }\n else if (c === CharCodes.Gt && this.sequenceIndex === 1) {\n this.cbs.onprocessinginstruction(this.sectionStart, this.index - 1);\n this.sequenceIndex = 0;\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else {\n // Keep scanning for the next `?`, which can start a closing `?>`.\n this.sequenceIndex = Number(this.fastForwardTo(CharCodes.Questionmark));\n }\n }\n stateBeforeComment(c) {\n if (c === CharCodes.Dash) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CommentEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n else if (this.xmlMode) {\n this.state = State.InDeclaration;\n }\n else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InSpecialComment;\n }\n }\n stateInSpecialComment(c) {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n startEntity() {\n this.baseState = this.state;\n this.state = State.InEntity;\n this.entityStart = this.index;\n this.entityDecoder.startEntity(this.xmlMode\n ? DecodingMode.Strict\n : this.baseState === State.Text ||\n this.baseState === State.InSpecialTag\n ? DecodingMode.Legacy\n : DecodingMode.Attribute);\n }\n stateInEntity() {\n const indexInBuffer = this.index - this.offset;\n const length = this.entityDecoder.write(this.buffer, indexInBuffer);\n // If `length` is positive, we are done with the entity.\n if (length >= 0) {\n this.state = this.baseState;\n if (length === 0) {\n this.index -= 1;\n }\n }\n else {\n if (indexInBuffer < this.buffer.length &&\n this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp) {\n this.state = this.baseState;\n this.index -= 1;\n return;\n }\n // Mark buffer as consumed.\n this.index = this.offset + this.buffer.length - 1;\n }\n }\n /**\n * Remove data that has already been consumed from the buffer.\n */\n cleanup() {\n // If we are inside of text or attributes, emit what we already have.\n if (this.running && this.sectionStart !== this.index) {\n if (this.state === State.Text ||\n this.state === State.InPlainText ||\n (this.state === State.InSpecialTag && this.sequenceIndex === 0)) {\n this.cbs.ontext(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n else if (this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueNq) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n }\n }\n shouldContinue() {\n return this.index < this.buffer.length + this.offset && this.running;\n }\n /**\n * Iterates through the buffer, calling the function corresponding to the current state.\n *\n * States that are more likely to be hit are higher up, as a performance improvement.\n */\n parse() {\n while (this.shouldContinue()) {\n const c = this.buffer.charCodeAt(this.index - this.offset);\n switch (this.state) {\n case State.Text: {\n this.stateText(c);\n break;\n }\n case State.InPlainText: {\n // Skip to end of buffer; cleanup() emits the text.\n this.index = this.buffer.length + this.offset - 1;\n break;\n }\n case State.SpecialStartSequence: {\n this.stateSpecialStartSequence(c);\n break;\n }\n case State.InSpecialTag: {\n this.stateInSpecialTag(c);\n break;\n }\n case State.CDATASequence: {\n this.stateCDATASequence(c);\n break;\n }\n case State.DeclarationSequence: {\n this.stateDeclarationSequence(c);\n break;\n }\n case State.InAttributeValueDq: {\n this.stateInAttributeValueDoubleQuotes(c);\n break;\n }\n case State.InAttributeName: {\n this.stateInAttributeName(c);\n break;\n }\n case State.InCommentLike: {\n this.stateInCommentLike(c);\n break;\n }\n case State.InSpecialComment: {\n this.stateInSpecialComment(c);\n break;\n }\n case State.BeforeAttributeName: {\n this.stateBeforeAttributeName(c);\n break;\n }\n case State.InTagName: {\n this.stateInTagName(c);\n break;\n }\n case State.InClosingTagName: {\n this.stateInClosingTagName(c);\n break;\n }\n case State.BeforeTagName: {\n this.stateBeforeTagName(c);\n break;\n }\n case State.AfterAttributeName: {\n this.stateAfterAttributeName(c);\n break;\n }\n case State.InAttributeValueSq: {\n this.stateInAttributeValueSingleQuotes(c);\n break;\n }\n case State.BeforeAttributeValue: {\n this.stateBeforeAttributeValue(c);\n break;\n }\n case State.BeforeClosingTagName: {\n this.stateBeforeClosingTagName(c);\n break;\n }\n case State.AfterClosingTagName: {\n this.stateAfterClosingTagName(c);\n break;\n }\n case State.InAttributeValueNq: {\n this.stateInAttributeValueNoQuotes(c);\n break;\n }\n case State.InSelfClosingTag: {\n this.stateInSelfClosingTag(c);\n break;\n }\n case State.InDeclaration: {\n this.stateInDeclaration(c);\n break;\n }\n case State.BeforeDeclaration: {\n this.stateBeforeDeclaration(c);\n break;\n }\n case State.BeforeComment: {\n this.stateBeforeComment(c);\n break;\n }\n case State.InProcessingInstruction: {\n this.stateInProcessingInstruction(c);\n break;\n }\n case State.InEntity: {\n this.stateInEntity();\n break;\n }\n }\n this.index++;\n }\n this.cleanup();\n }\n finish() {\n if (this.state === State.InEntity) {\n this.entityDecoder.end();\n this.state = this.baseState;\n }\n this.handleTrailingData();\n this.cbs.onend();\n }\n handleTrailingCommentLikeData(endIndex) {\n if (this.state !== State.InCommentLike) {\n return false;\n }\n if (this.currentSequence === Sequences.CdataEnd) {\n if (this.xmlMode) {\n if (this.sectionStart < endIndex) {\n this.cbs.oncdata(this.sectionStart, endIndex, 0);\n }\n }\n else {\n /* In HTML mode, unclosed CDATA is a bogus comment. */\n const cdataStart = this.sectionStart - Sequences.Cdata.length - 1;\n this.cbs.oncomment(cdataStart, endIndex, 0);\n }\n }\n else {\n const offset = this.xmlMode\n ? 0\n : Math.min(this.sequenceIndex, Sequences.CommentEnd.length - 1);\n this.cbs.oncomment(this.sectionStart, endIndex, offset);\n }\n return true;\n }\n handleTrailingMarkupDeclaration(endIndex) {\n if (this.xmlMode) {\n switch (this.state) {\n case State.InSpecialComment:\n case State.BeforeComment:\n case State.CDATASequence:\n case State.DeclarationSequence:\n case State.InDeclaration: {\n this.cbs.ontext(this.sectionStart, endIndex);\n return true;\n }\n default: {\n return false;\n }\n }\n }\n switch (this.state) {\n case State.BeforeDeclaration:\n case State.InSpecialComment:\n case State.BeforeComment:\n case State.CDATASequence: {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n return true;\n }\n case State.DeclarationSequence: {\n if (this.sequenceIndex !== Sequences.Doctype.length) {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n }\n return true;\n }\n case State.InDeclaration: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n /** Handle any trailing data. */\n handleTrailingData() {\n const endIndex = this.buffer.length + this.offset;\n if (this.handleTrailingCommentLikeData(endIndex) ||\n this.handleTrailingMarkupDeclaration(endIndex)) {\n return;\n }\n // If there is no remaining data, we are done.\n if (this.sectionStart >= endIndex) {\n return;\n }\n switch (this.state) {\n case State.InTagName:\n case State.BeforeAttributeName:\n case State.BeforeAttributeValue:\n case State.AfterAttributeName:\n case State.InAttributeName:\n case State.InAttributeValueSq:\n case State.InAttributeValueDq:\n case State.InAttributeValueNq:\n case State.InClosingTagName: {\n /*\n * If we are currently in an opening or closing tag, us not calling the\n * respective callback signals that the tag should be ignored.\n */\n break;\n }\n default: {\n this.cbs.ontext(this.sectionStart, endIndex);\n }\n }\n }\n emitCodePoint(cp, consumed) {\n if (this.baseState !== State.Text &&\n this.baseState !== State.InSpecialTag) {\n if (this.sectionStart < this.entityStart) {\n this.cbs.onattribdata(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n this.cbs.onattribentity(cp);\n }\n else {\n if (this.sectionStart < this.entityStart) {\n this.cbs.ontext(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n this.cbs.ontextentity(cp, this.sectionStart);\n }\n }\n}\n//# sourceMappingURL=Tokenizer.js.map","const { fromCodePoint } = String;\nimport Tokenizer, { QuoteType } from \"./Tokenizer.js\";\nconst formTags = new Set([\n \"input\",\n \"option\",\n \"optgroup\",\n \"select\",\n \"button\",\n \"datalist\",\n \"textarea\",\n]);\nconst pTag = new Set([\"p\"]);\nconst headingTags = new Set([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"p\"]);\nconst tableSectionTags = new Set([\"thead\", \"tbody\"]);\nconst ddtTags = new Set([\"dd\", \"dt\"]);\nconst rtpTags = new Set([\"rt\", \"rp\"]);\nconst openImpliesClose = new Map([\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 [\"a\", new Set([\"a\"])],\n [\"li\", new Set([\"li\"])],\n [\"p\", pTag],\n [\"h1\", headingTags],\n [\"h2\", headingTags],\n [\"h3\", headingTags],\n [\"h4\", headingTags],\n [\"h5\", headingTags],\n [\"h6\", headingTags],\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\", ddtTags],\n [\"dt\", ddtTags],\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\", rtpTags],\n [\"rp\", rtpTags],\n [\"tbody\", tableSectionTags],\n [\"tfoot\", tableSectionTags],\n]);\nconst DOCUMENT_TYPE = \"doctype\";\nconst 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]);\nconst foreignContextElements = new Set([\"math\", \"svg\"]);\n/**\n * Elements that can be used to integrate HTML content within foreign namespaces (e.g., SVG or MathML).\n *\n * Entries must use the SVG-adjusted casing (e.g. \"foreignObject\" not\n * \"foreignobject\") since they are compared against adjusted tag names.\n */\nconst htmlIntegrationElements = new Set([\n \"mi\",\n \"mo\",\n \"mn\",\n \"ms\",\n \"mtext\",\n \"annotation-xml\",\n \"foreignObject\",\n \"desc\",\n \"title\",\n]);\nconst svgTagNameAdjustments = new Map([\n [\"altglyph\", \"altGlyph\"],\n [\"altglyphdef\", \"altGlyphDef\"],\n [\"altglyphitem\", \"altGlyphItem\"],\n [\"animatecolor\", \"animateColor\"],\n [\"animatemotion\", \"animateMotion\"],\n [\"animatetransform\", \"animateTransform\"],\n [\"clippath\", \"clipPath\"],\n [\"feblend\", \"feBlend\"],\n [\"fecolormatrix\", \"feColorMatrix\"],\n [\"fecomponenttransfer\", \"feComponentTransfer\"],\n [\"fecomposite\", \"feComposite\"],\n [\"feconvolvematrix\", \"feConvolveMatrix\"],\n [\"fediffuselighting\", \"feDiffuseLighting\"],\n [\"fedisplacementmap\", \"feDisplacementMap\"],\n [\"fedistantlight\", \"feDistantLight\"],\n [\"fedropshadow\", \"feDropShadow\"],\n [\"feflood\", \"feFlood\"],\n [\"fefunca\", \"feFuncA\"],\n [\"fefuncb\", \"feFuncB\"],\n [\"fefuncg\", \"feFuncG\"],\n [\"fefuncr\", \"feFuncR\"],\n [\"fegaussianblur\", \"feGaussianBlur\"],\n [\"feimage\", \"feImage\"],\n [\"femerge\", \"feMerge\"],\n [\"femergenode\", \"feMergeNode\"],\n [\"femorphology\", \"feMorphology\"],\n [\"feoffset\", \"feOffset\"],\n [\"fepointlight\", \"fePointLight\"],\n [\"fespecularlighting\", \"feSpecularLighting\"],\n [\"fespotlight\", \"feSpotLight\"],\n [\"fetile\", \"feTile\"],\n [\"feturbulence\", \"feTurbulence\"],\n [\"foreignobject\", \"foreignObject\"],\n [\"glyphref\", \"glyphRef\"],\n [\"lineargradient\", \"linearGradient\"],\n [\"radialgradient\", \"radialGradient\"],\n [\"textpath\", \"textPath\"],\n]);\nvar ForeignContext;\n(function (ForeignContext) {\n ForeignContext[ForeignContext[\"None\"] = 0] = \"None\";\n ForeignContext[ForeignContext[\"Svg\"] = 1] = \"Svg\";\n ForeignContext[ForeignContext[\"MathML\"] = 2] = \"MathML\";\n})(ForeignContext || (ForeignContext = {}));\nconst reNameEnd = /\\s|\\//;\n/**\n * Incremental parser implementation.\n */\nexport class Parser {\n options;\n /** The start index of the last event. */\n startIndex = 0;\n /** The end index of the last event. */\n endIndex = 0;\n /**\n * Store the start index of the current open tag,\n * so we can update the start index for attributes.\n */\n openTagStart = 0;\n tagname = \"\";\n attribname = \"\";\n attribvalue = \"\";\n attribs = null;\n stack = [];\n foreignContext;\n cbs;\n lowerCaseTagNames;\n lowerCaseAttributeNames;\n recognizeSelfClosing;\n /** We are parsing HTML. Inverse of the `xmlMode` option. */\n htmlMode;\n tokenizer;\n buffers = [];\n bufferOffset = 0;\n /** The index of the last written buffer. Used when resuming after a `pause()`. */\n writeIndex = 0;\n /** Indicates whether the parser has finished running / `.end` has been called. */\n ended = false;\n constructor(cbs, options = {}) {\n this.options = options;\n this.cbs = cbs ?? {};\n this.htmlMode = !this.options.xmlMode;\n this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode;\n this.lowerCaseAttributeNames =\n options.lowerCaseAttributeNames ?? this.htmlMode;\n this.recognizeSelfClosing =\n options.recognizeSelfClosing ?? !this.htmlMode;\n this.tokenizer = new (options.Tokenizer ?? Tokenizer)(this.options, this);\n this.foreignContext = [ForeignContext.None];\n this.cbs.onparserinit?.(this);\n }\n // Tokenizer event handlers\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ontext(start, endIndex) {\n const data = this.getSlice(start, endIndex);\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(data);\n this.startIndex = endIndex;\n }\n /**\n * @param cp Current Unicode code point.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ontextentity(cp, endIndex) {\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(fromCodePoint(cp));\n this.startIndex = endIndex;\n }\n /** @internal */\n isInForeignContext() {\n return this.foreignContext[0] !== ForeignContext.None;\n }\n /**\n * Checks if the current tag is a void element. Override this if you want\n * to specify your own additional void elements.\n * @param name Name of the pseudo selector.\n */\n isVoidElement(name) {\n return this.htmlMode && voidElements.has(name);\n }\n /**\n * Read a tag name from the buffer.\n *\n * When `lowerCaseTagNames` is enabled (the default in HTML mode), the name\n * is lowercased and may be adjusted for SVG casing or the `image` → `img`\n * alias.\n * @param start Start index of the tag name in the buffer.\n * @param endIndex End index of the tag name in the buffer.\n */\n readTagName(start, endIndex) {\n const name = this.lowerCaseTagNames\n ? this.getSlice(start, endIndex).toLowerCase()\n : this.getSlice(start, endIndex);\n if (!(this.lowerCaseTagNames && this.htmlMode)) {\n return name;\n }\n if (this.foreignContext[0] === ForeignContext.Svg) {\n return svgTagNameAdjustments.get(name) ?? name;\n }\n /*\n * Closing tags for SVG elements inside HTML integration points\n * (e.g. </foreignObject> while inside its own content) need case\n * adjustment so the name matches what was pushed to the stack.\n * `foreignContext.length > 1` means a foreign ancestor exists —\n * the base [None] entry plus at least one pushed context.\n */\n if (this.foreignContext.length > 1) {\n const adjusted = svgTagNameAdjustments.get(name);\n if (adjusted !== undefined && this.stack.includes(adjusted)) {\n return adjusted;\n }\n }\n if (!this.isInForeignContext()) {\n return name === \"image\" ? \"img\" : name;\n }\n return name;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onopentagname(start, endIndex) {\n this.endIndex = endIndex;\n this.emitOpenTag(this.readTagName(start, endIndex));\n }\n emitOpenTag(name) {\n this.openTagStart = this.startIndex;\n this.tagname = name;\n /*\n * The spec ignores a second <form> when one is already open.\n * Setting tagname to \"\" suppresses all downstream effects: attribs\n * stays null so endOpenTag is a no-op, and closeCurrentTag can't\n * match \"\" on the stack.\n */\n if (this.htmlMode && name === \"form\" && this.stack.includes(\"form\")) {\n this.tagname = \"\";\n return;\n }\n const impliesClose = this.htmlMode && openImpliesClose.get(name);\n if (impliesClose) {\n while (this.stack.length > 0 && impliesClose.has(this.stack[0])) {\n this.popElement(true);\n }\n }\n if (!this.isVoidElement(name)) {\n this.stack.unshift(name);\n if (this.htmlMode) {\n if (name === \"svg\") {\n this.foreignContext.unshift(ForeignContext.Svg);\n }\n else if (name === \"math\") {\n this.foreignContext.unshift(ForeignContext.MathML);\n }\n else if (htmlIntegrationElements.has(name)) {\n this.foreignContext.unshift(ForeignContext.None);\n }\n }\n }\n this.cbs.onopentagname?.(name);\n if (this.cbs.onopentag)\n this.attribs = {};\n }\n endOpenTag(isImplied) {\n this.startIndex = this.openTagStart;\n if (this.attribs) {\n this.cbs.onopentag?.(this.tagname, this.attribs, isImplied);\n this.attribs = null;\n }\n if (this.cbs.onclosetag && this.isVoidElement(this.tagname)) {\n this.cbs.onclosetag(this.tagname, true);\n }\n this.tagname = \"\";\n }\n /**\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onopentagend(endIndex) {\n this.endIndex = endIndex;\n this.endOpenTag(false);\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onclosetag(start, endIndex) {\n this.endIndex = endIndex;\n const name = this.readTagName(start, endIndex);\n if (!this.isVoidElement(name)) {\n const pos = this.stack.indexOf(name);\n if (pos !== -1) {\n for (let index = 0; index < pos; index++) {\n this.popElement(true);\n }\n this.popElement(false);\n }\n else if (this.htmlMode && name === \"p\") {\n // Implicit open before close\n this.emitOpenTag(\"p\");\n this.closeCurrentTag(true);\n }\n }\n else if (this.htmlMode && name === \"br\") {\n // We can't use `emitOpenTag` for implicit open, as `br` would be implicitly closed.\n this.cbs.onopentagname?.(\"br\");\n this.cbs.onopentag?.(\"br\", {}, true);\n this.cbs.onclosetag?.(\"br\", false);\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onselfclosingtag(endIndex) {\n this.endIndex = endIndex;\n if (this.recognizeSelfClosing || this.isInForeignContext()) {\n this.closeCurrentTag(false);\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n else {\n // Ignore the fact that the tag is self-closing.\n this.onopentagend(endIndex);\n }\n }\n /**\n * Pop the top element off the stack, emit a close event, and maintain\n * the foreign context stack.\n * @param implied Whether this close is implied (not from an explicit end tag).\n */\n popElement(implied) {\n // biome-ignore lint/style/noNonNullAssertion: The element is guaranteed to exist.\n const element = this.stack.shift();\n if (this.htmlMode &&\n (foreignContextElements.has(element) ||\n htmlIntegrationElements.has(element))) {\n this.foreignContext.shift();\n }\n this.cbs.onclosetag?.(element, implied);\n }\n closeCurrentTag(isOpenImplied) {\n const name = this.tagname;\n this.endOpenTag(isOpenImplied);\n // Self-closing tags will be on the top of the stack\n if (this.stack[0] === name) {\n this.popElement(!isOpenImplied);\n }\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribname(start, endIndex) {\n this.startIndex = start;\n const name = this.getSlice(start, endIndex);\n this.attribname = this.lowerCaseAttributeNames\n ? name.toLowerCase()\n : name;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribdata(start, endIndex) {\n this.attribvalue += this.getSlice(start, endIndex);\n }\n /**\n * @param cp Current Unicode code point.\n * @internal\n */\n onattribentity(cp) {\n this.attribvalue += fromCodePoint(cp);\n }\n /**\n * @param quote Quote type used for the current attribute.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribend(quote, endIndex) {\n this.endIndex = endIndex;\n this.cbs.onattribute?.(this.attribname, this.attribvalue, quote === QuoteType.Double\n ? '\"'\n : quote === QuoteType.Single\n ? \"'\"\n : quote === QuoteType.NoValue\n ? undefined\n : null);\n if (this.attribs && !Object.hasOwn(this.attribs, this.attribname)) {\n this.attribs[this.attribname] = this.attribvalue;\n }\n this.attribvalue = \"\";\n }\n getInstructionName(value) {\n const index = value.search(reNameEnd);\n let name = index < 0 ? value : value.substr(0, index);\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n return name;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ondeclaration(start, endIndex) {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n if (this.cbs.onprocessinginstruction) {\n /*\n * In HTML mode, ondeclaration is only reached for DOCTYPE\n * (the tokenizer routes everything else to bogus comments).\n */\n const name = this.htmlMode\n ? this.lowerCaseTagNames\n ? DOCUMENT_TYPE\n : value.slice(0, DOCUMENT_TYPE.length)\n : this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`!${name}`, `!${value}`);\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onprocessinginstruction(start, endIndex) {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n if (this.cbs.onprocessinginstruction) {\n const name = this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`?${name}`, `?${value}`);\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @param offset Offset applied when computing parser indices.\n * @internal\n */\n oncomment(start, endIndex, offset) {\n this.endIndex = endIndex;\n this.cbs.oncomment?.(this.getSlice(start, endIndex - offset));\n this.cbs.oncommentend?.();\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @param offset Offset applied when computing parser indices.\n * @internal\n */\n oncdata(start, endIndex, offset) {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex - offset);\n if (!this.htmlMode || this.options.recognizeCDATA) {\n this.cbs.oncdatastart?.();\n this.cbs.ontext?.(value);\n this.cbs.oncdataend?.();\n }\n else if (this.isInForeignContext()) {\n this.cbs.ontext?.(value);\n }\n else {\n this.cbs.oncomment?.(`[CDATA[${value}]]`);\n this.cbs.oncommentend?.();\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /** @internal */\n onend() {\n if (this.cbs.onclosetag) {\n // Set the end index for all remaining tags\n this.endIndex = this.startIndex;\n for (let index = 0; index < this.stack.length; index++) {\n this.cbs.onclosetag(this.stack[index], true);\n }\n }\n this.cbs.onend?.();\n }\n /**\n * Resets the parser to a blank state, ready to parse a new HTML document\n */\n reset() {\n this.cbs.onreset?.();\n this.tokenizer.reset();\n this.tagname = \"\";\n this.attribname = \"\";\n this.attribvalue = \"\";\n this.attribs = null;\n this.stack.length = 0;\n this.startIndex = 0;\n this.endIndex = 0;\n this.cbs.onparserinit?.(this);\n this.buffers.length = 0;\n this.foreignContext.length = 0;\n this.foreignContext.unshift(ForeignContext.None);\n this.bufferOffset = 0;\n this.writeIndex = 0;\n this.ended = false;\n }\n /**\n * Resets the parser, then parses a complete document and\n * pushes it to the handler.\n * @param data Document to parse.\n */\n parseComplete(data) {\n this.reset();\n this.end(data);\n }\n getSlice(start, end) {\n if (start === end) {\n return \"\";\n }\n while (start - this.bufferOffset >= this.buffers[0].length) {\n this.shiftBuffer();\n }\n let slice = this.buffers[0].slice(start - this.bufferOffset, end - this.bufferOffset);\n while (end - this.bufferOffset > this.buffers[0].length) {\n this.shiftBuffer();\n slice += this.buffers[0].slice(0, end - this.bufferOffset);\n }\n return slice;\n }\n shiftBuffer() {\n this.bufferOffset += this.buffers[0].length;\n this.writeIndex--;\n this.buffers.shift();\n }\n /**\n * Parses a chunk of data and calls the corresponding callbacks.\n * @param chunk Chunk to parse.\n */\n write(chunk) {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".write() after done!\"));\n return;\n }\n this.buffers.push(chunk);\n if (this.tokenizer.running) {\n this.tokenizer.write(chunk);\n this.writeIndex++;\n }\n }\n /**\n * Parses the end of the buffer and clears the stack, calls onend.\n * @param chunk Optional final chunk to parse.\n */\n end(chunk) {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".end() after done!\"));\n return;\n }\n if (chunk)\n this.write(chunk);\n this.ended = true;\n this.tokenizer.end();\n }\n /**\n * Pauses parsing. The parser won't emit events until `resume` is called.\n */\n pause() {\n this.tokenizer.pause();\n }\n /**\n * Resumes parsing after `pause` was called.\n */\n resume() {\n this.tokenizer.resume();\n while (this.tokenizer.running &&\n this.writeIndex < this.buffers.length) {\n this.tokenizer.write(this.buffers[this.writeIndex++]);\n }\n if (this.ended)\n this.tokenizer.end();\n }\n}\n//# sourceMappingURL=Parser.js.map"],"x_google_ignoreList":[0,1,2,3,4,5,6,7],"mappings":"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"}