tutuca 0.9.37 → 0.9.39

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.
@@ -1644,428 +1644,77 @@ class ParseCtxClassSetCollector extends ParseContext {
1644
1644
  }
1645
1645
  }
1646
1646
 
1647
- // node_modules/entities/dist/decode-codepoint.js
1648
- var decodeMap = new Map([
1649
- [0, 65533],
1650
- [128, 8364],
1651
- [130, 8218],
1652
- [131, 402],
1653
- [132, 8222],
1654
- [133, 8230],
1655
- [134, 8224],
1656
- [135, 8225],
1657
- [136, 710],
1658
- [137, 8240],
1659
- [138, 352],
1660
- [139, 8249],
1661
- [140, 338],
1662
- [142, 381],
1663
- [145, 8216],
1664
- [146, 8217],
1665
- [147, 8220],
1666
- [148, 8221],
1667
- [149, 8226],
1668
- [150, 8211],
1669
- [151, 8212],
1670
- [152, 732],
1671
- [153, 8482],
1672
- [154, 353],
1673
- [155, 8250],
1674
- [156, 339],
1675
- [158, 382],
1676
- [159, 376]
1677
- ]);
1678
- function replaceCodePoint(codePoint) {
1679
- if (codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111) {
1680
- return 65533;
1681
- }
1682
- return decodeMap.get(codePoint) ?? codePoint;
1683
- }
1684
-
1685
- // node_modules/entities/dist/internal/decode-shared.js
1686
- function decodeBase64(input) {
1687
- const binary = atob(input);
1688
- const evenLength = binary.length & ~1;
1689
- const out = new Uint16Array(evenLength / 2);
1690
- for (let index = 0, outIndex = 0;index < evenLength; index += 2) {
1691
- const lo = binary.charCodeAt(index);
1692
- const hi = binary.charCodeAt(index + 1);
1693
- out[outIndex++] = lo | hi << 8;
1694
- }
1695
- return out;
1696
- }
1697
-
1698
- // node_modules/entities/dist/generated/decode-data-html.js
1699
- var 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");
1700
-
1701
- // node_modules/entities/dist/generated/decode-data-xml.js
1702
- var xmlDecodeTree = /* @__PURE__ */ decodeBase64("AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg");
1703
-
1704
- // node_modules/entities/dist/internal/bin-trie-flags.js
1705
- var BinTrieFlags;
1706
- (function(BinTrieFlags2) {
1707
- BinTrieFlags2[BinTrieFlags2["VALUE_LENGTH"] = 49152] = "VALUE_LENGTH";
1708
- BinTrieFlags2[BinTrieFlags2["FLAG13"] = 8192] = "FLAG13";
1709
- BinTrieFlags2[BinTrieFlags2["BRANCH_LENGTH"] = 8064] = "BRANCH_LENGTH";
1710
- BinTrieFlags2[BinTrieFlags2["JUMP_TABLE"] = 127] = "JUMP_TABLE";
1711
- })(BinTrieFlags || (BinTrieFlags = {}));
1712
-
1713
- // node_modules/entities/dist/decode.js
1714
- var CharCodes;
1715
- (function(CharCodes2) {
1716
- CharCodes2[CharCodes2["NUM"] = 35] = "NUM";
1717
- CharCodes2[CharCodes2["SEMI"] = 59] = "SEMI";
1718
- CharCodes2[CharCodes2["EQUALS"] = 61] = "EQUALS";
1719
- CharCodes2[CharCodes2["ZERO"] = 48] = "ZERO";
1720
- CharCodes2[CharCodes2["NINE"] = 57] = "NINE";
1721
- CharCodes2[CharCodes2["LOWER_A"] = 97] = "LOWER_A";
1722
- CharCodes2[CharCodes2["LOWER_F"] = 102] = "LOWER_F";
1723
- CharCodes2[CharCodes2["LOWER_X"] = 120] = "LOWER_X";
1724
- CharCodes2[CharCodes2["LOWER_Z"] = 122] = "LOWER_Z";
1725
- CharCodes2[CharCodes2["UPPER_A"] = 65] = "UPPER_A";
1726
- CharCodes2[CharCodes2["UPPER_F"] = 70] = "UPPER_F";
1727
- CharCodes2[CharCodes2["UPPER_Z"] = 90] = "UPPER_Z";
1728
- })(CharCodes || (CharCodes = {}));
1729
- var TO_LOWER_BIT = 32;
1730
- function isNumber(code) {
1731
- return code >= CharCodes.ZERO && code <= CharCodes.NINE;
1732
- }
1733
- function isHexadecimalCharacter(code) {
1734
- return code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F || code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F;
1735
- }
1736
- function isAsciiAlphaNumeric(code) {
1737
- return code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z || code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z || isNumber(code);
1738
- }
1739
- function isEntityInAttributeInvalidEnd(code) {
1740
- return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);
1741
- }
1742
- var EntityDecoderState;
1743
- (function(EntityDecoderState2) {
1744
- EntityDecoderState2[EntityDecoderState2["EntityStart"] = 0] = "EntityStart";
1745
- EntityDecoderState2[EntityDecoderState2["NumericStart"] = 1] = "NumericStart";
1746
- EntityDecoderState2[EntityDecoderState2["NumericDecimal"] = 2] = "NumericDecimal";
1747
- EntityDecoderState2[EntityDecoderState2["NumericHex"] = 3] = "NumericHex";
1748
- EntityDecoderState2[EntityDecoderState2["NamedEntity"] = 4] = "NamedEntity";
1749
- })(EntityDecoderState || (EntityDecoderState = {}));
1750
- var DecodingMode;
1751
- (function(DecodingMode2) {
1752
- DecodingMode2[DecodingMode2["Legacy"] = 0] = "Legacy";
1753
- DecodingMode2[DecodingMode2["Strict"] = 1] = "Strict";
1754
- DecodingMode2[DecodingMode2["Attribute"] = 2] = "Attribute";
1755
- })(DecodingMode || (DecodingMode = {}));
1756
-
1757
- class EntityDecoder {
1758
- decodeTree;
1759
- emitCodePoint;
1760
- errors;
1761
- constructor(decodeTree, emitCodePoint, errors) {
1762
- this.decodeTree = decodeTree;
1763
- this.emitCodePoint = emitCodePoint;
1764
- this.errors = errors;
1765
- }
1766
- state = EntityDecoderState.EntityStart;
1767
- consumed = 1;
1768
- result = 0;
1769
- treeIndex = 0;
1770
- excess = 1;
1771
- decodeMode = DecodingMode.Strict;
1772
- runConsumed = 0;
1773
- startEntity(decodeMode) {
1774
- this.decodeMode = decodeMode;
1775
- this.state = EntityDecoderState.EntityStart;
1776
- this.result = 0;
1777
- this.treeIndex = 0;
1778
- this.excess = 1;
1779
- this.consumed = 1;
1780
- this.runConsumed = 0;
1781
- }
1782
- write(input, offset) {
1783
- switch (this.state) {
1784
- case EntityDecoderState.EntityStart: {
1785
- if (input.charCodeAt(offset) === CharCodes.NUM) {
1786
- this.state = EntityDecoderState.NumericStart;
1787
- this.consumed += 1;
1788
- return this.stateNumericStart(input, offset + 1);
1789
- }
1790
- this.state = EntityDecoderState.NamedEntity;
1791
- return this.stateNamedEntity(input, offset);
1792
- }
1793
- case EntityDecoderState.NumericStart: {
1794
- return this.stateNumericStart(input, offset);
1795
- }
1796
- case EntityDecoderState.NumericDecimal: {
1797
- return this.stateNumericDecimal(input, offset);
1798
- }
1799
- case EntityDecoderState.NumericHex: {
1800
- return this.stateNumericHex(input, offset);
1801
- }
1802
- case EntityDecoderState.NamedEntity: {
1803
- return this.stateNamedEntity(input, offset);
1804
- }
1805
- }
1806
- }
1807
- stateNumericStart(input, offset) {
1808
- if (offset >= input.length) {
1809
- return -1;
1810
- }
1811
- if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {
1812
- this.state = EntityDecoderState.NumericHex;
1813
- this.consumed += 1;
1814
- return this.stateNumericHex(input, offset + 1);
1815
- }
1816
- this.state = EntityDecoderState.NumericDecimal;
1817
- return this.stateNumericDecimal(input, offset);
1818
- }
1819
- stateNumericHex(input, offset) {
1820
- while (offset < input.length) {
1821
- const char = input.charCodeAt(offset);
1822
- if (isNumber(char) || isHexadecimalCharacter(char)) {
1823
- const digit = char <= CharCodes.NINE ? char - CharCodes.ZERO : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;
1824
- this.result = this.result * 16 + digit;
1825
- this.consumed++;
1826
- offset++;
1827
- } else {
1828
- return this.emitNumericEntity(char, 3);
1829
- }
1830
- }
1831
- return -1;
1832
- }
1833
- stateNumericDecimal(input, offset) {
1834
- while (offset < input.length) {
1835
- const char = input.charCodeAt(offset);
1836
- if (isNumber(char)) {
1837
- this.result = this.result * 10 + (char - CharCodes.ZERO);
1838
- this.consumed++;
1839
- offset++;
1840
- } else {
1841
- return this.emitNumericEntity(char, 2);
1842
- }
1843
- }
1844
- return -1;
1845
- }
1846
- emitNumericEntity(lastCp, expectedLength) {
1847
- if (this.consumed <= expectedLength) {
1848
- this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);
1849
- return 0;
1850
- }
1851
- if (lastCp === CharCodes.SEMI) {
1852
- this.consumed += 1;
1853
- } else if (this.decodeMode === DecodingMode.Strict) {
1854
- return 0;
1855
- }
1856
- this.emitCodePoint(replaceCodePoint(this.result), this.consumed);
1857
- if (this.errors) {
1858
- if (lastCp !== CharCodes.SEMI) {
1859
- this.errors.missingSemicolonAfterCharacterReference();
1860
- }
1861
- this.errors.validateNumericCharacterReference(this.result);
1862
- }
1863
- return this.consumed;
1864
- }
1865
- stateNamedEntity(input, offset) {
1866
- const { decodeTree } = this;
1867
- let current = decodeTree[this.treeIndex];
1868
- let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
1869
- while (offset < input.length) {
1870
- if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {
1871
- const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
1872
- if (this.runConsumed === 0) {
1873
- const firstChar = current & BinTrieFlags.JUMP_TABLE;
1874
- if (input.charCodeAt(offset) !== firstChar) {
1875
- return this.result === 0 ? 0 : this.emitNotTerminatedNamedEntity();
1876
- }
1877
- offset++;
1878
- this.excess++;
1879
- this.runConsumed++;
1880
- }
1881
- while (this.runConsumed < runLength) {
1882
- if (offset >= input.length) {
1883
- return -1;
1884
- }
1885
- const charIndexInPacked = this.runConsumed - 1;
1886
- const packedWord = decodeTree[this.treeIndex + 1 + (charIndexInPacked >> 1)];
1887
- const expectedChar = charIndexInPacked % 2 === 0 ? packedWord & 255 : packedWord >> 8 & 255;
1888
- if (input.charCodeAt(offset) !== expectedChar) {
1889
- this.runConsumed = 0;
1890
- return this.result === 0 ? 0 : this.emitNotTerminatedNamedEntity();
1891
- }
1892
- offset++;
1893
- this.excess++;
1894
- this.runConsumed++;
1895
- }
1896
- this.runConsumed = 0;
1897
- this.treeIndex += 1 + (runLength >> 1);
1898
- current = decodeTree[this.treeIndex];
1899
- valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
1900
- }
1901
- if (offset >= input.length)
1902
- break;
1903
- const char = input.charCodeAt(offset);
1904
- if (char === CharCodes.SEMI && valueLength !== 0 && (current & BinTrieFlags.FLAG13) !== 0) {
1905
- return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);
1906
- }
1907
- this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);
1908
- if (this.treeIndex < 0) {
1909
- return this.result === 0 || this.decodeMode === DecodingMode.Attribute && (valueLength === 0 || isEntityInAttributeInvalidEnd(char)) ? 0 : this.emitNotTerminatedNamedEntity();
1910
- }
1911
- current = decodeTree[this.treeIndex];
1912
- valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
1913
- if (valueLength !== 0) {
1914
- if (char === CharCodes.SEMI) {
1915
- return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);
1916
- }
1917
- if (this.decodeMode !== DecodingMode.Strict && (current & BinTrieFlags.FLAG13) === 0) {
1918
- this.result = this.treeIndex;
1919
- this.consumed += this.excess;
1920
- this.excess = 0;
1921
- }
1922
- }
1923
- offset++;
1924
- this.excess++;
1925
- }
1926
- return -1;
1927
- }
1928
- emitNotTerminatedNamedEntity() {
1929
- const { result, decodeTree } = this;
1930
- const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;
1931
- this.emitNamedEntityData(result, valueLength, this.consumed);
1932
- this.errors?.missingSemicolonAfterCharacterReference();
1933
- return this.consumed;
1934
- }
1935
- emitNamedEntityData(result, valueLength, consumed) {
1936
- const { decodeTree } = this;
1937
- this.emitCodePoint(valueLength === 1 ? decodeTree[result] & ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13) : decodeTree[result + 1], consumed);
1938
- if (valueLength === 3) {
1939
- this.emitCodePoint(decodeTree[result + 2], consumed);
1940
- }
1941
- return consumed;
1942
- }
1943
- end() {
1944
- switch (this.state) {
1945
- case EntityDecoderState.NamedEntity: {
1946
- return this.result !== 0 && (this.decodeMode !== DecodingMode.Attribute || this.result === this.treeIndex) ? this.emitNotTerminatedNamedEntity() : 0;
1947
- }
1948
- case EntityDecoderState.NumericDecimal: {
1949
- return this.emitNumericEntity(0, 2);
1950
- }
1951
- case EntityDecoderState.NumericHex: {
1952
- return this.emitNumericEntity(0, 3);
1953
- }
1954
- case EntityDecoderState.NumericStart: {
1955
- this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);
1956
- return 0;
1957
- }
1958
- case EntityDecoderState.EntityStart: {
1959
- return 0;
1960
- }
1961
- }
1962
- }
1963
- }
1964
- function determineBranch(decodeTree, current, nodeIndex, char) {
1965
- const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
1966
- const jumpOffset = current & BinTrieFlags.JUMP_TABLE;
1967
- if (branchCount === 0) {
1968
- return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;
1969
- }
1970
- if (jumpOffset) {
1971
- const value = char - jumpOffset;
1972
- return value < 0 || value >= branchCount ? -1 : decodeTree[nodeIndex + value] - 1;
1973
- }
1974
- const packedKeySlots = branchCount + 1 >> 1;
1975
- let lo = 0;
1976
- let hi = branchCount - 1;
1977
- while (lo <= hi) {
1978
- const mid = lo + hi >>> 1;
1979
- const slot = mid >> 1;
1980
- const packed = decodeTree[nodeIndex + slot];
1981
- const midKey = packed >> (mid & 1) * 8 & 255;
1982
- if (midKey < char) {
1983
- lo = mid + 1;
1984
- } else if (midKey > char) {
1985
- hi = mid - 1;
1986
- } else {
1987
- return decodeTree[nodeIndex + packedKeySlots + mid];
1988
- }
1989
- }
1990
- return -1;
1991
- }
1992
-
1993
- // node_modules/htmlparser2/dist/Tokenizer.js
1994
- var CharCodes2;
1995
- (function(CharCodes3) {
1996
- CharCodes3[CharCodes3["Tab"] = 9] = "Tab";
1997
- CharCodes3[CharCodes3["NewLine"] = 10] = "NewLine";
1998
- CharCodes3[CharCodes3["FormFeed"] = 12] = "FormFeed";
1999
- CharCodes3[CharCodes3["CarriageReturn"] = 13] = "CarriageReturn";
2000
- CharCodes3[CharCodes3["Space"] = 32] = "Space";
2001
- CharCodes3[CharCodes3["ExclamationMark"] = 33] = "ExclamationMark";
2002
- CharCodes3[CharCodes3["Number"] = 35] = "Number";
2003
- CharCodes3[CharCodes3["Amp"] = 38] = "Amp";
2004
- CharCodes3[CharCodes3["SingleQuote"] = 39] = "SingleQuote";
2005
- CharCodes3[CharCodes3["DoubleQuote"] = 34] = "DoubleQuote";
2006
- CharCodes3[CharCodes3["Dash"] = 45] = "Dash";
2007
- CharCodes3[CharCodes3["Slash"] = 47] = "Slash";
2008
- CharCodes3[CharCodes3["Zero"] = 48] = "Zero";
2009
- CharCodes3[CharCodes3["Nine"] = 57] = "Nine";
2010
- CharCodes3[CharCodes3["Semi"] = 59] = "Semi";
2011
- CharCodes3[CharCodes3["Lt"] = 60] = "Lt";
2012
- CharCodes3[CharCodes3["Eq"] = 61] = "Eq";
2013
- CharCodes3[CharCodes3["Gt"] = 62] = "Gt";
2014
- CharCodes3[CharCodes3["Questionmark"] = 63] = "Questionmark";
2015
- CharCodes3[CharCodes3["UpperA"] = 65] = "UpperA";
2016
- CharCodes3[CharCodes3["LowerA"] = 97] = "LowerA";
2017
- CharCodes3[CharCodes3["UpperF"] = 70] = "UpperF";
2018
- CharCodes3[CharCodes3["LowerF"] = 102] = "LowerF";
2019
- CharCodes3[CharCodes3["UpperZ"] = 90] = "UpperZ";
2020
- CharCodes3[CharCodes3["LowerZ"] = 122] = "LowerZ";
2021
- CharCodes3[CharCodes3["LowerX"] = 120] = "LowerX";
2022
- CharCodes3[CharCodes3["OpeningSquareBracket"] = 91] = "OpeningSquareBracket";
2023
- })(CharCodes2 || (CharCodes2 = {}));
2024
- var State;
2025
- (function(State2) {
2026
- State2[State2["Text"] = 1] = "Text";
2027
- State2[State2["BeforeTagName"] = 2] = "BeforeTagName";
2028
- State2[State2["InTagName"] = 3] = "InTagName";
2029
- State2[State2["InSelfClosingTag"] = 4] = "InSelfClosingTag";
2030
- State2[State2["BeforeClosingTagName"] = 5] = "BeforeClosingTagName";
2031
- State2[State2["InClosingTagName"] = 6] = "InClosingTagName";
2032
- State2[State2["AfterClosingTagName"] = 7] = "AfterClosingTagName";
2033
- State2[State2["BeforeAttributeName"] = 8] = "BeforeAttributeName";
2034
- State2[State2["InAttributeName"] = 9] = "InAttributeName";
2035
- State2[State2["AfterAttributeName"] = 10] = "AfterAttributeName";
2036
- State2[State2["BeforeAttributeValue"] = 11] = "BeforeAttributeValue";
2037
- State2[State2["InAttributeValueDq"] = 12] = "InAttributeValueDq";
2038
- State2[State2["InAttributeValueSq"] = 13] = "InAttributeValueSq";
2039
- State2[State2["InAttributeValueNq"] = 14] = "InAttributeValueNq";
2040
- State2[State2["BeforeDeclaration"] = 15] = "BeforeDeclaration";
2041
- State2[State2["InDeclaration"] = 16] = "InDeclaration";
2042
- State2[State2["InProcessingInstruction"] = 17] = "InProcessingInstruction";
2043
- State2[State2["BeforeComment"] = 18] = "BeforeComment";
2044
- State2[State2["CDATASequence"] = 19] = "CDATASequence";
2045
- State2[State2["DeclarationSequence"] = 20] = "DeclarationSequence";
2046
- State2[State2["InSpecialComment"] = 21] = "InSpecialComment";
2047
- State2[State2["InCommentLike"] = 22] = "InCommentLike";
2048
- State2[State2["SpecialStartSequence"] = 23] = "SpecialStartSequence";
2049
- State2[State2["InSpecialTag"] = 24] = "InSpecialTag";
2050
- State2[State2["InPlainText"] = 25] = "InPlainText";
2051
- State2[State2["InEntity"] = 26] = "InEntity";
2052
- })(State || (State = {}));
1647
+ // tools/core/html-tokenizer.js
1648
+ var CharCodes = {
1649
+ Tab: 9,
1650
+ NewLine: 10,
1651
+ FormFeed: 12,
1652
+ CarriageReturn: 13,
1653
+ Space: 32,
1654
+ ExclamationMark: 33,
1655
+ Number: 35,
1656
+ SingleQuote: 39,
1657
+ DoubleQuote: 34,
1658
+ Dash: 45,
1659
+ Slash: 47,
1660
+ Zero: 48,
1661
+ Nine: 57,
1662
+ Semi: 59,
1663
+ Lt: 60,
1664
+ Eq: 61,
1665
+ Gt: 62,
1666
+ Questionmark: 63,
1667
+ UpperA: 65,
1668
+ LowerA: 97,
1669
+ UpperF: 70,
1670
+ LowerF: 102,
1671
+ UpperZ: 90,
1672
+ LowerZ: 122,
1673
+ LowerX: 120,
1674
+ OpeningSquareBracket: 91
1675
+ };
1676
+ var State = {
1677
+ Text: 1,
1678
+ BeforeTagName: 2,
1679
+ InTagName: 3,
1680
+ InSelfClosingTag: 4,
1681
+ BeforeClosingTagName: 5,
1682
+ InClosingTagName: 6,
1683
+ AfterClosingTagName: 7,
1684
+ BeforeAttributeName: 8,
1685
+ InAttributeName: 9,
1686
+ AfterAttributeName: 10,
1687
+ BeforeAttributeValue: 11,
1688
+ InAttributeValueDq: 12,
1689
+ InAttributeValueSq: 13,
1690
+ InAttributeValueNq: 14,
1691
+ BeforeDeclaration: 15,
1692
+ InDeclaration: 16,
1693
+ InProcessingInstruction: 17,
1694
+ BeforeComment: 18,
1695
+ CDATASequence: 19,
1696
+ DeclarationSequence: 20,
1697
+ InSpecialComment: 21,
1698
+ InCommentLike: 22,
1699
+ SpecialStartSequence: 23,
1700
+ InSpecialTag: 24,
1701
+ InPlainText: 25
1702
+ };
2053
1703
  function isWhitespace(c) {
2054
- return c === CharCodes2.Space || c === CharCodes2.NewLine || c === CharCodes2.Tab || c === CharCodes2.FormFeed || c === CharCodes2.CarriageReturn;
1704
+ return c === CharCodes.Space || c === CharCodes.NewLine || c === CharCodes.Tab || c === CharCodes.FormFeed || c === CharCodes.CarriageReturn;
2055
1705
  }
