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.
- package/dist/tutuca-cli.js +390 -800
- package/dist/tutuca-dev.js +393 -711
- package/dist/tutuca-dev.min.js +2 -2
- package/package.json +2 -2
package/dist/tutuca-dev.js
CHANGED
|
@@ -1644,428 +1644,77 @@ class ParseCtxClassSetCollector extends ParseContext {
|
|
|
1644
1644
|
}
|
|
1645
1645
|
}
|
|
1646
1646
|
|
|
1647
|
-
//
|
|
1648
|
-
var
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
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
|
-
|
|
1702
|
-
|
|
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 ===
|
|
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 ===
|
|
1707
|
+
return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);
|
|
2058
1708
|
}
|
|
2059
1709
|
function isASCIIAlpha(c) {
|
|
2060
|
-
return c >=
|
|
2061
|
-
}
|
|
2062
|
-
var QuoteType
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
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
|
-
|
|
2078
|
-
|
|
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
|
|
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.
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 !==
|
|
2289
|
-
this.sequenceIndex = Number(c ===
|
|
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.
|
|
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 ===
|
|
1929
|
+
this.sequenceIndex = Number(c === CharCodes.Lt);
|
|
2341
1930
|
}
|
|
2342
1931
|
}
|
|
2343
1932
|
stateBeforeTagName(c) {
|
|
2344
|
-
if (c ===
|
|
1933
|
+
if (c === CharCodes.ExclamationMark) {
|
|
2345
1934
|
this.state = State.BeforeDeclaration;
|
|
2346
1935
|
this.sectionStart = this.index + 1;
|
|
2347
|
-
} else if (c ===
|
|
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 ===
|
|
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) {
|
|
1973
|
+
if (!this.xmlMode) {
|
|
2385
1974
|
this.state = State.InSpecialComment;
|
|
2386
1975
|
this.sectionStart = this.index;
|
|
2387
1976
|
}
|
|
2388
|
-
} else if (c ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
2038
|
+
if (c === CharCodes.Eq) {
|
|
2450
2039
|
this.state = State.BeforeAttributeValue;
|
|
2451
|
-
} else if (c ===
|
|
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 ===
|
|
2052
|
+
if (c === CharCodes.DoubleQuote) {
|
|
2464
2053
|
this.state = State.InAttributeValueDq;
|
|
2465
2054
|
this.sectionStart = this.index + 1;
|
|
2466
|
-
} else if (c ===
|
|
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 ||
|
|
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 ===
|
|
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,
|
|
2073
|
+
this.handleInAttributeValue(c, CharCodes.DoubleQuote);
|
|
2487
2074
|
}
|
|
2488
2075
|
stateInAttributeValueSingleQuotes(c) {
|
|
2489
|
-
this.handleInAttributeValue(c,
|
|
2076
|
+
this.handleInAttributeValue(c, CharCodes.SingleQuote);
|
|
2490
2077
|
}
|
|
2491
2078
|
stateInAttributeValueNoQuotes(c) {
|
|
2492
|
-
if (isWhitespace(c) || c ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
2129
|
+
if (c === CharCodes.Questionmark) {
|
|
2545
2130
|
this.sequenceIndex = 1;
|
|
2546
|
-
} else if (c ===
|
|
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(
|
|
2137
|
+
this.sequenceIndex = Number(this.fastForwardTo(CharCodes.Questionmark));
|
|
2553
2138
|
}
|
|
2554
2139
|
}
|
|
2555
2140
|
stateBeforeComment(c) {
|
|
2556
|
-
if (c ===
|
|
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 ===
|
|
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 ===
|
|
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
|
|
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(
|
|
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(
|
|
3309
|
-
|
|
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
|
|
3350
|
-
|
|
3351
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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 &&
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
4084
|
-
|
|
4085
|
-
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
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;
|