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-cli.js
CHANGED
|
@@ -2066,405 +2066,37 @@ var init_components = __esm(() => {
|
|
|
2066
2066
|
init_attribute();
|
|
2067
2067
|
});
|
|
2068
2068
|
|
|
2069
|
-
//
|
|
2070
|
-
function replaceCodePoint(codePoint) {
|
|
2071
|
-
if (codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111) {
|
|
2072
|
-
return 65533;
|
|
2073
|
-
}
|
|
2074
|
-
return decodeMap.get(codePoint) ?? codePoint;
|
|
2075
|
-
}
|
|
2076
|
-
var decodeMap;
|
|
2077
|
-
var init_decode_codepoint = __esm(() => {
|
|
2078
|
-
decodeMap = new Map([
|
|
2079
|
-
[0, 65533],
|
|
2080
|
-
[128, 8364],
|
|
2081
|
-
[130, 8218],
|
|
2082
|
-
[131, 402],
|
|
2083
|
-
[132, 8222],
|
|
2084
|
-
[133, 8230],
|
|
2085
|
-
[134, 8224],
|
|
2086
|
-
[135, 8225],
|
|
2087
|
-
[136, 710],
|
|
2088
|
-
[137, 8240],
|
|
2089
|
-
[138, 352],
|
|
2090
|
-
[139, 8249],
|
|
2091
|
-
[140, 338],
|
|
2092
|
-
[142, 381],
|
|
2093
|
-
[145, 8216],
|
|
2094
|
-
[146, 8217],
|
|
2095
|
-
[147, 8220],
|
|
2096
|
-
[148, 8221],
|
|
2097
|
-
[149, 8226],
|
|
2098
|
-
[150, 8211],
|
|
2099
|
-
[151, 8212],
|
|
2100
|
-
[152, 732],
|
|
2101
|
-
[153, 8482],
|
|
2102
|
-
[154, 353],
|
|
2103
|
-
[155, 8250],
|
|
2104
|
-
[156, 339],
|
|
2105
|
-
[158, 382],
|
|
2106
|
-
[159, 376]
|
|
2107
|
-
]);
|
|
2108
|
-
});
|
|
2109
|
-
|
|
2110
|
-
// node_modules/entities/dist/internal/decode-shared.js
|
|
2111
|
-
function decodeBase64(input) {
|
|
2112
|
-
const binary = atob(input);
|
|
2113
|
-
const evenLength = binary.length & ~1;
|
|
2114
|
-
const out = new Uint16Array(evenLength / 2);
|
|
2115
|
-
for (let index = 0, outIndex = 0;index < evenLength; index += 2) {
|
|
2116
|
-
const lo = binary.charCodeAt(index);
|
|
2117
|
-
const hi = binary.charCodeAt(index + 1);
|
|
2118
|
-
out[outIndex++] = lo | hi << 8;
|
|
2119
|
-
}
|
|
2120
|
-
return out;
|
|
2121
|
-
}
|
|
2122
|
-
|
|
2123
|
-
// node_modules/entities/dist/generated/decode-data-html.js
|
|
2124
|
-
var htmlDecodeTree;
|
|
2125
|
-
var init_decode_data_html = __esm(() => {
|
|
2126
|
-
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");
|
|
2127
|
-
});
|
|
2128
|
-
|
|
2129
|
-
// node_modules/entities/dist/generated/decode-data-xml.js
|
|
2130
|
-
var xmlDecodeTree;
|
|
2131
|
-
var init_decode_data_xml = __esm(() => {
|
|
2132
|
-
xmlDecodeTree = /* @__PURE__ */ decodeBase64("AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg");
|
|
2133
|
-
});
|
|
2134
|
-
|
|
2135
|
-
// node_modules/entities/dist/internal/bin-trie-flags.js
|
|
2136
|
-
var BinTrieFlags;
|
|
2137
|
-
var init_bin_trie_flags = __esm(() => {
|
|
2138
|
-
(function(BinTrieFlags2) {
|
|
2139
|
-
BinTrieFlags2[BinTrieFlags2["VALUE_LENGTH"] = 49152] = "VALUE_LENGTH";
|
|
2140
|
-
BinTrieFlags2[BinTrieFlags2["FLAG13"] = 8192] = "FLAG13";
|
|
2141
|
-
BinTrieFlags2[BinTrieFlags2["BRANCH_LENGTH"] = 8064] = "BRANCH_LENGTH";
|
|
2142
|
-
BinTrieFlags2[BinTrieFlags2["JUMP_TABLE"] = 127] = "JUMP_TABLE";
|
|
2143
|
-
})(BinTrieFlags || (BinTrieFlags = {}));
|
|
2144
|
-
});
|
|
2145
|
-
|
|
2146
|
-
// node_modules/entities/dist/decode.js
|
|
2147
|
-
function isNumber(code) {
|
|
2148
|
-
return code >= CharCodes.ZERO && code <= CharCodes.NINE;
|
|
2149
|
-
}
|
|
2150
|
-
function isHexadecimalCharacter(code) {
|
|
2151
|
-
return code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F || code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F;
|
|
2152
|
-
}
|
|
2153
|
-
function isAsciiAlphaNumeric(code) {
|
|
2154
|
-
return code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z || code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z || isNumber(code);
|
|
2155
|
-
}
|
|
2156
|
-
function isEntityInAttributeInvalidEnd(code) {
|
|
2157
|
-
return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);
|
|
2158
|
-
}
|
|
2159
|
-
|
|
2160
|
-
class EntityDecoder {
|
|
2161
|
-
decodeTree;
|
|
2162
|
-
emitCodePoint;
|
|
2163
|
-
errors;
|
|
2164
|
-
constructor(decodeTree, emitCodePoint, errors) {
|
|
2165
|
-
this.decodeTree = decodeTree;
|
|
2166
|
-
this.emitCodePoint = emitCodePoint;
|
|
2167
|
-
this.errors = errors;
|
|
2168
|
-
}
|
|
2169
|
-
state = EntityDecoderState.EntityStart;
|
|
2170
|
-
consumed = 1;
|
|
2171
|
-
result = 0;
|
|
2172
|
-
treeIndex = 0;
|
|
2173
|
-
excess = 1;
|
|
2174
|
-
decodeMode = DecodingMode.Strict;
|
|
2175
|
-
runConsumed = 0;
|
|
2176
|
-
startEntity(decodeMode) {
|
|
2177
|
-
this.decodeMode = decodeMode;
|
|
2178
|
-
this.state = EntityDecoderState.EntityStart;
|
|
2179
|
-
this.result = 0;
|
|
2180
|
-
this.treeIndex = 0;
|
|
2181
|
-
this.excess = 1;
|
|
2182
|
-
this.consumed = 1;
|
|
2183
|
-
this.runConsumed = 0;
|
|
2184
|
-
}
|
|
2185
|
-
write(input, offset) {
|
|
2186
|
-
switch (this.state) {
|
|
2187
|
-
case EntityDecoderState.EntityStart: {
|
|
2188
|
-
if (input.charCodeAt(offset) === CharCodes.NUM) {
|
|
2189
|
-
this.state = EntityDecoderState.NumericStart;
|
|
2190
|
-
this.consumed += 1;
|
|
2191
|
-
return this.stateNumericStart(input, offset + 1);
|
|
2192
|
-
}
|
|
2193
|
-
this.state = EntityDecoderState.NamedEntity;
|
|
2194
|
-
return this.stateNamedEntity(input, offset);
|
|
2195
|
-
}
|
|
2196
|
-
case EntityDecoderState.NumericStart: {
|
|
2197
|
-
return this.stateNumericStart(input, offset);
|
|
2198
|
-
}
|
|
2199
|
-
case EntityDecoderState.NumericDecimal: {
|
|
2200
|
-
return this.stateNumericDecimal(input, offset);
|
|
2201
|
-
}
|
|
2202
|
-
case EntityDecoderState.NumericHex: {
|
|
2203
|
-
return this.stateNumericHex(input, offset);
|
|
2204
|
-
}
|
|
2205
|
-
case EntityDecoderState.NamedEntity: {
|
|
2206
|
-
return this.stateNamedEntity(input, offset);
|
|
2207
|
-
}
|
|
2208
|
-
}
|
|
2209
|
-
}
|
|
2210
|
-
stateNumericStart(input, offset) {
|
|
2211
|
-
if (offset >= input.length) {
|
|
2212
|
-
return -1;
|
|
2213
|
-
}
|
|
2214
|
-
if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {
|
|
2215
|
-
this.state = EntityDecoderState.NumericHex;
|
|
2216
|
-
this.consumed += 1;
|
|
2217
|
-
return this.stateNumericHex(input, offset + 1);
|
|
2218
|
-
}
|
|
2219
|
-
this.state = EntityDecoderState.NumericDecimal;
|
|
2220
|
-
return this.stateNumericDecimal(input, offset);
|
|
2221
|
-
}
|
|
2222
|
-
stateNumericHex(input, offset) {
|
|
2223
|
-
while (offset < input.length) {
|
|
2224
|
-
const char = input.charCodeAt(offset);
|
|
2225
|
-
if (isNumber(char) || isHexadecimalCharacter(char)) {
|
|
2226
|
-
const digit = char <= CharCodes.NINE ? char - CharCodes.ZERO : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;
|
|
2227
|
-
this.result = this.result * 16 + digit;
|
|
2228
|
-
this.consumed++;
|
|
2229
|
-
offset++;
|
|
2230
|
-
} else {
|
|
2231
|
-
return this.emitNumericEntity(char, 3);
|
|
2232
|
-
}
|
|
2233
|
-
}
|
|
2234
|
-
return -1;
|
|
2235
|
-
}
|
|
2236
|
-
stateNumericDecimal(input, offset) {
|
|
2237
|
-
while (offset < input.length) {
|
|
2238
|
-
const char = input.charCodeAt(offset);
|
|
2239
|
-
if (isNumber(char)) {
|
|
2240
|
-
this.result = this.result * 10 + (char - CharCodes.ZERO);
|
|
2241
|
-
this.consumed++;
|
|
2242
|
-
offset++;
|
|
2243
|
-
} else {
|
|
2244
|
-
return this.emitNumericEntity(char, 2);
|
|
2245
|
-
}
|
|
2246
|
-
}
|
|
2247
|
-
return -1;
|
|
2248
|
-
}
|
|
2249
|
-
emitNumericEntity(lastCp, expectedLength) {
|
|
2250
|
-
if (this.consumed <= expectedLength) {
|
|
2251
|
-
this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);
|
|
2252
|
-
return 0;
|
|
2253
|
-
}
|
|
2254
|
-
if (lastCp === CharCodes.SEMI) {
|
|
2255
|
-
this.consumed += 1;
|
|
2256
|
-
} else if (this.decodeMode === DecodingMode.Strict) {
|
|
2257
|
-
return 0;
|
|
2258
|
-
}
|
|
2259
|
-
this.emitCodePoint(replaceCodePoint(this.result), this.consumed);
|
|
2260
|
-
if (this.errors) {
|
|
2261
|
-
if (lastCp !== CharCodes.SEMI) {
|
|
2262
|
-
this.errors.missingSemicolonAfterCharacterReference();
|
|
2263
|
-
}
|
|
2264
|
-
this.errors.validateNumericCharacterReference(this.result);
|
|
2265
|
-
}
|
|
2266
|
-
return this.consumed;
|
|
2267
|
-
}
|
|
2268
|
-
stateNamedEntity(input, offset) {
|
|
2269
|
-
const { decodeTree } = this;
|
|
2270
|
-
let current = decodeTree[this.treeIndex];
|
|
2271
|
-
let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
|
|
2272
|
-
while (offset < input.length) {
|
|
2273
|
-
if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {
|
|
2274
|
-
const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
|
|
2275
|
-
if (this.runConsumed === 0) {
|
|
2276
|
-
const firstChar = current & BinTrieFlags.JUMP_TABLE;
|
|
2277
|
-
if (input.charCodeAt(offset) !== firstChar) {
|
|
2278
|
-
return this.result === 0 ? 0 : this.emitNotTerminatedNamedEntity();
|
|
2279
|
-
}
|
|
2280
|
-
offset++;
|
|
2281
|
-
this.excess++;
|
|
2282
|
-
this.runConsumed++;
|
|
2283
|
-
}
|
|
2284
|
-
while (this.runConsumed < runLength) {
|
|
2285
|
-
if (offset >= input.length) {
|
|
2286
|
-
return -1;
|
|
2287
|
-
}
|
|
2288
|
-
const charIndexInPacked = this.runConsumed - 1;
|
|
2289
|
-
const packedWord = decodeTree[this.treeIndex + 1 + (charIndexInPacked >> 1)];
|
|
2290
|
-
const expectedChar = charIndexInPacked % 2 === 0 ? packedWord & 255 : packedWord >> 8 & 255;
|
|
2291
|
-
if (input.charCodeAt(offset) !== expectedChar) {
|
|
2292
|
-
this.runConsumed = 0;
|
|
2293
|
-
return this.result === 0 ? 0 : this.emitNotTerminatedNamedEntity();
|
|
2294
|
-
}
|
|
2295
|
-
offset++;
|
|
2296
|
-
this.excess++;
|
|
2297
|
-
this.runConsumed++;
|
|
2298
|
-
}
|
|
2299
|
-
this.runConsumed = 0;
|
|
2300
|
-
this.treeIndex += 1 + (runLength >> 1);
|
|
2301
|
-
current = decodeTree[this.treeIndex];
|
|
2302
|
-
valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
|
|
2303
|
-
}
|
|
2304
|
-
if (offset >= input.length)
|
|
2305
|
-
break;
|
|
2306
|
-
const char = input.charCodeAt(offset);
|
|
2307
|
-
if (char === CharCodes.SEMI && valueLength !== 0 && (current & BinTrieFlags.FLAG13) !== 0) {
|
|
2308
|
-
return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);
|
|
2309
|
-
}
|
|
2310
|
-
this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);
|
|
2311
|
-
if (this.treeIndex < 0) {
|
|
2312
|
-
return this.result === 0 || this.decodeMode === DecodingMode.Attribute && (valueLength === 0 || isEntityInAttributeInvalidEnd(char)) ? 0 : this.emitNotTerminatedNamedEntity();
|
|
2313
|
-
}
|
|
2314
|
-
current = decodeTree[this.treeIndex];
|
|
2315
|
-
valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
|
|
2316
|
-
if (valueLength !== 0) {
|
|
2317
|
-
if (char === CharCodes.SEMI) {
|
|
2318
|
-
return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);
|
|
2319
|
-
}
|
|
2320
|
-
if (this.decodeMode !== DecodingMode.Strict && (current & BinTrieFlags.FLAG13) === 0) {
|
|
2321
|
-
this.result = this.treeIndex;
|
|
2322
|
-
this.consumed += this.excess;
|
|
2323
|
-
this.excess = 0;
|
|
2324
|
-
}
|
|
2325
|
-
}
|
|
2326
|
-
offset++;
|
|
2327
|
-
this.excess++;
|
|
2328
|
-
}
|
|
2329
|
-
return -1;
|
|
2330
|
-
}
|
|
2331
|
-
emitNotTerminatedNamedEntity() {
|
|
2332
|
-
const { result, decodeTree } = this;
|
|
2333
|
-
const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;
|
|
2334
|
-
this.emitNamedEntityData(result, valueLength, this.consumed);
|
|
2335
|
-
this.errors?.missingSemicolonAfterCharacterReference();
|
|
2336
|
-
return this.consumed;
|
|
2337
|
-
}
|
|
2338
|
-
emitNamedEntityData(result, valueLength, consumed) {
|
|
2339
|
-
const { decodeTree } = this;
|
|
2340
|
-
this.emitCodePoint(valueLength === 1 ? decodeTree[result] & ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13) : decodeTree[result + 1], consumed);
|
|
2341
|
-
if (valueLength === 3) {
|
|
2342
|
-
this.emitCodePoint(decodeTree[result + 2], consumed);
|
|
2343
|
-
}
|
|
2344
|
-
return consumed;
|
|
2345
|
-
}
|
|
2346
|
-
end() {
|
|
2347
|
-
switch (this.state) {
|
|
2348
|
-
case EntityDecoderState.NamedEntity: {
|
|
2349
|
-
return this.result !== 0 && (this.decodeMode !== DecodingMode.Attribute || this.result === this.treeIndex) ? this.emitNotTerminatedNamedEntity() : 0;
|
|
2350
|
-
}
|
|
2351
|
-
case EntityDecoderState.NumericDecimal: {
|
|
2352
|
-
return this.emitNumericEntity(0, 2);
|
|
2353
|
-
}
|
|
2354
|
-
case EntityDecoderState.NumericHex: {
|
|
2355
|
-
return this.emitNumericEntity(0, 3);
|
|
2356
|
-
}
|
|
2357
|
-
case EntityDecoderState.NumericStart: {
|
|
2358
|
-
this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);
|
|
2359
|
-
return 0;
|
|
2360
|
-
}
|
|
2361
|
-
case EntityDecoderState.EntityStart: {
|
|
2362
|
-
return 0;
|
|
2363
|
-
}
|
|
2364
|
-
}
|
|
2365
|
-
}
|
|
2366
|
-
}
|
|
2367
|
-
function determineBranch(decodeTree, current, nodeIndex, char) {
|
|
2368
|
-
const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
|
|
2369
|
-
const jumpOffset = current & BinTrieFlags.JUMP_TABLE;
|
|
2370
|
-
if (branchCount === 0) {
|
|
2371
|
-
return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;
|
|
2372
|
-
}
|
|
2373
|
-
if (jumpOffset) {
|
|
2374
|
-
const value = char - jumpOffset;
|
|
2375
|
-
return value < 0 || value >= branchCount ? -1 : decodeTree[nodeIndex + value] - 1;
|
|
2376
|
-
}
|
|
2377
|
-
const packedKeySlots = branchCount + 1 >> 1;
|
|
2378
|
-
let lo = 0;
|
|
2379
|
-
let hi = branchCount - 1;
|
|
2380
|
-
while (lo <= hi) {
|
|
2381
|
-
const mid = lo + hi >>> 1;
|
|
2382
|
-
const slot = mid >> 1;
|
|
2383
|
-
const packed = decodeTree[nodeIndex + slot];
|
|
2384
|
-
const midKey = packed >> (mid & 1) * 8 & 255;
|
|
2385
|
-
if (midKey < char) {
|
|
2386
|
-
lo = mid + 1;
|
|
2387
|
-
} else if (midKey > char) {
|
|
2388
|
-
hi = mid - 1;
|
|
2389
|
-
} else {
|
|
2390
|
-
return decodeTree[nodeIndex + packedKeySlots + mid];
|
|
2391
|
-
}
|
|
2392
|
-
}
|
|
2393
|
-
return -1;
|
|
2394
|
-
}
|
|
2395
|
-
var CharCodes, TO_LOWER_BIT = 32, EntityDecoderState, DecodingMode;
|
|
2396
|
-
var init_decode = __esm(() => {
|
|
2397
|
-
init_decode_codepoint();
|
|
2398
|
-
init_bin_trie_flags();
|
|
2399
|
-
init_decode_data_html();
|
|
2400
|
-
init_decode_data_xml();
|
|
2401
|
-
(function(CharCodes2) {
|
|
2402
|
-
CharCodes2[CharCodes2["NUM"] = 35] = "NUM";
|
|
2403
|
-
CharCodes2[CharCodes2["SEMI"] = 59] = "SEMI";
|
|
2404
|
-
CharCodes2[CharCodes2["EQUALS"] = 61] = "EQUALS";
|
|
2405
|
-
CharCodes2[CharCodes2["ZERO"] = 48] = "ZERO";
|
|
2406
|
-
CharCodes2[CharCodes2["NINE"] = 57] = "NINE";
|
|
2407
|
-
CharCodes2[CharCodes2["LOWER_A"] = 97] = "LOWER_A";
|
|
2408
|
-
CharCodes2[CharCodes2["LOWER_F"] = 102] = "LOWER_F";
|
|
2409
|
-
CharCodes2[CharCodes2["LOWER_X"] = 120] = "LOWER_X";
|
|
2410
|
-
CharCodes2[CharCodes2["LOWER_Z"] = 122] = "LOWER_Z";
|
|
2411
|
-
CharCodes2[CharCodes2["UPPER_A"] = 65] = "UPPER_A";
|
|
2412
|
-
CharCodes2[CharCodes2["UPPER_F"] = 70] = "UPPER_F";
|
|
2413
|
-
CharCodes2[CharCodes2["UPPER_Z"] = 90] = "UPPER_Z";
|
|
2414
|
-
})(CharCodes || (CharCodes = {}));
|
|
2415
|
-
(function(EntityDecoderState2) {
|
|
2416
|
-
EntityDecoderState2[EntityDecoderState2["EntityStart"] = 0] = "EntityStart";
|
|
2417
|
-
EntityDecoderState2[EntityDecoderState2["NumericStart"] = 1] = "NumericStart";
|
|
2418
|
-
EntityDecoderState2[EntityDecoderState2["NumericDecimal"] = 2] = "NumericDecimal";
|
|
2419
|
-
EntityDecoderState2[EntityDecoderState2["NumericHex"] = 3] = "NumericHex";
|
|
2420
|
-
EntityDecoderState2[EntityDecoderState2["NamedEntity"] = 4] = "NamedEntity";
|
|
2421
|
-
})(EntityDecoderState || (EntityDecoderState = {}));
|
|
2422
|
-
(function(DecodingMode2) {
|
|
2423
|
-
DecodingMode2[DecodingMode2["Legacy"] = 0] = "Legacy";
|
|
2424
|
-
DecodingMode2[DecodingMode2["Strict"] = 1] = "Strict";
|
|
2425
|
-
DecodingMode2[DecodingMode2["Attribute"] = 2] = "Attribute";
|
|
2426
|
-
})(DecodingMode || (DecodingMode = {}));
|
|
2427
|
-
});
|
|
2428
|
-
|
|
2429
|
-
// node_modules/htmlparser2/dist/Tokenizer.js
|
|
2069
|
+
// tools/core/html-tokenizer.js
|
|
2430
2070
|
function isWhitespace(c) {
|
|
2431
|
-
return c ===
|
|
2071
|
+
return c === CharCodes.Space || c === CharCodes.NewLine || c === CharCodes.Tab || c === CharCodes.FormFeed || c === CharCodes.CarriageReturn;
|
|
2432
2072
|
}
|
|
2433
2073
|
function isEndOfTagSection(c) {
|
|
2434
|
-
return c ===
|
|
2074
|
+
return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);
|
|
2435
2075
|
}
|
|
2436
2076
|
function isASCIIAlpha(c) {
|
|
2437
|
-
return c >=
|
|
2077
|
+
return c >= CharCodes.LowerA && c <= CharCodes.LowerZ || c >= CharCodes.UpperA && c <= CharCodes.UpperZ;
|
|
2438
2078
|
}
|
|
2439
2079
|
|
|
2440
|
-
class
|
|
2441
|
-
cbs
|
|
2442
|
-
state = State.Text;
|
|
2443
|
-
buffer = "";
|
|
2444
|
-
sectionStart = 0;
|
|
2445
|
-
index = 0;
|
|
2446
|
-
entityStart = 0;
|
|
2447
|
-
baseState = State.Text;
|
|
2448
|
-
isSpecial = false;
|
|
2449
|
-
running = true;
|
|
2450
|
-
offset = 0;
|
|
2451
|
-
xmlMode;
|
|
2452
|
-
decodeEntities;
|
|
2453
|
-
recognizeSelfClosing;
|
|
2454
|
-
entityDecoder;
|
|
2455
|
-
constructor({ xmlMode = false, decodeEntities = true, recognizeSelfClosing = xmlMode }, cbs) {
|
|
2080
|
+
class HtmlTokenizer {
|
|
2081
|
+
constructor({ xmlMode = false, recognizeSelfClosing = xmlMode } = {}, cbs) {
|
|
2456
2082
|
this.cbs = cbs;
|
|
2457
2083
|
this.xmlMode = xmlMode;
|
|
2458
|
-
this.decodeEntities = decodeEntities;
|
|
2459
2084
|
this.recognizeSelfClosing = recognizeSelfClosing;
|
|
2460
|
-
this.
|
|
2085
|
+
this.state = State.Text;
|
|
2086
|
+
this.buffer = "";
|
|
2087
|
+
this.sectionStart = 0;
|
|
2088
|
+
this.index = 0;
|
|
2089
|
+
this.isSpecial = false;
|
|
2090
|
+
this.running = true;
|
|
2091
|
+
this.offset = 0;
|
|
2092
|
+
this.currentSequence = Sequences.Empty;
|
|
2093
|
+
this.sequenceIndex = 0;
|
|
2461
2094
|
}
|
|
2462
2095
|
reset() {
|
|
2463
2096
|
this.state = State.Text;
|
|
2464
2097
|
this.buffer = "";
|
|
2465
2098
|
this.sectionStart = 0;
|
|
2466
2099
|
this.index = 0;
|
|
2467
|
-
this.baseState = State.Text;
|
|
2468
2100
|
this.isSpecial = false;
|
|
2469
2101
|
this.currentSequence = Sequences.Empty;
|
|
2470
2102
|
this.sequenceIndex = 0;
|
|
@@ -2490,18 +2122,14 @@ class Tokenizer {
|
|
|
2490
2122
|
}
|
|
2491
2123
|
}
|
|
2492
2124
|
stateText(c) {
|
|
2493
|
-
if (c ===
|
|
2125
|
+
if (c === CharCodes.Lt || this.fastForwardTo(CharCodes.Lt)) {
|
|
2494
2126
|
if (this.index > this.sectionStart) {
|
|
2495
2127
|
this.cbs.ontext(this.sectionStart, this.index);
|
|
2496
2128
|
}
|
|
2497
2129
|
this.state = State.BeforeTagName;
|
|
2498
2130
|
this.sectionStart = this.index;
|
|
2499
|
-
} else if (this.decodeEntities && c === CharCodes2.Amp) {
|
|
2500
|
-
this.startEntity();
|
|
2501
2131
|
}
|
|
2502
2132
|
}
|
|
2503
|
-
currentSequence = Sequences.Empty;
|
|
2504
|
-
sequenceIndex = 0;
|
|
2505
2133
|
enterTagBody() {
|
|
2506
2134
|
if (this.currentSequence === Sequences.Plaintext) {
|
|
2507
2135
|
this.currentSequence = Sequences.Empty;
|
|
@@ -2583,12 +2211,12 @@ class Tokenizer {
|
|
|
2583
2211
|
this.state = State.Text;
|
|
2584
2212
|
}
|
|
2585
2213
|
stateInCommentLike(c) {
|
|
2586
|
-
if (!this.xmlMode && this.currentSequence === Sequences.CommentEnd && this.sequenceIndex <= 1 && this.index === this.sectionStart + this.sequenceIndex && c ===
|
|
2214
|
+
if (!this.xmlMode && this.currentSequence === Sequences.CommentEnd && this.sequenceIndex <= 1 && this.index === this.sectionStart + this.sequenceIndex && c === CharCodes.Gt) {
|
|
2587
2215
|
this.emitComment(this.sequenceIndex);
|
|
2588
|
-
} else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === 2 && c ===
|
|
2216
|
+
} else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === 2 && c === CharCodes.Gt) {
|
|
2589
2217
|
this.emitComment(2);
|
|
2590
|
-
} else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === this.currentSequence.length - 1 && c !==
|
|
2591
|
-
this.sequenceIndex = Number(c ===
|
|
2218
|
+
} else if (this.currentSequence === Sequences.CommentEnd && this.sequenceIndex === this.currentSequence.length - 1 && c !== CharCodes.Gt) {
|
|
2219
|
+
this.sequenceIndex = Number(c === CharCodes.Dash);
|
|
2592
2220
|
} else if (c === this.currentSequence[this.sequenceIndex]) {
|
|
2593
2221
|
if (++this.sequenceIndex === this.currentSequence.length) {
|
|
2594
2222
|
if (this.currentSequence === Sequences.CdataEnd) {
|
|
@@ -2631,22 +2259,18 @@ class Tokenizer {
|
|
|
2631
2259
|
if ((c | 32) === this.currentSequence[this.sequenceIndex]) {
|
|
2632
2260
|
this.sequenceIndex += 1;
|
|
2633
2261
|
} else if (this.sequenceIndex === 0) {
|
|
2634
|
-
if (this.
|
|
2635
|
-
if (this.decodeEntities && c === CharCodes2.Amp) {
|
|
2636
|
-
this.startEntity();
|
|
2637
|
-
}
|
|
2638
|
-
} else if (this.fastForwardTo(CharCodes2.Lt)) {
|
|
2262
|
+
if (this.fastForwardTo(CharCodes.Lt)) {
|
|
2639
2263
|
this.sequenceIndex = 1;
|
|
2640
2264
|
}
|
|
2641
2265
|
} else {
|
|
2642
|
-
this.sequenceIndex = Number(c ===
|
|
2266
|
+
this.sequenceIndex = Number(c === CharCodes.Lt);
|
|
2643
2267
|
}
|
|
2644
2268
|
}
|
|
2645
2269
|
stateBeforeTagName(c) {
|
|
2646
|
-
if (c ===
|
|
2270
|
+
if (c === CharCodes.ExclamationMark) {
|
|
2647
2271
|
this.state = State.BeforeDeclaration;
|
|
2648
2272
|
this.sectionStart = this.index + 1;
|
|
2649
|
-
} else if (c ===
|
|
2273
|
+
} else if (c === CharCodes.Questionmark) {
|
|
2650
2274
|
if (this.xmlMode) {
|
|
2651
2275
|
this.state = State.InProcessingInstruction;
|
|
2652
2276
|
this.sequenceIndex = 0;
|
|
@@ -2666,7 +2290,7 @@ class Tokenizer {
|
|
|
2666
2290
|
this.sequenceIndex = 3;
|
|
2667
2291
|
this.state = State.SpecialStartSequence;
|
|
2668
2292
|
}
|
|
2669
|
-
} else if (c ===
|
|
2293
|
+
} else if (c === CharCodes.Slash) {
|
|
2670
2294
|
this.state = State.BeforeClosingTagName;
|
|
2671
2295
|
} else {
|
|
2672
2296
|
this.state = State.Text;
|
|
@@ -2683,11 +2307,11 @@ class Tokenizer {
|
|
|
2683
2307
|
}
|
|
2684
2308
|
stateBeforeClosingTagName(c) {
|
|
2685
2309
|
if (isWhitespace(c)) {
|
|
2686
|
-
if (this.xmlMode) {
|
|
2310
|
+
if (!this.xmlMode) {
|
|
2687
2311
|
this.state = State.InSpecialComment;
|
|
2688
2312
|
this.sectionStart = this.index;
|
|
2689
2313
|
}
|
|
2690
|
-
} else if (c ===
|
|
2314
|
+
} else if (c === CharCodes.Gt) {
|
|
2691
2315
|
this.state = State.Text;
|
|
2692
2316
|
if (!this.xmlMode) {
|
|
2693
2317
|
this.sectionStart = this.index + 1;
|
|
@@ -2706,17 +2330,17 @@ class Tokenizer {
|
|
|
2706
2330
|
}
|
|
2707
2331
|
}
|
|
2708
2332
|
stateAfterClosingTagName(c) {
|
|
2709
|
-
if (c ===
|
|
2333
|
+
if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {
|
|
2710
2334
|
this.state = State.Text;
|
|
2711
2335
|
this.sectionStart = this.index + 1;
|
|
2712
2336
|
}
|
|
2713
2337
|
}
|
|
2714
2338
|
stateBeforeAttributeName(c) {
|
|
2715
|
-
if (c ===
|
|
2339
|
+
if (c === CharCodes.Gt) {
|
|
2716
2340
|
this.cbs.onopentagend(this.index);
|
|
2717
2341
|
this.enterTagBody();
|
|
2718
2342
|
this.sectionStart = this.index + 1;
|
|
2719
|
-
} else if (c ===
|
|
2343
|
+
} else if (c === CharCodes.Slash) {
|
|
2720
2344
|
this.state = State.InSelfClosingTag;
|
|
2721
2345
|
} else if (!isWhitespace(c)) {
|
|
2722
2346
|
this.state = State.InAttributeName;
|
|
@@ -2724,7 +2348,7 @@ class Tokenizer {
|
|
|
2724
2348
|
}
|
|
2725
2349
|
}
|
|
2726
2350
|
stateInSelfClosingTag(c) {
|
|
2727
|
-
if (c ===
|
|
2351
|
+
if (c === CharCodes.Gt) {
|
|
2728
2352
|
this.cbs.onselfclosingtag(this.index);
|
|
2729
2353
|
this.sectionStart = this.index + 1;
|
|
2730
2354
|
if (!this.recognizeSelfClosing) {
|
|
@@ -2740,7 +2364,7 @@ class Tokenizer {
|
|
|
2740
2364
|
}
|
|
2741
2365
|
}
|
|
2742
2366
|
stateInAttributeName(c) {
|
|
2743
|
-
if (c ===
|
|
2367
|
+
if (c === CharCodes.Eq || isEndOfTagSection(c)) {
|
|
2744
2368
|
this.cbs.onattribname(this.sectionStart, this.index);
|
|
2745
2369
|
this.sectionStart = this.index;
|
|
2746
2370
|
this.state = State.AfterAttributeName;
|
|
@@ -2748,9 +2372,9 @@ class Tokenizer {
|
|
|
2748
2372
|
}
|
|
2749
2373
|
}
|
|
2750
2374
|
stateAfterAttributeName(c) {
|
|
2751
|
-
if (c ===
|
|
2375
|
+
if (c === CharCodes.Eq) {
|
|
2752
2376
|
this.state = State.BeforeAttributeValue;
|
|
2753
|
-
} else if (c ===
|
|
2377
|
+
} else if (c === CharCodes.Slash || c === CharCodes.Gt) {
|
|
2754
2378
|
this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);
|
|
2755
2379
|
this.sectionStart = -1;
|
|
2756
2380
|
this.state = State.BeforeAttributeName;
|
|
@@ -2762,10 +2386,10 @@ class Tokenizer {
|
|
|
2762
2386
|
}
|
|
2763
2387
|
}
|
|
2764
2388
|
stateBeforeAttributeValue(c) {
|
|
2765
|
-
if (c ===
|
|
2389
|
+
if (c === CharCodes.DoubleQuote) {
|
|
2766
2390
|
this.state = State.InAttributeValueDq;
|
|
2767
2391
|
this.sectionStart = this.index + 1;
|
|
2768
|
-
} else if (c ===
|
|
2392
|
+
} else if (c === CharCodes.SingleQuote) {
|
|
2769
2393
|
this.state = State.InAttributeValueSq;
|
|
2770
2394
|
this.sectionStart = this.index + 1;
|
|
2771
2395
|
} else if (!isWhitespace(c)) {
|
|
@@ -2775,47 +2399,43 @@ class Tokenizer {
|
|
|
2775
2399
|
}
|
|
2776
2400
|
}
|
|
2777
2401
|
handleInAttributeValue(c, quote) {
|
|
2778
|
-
if (c === quote ||
|
|
2402
|
+
if (c === quote || this.fastForwardTo(quote)) {
|
|
2779
2403
|
this.cbs.onattribdata(this.sectionStart, this.index);
|
|
2780
2404
|
this.sectionStart = -1;
|
|
2781
|
-
this.cbs.onattribend(quote ===
|
|
2405
|
+
this.cbs.onattribend(quote === CharCodes.DoubleQuote ? QuoteType.Double : QuoteType.Single, this.index + 1);
|
|
2782
2406
|
this.state = State.BeforeAttributeName;
|
|
2783
|
-
} else if (this.decodeEntities && c === CharCodes2.Amp) {
|
|
2784
|
-
this.startEntity();
|
|
2785
2407
|
}
|
|
2786
2408
|
}
|
|
2787
2409
|
stateInAttributeValueDoubleQuotes(c) {
|
|
2788
|
-
this.handleInAttributeValue(c,
|
|
2410
|
+
this.handleInAttributeValue(c, CharCodes.DoubleQuote);
|
|
2789
2411
|
}
|
|
2790
2412
|
stateInAttributeValueSingleQuotes(c) {
|
|
2791
|
-
this.handleInAttributeValue(c,
|
|
2413
|
+
this.handleInAttributeValue(c, CharCodes.SingleQuote);
|
|
2792
2414
|
}
|
|
2793
2415
|
stateInAttributeValueNoQuotes(c) {
|
|
2794
|
-
if (isWhitespace(c) || c ===
|
|
2416
|
+
if (isWhitespace(c) || c === CharCodes.Gt) {
|
|
2795
2417
|
this.cbs.onattribdata(this.sectionStart, this.index);
|
|
2796
2418
|
this.sectionStart = -1;
|
|
2797
2419
|
this.cbs.onattribend(QuoteType.Unquoted, this.index);
|
|
2798
2420
|
this.state = State.BeforeAttributeName;
|
|
2799
2421
|
this.stateBeforeAttributeName(c);
|
|
2800
|
-
} else if (this.decodeEntities && c === CharCodes2.Amp) {
|
|
2801
|
-
this.startEntity();
|
|
2802
2422
|
}
|
|
2803
2423
|
}
|
|
2804
2424
|
stateBeforeDeclaration(c) {
|
|
2805
|
-
if (c ===
|
|
2425
|
+
if (c === CharCodes.OpeningSquareBracket) {
|
|
2806
2426
|
this.state = State.CDATASequence;
|
|
2807
2427
|
this.sequenceIndex = 0;
|
|
2808
2428
|
} else if (this.xmlMode) {
|
|
2809
|
-
this.state = c ===
|
|
2429
|
+
this.state = c === CharCodes.Dash ? State.BeforeComment : State.InDeclaration;
|
|
2810
2430
|
} else if ((c | 32) === Sequences.Doctype[0]) {
|
|
2811
2431
|
this.state = State.DeclarationSequence;
|
|
2812
2432
|
this.currentSequence = Sequences.Doctype;
|
|
2813
2433
|
this.sequenceIndex = 1;
|
|
2814
|
-
} else if (c ===
|
|
2434
|
+
} else if (c === CharCodes.Gt) {
|
|
2815
2435
|
this.cbs.oncomment(this.sectionStart, this.index, 0);
|
|
2816
2436
|
this.state = State.Text;
|
|
2817
2437
|
this.sectionStart = this.index + 1;
|
|
2818
|
-
} else if (c ===
|
|
2438
|
+
} else if (c === CharCodes.Dash) {
|
|
2819
2439
|
this.state = State.BeforeComment;
|
|
2820
2440
|
} else {
|
|
2821
2441
|
this.state = State.InSpecialComment;
|
|
@@ -2827,7 +2447,7 @@ class Tokenizer {
|
|
|
2827
2447
|
this.stateInDeclaration(c);
|
|
2828
2448
|
} else if ((c | 32) === this.currentSequence[this.sequenceIndex]) {
|
|
2829
2449
|
this.sequenceIndex += 1;
|
|
2830
|
-
} else if (c ===
|
|
2450
|
+
} else if (c === CharCodes.Gt) {
|
|
2831
2451
|
this.cbs.oncomment(this.sectionStart, this.index, 0);
|
|
2832
2452
|
this.state = State.Text;
|
|
2833
2453
|
this.sectionStart = this.index + 1;
|
|
@@ -2836,33 +2456,33 @@ class Tokenizer {
|
|
|
2836
2456
|
}
|
|
2837
2457
|
}
|
|
2838
2458
|
stateInDeclaration(c) {
|
|
2839
|
-
if (c ===
|
|
2459
|
+
if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {
|
|
2840
2460
|
this.cbs.ondeclaration(this.sectionStart, this.index);
|
|
2841
2461
|
this.state = State.Text;
|
|
2842
2462
|
this.sectionStart = this.index + 1;
|
|
2843
2463
|
}
|
|
2844
2464
|
}
|
|
2845
2465
|
stateInProcessingInstruction(c) {
|
|
2846
|
-
if (c ===
|
|
2466
|
+
if (c === CharCodes.Questionmark) {
|
|
2847
2467
|
this.sequenceIndex = 1;
|
|
2848
|
-
} else if (c ===
|
|
2468
|
+
} else if (c === CharCodes.Gt && this.sequenceIndex === 1) {
|
|
2849
2469
|
this.cbs.onprocessinginstruction(this.sectionStart, this.index - 1);
|
|
2850
2470
|
this.sequenceIndex = 0;
|
|
2851
2471
|
this.state = State.Text;
|
|
2852
2472
|
this.sectionStart = this.index + 1;
|
|
2853
2473
|
} else {
|
|
2854
|
-
this.sequenceIndex = Number(this.fastForwardTo(
|
|
2474
|
+
this.sequenceIndex = Number(this.fastForwardTo(CharCodes.Questionmark));
|
|
2855
2475
|
}
|
|
2856
2476
|
}
|
|
2857
2477
|
stateBeforeComment(c) {
|
|
2858
|
-
if (c ===
|
|
2478
|
+
if (c === CharCodes.Dash) {
|
|
2859
2479
|
this.state = State.InCommentLike;
|
|
2860
2480
|
this.currentSequence = Sequences.CommentEnd;
|
|
2861
2481
|
this.sequenceIndex = 0;
|
|
2862
2482
|
this.sectionStart = this.index + 1;
|
|
2863
2483
|
} else if (this.xmlMode) {
|
|
2864
2484
|
this.state = State.InDeclaration;
|
|
2865
|
-
} else if (c ===
|
|
2485
|
+
} else if (c === CharCodes.Gt) {
|
|
2866
2486
|
this.cbs.oncomment(this.sectionStart, this.index, 0);
|
|
2867
2487
|
this.state = State.Text;
|
|
2868
2488
|
this.sectionStart = this.index + 1;
|
|
@@ -2871,35 +2491,12 @@ class Tokenizer {
|
|
|
2871
2491
|
}
|
|
2872
2492
|
}
|
|
2873
2493
|
stateInSpecialComment(c) {
|
|
2874
|
-
if (c ===
|
|
2494
|
+
if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {
|
|
2875
2495
|
this.cbs.oncomment(this.sectionStart, this.index, 0);
|
|
2876
2496
|
this.state = State.Text;
|
|
2877
2497
|
this.sectionStart = this.index + 1;
|
|
2878
2498
|
}
|
|
2879
2499
|
}
|
|
2880
|
-
startEntity() {
|
|
2881
|
-
this.baseState = this.state;
|
|
2882
|
-
this.state = State.InEntity;
|
|
2883
|
-
this.entityStart = this.index;
|
|
2884
|
-
this.entityDecoder.startEntity(this.xmlMode ? DecodingMode.Strict : this.baseState === State.Text || this.baseState === State.InSpecialTag ? DecodingMode.Legacy : DecodingMode.Attribute);
|
|
2885
|
-
}
|
|
2886
|
-
stateInEntity() {
|
|
2887
|
-
const indexInBuffer = this.index - this.offset;
|
|
2888
|
-
const length = this.entityDecoder.write(this.buffer, indexInBuffer);
|
|
2889
|
-
if (length >= 0) {
|
|
2890
|
-
this.state = this.baseState;
|
|
2891
|
-
if (length === 0) {
|
|
2892
|
-
this.index -= 1;
|
|
2893
|
-
}
|
|
2894
|
-
} else {
|
|
2895
|
-
if (indexInBuffer < this.buffer.length && this.buffer.charCodeAt(indexInBuffer) === CharCodes2.Amp) {
|
|
2896
|
-
this.state = this.baseState;
|
|
2897
|
-
this.index -= 1;
|
|
2898
|
-
return;
|
|
2899
|
-
}
|
|
2900
|
-
this.index = this.offset + this.buffer.length - 1;
|
|
2901
|
-
}
|
|
2902
|
-
}
|
|
2903
2500
|
cleanup() {
|
|
2904
2501
|
if (this.running && this.sectionStart !== this.index) {
|
|
2905
2502
|
if (this.state === State.Text || this.state === State.InPlainText || this.state === State.InSpecialTag && this.sequenceIndex === 0) {
|
|
@@ -2918,127 +2515,93 @@ class Tokenizer {
|
|
|
2918
2515
|
while (this.shouldContinue()) {
|
|
2919
2516
|
const c = this.buffer.charCodeAt(this.index - this.offset);
|
|
2920
2517
|
switch (this.state) {
|
|
2921
|
-
case State.Text:
|
|
2518
|
+
case State.Text:
|
|
2922
2519
|
this.stateText(c);
|
|
2923
2520
|
break;
|
|
2924
|
-
|
|
2925
|
-
case State.InPlainText: {
|
|
2521
|
+
case State.InPlainText:
|
|
2926
2522
|
this.index = this.buffer.length + this.offset - 1;
|
|
2927
2523
|
break;
|
|
2928
|
-
|
|
2929
|
-
case State.SpecialStartSequence: {
|
|
2524
|
+
case State.SpecialStartSequence:
|
|
2930
2525
|
this.stateSpecialStartSequence(c);
|
|
2931
2526
|
break;
|
|
2932
|
-
|
|
2933
|
-
case State.InSpecialTag: {
|
|
2527
|
+
case State.InSpecialTag:
|
|
2934
2528
|
this.stateInSpecialTag(c);
|
|
2935
2529
|
break;
|
|
2936
|
-
|
|
2937
|
-
case State.CDATASequence: {
|
|
2530
|
+
case State.CDATASequence:
|
|
2938
2531
|
this.stateCDATASequence(c);
|
|
2939
2532
|
break;
|
|
2940
|
-
|
|
2941
|
-
case State.DeclarationSequence: {
|
|
2533
|
+
case State.DeclarationSequence:
|
|
2942
2534
|
this.stateDeclarationSequence(c);
|
|
2943
2535
|
break;
|
|
2944
|
-
|
|
2945
|
-
case State.InAttributeValueDq: {
|
|
2536
|
+
case State.InAttributeValueDq:
|
|
2946
2537
|
this.stateInAttributeValueDoubleQuotes(c);
|
|
2947
2538
|
break;
|
|
2948
|
-
|
|
2949
|
-
case State.InAttributeName: {
|
|
2539
|
+
case State.InAttributeName:
|
|
2950
2540
|
this.stateInAttributeName(c);
|
|
2951
2541
|
break;
|
|
2952
|
-
|
|
2953
|
-
case State.InCommentLike: {
|
|
2542
|
+
case State.InCommentLike:
|
|
2954
2543
|
this.stateInCommentLike(c);
|
|
2955
2544
|
break;
|
|
2956
|
-
|
|
2957
|
-
case State.InSpecialComment: {
|
|
2545
|
+
case State.InSpecialComment:
|
|
2958
2546
|
this.stateInSpecialComment(c);
|
|
2959
2547
|
break;
|
|
2960
|
-
|
|
2961
|
-
case State.BeforeAttributeName: {
|
|
2548
|
+
case State.BeforeAttributeName:
|
|
2962
2549
|
this.stateBeforeAttributeName(c);
|
|
2963
2550
|
break;
|
|
2964
|
-
|
|
2965
|
-
case State.InTagName: {
|
|
2551
|
+
case State.InTagName:
|
|
2966
2552
|
this.stateInTagName(c);
|
|
2967
2553
|
break;
|
|
2968
|
-
|
|
2969
|
-
case State.InClosingTagName: {
|
|
2554
|
+
case State.InClosingTagName:
|
|
2970
2555
|
this.stateInClosingTagName(c);
|
|
2971
2556
|
break;
|
|
2972
|
-
|
|
2973
|
-
case State.BeforeTagName: {
|
|
2557
|
+
case State.BeforeTagName:
|
|
2974
2558
|
this.stateBeforeTagName(c);
|
|
2975
2559
|
break;
|
|
2976
|
-
|
|
2977
|
-
case State.AfterAttributeName: {
|
|
2560
|
+
case State.AfterAttributeName:
|
|
2978
2561
|
this.stateAfterAttributeName(c);
|
|
2979
2562
|
break;
|
|
2980
|
-
|
|
2981
|
-
case State.InAttributeValueSq: {
|
|
2563
|
+
case State.InAttributeValueSq:
|
|
2982
2564
|
this.stateInAttributeValueSingleQuotes(c);
|
|
2983
2565
|
break;
|
|
2984
|
-
|
|
2985
|
-
case State.BeforeAttributeValue: {
|
|
2566
|
+
case State.BeforeAttributeValue:
|
|
2986
2567
|
this.stateBeforeAttributeValue(c);
|
|
2987
2568
|
break;
|
|
2988
|
-
|
|
2989
|
-
case State.BeforeClosingTagName: {
|
|
2569
|
+
case State.BeforeClosingTagName:
|
|
2990
2570
|
this.stateBeforeClosingTagName(c);
|
|
2991
2571
|
break;
|
|
2992
|
-
|
|
2993
|
-
case State.AfterClosingTagName: {
|
|
2572
|
+
case State.AfterClosingTagName:
|
|
2994
2573
|
this.stateAfterClosingTagName(c);
|
|
2995
2574
|
break;
|
|
2996
|
-
|
|
2997
|
-
case State.InAttributeValueNq: {
|
|
2575
|
+
case State.InAttributeValueNq:
|
|
2998
2576
|
this.stateInAttributeValueNoQuotes(c);
|
|
2999
2577
|
break;
|
|
3000
|
-
|
|
3001
|
-
case State.InSelfClosingTag: {
|
|
2578
|
+
case State.InSelfClosingTag:
|
|
3002
2579
|
this.stateInSelfClosingTag(c);
|
|
3003
2580
|
break;
|
|
3004
|
-
|
|
3005
|
-
case State.InDeclaration: {
|
|
2581
|
+
case State.InDeclaration:
|
|
3006
2582
|
this.stateInDeclaration(c);
|
|
3007
2583
|
break;
|
|
3008
|
-
|
|
3009
|
-
case State.BeforeDeclaration: {
|
|
2584
|
+
case State.BeforeDeclaration:
|
|
3010
2585
|
this.stateBeforeDeclaration(c);
|
|
3011
2586
|
break;
|
|
3012
|
-
|
|
3013
|
-
case State.BeforeComment: {
|
|
2587
|
+
case State.BeforeComment:
|
|
3014
2588
|
this.stateBeforeComment(c);
|
|
3015
2589
|
break;
|
|
3016
|
-
|
|
3017
|
-
case State.InProcessingInstruction: {
|
|
2590
|
+
case State.InProcessingInstruction:
|
|
3018
2591
|
this.stateInProcessingInstruction(c);
|
|
3019
2592
|
break;
|
|
3020
|
-
}
|
|
3021
|
-
case State.InEntity: {
|
|
3022
|
-
this.stateInEntity();
|
|
3023
|
-
break;
|
|
3024
|
-
}
|
|
3025
2593
|
}
|
|
3026
2594
|
this.index++;
|
|
3027
2595
|
}
|
|
3028
2596
|
this.cleanup();
|
|
3029
2597
|
}
|
|
3030
2598
|
finish() {
|
|
3031
|
-
if (this.state === State.InEntity) {
|
|
3032
|
-
this.entityDecoder.end();
|
|
3033
|
-
this.state = this.baseState;
|
|
3034
|
-
}
|
|
3035
2599
|
this.handleTrailingData();
|
|
3036
2600
|
this.cbs.onend();
|
|
3037
2601
|
}
|
|
3038
2602
|
handleTrailingCommentLikeData(endIndex) {
|
|
3039
|
-
if (this.state !== State.InCommentLike)
|
|
2603
|
+
if (this.state !== State.InCommentLike)
|
|
3040
2604
|
return false;
|
|
3041
|
-
}
|
|
3042
2605
|
if (this.currentSequence === Sequences.CdataEnd) {
|
|
3043
2606
|
if (this.xmlMode) {
|
|
3044
2607
|
if (this.sectionStart < endIndex) {
|
|
@@ -3061,35 +2624,29 @@ class Tokenizer {
|
|
|
3061
2624
|
case State.BeforeComment:
|
|
3062
2625
|
case State.CDATASequence:
|
|
3063
2626
|
case State.DeclarationSequence:
|
|
3064
|
-
case State.InDeclaration:
|
|
2627
|
+
case State.InDeclaration:
|
|
3065
2628
|
this.cbs.ontext(this.sectionStart, endIndex);
|
|
3066
2629
|
return true;
|
|
3067
|
-
|
|
3068
|
-
default: {
|
|
2630
|
+
default:
|
|
3069
2631
|
return false;
|
|
3070
|
-
}
|
|
3071
2632
|
}
|
|
3072
2633
|
}
|
|
3073
2634
|
switch (this.state) {
|
|
3074
2635
|
case State.BeforeDeclaration:
|
|
3075
2636
|
case State.InSpecialComment:
|
|
3076
2637
|
case State.BeforeComment:
|
|
3077
|
-
case State.CDATASequence:
|
|
2638
|
+
case State.CDATASequence:
|
|
3078
2639
|
this.cbs.oncomment(this.sectionStart, endIndex, 0);
|
|
3079
2640
|
return true;
|
|
3080
|
-
|
|
3081
|
-
case State.DeclarationSequence: {
|
|
2641
|
+
case State.DeclarationSequence:
|
|
3082
2642
|
if (this.sequenceIndex !== Sequences.Doctype.length) {
|
|
3083
2643
|
this.cbs.oncomment(this.sectionStart, endIndex, 0);
|
|
3084
2644
|
}
|
|
3085
2645
|
return true;
|
|
3086
|
-
|
|
3087
|
-
case State.InDeclaration: {
|
|
2646
|
+
case State.InDeclaration:
|
|
3088
2647
|
return true;
|
|
3089
|
-
|
|
3090
|
-
default: {
|
|
2648
|
+
default:
|
|
3091
2649
|
return false;
|
|
3092
|
-
}
|
|
3093
2650
|
}
|
|
3094
2651
|
}
|
|
3095
2652
|
handleTrailingData() {
|
|
@@ -3097,9 +2654,8 @@ class Tokenizer {
|
|
|
3097
2654
|
if (this.handleTrailingCommentLikeData(endIndex) || this.handleTrailingMarkupDeclaration(endIndex)) {
|
|
3098
2655
|
return;
|
|
3099
2656
|
}
|
|
3100
|
-
if (this.sectionStart >= endIndex)
|
|
2657
|
+
if (this.sectionStart >= endIndex)
|
|
3101
2658
|
return;
|
|
3102
|
-
}
|
|
3103
2659
|
switch (this.state) {
|
|
3104
2660
|
case State.InTagName:
|
|
3105
2661
|
case State.BeforeAttributeName:
|
|
@@ -3109,98 +2665,76 @@ class Tokenizer {
|
|
|
3109
2665
|
case State.InAttributeValueSq:
|
|
3110
2666
|
case State.InAttributeValueDq:
|
|
3111
2667
|
case State.InAttributeValueNq:
|
|
3112
|
-
case State.InClosingTagName:
|
|
2668
|
+
case State.InClosingTagName:
|
|
3113
2669
|
break;
|
|
3114
|
-
|
|
3115
|
-
default: {
|
|
2670
|
+
default:
|
|
3116
2671
|
this.cbs.ontext(this.sectionStart, endIndex);
|
|
3117
|
-
}
|
|
3118
2672
|
}
|
|
3119
2673
|
}
|
|
3120
|
-
|
|
3121
|
-
|
|
3122
|
-
|
|
3123
|
-
|
|
3124
|
-
|
|
3125
|
-
|
|
3126
|
-
|
|
3127
|
-
|
|
3128
|
-
|
|
3129
|
-
|
|
3130
|
-
|
|
3131
|
-
|
|
3132
|
-
|
|
3133
|
-
|
|
3134
|
-
|
|
3135
|
-
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
|
-
|
|
3139
|
-
|
|
3140
|
-
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
|
|
3148
|
-
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
|
|
3158
|
-
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
|
|
3168
|
-
|
|
3169
|
-
|
|
3170
|
-
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
|
|
3184
|
-
State2[State2["InAttributeValueNq"] = 14] = "InAttributeValueNq";
|
|
3185
|
-
State2[State2["BeforeDeclaration"] = 15] = "BeforeDeclaration";
|
|
3186
|
-
State2[State2["InDeclaration"] = 16] = "InDeclaration";
|
|
3187
|
-
State2[State2["InProcessingInstruction"] = 17] = "InProcessingInstruction";
|
|
3188
|
-
State2[State2["BeforeComment"] = 18] = "BeforeComment";
|
|
3189
|
-
State2[State2["CDATASequence"] = 19] = "CDATASequence";
|
|
3190
|
-
State2[State2["DeclarationSequence"] = 20] = "DeclarationSequence";
|
|
3191
|
-
State2[State2["InSpecialComment"] = 21] = "InSpecialComment";
|
|
3192
|
-
State2[State2["InCommentLike"] = 22] = "InCommentLike";
|
|
3193
|
-
State2[State2["SpecialStartSequence"] = 23] = "SpecialStartSequence";
|
|
3194
|
-
State2[State2["InSpecialTag"] = 24] = "InSpecialTag";
|
|
3195
|
-
State2[State2["InPlainText"] = 25] = "InPlainText";
|
|
3196
|
-
State2[State2["InEntity"] = 26] = "InEntity";
|
|
3197
|
-
})(State || (State = {}));
|
|
3198
|
-
(function(QuoteType2) {
|
|
3199
|
-
QuoteType2[QuoteType2["NoValue"] = 0] = "NoValue";
|
|
3200
|
-
QuoteType2[QuoteType2["Unquoted"] = 1] = "Unquoted";
|
|
3201
|
-
QuoteType2[QuoteType2["Single"] = 2] = "Single";
|
|
3202
|
-
QuoteType2[QuoteType2["Double"] = 3] = "Double";
|
|
3203
|
-
})(QuoteType || (QuoteType = {}));
|
|
2674
|
+
}
|
|
2675
|
+
var CharCodes, State, QuoteType, Sequences, specialStartSequences;
|
|
2676
|
+
var init_html_tokenizer = __esm(() => {
|
|
2677
|
+
CharCodes = {
|
|
2678
|
+
Tab: 9,
|
|
2679
|
+
NewLine: 10,
|
|
2680
|
+
FormFeed: 12,
|
|
2681
|
+
CarriageReturn: 13,
|
|
2682
|
+
Space: 32,
|
|
2683
|
+
ExclamationMark: 33,
|
|
2684
|
+
Number: 35,
|
|
2685
|
+
SingleQuote: 39,
|
|
2686
|
+
DoubleQuote: 34,
|
|
2687
|
+
Dash: 45,
|
|
2688
|
+
Slash: 47,
|
|
2689
|
+
Zero: 48,
|
|
2690
|
+
Nine: 57,
|
|
2691
|
+
Semi: 59,
|
|
2692
|
+
Lt: 60,
|
|
2693
|
+
Eq: 61,
|
|
2694
|
+
Gt: 62,
|
|
2695
|
+
Questionmark: 63,
|
|
2696
|
+
UpperA: 65,
|
|
2697
|
+
LowerA: 97,
|
|
2698
|
+
UpperF: 70,
|
|
2699
|
+
LowerF: 102,
|
|
2700
|
+
UpperZ: 90,
|
|
2701
|
+
LowerZ: 122,
|
|
2702
|
+
LowerX: 120,
|
|
2703
|
+
OpeningSquareBracket: 91
|
|
2704
|
+
};
|
|
2705
|
+
State = {
|
|
2706
|
+
Text: 1,
|
|
2707
|
+
BeforeTagName: 2,
|
|
2708
|
+
InTagName: 3,
|
|
2709
|
+
InSelfClosingTag: 4,
|
|
2710
|
+
BeforeClosingTagName: 5,
|
|
2711
|
+
InClosingTagName: 6,
|
|
2712
|
+
AfterClosingTagName: 7,
|
|
2713
|
+
BeforeAttributeName: 8,
|
|
2714
|
+
InAttributeName: 9,
|
|
2715
|
+
AfterAttributeName: 10,
|
|
2716
|
+
BeforeAttributeValue: 11,
|
|
2717
|
+
InAttributeValueDq: 12,
|
|
2718
|
+
InAttributeValueSq: 13,
|
|
2719
|
+
InAttributeValueNq: 14,
|
|
2720
|
+
BeforeDeclaration: 15,
|
|
2721
|
+
InDeclaration: 16,
|
|
2722
|
+
InProcessingInstruction: 17,
|
|
2723
|
+
BeforeComment: 18,
|
|
2724
|
+
CDATASequence: 19,
|
|
2725
|
+
DeclarationSequence: 20,
|
|
2726
|
+
InSpecialComment: 21,
|
|
2727
|
+
InCommentLike: 22,
|
|
2728
|
+
SpecialStartSequence: 23,
|
|
2729
|
+
InSpecialTag: 24,
|
|
2730
|
+
InPlainText: 25
|
|
2731
|
+
};
|
|
2732
|
+
QuoteType = {
|
|
2733
|
+
NoValue: 0,
|
|
2734
|
+
Unquoted: 1,
|
|
2735
|
+
Single: 2,
|
|
2736
|
+
Double: 3
|
|
2737
|
+
};
|
|
3204
2738
|
Sequences = {
|
|
3205
2739
|
Empty: new Uint8Array(0),
|
|
3206
2740
|
Cdata: new Uint8Array([67, 68, 65, 84, 65, 91]),
|
|
@@ -3208,57 +2742,13 @@ var init_Tokenizer = __esm(() => {
|
|
|
3208
2742
|
CommentEnd: new Uint8Array([45, 45, 33, 62]),
|
|
3209
2743
|
Doctype: new Uint8Array([100, 111, 99, 116, 121, 112, 101]),
|
|
3210
2744
|
IframeEnd: new Uint8Array([60, 47, 105, 102, 114, 97, 109, 101]),
|
|
3211
|
-
NoembedEnd: new Uint8Array([
|
|
3212
|
-
|
|
3213
|
-
|
|
3214
|
-
110,
|
|
3215
|
-
111,
|
|
3216
|
-
101,
|
|
3217
|
-
109,
|
|
3218
|
-
98,
|
|
3219
|
-
101,
|
|
3220
|
-
100
|
|
3221
|
-
]),
|
|
3222
|
-
NoframesEnd: new Uint8Array([
|
|
3223
|
-
60,
|
|
3224
|
-
47,
|
|
3225
|
-
110,
|
|
3226
|
-
111,
|
|
3227
|
-
102,
|
|
3228
|
-
114,
|
|
3229
|
-
97,
|
|
3230
|
-
109,
|
|
3231
|
-
101,
|
|
3232
|
-
115
|
|
3233
|
-
]),
|
|
3234
|
-
Plaintext: new Uint8Array([
|
|
3235
|
-
60,
|
|
3236
|
-
47,
|
|
3237
|
-
112,
|
|
3238
|
-
108,
|
|
3239
|
-
97,
|
|
3240
|
-
105,
|
|
3241
|
-
110,
|
|
3242
|
-
116,
|
|
3243
|
-
101,
|
|
3244
|
-
120,
|
|
3245
|
-
116
|
|
3246
|
-
]),
|
|
2745
|
+
NoembedEnd: new Uint8Array([60, 47, 110, 111, 101, 109, 98, 101, 100]),
|
|
2746
|
+
NoframesEnd: new Uint8Array([60, 47, 110, 111, 102, 114, 97, 109, 101, 115]),
|
|
2747
|
+
Plaintext: new Uint8Array([60, 47, 112, 108, 97, 105, 110, 116, 101, 120, 116]),
|
|
3247
2748
|
ScriptEnd: new Uint8Array([60, 47, 115, 99, 114, 105, 112, 116]),
|
|
3248
2749
|
StyleEnd: new Uint8Array([60, 47, 115, 116, 121, 108, 101]),
|
|
3249
2750
|
TitleEnd: new Uint8Array([60, 47, 116, 105, 116, 108, 101]),
|
|
3250
|
-
TextareaEnd: new Uint8Array([
|
|
3251
|
-
60,
|
|
3252
|
-
47,
|
|
3253
|
-
116,
|
|
3254
|
-
101,
|
|
3255
|
-
120,
|
|
3256
|
-
116,
|
|
3257
|
-
97,
|
|
3258
|
-
114,
|
|
3259
|
-
101,
|
|
3260
|
-
97
|
|
3261
|
-
]),
|
|
2751
|
+
TextareaEnd: new Uint8Array([60, 47, 116, 101, 120, 116, 97, 114, 101, 97]),
|
|
3262
2752
|
XmpEnd: new Uint8Array([60, 47, 120, 109, 112])
|
|
3263
2753
|
};
|
|
3264
2754
|
specialStartSequences = new Map([
|
|
@@ -3271,77 +2761,8 @@ var init_Tokenizer = __esm(() => {
|
|
|
3271
2761
|
]);
|
|
3272
2762
|
});
|
|
3273
2763
|
|
|
3274
|
-
// node_modules/domelementtype/dist/index.js
|
|
3275
|
-
var ElementType, Root, Text, Directive, Comment, Script, Style, Tag, CDATA, Doctype;
|
|
3276
|
-
var init_dist = __esm(() => {
|
|
3277
|
-
(function(ElementType2) {
|
|
3278
|
-
ElementType2["Root"] = "root";
|
|
3279
|
-
ElementType2["Text"] = "text";
|
|
3280
|
-
ElementType2["Directive"] = "directive";
|
|
3281
|
-
ElementType2["Comment"] = "comment";
|
|
3282
|
-
ElementType2["Script"] = "script";
|
|
3283
|
-
ElementType2["Style"] = "style";
|
|
3284
|
-
ElementType2["Tag"] = "tag";
|
|
3285
|
-
ElementType2["CDATA"] = "cdata";
|
|
3286
|
-
ElementType2["Doctype"] = "doctype";
|
|
3287
|
-
})(ElementType || (ElementType = {}));
|
|
3288
|
-
Root = ElementType.Root;
|
|
3289
|
-
Text = ElementType.Text;
|
|
3290
|
-
Directive = ElementType.Directive;
|
|
3291
|
-
Comment = ElementType.Comment;
|
|
3292
|
-
Script = ElementType.Script;
|
|
3293
|
-
Style = ElementType.Style;
|
|
3294
|
-
Tag = ElementType.Tag;
|
|
3295
|
-
CDATA = ElementType.CDATA;
|
|
3296
|
-
Doctype = ElementType.Doctype;
|
|
3297
|
-
});
|
|
3298
|
-
|
|
3299
|
-
// node_modules/domutils/dist/querying.js
|
|
3300
|
-
var init_querying = () => {};
|
|
3301
|
-
|
|
3302
|
-
// node_modules/domutils/dist/legacy.js
|
|
3303
|
-
var init_legacy = () => {};
|
|
3304
|
-
|
|
3305
|
-
// node_modules/domutils/dist/stringify.js
|
|
3306
|
-
var init_stringify = () => {};
|
|
3307
|
-
|
|
3308
|
-
// node_modules/domutils/dist/feeds.js
|
|
3309
|
-
var init_feeds = () => {};
|
|
3310
|
-
|
|
3311
|
-
// node_modules/domutils/dist/helpers.js
|
|
3312
|
-
var DocumentPosition;
|
|
3313
|
-
var init_helpers = __esm(() => {
|
|
3314
|
-
(function(DocumentPosition2) {
|
|
3315
|
-
DocumentPosition2[DocumentPosition2["DISCONNECTED"] = 1] = "DISCONNECTED";
|
|
3316
|
-
DocumentPosition2[DocumentPosition2["PRECEDING"] = 2] = "PRECEDING";
|
|
3317
|
-
DocumentPosition2[DocumentPosition2["FOLLOWING"] = 4] = "FOLLOWING";
|
|
3318
|
-
DocumentPosition2[DocumentPosition2["CONTAINS"] = 8] = "CONTAINS";
|
|
3319
|
-
DocumentPosition2[DocumentPosition2["CONTAINED_BY"] = 16] = "CONTAINED_BY";
|
|
3320
|
-
})(DocumentPosition || (DocumentPosition = {}));
|
|
3321
|
-
});
|
|
3322
|
-
|
|
3323
|
-
// node_modules/domutils/dist/traversal.js
|
|
3324
|
-
var init_traversal = () => {};
|
|
3325
|
-
|
|
3326
|
-
// node_modules/domutils/dist/index.js
|
|
3327
|
-
var init_dist2 = __esm(() => {
|
|
3328
|
-
init_feeds();
|
|
3329
|
-
init_helpers();
|
|
3330
|
-
init_legacy();
|
|
3331
|
-
init_querying();
|
|
3332
|
-
init_stringify();
|
|
3333
|
-
init_traversal();
|
|
3334
|
-
});
|
|
3335
|
-
|
|
3336
|
-
// node_modules/htmlparser2/dist/index.js
|
|
3337
|
-
var init_dist3 = __esm(() => {
|
|
3338
|
-
init_dist();
|
|
3339
|
-
init_Tokenizer();
|
|
3340
|
-
init_dist2();
|
|
3341
|
-
});
|
|
3342
|
-
|
|
3343
2764
|
// tools/core/htmllinter-tables.js
|
|
3344
|
-
var VOID_ELEMENTS, RAW_TEXT_ELEMENTS, RCDATA_ELEMENTS, SPECIAL_ELEMENTS, FORMATTING_ELEMENTS, DEFAULT_SCOPE_BOUNDARIES, SCOPE_LIST_ITEM, SCOPE_BUTTON, SCOPE_DEFAULT, SCOPE_TABLE, SCOPE_SELECT, STANDARD_SVG_CAMEL_ELEMENTS, STANDARD_SVG_CAMEL_ATTRS, MATHML_CAMEL_ATTRS, FOREIGN_BREAKOUT_TAGS, MATHML_TEXT_INTEGRATION_POINTS, BLOCK_LEVEL_AUTO_CLOSE_P, SELECT_VALID_CHILDREN, SELECT_BREAKOUT_TAGS, MODES, NS, FRAGMENT_CONTEXT_MODES;
|
|
2765
|
+
var VOID_ELEMENTS, RAW_TEXT_ELEMENTS, RCDATA_ELEMENTS, SPECIAL_ELEMENTS, FORMATTING_ELEMENTS, DEFAULT_SCOPE_BOUNDARIES, MATHML_TEXT_INTEGRATION_POINT_NAMES, SVG_HTML_INTEGRATION_POINT_NAMES, SCOPE_LIST_ITEM, SCOPE_BUTTON, SCOPE_DEFAULT, SCOPE_TABLE, SCOPE_SELECT, STANDARD_SVG_CAMEL_ELEMENTS, STANDARD_SVG_CAMEL_ATTRS, MATHML_CAMEL_ATTRS, SVG_ATTR_LOWERCASE_TO_CAMEL, MATHML_ATTR_LOWERCASE_TO_CAMEL, FOREIGN_BREAKOUT_TAGS, MATHML_TEXT_INTEGRATION_POINTS, BLOCK_LEVEL_AUTO_CLOSE_P, SELECT_VALID_CHILDREN, SELECT_BREAKOUT_TAGS, MODES, NS, FRAGMENT_CONTEXT_MODES;
|
|
3345
2766
|
var init_htmllinter_tables = __esm(() => {
|
|
3346
2767
|
VOID_ELEMENTS = new Set([
|
|
3347
2768
|
"area",
|
|
@@ -3474,8 +2895,11 @@ var init_htmllinter_tables = __esm(() => {
|
|
|
3474
2895
|
"th",
|
|
3475
2896
|
"marquee",
|
|
3476
2897
|
"object",
|
|
2898
|
+
"select",
|
|
3477
2899
|
"template"
|
|
3478
2900
|
]);
|
|
2901
|
+
MATHML_TEXT_INTEGRATION_POINT_NAMES = new Set(["mi", "mo", "mn", "ms", "mtext"]);
|
|
2902
|
+
SVG_HTML_INTEGRATION_POINT_NAMES = new Set(["foreignobject", "desc", "title"]);
|
|
3479
2903
|
SCOPE_LIST_ITEM = new Set([...DEFAULT_SCOPE_BOUNDARIES, "ol", "ul"]);
|
|
3480
2904
|
SCOPE_BUTTON = new Set([...DEFAULT_SCOPE_BOUNDARIES, "button"]);
|
|
3481
2905
|
SCOPE_DEFAULT = DEFAULT_SCOPE_BOUNDARIES;
|
|
@@ -3580,6 +3004,12 @@ var init_htmllinter_tables = __esm(() => {
|
|
|
3580
3004
|
"zoomAndPan"
|
|
3581
3005
|
]);
|
|
3582
3006
|
MATHML_CAMEL_ATTRS = new Set(["definitionURL"]);
|
|
3007
|
+
SVG_ATTR_LOWERCASE_TO_CAMEL = new Map;
|
|
3008
|
+
for (const camel of STANDARD_SVG_CAMEL_ATTRS)
|
|
3009
|
+
SVG_ATTR_LOWERCASE_TO_CAMEL.set(camel.toLowerCase(), camel);
|
|
3010
|
+
MATHML_ATTR_LOWERCASE_TO_CAMEL = new Map;
|
|
3011
|
+
for (const camel of MATHML_CAMEL_ATTRS)
|
|
3012
|
+
MATHML_ATTR_LOWERCASE_TO_CAMEL.set(camel.toLowerCase(), camel);
|
|
3583
3013
|
FOREIGN_BREAKOUT_TAGS = new Set([
|
|
3584
3014
|
"b",
|
|
3585
3015
|
"big",
|
|
@@ -3674,7 +3104,6 @@ var init_htmllinter_tables = __esm(() => {
|
|
|
3674
3104
|
MODES = Object.freeze({
|
|
3675
3105
|
inBody: "inBody",
|
|
3676
3106
|
inTable: "inTable",
|
|
3677
|
-
inTableText: "inTableText",
|
|
3678
3107
|
inCaption: "inCaption",
|
|
3679
3108
|
inColumnGroup: "inColumnGroup",
|
|
3680
3109
|
inTableBody: "inTableBody",
|
|
@@ -3682,8 +3111,7 @@ var init_htmllinter_tables = __esm(() => {
|
|
|
3682
3111
|
inCell: "inCell",
|
|
3683
3112
|
inSelect: "inSelect",
|
|
3684
3113
|
inSelectInTable: "inSelectInTable",
|
|
3685
|
-
inTemplate: "inTemplate"
|
|
3686
|
-
text: "text"
|
|
3114
|
+
inTemplate: "inTemplate"
|
|
3687
3115
|
});
|
|
3688
3116
|
NS = Object.freeze({
|
|
3689
3117
|
html: "html",
|
|
@@ -3711,8 +3139,9 @@ var init_htmllinter_tables = __esm(() => {
|
|
|
3711
3139
|
|
|
3712
3140
|
// tools/core/htmllinter.js
|
|
3713
3141
|
function lintHtml(html, onFinding, opts = {}) {
|
|
3142
|
+
const TokenizerClass = opts.TokenizerClass ?? HtmlTokenizer;
|
|
3714
3143
|
const ctx = new LinterCtx(html, onFinding, opts);
|
|
3715
|
-
const tokenizer = new
|
|
3144
|
+
const tokenizer = new TokenizerClass({ xmlMode: false, decodeEntities: false, recognizeSelfClosing: true }, ctx);
|
|
3716
3145
|
ctx.tokenizer = tokenizer;
|
|
3717
3146
|
tokenizer.write(html);
|
|
3718
3147
|
tokenizer.end();
|
|
@@ -3749,30 +3178,75 @@ class LinterCtx {
|
|
|
3749
3178
|
this.openElements.push({ name: "select", ns: NS.html, start: -1 });
|
|
3750
3179
|
}
|
|
3751
3180
|
this.insertionMode = ctxInfo.mode;
|
|
3752
|
-
this.originalInsertionMode = MODES.inBody;
|
|
3753
3181
|
this.templateInsertionModes = ctxName === "template" ? [MODES.inTemplate] : [];
|
|
3754
3182
|
this.activeFormatting = [];
|
|
3755
|
-
this.formPointer = null;
|
|
3756
3183
|
this.framesetOk = true;
|
|
3757
3184
|
this.svgCamelElements = opts.svgCamelElements ?? STANDARD_SVG_CAMEL_ELEMENTS;
|
|
3758
|
-
this.transparentTagPrefixes = opts.transparentTagPrefixes ?? [];
|
|
3185
|
+
this.transparentTagPrefixes = (opts.transparentTagPrefixes ?? []).map((p) => p.toLowerCase());
|
|
3759
3186
|
this.currentTagName = "";
|
|
3760
3187
|
this.currentTagRawName = "";
|
|
3761
3188
|
this.currentTagStart = 0;
|
|
3189
|
+
this.currentAttrs = [];
|
|
3190
|
+
this.currentAttr = null;
|
|
3762
3191
|
this.tokenizer = null;
|
|
3763
|
-
this.textRestoreMode = null;
|
|
3764
3192
|
}
|
|
3765
3193
|
onopentagname(start, end) {
|
|
3766
3194
|
const raw = this.html.slice(start, end);
|
|
3767
3195
|
this.currentTagRawName = raw;
|
|
3768
3196
|
this.currentTagName = raw.toLowerCase();
|
|
3769
3197
|
this.currentTagStart = start;
|
|
3198
|
+
this.currentAttrs = [];
|
|
3199
|
+
this.currentAttr = null;
|
|
3200
|
+
}
|
|
3201
|
+
onattribname(start, end) {
|
|
3202
|
+
const rawName = this.html.slice(start, end);
|
|
3203
|
+
this.currentAttr = {
|
|
3204
|
+
name: rawName.toLowerCase(),
|
|
3205
|
+
rawName,
|
|
3206
|
+
nameStart: start,
|
|
3207
|
+
value: null,
|
|
3208
|
+
valueStart: -1,
|
|
3209
|
+
valueEnd: -1,
|
|
3210
|
+
quote: QuoteType.NoValue
|
|
3211
|
+
};
|
|
3212
|
+
}
|
|
3213
|
+
onattribdata(start, end) {
|
|
3214
|
+
if (!this.currentAttr)
|
|
3215
|
+
return;
|
|
3216
|
+
this.currentAttr.valueStart = start;
|
|
3217
|
+
this.currentAttr.valueEnd = end;
|
|
3218
|
+
this.currentAttr.value = this.html.slice(start, end);
|
|
3219
|
+
}
|
|
3220
|
+
onattribend(quote, _end) {
|
|
3221
|
+
const a = this.currentAttr;
|
|
3222
|
+
if (!a)
|
|
3223
|
+
return;
|
|
3224
|
+
a.quote = quote;
|
|
3225
|
+
const dup = this.currentAttrs.find((x) => x.name === a.name);
|
|
3226
|
+
if (dup) {
|
|
3227
|
+
this.report(HTML_DUPLICATE_ATTRIBUTE, LEVEL_WARN, a.nameStart, {
|
|
3228
|
+
name: a.name,
|
|
3229
|
+
firstAt: dup.nameStart
|
|
3230
|
+
});
|
|
3231
|
+
} else {
|
|
3232
|
+
this.currentAttrs.push(a);
|
|
3233
|
+
}
|
|
3234
|
+
if (a.quote === QuoteType.Unquoted && a.value === "") {
|
|
3235
|
+
this.report(HTML_MISSING_ATTRIBUTE_VALUE, LEVEL_WARN, a.nameStart, {
|
|
3236
|
+
name: a.name
|
|
3237
|
+
});
|
|
3238
|
+
}
|
|
3239
|
+
this.currentAttr = null;
|
|
3770
3240
|
}
|
|
3771
|
-
onattribname(_start, _end) {}
|
|
3772
|
-
onattribdata(_start, _end) {}
|
|
3773
3241
|
onattribentity(_cp) {}
|
|
3774
|
-
onattribend(_quote, _end) {}
|
|
3775
3242
|
ontextentity(_cp, _end) {}
|
|
3243
|
+
getAttr(name) {
|
|
3244
|
+
const a = this.currentAttrs.find((x) => x.name === name);
|
|
3245
|
+
return a ? a.value : null;
|
|
3246
|
+
}
|
|
3247
|
+
hasAttr(name) {
|
|
3248
|
+
return this.currentAttrs.some((x) => x.name === name);
|
|
3249
|
+
}
|
|
3776
3250
|
onopentagend(endIndex) {
|
|
3777
3251
|
this.handleStartTag(false, endIndex);
|
|
3778
3252
|
}
|
|
@@ -3782,20 +3256,56 @@ class LinterCtx {
|
|
|
3782
3256
|
onclosetag(start, end) {
|
|
3783
3257
|
const raw = this.html.slice(start, end);
|
|
3784
3258
|
const name = raw.toLowerCase();
|
|
3259
|
+
let i = end;
|
|
3260
|
+
let lastNonWs = -1;
|
|
3261
|
+
while (i < this.html.length) {
|
|
3262
|
+
const c = this.html.charCodeAt(i);
|
|
3263
|
+
if (c === 62)
|
|
3264
|
+
break;
|
|
3265
|
+
if (c !== 32 && c !== 9 && c !== 10 && c !== 13 && c !== 12)
|
|
3266
|
+
lastNonWs = i;
|
|
3267
|
+
i++;
|
|
3268
|
+
}
|
|
3269
|
+
if (lastNonWs >= 0) {
|
|
3270
|
+
if (this.html.charCodeAt(lastNonWs) === 47 && lastNonWs === i - 1) {
|
|
3271
|
+
let firstNonWs = -1;
|
|
3272
|
+
for (let j = end;j < lastNonWs; j++) {
|
|
3273
|
+
const c2 = this.html.charCodeAt(j);
|
|
3274
|
+
if (c2 !== 32 && c2 !== 9 && c2 !== 10 && c2 !== 13 && c2 !== 12) {
|
|
3275
|
+
firstNonWs = j;
|
|
3276
|
+
break;
|
|
3277
|
+
}
|
|
3278
|
+
}
|
|
3279
|
+
if (firstNonWs < 0) {
|
|
3280
|
+
this.report(HTML_SELF_CLOSING_END_TAG, LEVEL_WARN, start, { tag: name });
|
|
3281
|
+
} else {
|
|
3282
|
+
this.report(HTML_ATTRIBUTES_ON_END_TAG, LEVEL_WARN, start, { tag: name });
|
|
3283
|
+
}
|
|
3284
|
+
} else {
|
|
3285
|
+
this.report(HTML_ATTRIBUTES_ON_END_TAG, LEVEL_WARN, start, { tag: name });
|
|
3286
|
+
}
|
|
3287
|
+
}
|
|
3785
3288
|
this.handleEndTag(name, start);
|
|
3786
3289
|
}
|
|
3787
3290
|
ontext(start, end) {
|
|
3788
3291
|
if (start >= end)
|
|
3789
3292
|
return;
|
|
3293
|
+
const top = this.currentNode();
|
|
3294
|
+
if (top && top.ns !== NS.html && !this.isIntegrationPoint(top))
|
|
3295
|
+
return;
|
|
3790
3296
|
this.handleText(start, end);
|
|
3791
3297
|
}
|
|
3792
|
-
oncomment(
|
|
3298
|
+
oncomment(start, _end, endOffset) {
|
|
3299
|
+
if (endOffset === 0) {
|
|
3300
|
+
this.report(HTML_BOGUS_COMMENT, LEVEL_WARN, start, {
|
|
3301
|
+
mode: this.insertionMode
|
|
3302
|
+
});
|
|
3303
|
+
}
|
|
3304
|
+
}
|
|
3793
3305
|
oncdata(start, _end, _endOffset) {
|
|
3794
3306
|
if (this.currentNamespace() === NS.html) {
|
|
3795
|
-
this.report(
|
|
3796
|
-
|
|
3797
|
-
mode: this.insertionMode,
|
|
3798
|
-
action: "ignored"
|
|
3307
|
+
this.report(HTML_CDATA_IN_HTML_NAMESPACE, LEVEL_WARN, start, {
|
|
3308
|
+
mode: this.insertionMode
|
|
3799
3309
|
});
|
|
3800
3310
|
}
|
|
3801
3311
|
}
|
|
@@ -3833,14 +3343,37 @@ class LinterCtx {
|
|
|
3833
3343
|
const f = this.openElements[i];
|
|
3834
3344
|
if (f.name === target && f.ns === NS.html)
|
|
3835
3345
|
return true;
|
|
3836
|
-
if (f.ns === NS.html
|
|
3837
|
-
|
|
3838
|
-
|
|
3346
|
+
if (f.ns === NS.html) {
|
|
3347
|
+
if (scopeSet.has(f.name))
|
|
3348
|
+
return false;
|
|
3349
|
+
} else if (this.isScopeBoundary(f)) {
|
|
3839
3350
|
return false;
|
|
3840
3351
|
}
|
|
3841
3352
|
}
|
|
3842
3353
|
return false;
|
|
3843
3354
|
}
|
|
3355
|
+
isScopeBoundary(frame) {
|
|
3356
|
+
if (frame.ns === NS.math) {
|
|
3357
|
+
return MATHML_TEXT_INTEGRATION_POINT_NAMES.has(frame.name) || frame.name === "annotation-xml";
|
|
3358
|
+
}
|
|
3359
|
+
if (frame.ns === NS.svg) {
|
|
3360
|
+
return SVG_HTML_INTEGRATION_POINT_NAMES.has(frame.name);
|
|
3361
|
+
}
|
|
3362
|
+
return false;
|
|
3363
|
+
}
|
|
3364
|
+
isIntegrationPoint(frame) {
|
|
3365
|
+
if (frame.ns === NS.math) {
|
|
3366
|
+
if (MATHML_TEXT_INTEGRATION_POINT_NAMES.has(frame.name))
|
|
3367
|
+
return true;
|
|
3368
|
+
if (frame.name === "annotation-xml" && frame.htmlIntegration)
|
|
3369
|
+
return true;
|
|
3370
|
+
return false;
|
|
3371
|
+
}
|
|
3372
|
+
if (frame.ns === NS.svg) {
|
|
3373
|
+
return SVG_HTML_INTEGRATION_POINT_NAMES.has(frame.name);
|
|
3374
|
+
}
|
|
3375
|
+
return false;
|
|
3376
|
+
}
|
|
3844
3377
|
hasInDefaultScope(target) {
|
|
3845
3378
|
return this.hasInScope(target, SCOPE_DEFAULT);
|
|
3846
3379
|
}
|
|
@@ -3911,13 +3444,43 @@ class LinterCtx {
|
|
|
3911
3444
|
});
|
|
3912
3445
|
}
|
|
3913
3446
|
}
|
|
3447
|
+
const targetNs = ns !== NS.html ? ns : name === "svg" ? NS.svg : name === "math" ? NS.math : NS.html;
|
|
3448
|
+
if (targetNs === NS.svg) {
|
|
3449
|
+
for (const a of this.currentAttrs) {
|
|
3450
|
+
const canonical = SVG_ATTR_LOWERCASE_TO_CAMEL.get(a.name);
|
|
3451
|
+
if (canonical && a.rawName !== canonical) {
|
|
3452
|
+
this.report(HTML_SVG_ATTR_WILL_LOWERCASE, LEVEL_ERROR, a.nameStart, {
|
|
3453
|
+
raw: a.rawName,
|
|
3454
|
+
canonical
|
|
3455
|
+
});
|
|
3456
|
+
}
|
|
3457
|
+
}
|
|
3458
|
+
} else if (targetNs === NS.math) {
|
|
3459
|
+
for (const a of this.currentAttrs) {
|
|
3460
|
+
const canonical = MATHML_ATTR_LOWERCASE_TO_CAMEL.get(a.name);
|
|
3461
|
+
if (canonical && a.rawName !== canonical) {
|
|
3462
|
+
this.report(HTML_MATHML_ATTR_WILL_LOWERCASE, LEVEL_ERROR, a.nameStart, {
|
|
3463
|
+
raw: a.rawName,
|
|
3464
|
+
canonical
|
|
3465
|
+
});
|
|
3466
|
+
}
|
|
3467
|
+
}
|
|
3468
|
+
}
|
|
3914
3469
|
if (this.isTransparentTag(name))
|
|
3915
3470
|
return;
|
|
3916
|
-
|
|
3471
|
+
const top = this.currentNode();
|
|
3472
|
+
const inForeign = ns !== NS.html && !(top && this.isIntegrationPoint(top));
|
|
3473
|
+
if (inForeign && !this.shouldBreakoutFromForeign(name)) {
|
|
3917
3474
|
this.startTagInForeign(name, raw, selfClosing, start);
|
|
3918
3475
|
return;
|
|
3919
3476
|
}
|
|
3920
|
-
if (
|
|
3477
|
+
if (inForeign && this.shouldBreakoutFromForeign(name)) {
|
|
3478
|
+
this.report(HTML_TAG_NOT_ALLOWED_IN_PARENT, LEVEL_WARN, start, {
|
|
3479
|
+
tag: raw,
|
|
3480
|
+
parent: this.currentNode()?.name ?? "(root)",
|
|
3481
|
+
mode: this.insertionMode,
|
|
3482
|
+
action: "foreign-breakout"
|
|
3483
|
+
});
|
|
3921
3484
|
while (this.openElements.length && this.currentNode()?.ns !== NS.html) {
|
|
3922
3485
|
this.openElements.pop();
|
|
3923
3486
|
}
|
|
@@ -3927,20 +3490,28 @@ class LinterCtx {
|
|
|
3927
3490
|
shouldBreakoutFromForeign(name) {
|
|
3928
3491
|
if (FOREIGN_BREAKOUT_TAGS.has(name))
|
|
3929
3492
|
return true;
|
|
3930
|
-
if (name === "font")
|
|
3931
|
-
return
|
|
3493
|
+
if (name === "font") {
|
|
3494
|
+
return this.hasAttr("color") || this.hasAttr("face") || this.hasAttr("size");
|
|
3495
|
+
}
|
|
3932
3496
|
return false;
|
|
3933
3497
|
}
|
|
3934
3498
|
startTagInForeign(name, raw, selfClosing, start) {
|
|
3935
3499
|
const ns = name === "svg" ? NS.svg : name === "math" ? NS.math : this.currentNamespace();
|
|
3936
3500
|
const top = this.currentNode();
|
|
3937
|
-
if (top &&
|
|
3501
|
+
if (top && this.isIntegrationPoint(top) && name !== "mglyph" && name !== "malignmark") {
|
|
3938
3502
|
this.dispatchStartTag(name, raw, selfClosing, start, start + raw.length);
|
|
3939
3503
|
return;
|
|
3940
3504
|
}
|
|
3941
3505
|
if (selfClosing)
|
|
3942
3506
|
return;
|
|
3943
|
-
|
|
3507
|
+
const frame = { name, ns, start };
|
|
3508
|
+
if (ns === NS.math && name === "annotation-xml") {
|
|
3509
|
+
const enc = (this.getAttr("encoding") ?? "").toLowerCase();
|
|
3510
|
+
if (enc === "text/html" || enc === "application/xhtml+xml") {
|
|
3511
|
+
frame.htmlIntegration = true;
|
|
3512
|
+
}
|
|
3513
|
+
}
|
|
3514
|
+
this.openElements.push(frame);
|
|
3944
3515
|
}
|
|
3945
3516
|
dispatchStartTag(name, raw, selfClosing, start, endIndex) {
|
|
3946
3517
|
switch (this.insertionMode) {
|
|
@@ -3950,10 +3521,6 @@ class LinterCtx {
|
|
|
3950
3521
|
return this.startInBody(name, raw, selfClosing, start, endIndex);
|
|
3951
3522
|
case MODES.inTable:
|
|
3952
3523
|
return this.startInTable(name, raw, selfClosing, start, endIndex);
|
|
3953
|
-
case MODES.inTableText:
|
|
3954
|
-
this.flushTableText();
|
|
3955
|
-
this.insertionMode = this.originalInsertionMode;
|
|
3956
|
-
return this.dispatchStartTag(name, raw, selfClosing, start, endIndex);
|
|
3957
3524
|
case MODES.inCaption:
|
|
3958
3525
|
return this.startInCaption(name, raw, selfClosing, start, endIndex);
|
|
3959
3526
|
case MODES.inColumnGroup:
|
|
@@ -3968,8 +3535,6 @@ class LinterCtx {
|
|
|
3968
3535
|
return this.startInSelect(name, raw, selfClosing, start, endIndex);
|
|
3969
3536
|
case MODES.inSelectInTable:
|
|
3970
3537
|
return this.startInSelectInTable(name, raw, selfClosing, start, endIndex);
|
|
3971
|
-
case MODES.text:
|
|
3972
|
-
return;
|
|
3973
3538
|
}
|
|
3974
3539
|
}
|
|
3975
3540
|
startInBody(name, raw, selfClosing, start, _endIndex) {
|
|
@@ -4011,7 +3576,7 @@ class LinterCtx {
|
|
|
4011
3576
|
return;
|
|
4012
3577
|
}
|
|
4013
3578
|
if (name === "form") {
|
|
4014
|
-
if (this.
|
|
3579
|
+
if (this.openElementsHas("form") && !this.openElementsHas("template")) {
|
|
4015
3580
|
this.report(HTML_DUPLICATE_FORM, LEVEL_ERROR, start, {
|
|
4016
3581
|
tag: raw,
|
|
4017
3582
|
mode: this.insertionMode
|
|
@@ -4021,7 +3586,6 @@ class LinterCtx {
|
|
|
4021
3586
|
if (this.hasInButtonScope("p"))
|
|
4022
3587
|
this.implicitlyClose("p", start, raw);
|
|
4023
3588
|
this.push(raw, NS.html, start);
|
|
4024
|
-
this.formPointer = this.currentNode();
|
|
4025
3589
|
return;
|
|
4026
3590
|
}
|
|
4027
3591
|
if (name === "li") {
|
|
@@ -4094,7 +3658,7 @@ class LinterCtx {
|
|
|
4094
3658
|
return;
|
|
4095
3659
|
}
|
|
4096
3660
|
if (name === "a") {
|
|
4097
|
-
if (this.
|
|
3661
|
+
if (this.activeFormattingHas("a")) {
|
|
4098
3662
|
this.report(HTML_NESTED_INTERACTIVE, LEVEL_WARN, start, {
|
|
4099
3663
|
tag: raw,
|
|
4100
3664
|
mode: this.insertionMode
|
|
@@ -4111,7 +3675,7 @@ class LinterCtx {
|
|
|
4111
3675
|
return;
|
|
4112
3676
|
}
|
|
4113
3677
|
if (name === "nobr") {
|
|
4114
|
-
if (this.
|
|
3678
|
+
if (this.activeFormattingHas("nobr")) {
|
|
4115
3679
|
this.report(HTML_NESTED_INTERACTIVE, LEVEL_WARN, start, {
|
|
4116
3680
|
tag: raw,
|
|
4117
3681
|
mode: this.insertionMode
|
|
@@ -4195,7 +3759,6 @@ class LinterCtx {
|
|
|
4195
3759
|
if (e === null)
|
|
4196
3760
|
break;
|
|
4197
3761
|
if (e.name === name) {
|
|
4198
|
-
this.activeFormatting.splice(i, 1);
|
|
4199
3762
|
const idx = this.openElements.indexOf(e);
|
|
4200
3763
|
if (idx >= 0)
|
|
4201
3764
|
this.openElements.splice(idx, 1);
|
|
@@ -4288,6 +3851,9 @@ class LinterCtx {
|
|
|
4288
3851
|
return this.startInBody(name, raw, selfClosing, start, endIndex);
|
|
4289
3852
|
}
|
|
4290
3853
|
if (name === "input") {
|
|
3854
|
+
const type = (this.getAttr("type") ?? "").toLowerCase();
|
|
3855
|
+
if (type === "hidden")
|
|
3856
|
+
return;
|
|
4291
3857
|
this.report(HTML_TAG_NOT_ALLOWED_IN_PARENT, LEVEL_WARN, start, {
|
|
4292
3858
|
tag: raw,
|
|
4293
3859
|
parent: "table",
|
|
@@ -4323,18 +3889,6 @@ class LinterCtx {
|
|
|
4323
3889
|
this.openElements.pop();
|
|
4324
3890
|
}
|
|
4325
3891
|
}
|
|
4326
|
-
flushTableText() {
|
|
4327
|
-
if (!this.pendingTableText)
|
|
4328
|
-
return;
|
|
4329
|
-
const { hasNonWhitespace, start, snippet } = this.pendingTableText;
|
|
4330
|
-
if (hasNonWhitespace) {
|
|
4331
|
-
this.report(HTML_TEXT_NOT_ALLOWED_IN_PARENT, LEVEL_ERROR, start, {
|
|
4332
|
-
mode: this.originalInsertionMode,
|
|
4333
|
-
snippet
|
|
4334
|
-
});
|
|
4335
|
-
}
|
|
4336
|
-
this.pendingTableText = null;
|
|
4337
|
-
}
|
|
4338
3892
|
startInCaption(name, raw, selfClosing, start, endIndex) {
|
|
4339
3893
|
if (name === "caption" || name === "col" || name === "colgroup" || name === "tbody" || name === "td" || name === "tfoot" || name === "th" || name === "thead" || name === "tr") {
|
|
4340
3894
|
if (this.hasInTableScope("caption")) {
|
|
@@ -4567,14 +4121,24 @@ class LinterCtx {
|
|
|
4567
4121
|
return;
|
|
4568
4122
|
const ns = this.currentNamespace();
|
|
4569
4123
|
if (ns !== NS.html) {
|
|
4570
|
-
|
|
4571
|
-
|
|
4572
|
-
|
|
4124
|
+
let stackIdx = this.openElements.length - 1;
|
|
4125
|
+
let first = true;
|
|
4126
|
+
while (stackIdx > 0) {
|
|
4127
|
+
const f = this.openElements[stackIdx];
|
|
4128
|
+
if (!first && f.ns === NS.html)
|
|
4573
4129
|
break;
|
|
4574
|
-
if (f.name.toLowerCase() === name) {
|
|
4575
|
-
this.openElements.length =
|
|
4130
|
+
if (f.ns !== NS.html && f.name.toLowerCase() === name) {
|
|
4131
|
+
this.openElements.length = stackIdx;
|
|
4576
4132
|
return;
|
|
4577
4133
|
}
|
|
4134
|
+
if (first) {
|
|
4135
|
+
this.report(HTML_UNEXPECTED_END_TAG, LEVEL_WARN, start, {
|
|
4136
|
+
tag: name,
|
|
4137
|
+
mode: this.insertionMode
|
|
4138
|
+
});
|
|
4139
|
+
first = false;
|
|
4140
|
+
}
|
|
4141
|
+
stackIdx--;
|
|
4578
4142
|
}
|
|
4579
4143
|
}
|
|
4580
4144
|
if (VOID_ELEMENTS.has(name)) {
|
|
@@ -4605,19 +4169,33 @@ class LinterCtx {
|
|
|
4605
4169
|
});
|
|
4606
4170
|
return;
|
|
4607
4171
|
}
|
|
4172
|
+
const endIsTableStructural = TABLE_SCOPE_TAGS.has(name);
|
|
4608
4173
|
for (let i = this.openElements.length - 1;i >= 0; i--) {
|
|
4609
4174
|
const f = this.openElements[i];
|
|
4610
4175
|
if (f.ns === NS.html && f.name === name) {
|
|
4176
|
+
for (let j = this.openElements.length - 1;j > i; j--) {
|
|
4177
|
+
const popped = this.openElements[j];
|
|
4178
|
+
if (popped.ns === NS.html && popped.name !== name && !IMPLIED_END_TAGS.has(popped.name) && !(endIsTableStructural && TABLE_SCOPE_TAGS.has(popped.name))) {
|
|
4179
|
+
this.report(HTML_UNCLOSED_BEFORE_END, LEVEL_WARN, start, {
|
|
4180
|
+
tag: name,
|
|
4181
|
+
unclosed: popped.name,
|
|
4182
|
+
mode: this.insertionMode
|
|
4183
|
+
});
|
|
4184
|
+
break;
|
|
4185
|
+
}
|
|
4186
|
+
}
|
|
4611
4187
|
this.openElements.length = i;
|
|
4612
|
-
if (name === "form")
|
|
4613
|
-
this.formPointer = null;
|
|
4614
4188
|
if (TABLE_SCOPE_TAGS.has(name) || name === "select" || name === "template") {
|
|
4615
4189
|
this.resetInsertionModeAppropriately();
|
|
4616
4190
|
}
|
|
4617
4191
|
return;
|
|
4618
4192
|
}
|
|
4619
|
-
if (f.ns === NS.html && SPECIAL_ELEMENTS.has(f.name)) {
|
|
4620
|
-
|
|
4193
|
+
if (f.ns === NS.html && SPECIAL_ELEMENTS.has(f.name) && !IMPLIED_END_TAGS.has(f.name) && !(endIsTableStructural && TABLE_SCOPE_TAGS.has(f.name))) {
|
|
4194
|
+
this.report(HTML_UNEXPECTED_END_TAG, LEVEL_WARN, start, {
|
|
4195
|
+
tag: name,
|
|
4196
|
+
mode: this.insertionMode
|
|
4197
|
+
});
|
|
4198
|
+
return;
|
|
4621
4199
|
}
|
|
4622
4200
|
}
|
|
4623
4201
|
}
|
|
@@ -4674,9 +4252,9 @@ function offsetToLineCol(lineStarts, offset) {
|
|
|
4674
4252
|
}
|
|
4675
4253
|
return { line: lo + 1, column: offset - lineStarts[lo] + 1 };
|
|
4676
4254
|
}
|
|
4677
|
-
var HTML_TAG_NAME_HAS_UPPERCASE = "HTML_TAG_NAME_HAS_UPPERCASE", HTML_SVG_TAG_WILL_LOWERCASE = "HTML_SVG_TAG_WILL_LOWERCASE", HTML_TAG_NOT_ALLOWED_IN_PARENT = "HTML_TAG_NOT_ALLOWED_IN_PARENT", HTML_TEXT_NOT_ALLOWED_IN_PARENT = "HTML_TEXT_NOT_ALLOWED_IN_PARENT", HTML_VOID_ELEMENT_HAS_CLOSE_TAG = "HTML_VOID_ELEMENT_HAS_CLOSE_TAG", HTML_DUPLICATE_FORM = "HTML_DUPLICATE_FORM", HTML_NESTED_INTERACTIVE = "HTML_NESTED_INTERACTIVE", HTML_MISNESTED_FORMATTING = "HTML_MISNESTED_FORMATTING", HTML_UNEXPECTED_END_TAG = "HTML_UNEXPECTED_END_TAG", LEVEL_ERROR = "error", LEVEL_WARN = "warn", TABLE_SCOPE_TAGS, TABLE_BODY_CELL_TAGS;
|
|
4255
|
+
var HTML_TAG_NAME_HAS_UPPERCASE = "HTML_TAG_NAME_HAS_UPPERCASE", HTML_SVG_TAG_WILL_LOWERCASE = "HTML_SVG_TAG_WILL_LOWERCASE", HTML_SVG_ATTR_WILL_LOWERCASE = "HTML_SVG_ATTR_WILL_LOWERCASE", HTML_MATHML_ATTR_WILL_LOWERCASE = "HTML_MATHML_ATTR_WILL_LOWERCASE", HTML_TAG_NOT_ALLOWED_IN_PARENT = "HTML_TAG_NOT_ALLOWED_IN_PARENT", HTML_TEXT_NOT_ALLOWED_IN_PARENT = "HTML_TEXT_NOT_ALLOWED_IN_PARENT", HTML_VOID_ELEMENT_HAS_CLOSE_TAG = "HTML_VOID_ELEMENT_HAS_CLOSE_TAG", HTML_DUPLICATE_FORM = "HTML_DUPLICATE_FORM", HTML_NESTED_INTERACTIVE = "HTML_NESTED_INTERACTIVE", HTML_MISNESTED_FORMATTING = "HTML_MISNESTED_FORMATTING", HTML_UNEXPECTED_END_TAG = "HTML_UNEXPECTED_END_TAG", HTML_DUPLICATE_ATTRIBUTE = "HTML_DUPLICATE_ATTRIBUTE", HTML_ATTRIBUTES_ON_END_TAG = "HTML_ATTRIBUTES_ON_END_TAG", HTML_SELF_CLOSING_END_TAG = "HTML_SELF_CLOSING_END_TAG", HTML_MISSING_ATTRIBUTE_VALUE = "HTML_MISSING_ATTRIBUTE_VALUE", HTML_CDATA_IN_HTML_NAMESPACE = "HTML_CDATA_IN_HTML_NAMESPACE", HTML_BOGUS_COMMENT = "HTML_BOGUS_COMMENT", HTML_UNCLOSED_BEFORE_END = "HTML_UNCLOSED_BEFORE_END", LEVEL_ERROR = "error", LEVEL_WARN = "warn", TABLE_SCOPE_TAGS, TABLE_BODY_CELL_TAGS, IMPLIED_END_TAGS;
|
|
4678
4256
|
var init_htmllinter = __esm(() => {
|
|
4679
|
-
|
|
4257
|
+
init_html_tokenizer();
|
|
4680
4258
|
init_htmllinter_tables();
|
|
4681
4259
|
TABLE_SCOPE_TAGS = new Set([
|
|
4682
4260
|
"caption",
|
|
@@ -4690,6 +4268,18 @@ var init_htmllinter = __esm(() => {
|
|
|
4690
4268
|
"table"
|
|
4691
4269
|
]);
|
|
4692
4270
|
TABLE_BODY_CELL_TAGS = new Set(["td", "th"]);
|
|
4271
|
+
IMPLIED_END_TAGS = new Set([
|
|
4272
|
+
"dd",
|
|
4273
|
+
"dt",
|
|
4274
|
+
"li",
|
|
4275
|
+
"optgroup",
|
|
4276
|
+
"option",
|
|
4277
|
+
"p",
|
|
4278
|
+
"rb",
|
|
4279
|
+
"rp",
|
|
4280
|
+
"rt",
|
|
4281
|
+
"rtc"
|
|
4282
|
+
]);
|
|
4693
4283
|
});
|
|
4694
4284
|
|
|
4695
4285
|
// tools/core/lint-check.js
|
|
@@ -5137,8 +4727,8 @@ var init_lint_check = __esm(() => {
|
|
|
5137
4727
|
PushViewNameNode: { originAttr: "<x push-view>" }
|
|
5138
4728
|
};
|
|
5139
4729
|
LintParseContext = class LintParseContext extends ParseContext {
|
|
5140
|
-
constructor(document2,
|
|
5141
|
-
super(document2,
|
|
4730
|
+
constructor(document2, Text, Comment) {
|
|
4731
|
+
super(document2, Text, Comment);
|
|
5142
4732
|
this.attrs = [];
|
|
5143
4733
|
this.parseIssues = [];
|
|
5144
4734
|
}
|
|
@@ -11049,18 +10639,18 @@ async function createNodeEnv() {
|
|
|
11049
10639
|
const dom = new JSDOM("<!DOCTYPE html><html><head></head><body></body></html>", {
|
|
11050
10640
|
virtualConsole
|
|
11051
10641
|
});
|
|
11052
|
-
const { document: document2, Text
|
|
10642
|
+
const { document: document2, Text, Comment } = dom.window;
|
|
11053
10643
|
globalThis.document = document2;
|
|
11054
10644
|
|
|
11055
10645
|
class HeadlessParseContext extends ParseContext {
|
|
11056
10646
|
constructor() {
|
|
11057
|
-
super(document2,
|
|
10647
|
+
super(document2, Text, Comment);
|
|
11058
10648
|
}
|
|
11059
10649
|
}
|
|
11060
10650
|
|
|
11061
10651
|
class HeadlessLintParseContext extends LintParseContext {
|
|
11062
10652
|
constructor() {
|
|
11063
|
-
super(document2,
|
|
10653
|
+
super(document2, Text, Comment);
|
|
11064
10654
|
}
|
|
11065
10655
|
}
|
|
11066
10656
|
return {
|