2056
1706
  function isEndOfTagSection(c) {
2057
- return c === CharCodes2.Slash || c === CharCodes2.Gt || isWhitespace(c);
1707
+ return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);
2058
1708
  }
2059
1709
  function isASCIIAlpha(c) {
2060
- return c >= CharCodes2.LowerA && c <= CharCodes2.LowerZ || c >= CharCodes2.UpperA && c <= CharCodes2.UpperZ;
2061
- }
2062
- var QuoteType;
2063
- (function(QuoteType2) {
2064
- QuoteType2[QuoteType2["NoValue"] = 0] = "NoValue";
2065
- QuoteType2[QuoteType2["Unquoted"] = 1] = "Unquoted";
2066
- QuoteType2[QuoteType2["Single"] = 2] = "Single";
2067
- QuoteType2[QuoteType2["Double"] = 3] = "Double";
2068
- })(QuoteType || (QuoteType = {}));
1710
+ return c >= CharCodes.LowerA && c <= CharCodes.LowerZ || c >= CharCodes.UpperA && c <= CharCodes.UpperZ;
1711
+ }
1712
+ var QuoteType = {
1713
+ NoValue: 0,
1714
+ Unquoted: 1,
1715
+ Single: 2,
1716
+ Double: 3
1717
+ };
2069
1718
  var Sequences = {
2070
1719
  Empty: new Uint8Array(0),
2071
1720
  Cdata: new Uint8Array([67, 68, 65, 84, 65, 91]),
@@ -2073,57 +1722,13 @@ var Sequences = {
2073
1722
  CommentEnd: new Uint8Array([45, 45, 33, 62]),
2074
1723
  Doctype: new Uint8Array([100, 111, 99, 116, 121, 112, 101]),
2075
1724
  IframeEnd: new Uint8Array([60, 47, 105, 102, 114, 97, 109, 101]),
2076
- NoembedEnd: new Uint8Array([
2077
- 60,
2078
- 47,
2079
- 110,
2080
- 111,
2081
- 101,
2082
- 109,
2083
- 98,
2084
- 101,
2085
- 100
2086
- ]),
2087
- NoframesEnd: new Uint8Array([
2088
- 60,
2089
- 47,
2090
- 110,
2091
- 111,
2092
- 102,
2093
- 114,
2094
- 97,
2095
- 109,
2096
- 101,
2097
- 115
2098
- ]),
2099
- Plaintext: new Uint8Array([
2100
- 60,
2101
- 47,
2102
- 112,
2103
- 108,
2104
- 97,
2105
- 105,
2106
- 110,
2107
- 116,
2108
- 101,
2109
- 120,
2110
- 116
2111
- ]),
1725
+ NoembedEnd: new Uint8Array([60, 47, 110, 111, 101, 109, 98, 101, 100]),
1726
+ NoframesEnd: new Uint8Array([60, 47, 110, 111, 102, 114, 97, 109, 101, 115]),
1727
+ Plaintext: new Uint8Array([60, 47, 112, 108, 97, 105, 110, 116, 101, 120, 116]),
2112
1728
  ScriptEnd: new Uint8Array([60, 47, 115, 99, 114, 105, 112, 116]),
2113
1729
  StyleEnd: new Uint8Array([60, 47, 115, 116, 121, 108, 101]),
2114
1730
  TitleEnd: new Uint8Array([60, 47, 116, 105, 116, 108, 101]),
2115
- TextareaEnd: new Uint8Array([
2116
- 60,
2117
- 47,
2118
- 116,
2119
- 101,
2120
- 120,
2121
- 116,
2122
- 97,
2123
- 114,
2124
- 101,
2125
- 97
2126
- ]),
1731
+ TextareaEnd: new Uint8Array([60, 47, 116, 101, 120, 116, 97, 114, 101, 97]),
2127
1732
  XmpEnd: new Uint8Array([60, 47, 120, 109, 112])
2128
1733
  };
2129
1734
  var specialStartSequences = new Map([
@@ -2135,34 +1740,26 @@ var specialStartSequences = new Map([
2135
1740
  [Sequences.XmpEnd[2], Sequences.XmpEnd]
2136
1741
  ]);
2137
1742
 
2138
- class Tokenizer {
2139
- cbs;
2140
- state = State.Text;
2141
- buffer = "";
2142
- sectionStart = 0;
2143
- index = 0;
2144
- entityStart = 0;
2145
- baseState = State.Text;
2146
- isSpecial = false;
2147
- running = true;
2148
- offset = 0;
2149
- xmlMode;
2150
- decodeEntities;
2151
- recognizeSelfClosing;
2152
- entityDecoder;
2153
- constructor({ xmlMode = false, decodeEntities = true, recognizeSelfClosing = xmlMode }, cbs) {
1743
+ class HtmlTokenizer {
1744
+ constructor({ xmlMode = false, recognizeSelfClosing = xmlMode } = {}, cbs) {
2154
1745
  this.cbs = cbs;
2155
1746
  this.xmlMode = xmlMode;
2156
- this.decodeEntities = decodeEntities;
2157
1747
  this.recognizeSelfClosing = recognizeSelfClosing;
2158
- this.entityDecoder = new EntityDecoder(xmlMode ? xmlDecodeTree : htmlDecodeTree, (cp, consumed) => this.emitCodePoint(cp, consumed));
1748
+ this.state = State.Text;
1749
+ this.buffer = "";
1750
+ this.sectionStart = 0;
1751
+ this.index = 0;
1752
+ this.isSpecial = false;
1753
+ this.running = true;
1754
+ this.offset = 0;
1755
+ this.currentSequence = Sequences.Empty;
1756
+ this.sequenceIndex = 0;
2159
1757
  }
2160
1758
  reset() {
2161
1759
  this.state = State.Text;
2162
1760
  this.buffer = "";
2163
1761
  this.sectionStart = 0;
2164
1762
  this.index = 0;
2165
- this.baseState = State.Text;
2166
1763
  this.isSpecial = false;
2167
1764
  this.currentSequence = Sequences.Empty;
2168
1765
  this.sequenceIndex = 0;
@@ -2188,18 +1785,14 @@ class Tokenizer {
2188
1785
  }
2189
1786
  }
2190
1787
  stateText(c) {
2191
- if (c === CharCodes2.Lt || !this.decodeEntities && this.fastForwardTo(CharCodes2.Lt)) {
1788
+ if (c === CharCodes.Lt || this.fastForwardTo(CharCodes.Lt)) {
2192
1789
  if (this.index > this.sectionStart) {
2193
1790
  this.cbs.ontext(this.sectionStart, this.index);
2194
1791
  }
2195
1792
  this.state = State.BeforeTagName;
2196
1793
  this.sectionStart = this.index;
2197
- } else if (this.decodeEntities && c === CharCodes2.Amp) {
2198
- this.startEntity();
2199
1794
  }
2200
1795
  }
2201
- currentSequence = Sequences.Empty;
2202
- sequenceIndex = 0;
2203
1796
  enterTagBody() {
2204
1797
  if (this.currentSequence === Sequences.Plaintext) {
2205
1798
  this.currentSequence = Sequences.Empty;
@@ -2281,12 +1874,12 @@ class Tokenizer {
2281
1874
  this.state = State.Text;
2282
1875
  }
2283
1876
  stateInCommentLike(c) {
2284
- if (!this.xmlMode && this.currentSequence === Sequences.CommentEnd && this.sequenceIndex <= 1 && this.index === this.sectionStart + this.sequenceIndex && c === CharCodes2.Gt) {
1877
+ if (!this.xmlMode && this.currentSequence === Sequences.CommentEnd && this.sequenceIndex <= 1 && this.index === this.sectionStart + this.sequenceIndex && c === CharCodes.Gt) {
2285
1878
  this.emitComment(this.sequenceIndex);
2286
- } else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === 2 && c === CharCodes2.Gt) {
1879
+ } else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === 2 && c === CharCodes.Gt) {
2287
1880
  this.emitComment(2);
2288
- } else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === this.currentSequence.length - 1 && c !== CharCodes2.Gt) {
2289
- this.sequenceIndex = Number(c === CharCodes2.Dash);
1881
+ } else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === this.currentSequence.length - 1 && c !== CharCodes.Gt) {
1882
+ this.sequenceIndex = Number(c === CharCodes.Dash);
2290
1883
  } else if (c === this.currentSequence[this.sequenceIndex]) {
2291
1884
  if (++this.sequenceIndex === this.currentSequence.length) {
2292
1885
  if (this.currentSequence === Sequences.CdataEnd) {
@@ -2329,22 +1922,18 @@ class Tokenizer {
2329
1922
  if ((c | 32) === this.currentSequence[this.sequenceIndex]) {
2330
1923
  this.sequenceIndex += 1;
2331
1924
  } else if (this.sequenceIndex === 0) {
2332
- if (this.currentSequence === Sequences.TitleEnd || this.currentSequence === Sequences.TextareaEnd) {
2333
- if (this.decodeEntities && c === CharCodes2.Amp) {
2334
- this.startEntity();
2335
- }
2336
- } else if (this.fastForwardTo(CharCodes2.Lt)) {
1925
+ if (this.fastForwardTo(CharCodes.Lt)) {
2337
1926
  this.sequenceIndex = 1;
2338
1927
  }
2339
1928
  } else {
2340
- this.sequenceIndex = Number(c === CharCodes2.Lt);
1929
+ this.sequenceIndex = Number(c === CharCodes.Lt);
2341
1930
  }
2342
1931
  }
2343
1932
  stateBeforeTagName(c) {
2344
- if (c === CharCodes2.ExclamationMark) {
1933
+ if (c === CharCodes.ExclamationMark) {
2345
1934
  this.state = State.BeforeDeclaration;
2346
1935
  this.sectionStart = this.index + 1;
2347
- } else if (c === CharCodes2.Questionmark) {
1936
+ } else if (c === CharCodes.Questionmark) {
2348
1937
  if (this.xmlMode) {
2349
1938
  this.state = State.InProcessingInstruction;
2350
1939
  this.sequenceIndex = 0;
@@ -2364,7 +1953,7 @@ class Tokenizer {
2364
1953
  this.sequenceIndex = 3;
2365
1954
  this.state = State.SpecialStartSequence;
2366
1955
  }
2367
- } else if (c === CharCodes2.Slash) {
1956
+ } else if (c === CharCodes.Slash) {
2368
1957
  this.state = State.BeforeClosingTagName;
2369
1958
  } else {
2370
1959
  this.state = State.Text;
@@ -2381,11 +1970,11 @@ class Tokenizer {
2381
1970
  }
2382
1971
  stateBeforeClosingTagName(c) {
2383
1972
  if (isWhitespace(c)) {
2384
- if (this.xmlMode) {} else {
1973
+ if (!this.xmlMode) {
2385
1974
  this.state = State.InSpecialComment;
2386
1975
  this.sectionStart = this.index;
2387
1976
  }
2388
- } else if (c === CharCodes2.Gt) {
1977
+ } else if (c === CharCodes.Gt) {
2389
1978
  this.state = State.Text;
2390
1979
  if (!this.xmlMode) {
2391
1980
  this.sectionStart = this.index + 1;
@@ -2404,17 +1993,17 @@ class Tokenizer {
2404
1993
  }
2405
1994
  }
2406
1995
  stateAfterClosingTagName(c) {
2407
- if (c === CharCodes2.Gt || this.fastForwardTo(CharCodes2.Gt)) {
1996
+ if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {
2408
1997
  this.state = State.Text;
2409
1998
  this.sectionStart = this.index + 1;
2410
1999
  }
2411
2000
  }
2412
2001
  stateBeforeAttributeName(c) {
2413
- if (c === CharCodes2.Gt) {
2002
+ if (c === CharCodes.Gt) {
2414
2003
  this.cbs.onopentagend(this.index);
2415
2004
  this.enterTagBody();
2416
2005
  this.sectionStart = this.index + 1;
2417
- } else if (c === CharCodes2.Slash) {
2006
+ } else if (c === CharCodes.Slash) {
2418
2007
  this.state = State.InSelfClosingTag;
2419
2008
  } else if (!isWhitespace(c)) {
2420
2009
  this.state = State.InAttributeName;
@@ -2422,7 +2011,7 @@ class Tokenizer {
2422
2011
  }
2423
2012
  }
2424
2013
  stateInSelfClosingTag(c) {
2425
- if (c === CharCodes2.Gt) {
2014
+ if (c === CharCodes.Gt) {
2426
2015
  this.cbs.onselfclosingtag(this.index);
2427
2016
  this.sectionStart = this.index + 1;
2428
2017
  if (!this.recognizeSelfClosing) {
@@ -2438,7 +2027,7 @@ class Tokenizer {
2438
2027
  }
2439
2028
  }
2440
2029
  stateInAttributeName(c) {
2441
- if (c === CharCodes2.Eq || isEndOfTagSection(c)) {
2030
+ if (c === CharCodes.Eq || isEndOfTagSection(c)) {
2442
2031
  this.cbs.onattribname(this.sectionStart, this.index);
2443
2032
  this.sectionStart = this.index;
2444
2033
  this.state = State.AfterAttributeName;
@@ -2446,9 +2035,9 @@ class Tokenizer {
2446
2035
  }
2447
2036
  }
2448
2037
  stateAfterAttributeName(c) {
2449
- if (c === CharCodes2.Eq) {
2038
+ if (c === CharCodes.Eq) {
2450
2039
  this.state = State.BeforeAttributeValue;
2451
- } else if (c === CharCodes2.Slash || c === CharCodes2.Gt) {
2040
+ } else if (c === CharCodes.Slash || c === CharCodes.Gt) {
2452
2041
  this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);
2453
2042
  this.sectionStart = -1;
2454
2043
  this.state = State.BeforeAttributeName;
@@ -2460,10 +2049,10 @@ class Tokenizer {
2460
2049
  }
2461
2050
  }
2462
2051
  stateBeforeAttributeValue(c) {
2463
- if (c === CharCodes2.DoubleQuote) {
2052
+ if (c === CharCodes.DoubleQuote) {
2464
2053
  this.state = State.InAttributeValueDq;
2465
2054
  this.sectionStart = this.index + 1;
2466
- } else if (c === CharCodes2.SingleQuote) {
2055
+ } else if (c === CharCodes.SingleQuote) {
2467
2056
  this.state = State.InAttributeValueSq;
2468
2057
  this.sectionStart = this.index + 1;
2469
2058
  } else if (!isWhitespace(c)) {
@@ -2473,47 +2062,43 @@ class Tokenizer {
2473
2062
  }
2474
2063
  }
2475
2064
  handleInAttributeValue(c, quote) {
2476
- if (c === quote || !this.decodeEntities && this.fastForwardTo(quote)) {
2065
+ if (c === quote || this.fastForwardTo(quote)) {
2477
2066
  this.cbs.onattribdata(this.sectionStart, this.index);
2478
2067
  this.sectionStart = -1;
2479
- this.cbs.onattribend(quote === CharCodes2.DoubleQuote ? QuoteType.Double : QuoteType.Single, this.index + 1);
2068
+ this.cbs.onattribend(quote === CharCodes.DoubleQuote ? QuoteType.Double : QuoteType.Single, this.index + 1);
2480
2069
  this.state = State.BeforeAttributeName;
2481
- } else if (this.decodeEntities && c === CharCodes2.Amp) {
2482
- this.startEntity();
2483
2070
  }
2484
2071
  }
2485
2072
  stateInAttributeValueDoubleQuotes(c) {
2486
- this.handleInAttributeValue(c, CharCodes2.DoubleQuote);
2073
+ this.handleInAttributeValue(c, CharCodes.DoubleQuote);
2487
2074
  }
2488
2075
  stateInAttributeValueSingleQuotes(c) {
2489
- this.handleInAttributeValue(c, CharCodes2.SingleQuote);
2076
+ this.handleInAttributeValue(c, CharCodes.SingleQuote);
2490
2077
  }
2491
2078
  stateInAttributeValueNoQuotes(c) {
2492
- if (isWhitespace(c) || c === CharCodes2.Gt) {
2079
+ if (isWhitespace(c) || c === CharCodes.Gt) {
2493
2080
  this.cbs.onattribdata(this.sectionStart, this.index);
2494
2081
  this.sectionStart = -1;
2495
2082
  this.cbs.onattribend(QuoteType.Unquoted, this.index);
2496
2083
  this.state = State.BeforeAttributeName;
2497
2084
  this.stateBeforeAttributeName(c);
2498
- } else if (this.decodeEntities && c === CharCodes2.Amp) {
2499
- this.startEntity();
2500
2085
  }
2501
2086
  }
2502
2087
  stateBeforeDeclaration(c) {
2503
- if (c === CharCodes2.OpeningSquareBracket) {
2088
+ if (c === CharCodes.OpeningSquareBracket) {
2504
2089
  this.state = State.CDATASequence;
2505
2090
  this.sequenceIndex = 0;
2506
2091
  } else if (this.xmlMode) {
2507
- this.state = c === CharCodes2.Dash ? State.BeforeComment : State.InDeclaration;
2092
+ this.state = c === CharCodes.Dash ? State.BeforeComment : State.InDeclaration;
2508
2093
  } else if ((c | 32) === Sequences.Doctype[0]) {
2509
2094
  this.state = State.DeclarationSequence;
2510
2095
  this.currentSequence = Sequences.Doctype;
2511
2096
  this.sequenceIndex = 1;
2512
- } else if (c === CharCodes2.Gt) {
2097
+ } else if (c === CharCodes.Gt) {
2513
2098
  this.cbs.oncomment(this.sectionStart, this.index, 0);
2514
2099
  this.state = State.Text;
2515
2100
  this.sectionStart = this.index + 1;
2516
- } else if (c === CharCodes2.Dash) {
2101
+ } else if (c === CharCodes.Dash) {
2517
2102
  this.state = State.BeforeComment;
2518
2103
  } else {
2519
2104
  this.state = State.InSpecialComment;
@@ -2525,7 +2110,7 @@ class Tokenizer {
2525
2110
  this.stateInDeclaration(c);
2526
2111
  } else if ((c | 32) === this.currentSequence[this.sequenceIndex]) {
2527
2112
  this.sequenceIndex += 1;
2528
- } else if (c === CharCodes2.Gt) {
2113
+ } else if (c === CharCodes.Gt) {
2529
2114
  this.cbs.oncomment(this.sectionStart, this.index, 0);
2530
2115
  this.state = State.Text;
2531
2116
  this.sectionStart = this.index + 1;
@@ -2534,33 +2119,33 @@ class Tokenizer {
2534
2119
  }
2535
2120
  }
2536
2121
  stateInDeclaration(c) {
2537
- if (c === CharCodes2.Gt || this.fastForwardTo(CharCodes2.Gt)) {
2122
+ if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {
2538
2123
  this.cbs.ondeclaration(this.sectionStart, this.index);
2539
2124
  this.state = State.Text;
2540
2125
  this.sectionStart = this.index + 1;
2541
2126
  }
2542
2127
  }
2543
2128
  stateInProcessingInstruction(c) {
2544
- if (c === CharCodes2.Questionmark) {
2129
+ if (c === CharCodes.Questionmark) {
2545
2130
  this.sequenceIndex = 1;
2546
- } else if (c === CharCodes2.Gt && this.sequenceIndex === 1) {
2131
+ } else if (c === CharCodes.Gt && this.sequenceIndex === 1) {
2547
2132
  this.cbs.onprocessinginstruction(this.sectionStart, this.index - 1);
2548
2133
  this.sequenceIndex = 0;
2549
2134
  this.state = State.Text;
2550
2135
  this.sectionStart = this.index + 1;
2551
2136
  } else {
2552
- this.sequenceIndex = Number(this.fastForwardTo(CharCodes2.Questionmark));
2137
+ this.sequenceIndex = Number(this.fastForwardTo(CharCodes.Questionmark));
2553
2138
  }
2554
2139
  }
2555
2140
  stateBeforeComment(c) {
2556
- if (c === CharCodes2.Dash) {
2141
+ if (c === CharCodes.Dash) {
2557
2142
  this.state = State.InCommentLike;
2558
2143
  this.currentSequence = Sequences.CommentEnd;
2559
2144
  this.sequenceIndex = 0;
2560
2145
  this.sectionStart = this.index + 1;
2561
2146
  } else if (this.xmlMode) {
2562
2147
  this.state = State.InDeclaration;
2563
- } else if (c === CharCodes2.Gt) {
2148
+ } else if (c === CharCodes.Gt) {
2564
2149
  this.cbs.oncomment(this.sectionStart, this.index, 0);
2565
2150
  this.state = State.Text;
2566
2151
  this.sectionStart = this.index + 1;
@@ -2569,35 +2154,12 @@ class Tokenizer {
2569
2154
  }
2570
2155
  }
2571
2156
  stateInSpecialComment(c) {
2572
- if (c === CharCodes2.Gt || this.fastForwardTo(CharCodes2.Gt)) {
2157
+ if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {
2573
2158
  this.cbs.oncomment(this.sectionStart, this.index, 0);
2574
2159
  this.state = State.Text;
2575
2160
  this.sectionStart = this.index + 1;
2576
2161
  }
2577
2162
  }
2578
- startEntity() {
2579
- this.baseState = this.state;
2580
- this.state = State.InEntity;
2581
- this.entityStart = this.index;
2582
- this.entityDecoder.startEntity(this.xmlMode ? DecodingMode.Strict : this.baseState === State.Text || this.baseState === State.InSpecialTag ? DecodingMode.Legacy : DecodingMode.Attribute);
2583
- }
2584
- stateInEntity() {
2585
- const indexInBuffer = this.index - this.offset;
2586
- const length = this.entityDecoder.write(this.buffer, indexInBuffer);
2587
- if (length >= 0) {
2588
- this.state = this.baseState;
2589
- if (length === 0) {
2590
- this.index -= 1;
2591
- }
2592
- } else {
2593
- if (indexInBuffer < this.buffer.length && this.buffer.charCodeAt(indexInBuffer) === CharCodes2.Amp) {
2594
- this.state = this.baseState;
2595
- this.index -= 1;
2596
- return;
2597
- }
2598
- this.index = this.offset + this.buffer.length - 1;
2599
- }
2600
- }
2601
2163
  cleanup() {
2602
2164
  if (this.running && this.sectionStart !== this.index) {
2603
2165
  if (this.state === State.Text || this.state === State.InPlainText || this.state === State.InSpecialTag && this.sequenceIndex === 0) {
@@ -2616,127 +2178,93 @@ class Tokenizer {
2616
2178
  while (this.shouldContinue()) {
2617
2179
  const c = this.buffer.charCodeAt(this.index - this.offset);
2618
2180
  switch (this.state) {
2619
- case State.Text: {
2181
+ case State.Text:
2620
2182
  this.stateText(c);
2621
2183
  break;
2622
- }
2623
- case State.InPlainText: {
2184
+ case State.InPlainText:
2624
2185
  this.index = this.buffer.length + this.offset - 1;
2625
2186
  break;
2626
- }
2627
- case State.SpecialStartSequence: {
2187
+ case State.SpecialStartSequence:
2628
2188
  this.stateSpecialStartSequence(c);
2629
2189
  break;
2630
- }
2631
- case State.InSpecialTag: {
2190
+ case State.InSpecialTag:
2632
2191
  this.stateInSpecialTag(c);
2633
2192
  break;
2634
- }
2635
- case State.CDATASequence: {
2193
+ case State.CDATASequence:
2636
2194
  this.stateCDATASequence(c);
2637
2195
  break;
2638
- }
2639
- case State.DeclarationSequence: {
2196
+ case State.DeclarationSequence:
2640
2197
  this.stateDeclarationSequence(c);
2641
2198
  break;
2642
- }
2643
- case State.InAttributeValueDq: {
2199
+ case State.InAttributeValueDq:
2644
2200
  this.stateInAttributeValueDoubleQuotes(c);
2645
2201
  break;
2646
- }
2647
- case State.InAttributeName: {
2202
+ case State.InAttributeName:
2648
2203
  this.stateInAttributeName(c);
2649
2204
  break;
2650
- }
2651
- case State.InCommentLike: {
2205
+ case State.InCommentLike:
2652
2206
  this.stateInCommentLike(c);
2653
2207
  break;
2654
- }
2655
- case State.InSpecialComment: {
2208
+ case State.InSpecialComment:
2656
2209
  this.stateInSpecialComment(c);
2657
2210
  break;
2658
- }
2659
- case State.BeforeAttributeName: {
2211
+ case State.BeforeAttributeName:
2660
2212
  this.stateBeforeAttributeName(c);
2661
2213
  break;
2662
- }
2663
- case State.InTagName: {
2214
+ case State.InTagName:
2664
2215
  this.stateInTagName(c);
2665
2216
  break;
2666
- }
2667
- case State.InClosingTagName: {
2217
+ case State.InClosingTagName:
2668
2218
  this.stateInClosingTagName(c);
2669
2219
  break;
2670
- }
2671
- case State.BeforeTagName: {
2220
+ case State.BeforeTagName:
2672
2221
  this.stateBeforeTagName(c);
2673
2222
  break;
2674
- }
2675
- case State.AfterAttributeName: {
2223
+ case State.AfterAttributeName:
2676
2224
  this.stateAfterAttributeName(c);
2677
2225
  break;
2678
- }
2679
- case State.InAttributeValueSq: {
2226
+ case State.InAttributeValueSq:
2680
2227
  this.stateInAttributeValueSingleQuotes(c);
2681
2228
  break;
2682
- }
2683
- case State.BeforeAttributeValue: {
2229
+ case State.BeforeAttributeValue:
2684
2230
  this.stateBeforeAttributeValue(c);
2685
2231
  break;
2686
- }
2687
- case State.BeforeClosingTagName: {
2232
+ case State.BeforeClosingTagName:
2688
2233
  this.stateBeforeClosingTagName(c);
2689
2234
  break;
2690
- }
2691
- case State.AfterClosingTagName: {
2235
+ case State.AfterClosingTagName:
2692
2236
  this.stateAfterClosingTagName(c);
2693
2237
  break;
2694
- }
2695
- case State.InAttributeValueNq: {
2238
+ case State.InAttributeValueNq:
2696
2239
  this.stateInAttributeValueNoQuotes(c);
2697
2240
  break;
2698
- }
2699
- case State.InSelfClosingTag: {
2241
+ case State.InSelfClosingTag:
2700
2242
  this.stateInSelfClosingTag(c);
2701
2243
  break;
2702
- }
2703
- case State.InDeclaration: {
2244
+ case State.InDeclaration:
2704
2245
  this.stateInDeclaration(c);
2705
2246
  break;
2706
- }
2707
- case State.BeforeDeclaration: {
2247
+ case State.BeforeDeclaration:
2708
2248
  this.stateBeforeDeclaration(c);
2709
2249
  break;
2710
- }
2711
- case State.BeforeComment: {
2250
+ case State.BeforeComment:
2712
2251
  this.stateBeforeComment(c);
2713
2252
  break;
2714
- }
2715
- case State.InProcessingInstruction: {
2253
+ case State.InProcessingInstruction:
2716
2254
  this.stateInProcessingInstruction(c);
2717
2255
  break;
2718
- }
2719
- case State.InEntity: {
2720
- this.stateInEntity();
2721
- break;
2722
- }
2723
2256
  }
2724
2257
  this.index++;
2725
2258
  }
2726
2259
  this.cleanup();
2727
2260
  }
2728
2261
  finish() {
2729
- if (this.state === State.InEntity) {
2730
- this.entityDecoder.end();
2731
- this.state = this.baseState;
2732
- }
2733
2262
  this.handleTrailingData();
2734
2263
  this.cbs.onend();
2735
2264
  }
2736
2265
  handleTrailingCommentLikeData(endIndex) {
2737
- if (this.state !== State.InCommentLike) {
2266
+ if (this.state !== State.InCommentLike)
2738
2267
  return false;
2739
- }
2740
2268
  if (this.currentSequence === Sequences.CdataEnd) {
2741
2269
  if (this.xmlMode) {
2742
2270
  if (this.sectionStart < endIndex) {
@@ -2759,35 +2287,29 @@ class Tokenizer {
2759
2287
  case State.BeforeComment:
2760
2288
  case State.CDATASequence:
2761
2289
  case State.DeclarationSequence:
2762
- case State.InDeclaration: {
2290
+ case State.InDeclaration:
2763
2291
  this.cbs.ontext(this.sectionStart, endIndex);
2764
2292
  return true;
2765
- }
2766
- default: {
2293
+ default:
2767
2294
  return false;
2768
- }
2769
2295
  }
2770
2296
  }
2771
2297
  switch (this.state) {
2772
2298
  case State.BeforeDeclaration:
2773
2299
  case State.InSpecialComment:
2774
2300
  case State.BeforeComment:
2775
- case State.CDATASequence: {
2301
+ case State.CDATASequence:
2776
2302
  this.cbs.oncomment(this.sectionStart, endIndex, 0);
2777
2303
  return true;
2778
- }
2779
- case State.DeclarationSequence: {
2304
+ case State.DeclarationSequence:
2780
2305
  if (this.sequenceIndex !== Sequences.Doctype.length) {
2781
2306
  this.cbs.oncomment(this.sectionStart, endIndex, 0);
2782
2307
  }
2783
2308
  return true;
2784
- }
2785
- case State.InDeclaration: {
2309
+ case State.InDeclaration:
2786
2310
  return true;
2787
- }
2788
- default: {
2311
+ default:
2789
2312
  return false;
2790
- }
2791
2313
  }
2792
2314
  }
2793
2315
  handleTrailingData() {
@@ -2795,9 +2317,8 @@ class Tokenizer {
2795
2317
  if (this.handleTrailingCommentLikeData(endIndex) || this.handleTrailingMarkupDeclaration(endIndex)) {
2796
2318
  return;
2797
2319
  }
2798
- if (this.sectionStart >= endIndex) {
2320
+ if (this.sectionStart >= endIndex)
2799
2321
  return;
2800
- }
2801
2322
  switch (this.state) {
2802
2323
  case State.InTagName:
2803
2324
  case State.BeforeAttributeName:
@@ -2807,32 +2328,14 @@ class Tokenizer {
2807
2328
  case State.InAttributeValueSq:
2808
2329
  case State.InAttributeValueDq:
2809
2330
  case State.InAttributeValueNq:
2810
- case State.InClosingTagName: {
2331
+ case State.InClosingTagName:
2811
2332
  break;
2812
- }
2813
- default: {
2333
+ default:
2814
2334
  this.cbs.ontext(this.sectionStart, endIndex);
2815
- }
2816
- }
2817
- }
2818
- emitCodePoint(cp, consumed) {
2819
- if (this.baseState !== State.Text && this.baseState !== State.InSpecialTag) {
2820
- if (this.sectionStart < this.entityStart) {
2821
- this.cbs.onattribdata(this.sectionStart, this.entityStart);
2822
- }
2823
- this.sectionStart = this.entityStart + consumed;
2824
- this.index = this.sectionStart - 1;
2825
- this.cbs.onattribentity(cp);
2826
- } else {
2827
- if (this.sectionStart < this.entityStart) {
2828
- this.cbs.ontext(this.sectionStart, this.entityStart);
2829
- }
2830
- this.sectionStart = this.entityStart + consumed;
2831
- this.index = this.sectionStart - 1;
2832
- this.cbs.ontextentity(cp, this.sectionStart);
2833
2335
  }
2834
2336
  }
2835
2337
  }
2338
+
2836
2339
  // tools/core/htmllinter-tables.js
2837
2340
  var VOID_ELEMENTS = new Set([
2838
2341
  "area",
@@ -2965,8 +2468,11 @@ var DEFAULT_SCOPE_BOUNDARIES = new Set([
2965
2468
  "th",
2966
2469
  "marquee",
2967
2470
  "object",
2471
+ "select",
2968
2472
  "template"
2969
2473
  ]);
2474
+ var MATHML_TEXT_INTEGRATION_POINT_NAMES = new Set(["mi", "mo", "mn", "ms", "mtext"]);
2475
+ var SVG_HTML_INTEGRATION_POINT_NAMES = new Set(["foreignobject", "desc", "title"]);
2970
2476
  var SCOPE_LIST_ITEM = new Set([...DEFAULT_SCOPE_BOUNDARIES, "ol", "ul"]);
2971
2477
  var SCOPE_BUTTON = new Set([...DEFAULT_SCOPE_BOUNDARIES, "button"]);
2972
2478
  var SCOPE_DEFAULT = DEFAULT_SCOPE_BOUNDARIES;
@@ -3071,6 +2577,12 @@ var STANDARD_SVG_CAMEL_ATTRS = new Set([
3071
2577
  "zoomAndPan"
3072
2578
  ]);
3073
2579
  var MATHML_CAMEL_ATTRS = new Set(["definitionURL"]);
2580
+ var SVG_ATTR_LOWERCASE_TO_CAMEL = new Map;
2581
+ for (const camel of STANDARD_SVG_CAMEL_ATTRS)
2582
+ SVG_ATTR_LOWERCASE_TO_CAMEL.set(camel.toLowerCase(), camel);
2583
+ var MATHML_ATTR_LOWERCASE_TO_CAMEL = new Map;
2584
+ for (const camel of MATHML_CAMEL_ATTRS)
2585
+ MATHML_ATTR_LOWERCASE_TO_CAMEL.set(camel.toLowerCase(), camel);
3074
2586
  var FOREIGN_BREAKOUT_TAGS = new Set([
3075
2587
  "b",
3076
2588
  "big",
@@ -3165,7 +2677,6 @@ var SELECT_BREAKOUT_TAGS = new Set(["input", "keygen", "textarea", "select"]);
3165
2677
  var MODES = Object.freeze({
3166
2678
  inBody: "inBody",
3167
2679
  inTable: "inTable",
3168
- inTableText: "inTableText",
3169
2680
  inCaption: "inCaption",
3170
2681
  inColumnGroup: "inColumnGroup",
3171
2682
  inTableBody: "inTableBody",
@@ -3173,8 +2684,7 @@ var MODES = Object.freeze({
3173
2684
  inCell: "inCell",
3174
2685
  inSelect: "inSelect",
3175
2686
  inSelectInTable: "inSelectInTable",
3176
- inTemplate: "inTemplate",
3177
- text: "text"
2687
+ inTemplate: "inTemplate"
3178
2688
  });
3179
2689
  var NS = Object.freeze({
3180
2690
  html: "html",
@@ -3202,6 +2712,8 @@ var FRAGMENT_CONTEXT_MODES = Object.freeze({
3202
2712
  // tools/core/htmllinter.js
3203
2713
  var HTML_TAG_NAME_HAS_UPPERCASE = "HTML_TAG_NAME_HAS_UPPERCASE";
3204
2714
  var HTML_SVG_TAG_WILL_LOWERCASE = "HTML_SVG_TAG_WILL_LOWERCASE";
2715
+ var HTML_SVG_ATTR_WILL_LOWERCASE = "HTML_SVG_ATTR_WILL_LOWERCASE";
2716
+ var HTML_MATHML_ATTR_WILL_LOWERCASE = "HTML_MATHML_ATTR_WILL_LOWERCASE";
3205
2717
  var HTML_TAG_NOT_ALLOWED_IN_PARENT = "HTML_TAG_NOT_ALLOWED_IN_PARENT";
3206
2718
  var HTML_TEXT_NOT_ALLOWED_IN_PARENT = "HTML_TEXT_NOT_ALLOWED_IN_PARENT";
3207
2719
  var HTML_VOID_ELEMENT_HAS_CLOSE_TAG = "HTML_VOID_ELEMENT_HAS_CLOSE_TAG";
@@ -3209,6 +2721,13 @@ var HTML_DUPLICATE_FORM = "HTML_DUPLICATE_FORM";
3209
2721
  var HTML_NESTED_INTERACTIVE = "HTML_NESTED_INTERACTIVE";
3210
2722
  var HTML_MISNESTED_FORMATTING = "HTML_MISNESTED_FORMATTING";
3211
2723
  var HTML_UNEXPECTED_END_TAG = "HTML_UNEXPECTED_END_TAG";
2724
+ var HTML_DUPLICATE_ATTRIBUTE = "HTML_DUPLICATE_ATTRIBUTE";
2725
+ var HTML_ATTRIBUTES_ON_END_TAG = "HTML_ATTRIBUTES_ON_END_TAG";
2726
+ var HTML_SELF_CLOSING_END_TAG = "HTML_SELF_CLOSING_END_TAG";
2727
+ var HTML_MISSING_ATTRIBUTE_VALUE = "HTML_MISSING_ATTRIBUTE_VALUE";
2728
+ var HTML_CDATA_IN_HTML_NAMESPACE = "HTML_CDATA_IN_HTML_NAMESPACE";
2729
+ var HTML_BOGUS_COMMENT = "HTML_BOGUS_COMMENT";
2730
+ var HTML_UNCLOSED_BEFORE_END = "HTML_UNCLOSED_BEFORE_END";
3212
2731
  var LEVEL_ERROR = "error";
3213
2732
  var LEVEL_WARN = "warn";
3214
2733
  var TABLE_SCOPE_TAGS = new Set([
@@ -3223,9 +2742,22 @@ var TABLE_SCOPE_TAGS = new Set([
3223
2742
  "table"
3224
2743
  ]);
3225
2744
  var TABLE_BODY_CELL_TAGS = new Set(["td", "th"]);
2745
+ var IMPLIED_END_TAGS = new Set([
2746
+ "dd",
2747
+ "dt",
2748
+ "li",
2749
+ "optgroup",
2750
+ "option",
2751
+ "p",
2752
+ "rb",
2753
+ "rp",
2754
+ "rt",
2755
+ "rtc"
2756
+ ]);
3226
2757
  function lintHtml(html, onFinding, opts = {}) {
2758
+ const TokenizerClass = opts.TokenizerClass ?? HtmlTokenizer;
3227
2759
  const ctx = new LinterCtx(html, onFinding, opts);
3228
- const tokenizer = new Tokenizer({ xmlMode: false, decodeEntities: false, recognizeSelfClosing: true }, ctx);
2760
+ const tokenizer = new TokenizerClass({ xmlMode: false, decodeEntities: false, recognizeSelfClosing: true }, ctx);
3229
2761
  ctx.tokenizer = tokenizer;
3230
2762
  tokenizer.write(html);
3231
2763
  tokenizer.end();
@@ -3262,30 +2794,75 @@ class LinterCtx {
3262
2794
  this.openElements.push({ name: "select", ns: NS.html, start: -1 });
3263
2795
  }
3264
2796
  this.insertionMode = ctxInfo.mode;
3265
- this.originalInsertionMode = MODES.inBody;
3266
2797
  this.templateInsertionModes = ctxName === "template" ? [MODES.inTemplate] : [];
3267
2798
  this.activeFormatting = [];
3268
- this.formPointer = null;
3269
2799
  this.framesetOk = true;
3270
2800
  this.svgCamelElements = opts.svgCamelElements ?? STANDARD_SVG_CAMEL_ELEMENTS;
3271
- this.transparentTagPrefixes = opts.transparentTagPrefixes ?? [];
2801
+ this.transparentTagPrefixes = (opts.transparentTagPrefixes ?? []).map((p) => p.toLowerCase());
3272
2802
  this.currentTagName = "";
3273
2803
  this.currentTagRawName = "";
3274
2804
  this.currentTagStart = 0;
2805
+ this.currentAttrs = [];
2806
+ this.currentAttr = null;
3275
2807
  this.tokenizer = null;
3276
- this.textRestoreMode = null;
3277
2808
  }
3278
2809
  onopentagname(start, end) {
3279
2810
  const raw = this.html.slice(start, end);
3280
2811
  this.currentTagRawName = raw;
3281
2812
  this.currentTagName = raw.toLowerCase();
3282
2813
  this.currentTagStart = start;
2814
+ this.currentAttrs = [];
2815
+ this.currentAttr = null;
2816
+ }
2817
+ onattribname(start, end) {
2818
+ const rawName = this.html.slice(start, end);
2819
+ this.currentAttr = {
2820
+ name: rawName.toLowerCase(),
2821
+ rawName,
2822
+ nameStart: start,
2823
+ value: null,
2824
+ valueStart: -1,
2825
+ valueEnd: -1,
2826
+ quote: QuoteType.NoValue
2827
+ };
2828
+ }
2829
+ onattribdata(start, end) {
2830
+ if (!this.currentAttr)
2831
+ return;
2832
+ this.currentAttr.valueStart = start;
2833
+ this.currentAttr.valueEnd = end;
2834
+ this.currentAttr.value = this.html.slice(start, end);
2835
+ }
2836
+ onattribend(quote, _end) {
2837
+ const a = this.currentAttr;
2838
+ if (!a)
2839
+ return;
2840
+ a.quote = quote;
2841
+ const dup = this.currentAttrs.find((x) => x.name === a.name);
2842
+ if (dup) {
2843
+ this.report(HTML_DUPLICATE_ATTRIBUTE, LEVEL_WARN, a.nameStart, {
2844
+ name: a.name,
2845
+ firstAt: dup.nameStart
2846
+ });
2847
+ } else {
2848
+ this.currentAttrs.push(a);
2849
+ }
2850
+ if (a.quote === QuoteType.Unquoted && a.value === "") {
2851
+ this.report(HTML_MISSING_ATTRIBUTE_VALUE, LEVEL_WARN, a.nameStart, {
2852
+ name: a.name
2853
+ });
2854
+ }
2855
+ this.currentAttr = null;
3283
2856
  }
3284
- onattribname(_start, _end) {}
3285
- onattribdata(_start, _end) {}
3286
2857
  onattribentity(_cp) {}
3287
- onattribend(_quote, _end) {}
3288
2858
  ontextentity(_cp, _end) {}
2859
+ getAttr(name) {
2860
+ const a = this.currentAttrs.find((x) => x.name === name);
2861
+ return a ? a.value : null;
2862
+ }
2863
+ hasAttr(name) {
2864
+ return this.currentAttrs.some((x) => x.name === name);
2865
+ }
3289
2866
  onopentagend(endIndex) {
3290
2867
  this.handleStartTag(false, endIndex);
3291
2868
  }
@@ -3295,20 +2872,56 @@ class LinterCtx {
3295
2872
  onclosetag(start, end) {
3296
2873
  const raw = this.html.slice(start, end);
3297
2874
  const name = raw.toLowerCase();
2875
+ let i = end;
2876
+ let lastNonWs = -1;
2877
+ while (i < this.html.length) {
2878
+ const c = this.html.charCodeAt(i);
2879
+ if (c === 62)
2880
+ break;
2881
+ if (c !== 32 && c !== 9 && c !== 10 && c !== 13 && c !== 12)
2882
+ lastNonWs = i;
2883
+ i++;
2884
+ }
2885
+ if (lastNonWs >= 0) {
2886
+ if (this.html.charCodeAt(lastNonWs) === 47 && lastNonWs === i - 1) {
2887
+ let firstNonWs = -1;
2888
+ for (let j = end;j < lastNonWs; j++) {
2889
+ const c2 = this.html.charCodeAt(j);
2890
+ if (c2 !== 32 && c2 !== 9 && c2 !== 10 && c2 !== 13 && c2 !== 12) {
2891
+ firstNonWs = j;
2892
+ break;
2893
+ }
2894
+ }
2895
+ if (firstNonWs < 0) {
2896
+ this.report(HTML_SELF_CLOSING_END_TAG, LEVEL_WARN, start, { tag: name });
2897
+ } else {
2898
+ this.report(HTML_ATTRIBUTES_ON_END_TAG, LEVEL_WARN, start, { tag: name });
2899
+ }
2900
+ } else {
2901
+ this.report(HTML_ATTRIBUTES_ON_END_TAG, LEVEL_WARN, start, { tag: name });
2902
+ }
2903
+ }
3298
2904
  this.handleEndTag(name, start);
3299
2905
  }
3300
2906
  ontext(start, end) {
3301
2907
  if (start >= end)
3302
2908
  return;
2909
+ const top = this.currentNode();
2910
+ if (top && top.ns !== NS.html && !this.isIntegrationPoint(top))
2911
+ return;
3303
2912
  this.handleText(start, end);
3304
2913
  }
3305
- oncomment(_start, _end, _endOffset) {}
2914
+ oncomment(start, _end, endOffset) {
2915
+ if (endOffset === 0) {
2916
+ this.report(HTML_BOGUS_COMMENT, LEVEL_WARN, start, {
2917
+ mode: this.insertionMode
2918
+ });
2919
+ }
2920
+ }
3306
2921
  oncdata(start, _end, _endOffset) {
3307
2922
  if (this.currentNamespace() === NS.html) {
3308
- this.report(HTML_TAG_NOT_ALLOWED_IN_PARENT, LEVEL_WARN, start, {
3309
- tag: "[CDATA[",
3310
- mode: this.insertionMode,
3311
- action: "ignored"
2923
+ this.report(HTML_CDATA_IN_HTML_NAMESPACE, LEVEL_WARN, start, {
2924
+ mode: this.insertionMode
3312
2925
  });
3313
2926
  }
3314
2927
  }
@@ -3346,14 +2959,37 @@ class LinterCtx {
3346
2959
  const f = this.openElements[i];
3347
2960
  if (f.name === target && f.ns === NS.html)
3348
2961
  return true;
3349
- if (f.ns === NS.html && scopeSet.has(f.name))
3350
- return false;
3351
- if (f.ns !== NS.html) {
2962
+ if (f.ns === NS.html) {
2963
+ if (scopeSet.has(f.name))
2964
+ return false;
2965
+ } else if (this.isScopeBoundary(f)) {
3352
2966
  return false;
3353
2967
  }
3354
2968
  }
3355
2969
  return false;
3356
2970
  }
2971
+ isScopeBoundary(frame) {
2972
+ if (frame.ns === NS.math) {
2973
+ return MATHML_TEXT_INTEGRATION_POINT_NAMES.has(frame.name) || frame.name === "annotation-xml";
2974
+ }
2975
+ if (frame.ns === NS.svg) {
2976
+ return SVG_HTML_INTEGRATION_POINT_NAMES.has(frame.name);
2977
+ }
2978
+ return false;
2979
+ }
2980
+ isIntegrationPoint(frame) {
2981
+ if (frame.ns === NS.math) {
2982
+ if (MATHML_TEXT_INTEGRATION_POINT_NAMES.has(frame.name))
2983
+ return true;
2984
+ if (frame.name === "annotation-xml" && frame.htmlIntegration)
2985
+ return true;
2986
+ return false;
2987
+ }
2988
+ if (frame.ns === NS.svg) {
2989
+ return SVG_HTML_INTEGRATION_POINT_NAMES.has(frame.name);
2990
+ }
2991
+ return false;
2992
+ }
3357
2993
  hasInDefaultScope(target) {
3358
2994
  return this.hasInScope(target, SCOPE_DEFAULT);
3359
2995
  }
@@ -3424,13 +3060,43 @@ class LinterCtx {
3424
3060
  });
3425
3061
  }
3426
3062
  }
3063
+ const targetNs = ns !== NS.html ? ns : name === "svg" ? NS.svg : name === "math" ? NS.math : NS.html;
3064
+ if (targetNs === NS.svg) {
3065
+ for (const a of this.currentAttrs) {
3066
+ const canonical = SVG_ATTR_LOWERCASE_TO_CAMEL.get(a.name);
3067
+ if (canonical && a.rawName !== canonical) {
3068
+ this.report(HTML_SVG_ATTR_WILL_LOWERCASE, LEVEL_ERROR, a.nameStart, {
3069
+ raw: a.rawName,
3070
+ canonical
3071
+ });
3072
+ }
3073
+ }
3074
+ } else if (targetNs === NS.math) {
3075
+ for (const a of this.currentAttrs) {
3076
+ const canonical = MATHML_ATTR_LOWERCASE_TO_CAMEL.get(a.name);
3077
+ if (canonical && a.rawName !== canonical) {
3078
+ this.report(HTML_MATHML_ATTR_WILL_LOWERCASE, LEVEL_ERROR, a.nameStart, {
3079
+ raw: a.rawName,
3080
+ canonical
3081
+ });
3082
+ }
3083
+ }
3084
+ }
3427
3085
  if (this.isTransparentTag(name))
3428
3086
  return;
3429
- if (ns !== NS.html && !this.shouldBreakoutFromForeign(name)) {
3087
+ const top = this.currentNode();
3088
+ const inForeign = ns !== NS.html && !(top && this.isIntegrationPoint(top));
3089
+ if (inForeign && !this.shouldBreakoutFromForeign(name)) {
3430
3090
  this.startTagInForeign(name, raw, selfClosing, start);
3431
3091
  return;
3432
3092
  }
3433
- if (ns !== NS.html && this.shouldBreakoutFromForeign(name)) {
3093
+ if (inForeign && this.shouldBreakoutFromForeign(name)) {
3094
+ this.report(HTML_TAG_NOT_ALLOWED_IN_PARENT, LEVEL_WARN, start, {
3095
+ tag: raw,
3096
+ parent: this.currentNode()?.name ?? "(root)",
3097
+ mode: this.insertionMode,
3098
+ action: "foreign-breakout"
3099
+ });
3434
3100
  while (this.openElements.length && this.currentNode()?.ns !== NS.html) {
3435
3101
  this.openElements.pop();
3436
3102
  }
@@ -3440,20 +3106,28 @@ class LinterCtx {
3440
3106
  shouldBreakoutFromForeign(name) {
3441
3107
  if (FOREIGN_BREAKOUT_TAGS.has(name))
3442
3108
  return true;
3443
- if (name === "font")
3444
- return true;
3109
+ if (name === "font") {
3110
+ return this.hasAttr("color") || this.hasAttr("face") || this.hasAttr("size");
3111
+ }
3445
3112
  return false;
3446
3113
  }
3447
3114
  startTagInForeign(name, raw, selfClosing, start) {
3448
3115
  const ns = name === "svg" ? NS.svg : name === "math" ? NS.math : this.currentNamespace();
3449
3116
  const top = this.currentNode();
3450
- if (top && top.ns === NS.math && MATHML_TEXT_INTEGRATION_POINTS.has(top.name) && name !== "mglyph" && name !== "malignmark") {
3117
+ if (top && this.isIntegrationPoint(top) && name !== "mglyph" && name !== "malignmark") {
3451
3118
  this.dispatchStartTag(name, raw, selfClosing, start, start + raw.length);
3452
3119
  return;
3453
3120
  }
3454
3121
  if (selfClosing)
3455
3122
  return;
3456
- this.push(raw, ns, start);
3123
+ const frame = { name, ns, start };
3124
+ if (ns === NS.math && name === "annotation-xml") {
3125
+ const enc = (this.getAttr("encoding") ?? "").toLowerCase();
3126
+ if (enc === "text/html" || enc === "application/xhtml+xml") {
3127
+ frame.htmlIntegration = true;
3128
+ }
3129
+ }
3130
+ this.openElements.push(frame);
3457
3131
  }
3458
3132
  dispatchStartTag(name, raw, selfClosing, start, endIndex) {
3459
3133
  switch (this.insertionMode) {
@@ -3463,10 +3137,6 @@ class LinterCtx {
3463
3137
  return this.startInBody(name, raw, selfClosing, start, endIndex);
3464
3138
  case MODES.inTable:
3465
3139
  return this.startInTable(name, raw, selfClosing, start, endIndex);
3466
- case MODES.inTableText:
3467
- this.flushTableText();
3468
- this.insertionMode = this.originalInsertionMode;
3469
- return this.dispatchStartTag(name, raw, selfClosing, start, endIndex);
3470
3140
  case MODES.inCaption:
3471
3141
  return this.startInCaption(name, raw, selfClosing, start, endIndex);
3472
3142
  case MODES.inColumnGroup:
@@ -3481,8 +3151,6 @@ class LinterCtx {
3481
3151
  return this.startInSelect(name, raw, selfClosing, start, endIndex);
3482
3152
  case MODES.inSelectInTable:
3483
3153
  return this.startInSelectInTable(name, raw, selfClosing, start, endIndex);
3484
- case MODES.text:
3485
- return;
3486
3154
  }
3487
3155
  }
3488
3156
  startInBody(name, raw, selfClosing, start, _endIndex) {
@@ -3524,7 +3192,7 @@ class LinterCtx {
3524
3192
  return;
3525
3193
  }
3526
3194
  if (name === "form") {
3527
- if (this.formPointer !== null && !this.openElementsHas("template")) {
3195
+ if (this.openElementsHas("form") && !this.openElementsHas("template")) {
3528
3196
  this.report(HTML_DUPLICATE_FORM, LEVEL_ERROR, start, {
3529
3197
  tag: raw,
3530
3198
  mode: this.insertionMode
@@ -3534,7 +3202,6 @@ class LinterCtx {
3534
3202
  if (this.hasInButtonScope("p"))
3535
3203
  this.implicitlyClose("p", start, raw);
3536
3204
  this.push(raw, NS.html, start);
3537
- this.formPointer = this.currentNode();
3538
3205
  return;
3539
3206
  }
3540
3207
  if (name === "li") {
@@ -3607,7 +3274,7 @@ class LinterCtx {
3607
3274
  return;
3608
3275
  }
3609
3276
  if (name === "a") {
3610
- if (this.openElementsHas("a") || this.activeFormattingHas("a")) {
3277
+ if (this.activeFormattingHas("a")) {
3611
3278
  this.report(HTML_NESTED_INTERACTIVE, LEVEL_WARN, start, {
3612
3279
  tag: raw,
3613
3280
  mode: this.insertionMode
@@ -3624,7 +3291,7 @@ class LinterCtx {
3624
3291
  return;
3625
3292
  }
3626
3293
  if (name === "nobr") {
3627
- if (this.hasInDefaultScope("nobr")) {
3294
+ if (this.activeFormattingHas("nobr")) {
3628
3295
  this.report(HTML_NESTED_INTERACTIVE, LEVEL_WARN, start, {
3629
3296
  tag: raw,
3630
3297
  mode: this.insertionMode
@@ -3708,7 +3375,6 @@ class LinterCtx {
3708
3375
  if (e === null)
3709
3376
  break;
3710
3377
  if (e.name === name) {
3711
- this.activeFormatting.splice(i, 1);
3712
3378
  const idx = this.openElements.indexOf(e);
3713
3379
  if (idx >= 0)
3714
3380
  this.openElements.splice(idx, 1);
@@ -3801,6 +3467,9 @@ class LinterCtx {
3801
3467
  return this.startInBody(name, raw, selfClosing, start, endIndex);
3802
3468
  }
3803
3469
  if (name === "input") {
3470
+ const type = (this.getAttr("type") ?? "").toLowerCase();
3471
+ if (type === "hidden")
3472
+ return;
3804
3473
  this.report(HTML_TAG_NOT_ALLOWED_IN_PARENT, LEVEL_WARN, start, {
3805
3474
  tag: raw,
3806
3475
  parent: "table",
@@ -3836,18 +3505,6 @@ class LinterCtx {
3836
3505
  this.openElements.pop();
3837
3506
  }
3838
3507
  }
3839
- flushTableText() {
3840
- if (!this.pendingTableText)
3841
- return;
3842
- const { hasNonWhitespace, start, snippet } = this.pendingTableText;
3843
- if (hasNonWhitespace) {
3844
- this.report(HTML_TEXT_NOT_ALLOWED_IN_PARENT, LEVEL_ERROR, start, {
3845
- mode: this.originalInsertionMode,
3846
- snippet
3847
- });
3848
- }
3849
- this.pendingTableText = null;
3850
- }
3851
3508
  startInCaption(name, raw, selfClosing, start, endIndex) {
3852
3509
  if (name === "caption" || name === "col" || name === "colgroup" || name === "tbody" || name === "td" || name === "tfoot" || name === "th" || name === "thead" || name === "tr") {
3853
3510
  if (this.hasInTableScope("caption")) {
@@ -4080,14 +3737,24 @@ class LinterCtx {
4080
3737
  return;
4081
3738
  const ns = this.currentNamespace();
4082
3739
  if (ns !== NS.html) {
4083
- for (let i = this.openElements.length - 1;i >= 0; i--) {
4084
- const f = this.openElements[i];
4085
- if (f.ns === NS.html)
3740
+ let stackIdx = this.openElements.length - 1;
3741
+ let first = true;
3742
+ while (stackIdx > 0) {
3743
+ const f = this.openElements[stackIdx];
3744
+ if (!first && f.ns === NS.html)
4086
3745
  break;
4087
- if (f.name.toLowerCase() === name) {
4088
- this.openElements.length = i;
3746
+ if (f.ns !== NS.html && f.name.toLowerCase() === name) {
3747
+ this.openElements.length = stackIdx;
4089
3748
  return;
4090
3749
  }
3750
+ if (first) {
3751
+ this.report(HTML_UNEXPECTED_END_TAG, LEVEL_WARN, start, {
3752
+ tag: name,
3753
+ mode: this.insertionMode
3754
+ });
3755
+ first = false;
3756
+ }
3757
+ stackIdx--;
4091
3758
  }
4092
3759
  }
4093
3760
  if (VOID_ELEMENTS.has(name)) {
@@ -4118,19 +3785,33 @@ class LinterCtx {
4118
3785
  });
4119
3786
  return;
4120
3787
  }
3788
+ const endIsTableStructural = TABLE_SCOPE_TAGS.has(name);
4121
3789
  for (let i = this.openElements.length - 1;i >= 0; i--) {
4122
3790
  const f = this.openElements[i];
4123
3791
  if (f.ns === NS.html && f.name === name) {
3792
+ for (let j = this.openElements.length - 1;j > i; j--) {
3793
+ const popped = this.openElements[j];
3794
+ if (popped.ns === NS.html && popped.name !== name && !IMPLIED_END_TAGS.has(popped.name) && !(endIsTableStructural && TABLE_SCOPE_TAGS.has(popped.name))) {
3795
+ this.report(HTML_UNCLOSED_BEFORE_END, LEVEL_WARN, start, {
3796
+ tag: name,
3797
+ unclosed: popped.name,
3798
+ mode: this.insertionMode
3799
+ });
3800
+ break;
3801
+ }
3802
+ }
4124
3803
  this.openElements.length = i;
4125
- if (name === "form")
4126
- this.formPointer = null;
4127
3804
  if (TABLE_SCOPE_TAGS.has(name) || name === "select" || name === "template") {
4128
3805
  this.resetInsertionModeAppropriately();
4129
3806
  }
4130
3807
  return;
4131
3808
  }
4132
- if (f.ns === NS.html && SPECIAL_ELEMENTS.has(f.name)) {
4133
- break;
3809
+ if (f.ns === NS.html && SPECIAL_ELEMENTS.has(f.name) && !IMPLIED_END_TAGS.has(f.name) && !(endIsTableStructural && TABLE_SCOPE_TAGS.has(f.name))) {
3810
+ this.report(HTML_UNEXPECTED_END_TAG, LEVEL_WARN, start, {
3811
+ tag: name,
3812
+ mode: this.insertionMode
3813
+ });
3814
+ return;
4134
3815
  }
4135
3816
  }
4136
3817
  }
@@ -11358,10 +11039,11 @@ function check(app) {
11358
11039
  for (const Comp of app.comps.byId.values()) {
11359
11040
  const shadowViews = {};
11360
11041
  for (const name in Comp.views) {
11042
+ const rawView = Comp.views[name].rawView;
11361
11043
  const ctx = new LintParseContext;
11362
- ANode.parse(Comp.views[name].rawView, ctx);
11044
+ ANode.parse(rawView, ctx);
11363
11045
  ctx.compile(Comp.scope);
11364
- shadowViews[name] = { name, ctx };
11046
+ shadowViews[name] = { name, ctx, rawView };
11365
11047
  }
11366
11048
  const shadowComp = Object.create(Comp);
11367
11049
  shadowComp.views = shadowViews;