html2canvas-pro 2.0.4 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (632) hide show
  1. package/README.md +8 -6
  2. package/dist/html2canvas-pro.esm.js +10018 -9922
  3. package/dist/html2canvas-pro.esm.js.map +1 -1
  4. package/dist/html2canvas-pro.js +10017 -9922
  5. package/dist/html2canvas-pro.js.map +1 -1
  6. package/dist/html2canvas-pro.min.js +5 -5
  7. package/dist/lib/config.js +3 -4
  8. package/dist/lib/core/bitwise.js +0 -1
  9. package/dist/lib/core/cache-storage.js +34 -48
  10. package/dist/lib/core/context.js +0 -1
  11. package/dist/lib/core/debugger.js +0 -1
  12. package/dist/lib/core/features.js +0 -1
  13. package/dist/lib/core/logger.js +0 -1
  14. package/dist/lib/core/origin-checker.js +0 -1
  15. package/dist/lib/core/performance-monitor.js +1 -24
  16. package/dist/lib/core/render-element.js +210 -0
  17. package/dist/lib/core/util.js +0 -1
  18. package/dist/lib/core/validator.js +0 -1
  19. package/dist/lib/css/index.js +149 -90
  20. package/dist/lib/css/layout/bounds.js +0 -1
  21. package/dist/lib/css/layout/text.js +0 -1
  22. package/dist/lib/css/{ITypeDescriptor.js → property-descriptor.js} +0 -1
  23. package/dist/lib/css/property-descriptors/background-clip.js +0 -1
  24. package/dist/lib/css/property-descriptors/background-color.js +0 -1
  25. package/dist/lib/css/property-descriptors/background-image.js +0 -1
  26. package/dist/lib/css/property-descriptors/background-origin.js +0 -1
  27. package/dist/lib/css/property-descriptors/background-position.js +0 -1
  28. package/dist/lib/css/property-descriptors/background-repeat.js +0 -1
  29. package/dist/lib/css/property-descriptors/background-size.js +0 -1
  30. package/dist/lib/css/property-descriptors/border-color.js +0 -1
  31. package/dist/lib/css/property-descriptors/border-radius.js +0 -1
  32. package/dist/lib/css/property-descriptors/border-style.js +0 -1
  33. package/dist/lib/css/property-descriptors/border-width.js +0 -1
  34. package/dist/lib/css/property-descriptors/box-shadow.js +0 -1
  35. package/dist/lib/css/property-descriptors/clip-path.js +0 -1
  36. package/dist/lib/css/property-descriptors/color.js +0 -1
  37. package/dist/lib/css/property-descriptors/content.js +0 -1
  38. package/dist/lib/css/property-descriptors/counter-increment.js +0 -1
  39. package/dist/lib/css/property-descriptors/counter-reset.js +0 -1
  40. package/dist/lib/css/property-descriptors/direction.js +0 -1
  41. package/dist/lib/css/property-descriptors/display.js +0 -1
  42. package/dist/lib/css/property-descriptors/duration.js +0 -1
  43. package/dist/lib/css/property-descriptors/float.js +0 -1
  44. package/dist/lib/css/property-descriptors/font-family.js +0 -1
  45. package/dist/lib/css/property-descriptors/font-size.js +0 -1
  46. package/dist/lib/css/property-descriptors/font-style.js +0 -1
  47. package/dist/lib/css/property-descriptors/font-variant.js +0 -1
  48. package/dist/lib/css/property-descriptors/font-weight.js +0 -1
  49. package/dist/lib/css/property-descriptors/image-rendering.js +0 -1
  50. package/dist/lib/css/property-descriptors/letter-spacing.js +0 -1
  51. package/dist/lib/css/property-descriptors/line-break.js +0 -1
  52. package/dist/lib/css/property-descriptors/line-height.js +0 -1
  53. package/dist/lib/css/property-descriptors/list-style-image.js +0 -1
  54. package/dist/lib/css/property-descriptors/list-style-position.js +0 -1
  55. package/dist/lib/css/property-descriptors/list-style-type.js +0 -1
  56. package/dist/lib/css/property-descriptors/margin.js +0 -1
  57. package/dist/lib/css/property-descriptors/mix-blend-mode.js +31 -0
  58. package/dist/lib/css/property-descriptors/object-fit.js +0 -1
  59. package/dist/lib/css/property-descriptors/opacity.js +0 -1
  60. package/dist/lib/css/property-descriptors/overflow-wrap.js +0 -1
  61. package/dist/lib/css/property-descriptors/overflow.js +0 -1
  62. package/dist/lib/css/property-descriptors/padding.js +0 -1
  63. package/dist/lib/css/property-descriptors/paint-order.js +0 -1
  64. package/dist/lib/css/property-descriptors/position.js +0 -1
  65. package/dist/lib/css/property-descriptors/quotes.js +0 -1
  66. package/dist/lib/css/property-descriptors/rotate.js +0 -1
  67. package/dist/lib/css/property-descriptors/text-align.js +0 -1
  68. package/dist/lib/css/property-descriptors/text-decoration-color.js +0 -1
  69. package/dist/lib/css/property-descriptors/text-decoration-line.js +0 -1
  70. package/dist/lib/css/property-descriptors/text-decoration-style.js +0 -1
  71. package/dist/lib/css/property-descriptors/text-decoration-thickness.js +0 -1
  72. package/dist/lib/css/property-descriptors/text-overflow.js +0 -1
  73. package/dist/lib/css/property-descriptors/text-shadow.js +0 -1
  74. package/dist/lib/css/property-descriptors/text-transform.js +0 -1
  75. package/dist/lib/css/property-descriptors/text-underline-offset.js +0 -1
  76. package/dist/lib/css/property-descriptors/transform-origin.js +0 -1
  77. package/dist/lib/css/property-descriptors/transform.js +0 -1
  78. package/dist/lib/css/property-descriptors/visibility.js +0 -1
  79. package/dist/lib/css/property-descriptors/webkit-line-clamp.js +0 -1
  80. package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js +0 -1
  81. package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js +0 -1
  82. package/dist/lib/css/property-descriptors/word-break.js +0 -1
  83. package/dist/lib/css/property-descriptors/writing-mode.js +0 -1
  84. package/dist/lib/css/property-descriptors/z-index.js +0 -1
  85. package/dist/lib/css/syntax/parser.js +0 -1
  86. package/dist/lib/css/syntax/tokenizer.js +14 -1
  87. package/dist/lib/css/{IPropertyDescriptor.js → type-descriptor.js} +0 -1
  88. package/dist/lib/css/types/angle.js +0 -1
  89. package/dist/lib/css/types/color-math.js +0 -1
  90. package/dist/lib/css/types/color-spaces/a98.js +0 -1
  91. package/dist/lib/css/types/color-spaces/p3.js +0 -1
  92. package/dist/lib/css/types/color-spaces/pro-photo.js +0 -1
  93. package/dist/lib/css/types/color-spaces/rec2020.js +0 -1
  94. package/dist/lib/css/types/color-spaces/srgb.js +0 -1
  95. package/dist/lib/css/types/color-utilities.js +0 -1
  96. package/dist/lib/css/types/color.js +0 -1
  97. package/dist/lib/css/types/functions/-prefix-linear-gradient.js +0 -1
  98. package/dist/lib/css/types/functions/-prefix-radial-gradient.js +0 -1
  99. package/dist/lib/css/types/functions/-webkit-gradient.js +0 -1
  100. package/dist/lib/css/types/functions/counter.js +0 -1
  101. package/dist/lib/css/types/functions/gradient.js +0 -1
  102. package/dist/lib/css/types/functions/linear-gradient.js +0 -1
  103. package/dist/lib/css/types/functions/radial-gradient.js +0 -1
  104. package/dist/lib/css/types/image.js +0 -1
  105. package/dist/lib/css/types/index.js +0 -1
  106. package/dist/lib/css/types/length-percentage.js +0 -1
  107. package/dist/lib/css/types/length.js +0 -1
  108. package/dist/lib/css/types/time.js +0 -1
  109. package/dist/lib/dom/document-cloner.js +27 -22
  110. package/dist/lib/dom/dom-normalizer.js +0 -1
  111. package/dist/lib/dom/element-container.js +7 -6
  112. package/dist/lib/dom/elements/li-element-container.js +0 -1
  113. package/dist/lib/dom/elements/ol-element-container.js +0 -1
  114. package/dist/lib/dom/elements/select-element-container.js +0 -1
  115. package/dist/lib/dom/elements/textarea-element-container.js +0 -1
  116. package/dist/lib/dom/node-parser.js +37 -53
  117. package/dist/lib/dom/node-type-guards.js +62 -25
  118. package/dist/lib/dom/replaced-elements/canvas-element-container.js +0 -1
  119. package/dist/lib/dom/replaced-elements/iframe-element-container.js +0 -1
  120. package/dist/lib/dom/replaced-elements/image-element-container.js +0 -1
  121. package/dist/lib/dom/replaced-elements/index.js +0 -1
  122. package/dist/lib/dom/replaced-elements/input-element-container.js +0 -1
  123. package/dist/lib/dom/replaced-elements/pseudo-elements.js +0 -1
  124. package/dist/lib/dom/replaced-elements/svg-element-container.js +0 -1
  125. package/dist/lib/dom/text-container.js +0 -1
  126. package/dist/lib/index.js +32 -210
  127. package/dist/lib/invariant.js +0 -1
  128. package/dist/lib/options.js +2 -0
  129. package/dist/lib/render/background.js +0 -1
  130. package/dist/lib/render/bezier-curve.js +0 -1
  131. package/dist/lib/render/border.js +0 -1
  132. package/dist/lib/render/bound-curves.js +0 -1
  133. package/dist/lib/render/box-sizing.js +0 -1
  134. package/dist/lib/render/canvas/background-renderer.js +2 -24
  135. package/dist/lib/render/canvas/border-renderer.js +0 -1
  136. package/dist/lib/render/canvas/canvas-path.js +25 -0
  137. package/dist/lib/render/canvas/canvas-renderer.js +23 -96
  138. package/dist/lib/render/canvas/effects-renderer.js +3 -1
  139. package/dist/lib/render/canvas/foreignobject-renderer.js +8 -16
  140. package/dist/lib/render/canvas/text-renderer.js +61 -117
  141. package/dist/lib/render/effects.js +11 -2
  142. package/dist/lib/render/font-metrics.js +0 -1
  143. package/dist/lib/render/object-fit.js +87 -0
  144. package/dist/lib/render/path.js +0 -1
  145. package/dist/lib/render/renderer-interface.js +0 -1
  146. package/dist/lib/render/stacking-context.js +16 -8
  147. package/dist/lib/render/vector.js +0 -1
  148. package/dist/types/core/cache-storage.d.ts +5 -6
  149. package/dist/types/core/performance-monitor.d.ts +0 -11
  150. package/dist/types/core/render-element.d.ts +3 -0
  151. package/dist/types/css/index.d.ts +3 -0
  152. package/dist/types/css/property-descriptors/background-clip.d.ts +1 -1
  153. package/dist/types/css/property-descriptors/background-color.d.ts +1 -1
  154. package/dist/types/css/property-descriptors/background-image.d.ts +1 -1
  155. package/dist/types/css/property-descriptors/background-origin.d.ts +1 -1
  156. package/dist/types/css/property-descriptors/background-position.d.ts +1 -1
  157. package/dist/types/css/property-descriptors/background-repeat.d.ts +1 -1
  158. package/dist/types/css/property-descriptors/background-size.d.ts +1 -1
  159. package/dist/types/css/property-descriptors/border-color.d.ts +1 -1
  160. package/dist/types/css/property-descriptors/border-radius.d.ts +1 -1
  161. package/dist/types/css/property-descriptors/border-style.d.ts +1 -1
  162. package/dist/types/css/property-descriptors/border-width.d.ts +1 -1
  163. package/dist/types/css/property-descriptors/box-shadow.d.ts +1 -1
  164. package/dist/types/css/property-descriptors/clip-path.d.ts +1 -1
  165. package/dist/types/css/property-descriptors/color.d.ts +1 -1
  166. package/dist/types/css/property-descriptors/content.d.ts +1 -1
  167. package/dist/types/css/property-descriptors/counter-increment.d.ts +1 -1
  168. package/dist/types/css/property-descriptors/counter-reset.d.ts +1 -1
  169. package/dist/types/css/property-descriptors/direction.d.ts +1 -1
  170. package/dist/types/css/property-descriptors/display.d.ts +1 -1
  171. package/dist/types/css/property-descriptors/duration.d.ts +1 -1
  172. package/dist/types/css/property-descriptors/float.d.ts +1 -1
  173. package/dist/types/css/property-descriptors/font-family.d.ts +1 -1
  174. package/dist/types/css/property-descriptors/font-size.d.ts +1 -1
  175. package/dist/types/css/property-descriptors/font-style.d.ts +1 -1
  176. package/dist/types/css/property-descriptors/font-variant.d.ts +1 -1
  177. package/dist/types/css/property-descriptors/font-weight.d.ts +1 -1
  178. package/dist/types/css/property-descriptors/image-rendering.d.ts +1 -1
  179. package/dist/types/css/property-descriptors/letter-spacing.d.ts +1 -1
  180. package/dist/types/css/property-descriptors/line-break.d.ts +1 -1
  181. package/dist/types/css/property-descriptors/line-height.d.ts +1 -1
  182. package/dist/types/css/property-descriptors/list-style-image.d.ts +1 -1
  183. package/dist/types/css/property-descriptors/list-style-position.d.ts +1 -1
  184. package/dist/types/css/property-descriptors/list-style-type.d.ts +1 -1
  185. package/dist/types/css/property-descriptors/margin.d.ts +1 -1
  186. package/dist/types/css/property-descriptors/mix-blend-mode.d.ts +21 -0
  187. package/dist/types/css/property-descriptors/object-fit.d.ts +1 -1
  188. package/dist/types/css/property-descriptors/opacity.d.ts +1 -1
  189. package/dist/types/css/property-descriptors/overflow-wrap.d.ts +1 -1
  190. package/dist/types/css/property-descriptors/overflow.d.ts +1 -1
  191. package/dist/types/css/property-descriptors/padding.d.ts +1 -1
  192. package/dist/types/css/property-descriptors/paint-order.d.ts +1 -1
  193. package/dist/types/css/property-descriptors/position.d.ts +1 -1
  194. package/dist/types/css/property-descriptors/quotes.d.ts +1 -1
  195. package/dist/types/css/property-descriptors/rotate.d.ts +1 -1
  196. package/dist/types/css/property-descriptors/text-align.d.ts +1 -1
  197. package/dist/types/css/property-descriptors/text-decoration-color.d.ts +1 -1
  198. package/dist/types/css/property-descriptors/text-decoration-line.d.ts +1 -1
  199. package/dist/types/css/property-descriptors/text-decoration-style.d.ts +1 -1
  200. package/dist/types/css/property-descriptors/text-decoration-thickness.d.ts +1 -1
  201. package/dist/types/css/property-descriptors/text-overflow.d.ts +1 -1
  202. package/dist/types/css/property-descriptors/text-shadow.d.ts +1 -1
  203. package/dist/types/css/property-descriptors/text-transform.d.ts +1 -1
  204. package/dist/types/css/property-descriptors/text-underline-offset.d.ts +1 -1
  205. package/dist/types/css/property-descriptors/transform-origin.d.ts +1 -1
  206. package/dist/types/css/property-descriptors/transform.d.ts +1 -1
  207. package/dist/types/css/property-descriptors/visibility.d.ts +1 -1
  208. package/dist/types/css/property-descriptors/webkit-line-clamp.d.ts +1 -1
  209. package/dist/types/css/property-descriptors/webkit-text-stroke-color.d.ts +1 -1
  210. package/dist/types/css/property-descriptors/webkit-text-stroke-width.d.ts +1 -1
  211. package/dist/types/css/property-descriptors/word-break.d.ts +1 -1
  212. package/dist/types/css/property-descriptors/writing-mode.d.ts +1 -1
  213. package/dist/types/css/property-descriptors/z-index.d.ts +1 -1
  214. package/dist/types/css/syntax/tokenizer.d.ts +5 -0
  215. package/dist/types/css/types/angle.d.ts +1 -1
  216. package/dist/types/css/types/color.d.ts +1 -1
  217. package/dist/types/css/types/image.d.ts +1 -1
  218. package/dist/types/css/types/time.d.ts +1 -1
  219. package/dist/types/dom/element-container.d.ts +4 -11
  220. package/dist/types/dom/node-parser.d.ts +2 -15
  221. package/dist/types/dom/node-type-guards.d.ts +21 -22
  222. package/dist/types/index.d.ts +28 -48
  223. package/dist/types/options.d.ts +51 -0
  224. package/dist/types/render/canvas/background-renderer.d.ts +0 -6
  225. package/dist/types/render/canvas/canvas-path.d.ts +3 -0
  226. package/dist/types/render/canvas/canvas-renderer.d.ts +4 -2
  227. package/dist/types/render/canvas/foreignobject-renderer.d.ts +2 -3
  228. package/dist/types/render/canvas/text-renderer.d.ts +5 -0
  229. package/dist/types/render/effects.d.ts +9 -1
  230. package/dist/types/render/object-fit.d.ts +18 -0
  231. package/package.json +43 -35
  232. package/src/__tests__/index.ts +99 -0
  233. package/src/config.ts +107 -0
  234. package/src/core/__mocks__/cache-storage.ts +1 -0
  235. package/src/core/__mocks__/context.ts +19 -0
  236. package/{dist/lib/core/__mocks__/features.js → src/core/__mocks__/features.ts} +1 -5
  237. package/src/core/__mocks__/logger.ts +17 -0
  238. package/{dist/lib/core/__tests__/cache-storage.test.js → src/core/__tests__/cache-storage.test.ts} +95 -48
  239. package/{dist/lib/core/__tests__/cache-storage.js → src/core/__tests__/cache-storage.ts} +117 -64
  240. package/{dist/lib/core/__tests__/logger.js → src/core/__tests__/logger.ts} +10 -8
  241. package/{dist/lib/core/__tests__/validator.js → src/core/__tests__/validator.ts} +161 -98
  242. package/src/core/bitwise.ts +1 -0
  243. package/src/core/cache-storage.ts +315 -0
  244. package/src/core/context.ts +31 -0
  245. package/src/core/debugger.ts +32 -0
  246. package/src/core/features.ts +222 -0
  247. package/src/core/logger.ts +64 -0
  248. package/src/core/origin-checker.ts +57 -0
  249. package/src/core/performance-monitor.ts +241 -0
  250. package/src/core/render-element.ts +272 -0
  251. package/src/core/util.ts +1 -0
  252. package/src/core/validator.ts +593 -0
  253. package/src/css/index.ts +427 -0
  254. package/src/css/layout/__mocks__/bounds.ts +6 -0
  255. package/src/css/layout/bounds.ts +79 -0
  256. package/src/css/layout/text.ts +161 -0
  257. package/src/css/property-descriptor.ts +49 -0
  258. package/src/css/property-descriptors/__tests__/background-tests.ts +65 -0
  259. package/src/css/property-descriptors/__tests__/clip-path.test.ts +280 -0
  260. package/src/css/property-descriptors/__tests__/font-family.ts +25 -0
  261. package/src/css/property-descriptors/__tests__/image-rendering-integration.test.ts +153 -0
  262. package/{dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js → src/css/property-descriptors/__tests__/image-rendering-performance.test.ts} +74 -66
  263. package/src/css/property-descriptors/__tests__/image-rendering.test.ts +72 -0
  264. package/src/css/property-descriptors/__tests__/paint-order.ts +87 -0
  265. package/src/css/property-descriptors/__tests__/text-shadow.ts +94 -0
  266. package/src/css/property-descriptors/__tests__/transform-tests.ts +18 -0
  267. package/src/css/property-descriptors/background-clip.ts +30 -0
  268. package/src/css/property-descriptors/background-color.ts +9 -0
  269. package/src/css/property-descriptors/background-image.ts +27 -0
  270. package/src/css/property-descriptors/background-origin.ts +31 -0
  271. package/src/css/property-descriptors/background-position.ts +38 -0
  272. package/src/css/property-descriptors/background-repeat.ts +44 -0
  273. package/src/css/property-descriptors/background-size.ts +27 -0
  274. package/src/css/property-descriptors/border-color.ts +13 -0
  275. package/src/css/property-descriptors/border-radius.ts +19 -0
  276. package/src/css/property-descriptors/border-style.ts +34 -0
  277. package/src/css/property-descriptors/border-width.ts +20 -0
  278. package/src/css/property-descriptors/box-shadow.ts +60 -0
  279. package/src/css/property-descriptors/clip-path.ts +271 -0
  280. package/src/css/property-descriptors/color.ts +9 -0
  281. package/src/css/property-descriptors/content.ts +26 -0
  282. package/src/css/property-descriptors/counter-increment.ts +43 -0
  283. package/src/css/property-descriptors/counter-reset.ts +36 -0
  284. package/src/css/property-descriptors/direction.ts +23 -0
  285. package/src/css/property-descriptors/display.ts +117 -0
  286. package/src/css/property-descriptors/duration.ts +14 -0
  287. package/src/css/property-descriptors/float.ts +29 -0
  288. package/src/css/property-descriptors/font-family.ts +38 -0
  289. package/src/css/property-descriptors/font-size.ts +9 -0
  290. package/src/css/property-descriptors/font-style.ts +25 -0
  291. package/src/css/property-descriptors/font-variant.ts +12 -0
  292. package/src/css/property-descriptors/font-weight.ts +26 -0
  293. package/src/css/property-descriptors/image-rendering.ts +33 -0
  294. package/src/css/property-descriptors/letter-spacing.ts +25 -0
  295. package/src/css/property-descriptors/line-break.ts +22 -0
  296. package/src/css/property-descriptors/line-height.ts +22 -0
  297. package/src/css/property-descriptors/list-style-image.ts +19 -0
  298. package/src/css/property-descriptors/list-style-position.ts +22 -0
  299. package/src/css/property-descriptors/list-style-type.ts +179 -0
  300. package/src/css/property-descriptors/margin.ts +13 -0
  301. package/src/css/property-descriptors/mix-blend-mode.ts +35 -0
  302. package/src/css/property-descriptors/object-fit.ts +39 -0
  303. package/src/css/property-descriptors/opacity.ts +15 -0
  304. package/src/css/property-descriptors/overflow-wrap.ts +22 -0
  305. package/src/css/property-descriptors/overflow.ts +34 -0
  306. package/src/css/property-descriptors/padding.ts +14 -0
  307. package/src/css/property-descriptors/paint-order.ts +42 -0
  308. package/src/css/property-descriptors/position.ts +30 -0
  309. package/src/css/property-descriptors/quotes.ts +57 -0
  310. package/src/css/property-descriptors/rotate.ts +34 -0
  311. package/src/css/property-descriptors/text-align.ts +26 -0
  312. package/src/css/property-descriptors/text-decoration-color.ts +9 -0
  313. package/src/css/property-descriptors/text-decoration-line.ts +38 -0
  314. package/src/css/property-descriptors/text-decoration-style.ts +32 -0
  315. package/src/css/property-descriptors/text-decoration-thickness.ts +30 -0
  316. package/src/css/property-descriptors/text-overflow.ts +23 -0
  317. package/src/css/property-descriptors/text-shadow.ts +52 -0
  318. package/src/css/property-descriptors/text-transform.ts +27 -0
  319. package/src/css/property-descriptors/text-underline-offset.ts +27 -0
  320. package/src/css/property-descriptors/transform-origin.ts +29 -0
  321. package/src/css/property-descriptors/transform.ts +74 -0
  322. package/src/css/property-descriptors/visibility.ts +25 -0
  323. package/src/css/property-descriptors/webkit-line-clamp.ts +30 -0
  324. package/src/css/property-descriptors/webkit-text-stroke-color.ts +8 -0
  325. package/src/css/property-descriptors/webkit-text-stroke-width.ts +15 -0
  326. package/src/css/property-descriptors/word-break.ts +25 -0
  327. package/src/css/property-descriptors/writing-mode.ts +37 -0
  328. package/src/css/property-descriptors/z-index.ts +27 -0
  329. package/src/css/syntax/__tests__/tokernizer-tests.ts +29 -0
  330. package/src/css/syntax/parser.ts +188 -0
  331. package/src/css/syntax/tokenizer.ts +822 -0
  332. package/src/css/type-descriptor.ts +7 -0
  333. package/src/css/types/__tests__/color-tests.ts +147 -0
  334. package/src/css/types/__tests__/image-tests.ts +239 -0
  335. package/src/css/types/angle.ts +86 -0
  336. package/src/css/types/color-math.ts +22 -0
  337. package/src/css/types/color-spaces/a98.ts +86 -0
  338. package/src/css/types/color-spaces/p3.ts +92 -0
  339. package/src/css/types/color-spaces/pro-photo.ts +87 -0
  340. package/src/css/types/color-spaces/rec2020.ts +90 -0
  341. package/src/css/types/color-spaces/srgb.ts +87 -0
  342. package/src/css/types/color-utilities.ts +452 -0
  343. package/src/css/types/color.ts +485 -0
  344. package/src/css/types/functions/-prefix-linear-gradient.ts +35 -0
  345. package/src/css/types/functions/-prefix-radial-gradient.ts +106 -0
  346. package/src/css/types/functions/-webkit-gradient.ts +69 -0
  347. package/src/css/types/functions/__tests__/radial-gradient.ts +69 -0
  348. package/src/css/types/functions/counter.ts +511 -0
  349. package/src/css/types/functions/gradient.ts +206 -0
  350. package/src/css/types/functions/linear-gradient.ts +28 -0
  351. package/src/css/types/functions/radial-gradient.ts +101 -0
  352. package/src/css/types/image.ts +120 -0
  353. package/src/css/types/index.ts +1 -0
  354. package/src/css/types/length-percentage.ts +137 -0
  355. package/src/css/types/length.ts +7 -0
  356. package/src/css/types/time.ts +20 -0
  357. package/src/dom/__mocks__/document-cloner.ts +22 -0
  358. package/{dist/lib/dom/__tests__/dom-normalizer.test.js → src/dom/__tests__/dom-normalizer.test.ts} +64 -44
  359. package/src/dom/__tests__/element-container.test.ts +129 -0
  360. package/src/dom/document-cloner.ts +929 -0
  361. package/src/dom/dom-normalizer.ts +133 -0
  362. package/src/dom/element-container.ts +75 -0
  363. package/src/dom/elements/li-element-container.ts +10 -0
  364. package/src/dom/elements/ol-element-container.ts +12 -0
  365. package/src/dom/elements/select-element-container.ts +10 -0
  366. package/src/dom/elements/textarea-element-container.ts +9 -0
  367. package/src/dom/node-parser.ts +177 -0
  368. package/src/dom/node-type-guards.ts +70 -0
  369. package/src/dom/replaced-elements/canvas-element-container.ts +15 -0
  370. package/src/dom/replaced-elements/iframe-element-container.ts +55 -0
  371. package/src/dom/replaced-elements/image-element-container.ts +16 -0
  372. package/src/dom/replaced-elements/index.ts +5 -0
  373. package/src/dom/replaced-elements/input-element-container.ts +105 -0
  374. package/src/dom/replaced-elements/pseudo-elements.ts +0 -0
  375. package/src/dom/replaced-elements/svg-element-container.ts +23 -0
  376. package/src/dom/text-container.ts +42 -0
  377. package/src/global.d.ts +19 -0
  378. package/src/index.ts +82 -0
  379. package/src/invariant.ts +5 -0
  380. package/src/options.ts +55 -0
  381. package/src/render/__tests__/object-fit.test.ts +85 -0
  382. package/src/render/background.ts +298 -0
  383. package/src/render/bezier-curve.ts +47 -0
  384. package/src/render/border.ts +165 -0
  385. package/src/render/bound-curves.ts +388 -0
  386. package/src/render/box-sizing.ts +31 -0
  387. package/{dist/lib/render/canvas/__tests__/background-renderer.test.js → src/render/canvas/__tests__/background-renderer.test.ts} +32 -25
  388. package/src/render/canvas/__tests__/border-renderer.test.ts +24 -0
  389. package/src/render/canvas/__tests__/effects-renderer.test.ts +32 -0
  390. package/src/render/canvas/__tests__/text-renderer.test.ts +471 -0
  391. package/src/render/canvas/background-renderer.ts +271 -0
  392. package/src/render/canvas/border-renderer.ts +224 -0
  393. package/src/render/canvas/canvas-path.ts +31 -0
  394. package/src/render/canvas/canvas-renderer.ts +641 -0
  395. package/src/render/canvas/effects-renderer.ts +130 -0
  396. package/src/render/canvas/foreignobject-renderer.ts +53 -0
  397. package/src/render/canvas/text-renderer.ts +700 -0
  398. package/src/render/effects.ts +75 -0
  399. package/src/render/font-metrics.ts +72 -0
  400. package/src/render/object-fit.ts +100 -0
  401. package/src/render/path.ts +37 -0
  402. package/src/render/renderer-interface.ts +28 -0
  403. package/src/render/stacking-context.ts +386 -0
  404. package/src/render/vector.ts +19 -0
  405. package/demo/image-smoothing-demo.html +0 -256
  406. package/demo/refactoring-test.html +0 -602
  407. package/dist/lib/__tests__/index.js +0 -85
  408. package/dist/lib/__tests__/index.js.map +0 -1
  409. package/dist/lib/config.js.map +0 -1
  410. package/dist/lib/core/__mocks__/cache-storage.js +0 -7
  411. package/dist/lib/core/__mocks__/cache-storage.js.map +0 -1
  412. package/dist/lib/core/__mocks__/context.js +0 -19
  413. package/dist/lib/core/__mocks__/context.js.map +0 -1
  414. package/dist/lib/core/__mocks__/features.js.map +0 -1
  415. package/dist/lib/core/__mocks__/logger.js +0 -16
  416. package/dist/lib/core/__mocks__/logger.js.map +0 -1
  417. package/dist/lib/core/__tests__/cache-storage.js.map +0 -1
  418. package/dist/lib/core/__tests__/cache-storage.test.js.map +0 -1
  419. package/dist/lib/core/__tests__/logger.js.map +0 -1
  420. package/dist/lib/core/__tests__/validator.js.map +0 -1
  421. package/dist/lib/core/bitwise.js.map +0 -1
  422. package/dist/lib/core/cache-storage.js.map +0 -1
  423. package/dist/lib/core/context.js.map +0 -1
  424. package/dist/lib/core/debugger.js.map +0 -1
  425. package/dist/lib/core/features.js.map +0 -1
  426. package/dist/lib/core/logger.js.map +0 -1
  427. package/dist/lib/core/origin-checker.js.map +0 -1
  428. package/dist/lib/core/performance-monitor.js.map +0 -1
  429. package/dist/lib/core/util.js.map +0 -1
  430. package/dist/lib/core/validator.js.map +0 -1
  431. package/dist/lib/css/IPropertyDescriptor.js.map +0 -1
  432. package/dist/lib/css/ITypeDescriptor.js.map +0 -1
  433. package/dist/lib/css/index.js.map +0 -1
  434. package/dist/lib/css/layout/__mocks__/bounds.js +0 -9
  435. package/dist/lib/css/layout/__mocks__/bounds.js.map +0 -1
  436. package/dist/lib/css/layout/bounds.js.map +0 -1
  437. package/dist/lib/css/layout/text.js.map +0 -1
  438. package/dist/lib/css/property-descriptors/__tests__/background-tests.js +0 -49
  439. package/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +0 -1
  440. package/dist/lib/css/property-descriptors/__tests__/clip-path.test.js +0 -273
  441. package/dist/lib/css/property-descriptors/__tests__/clip-path.test.js.map +0 -1
  442. package/dist/lib/css/property-descriptors/__tests__/font-family.js +0 -19
  443. package/dist/lib/css/property-descriptors/__tests__/font-family.js.map +0 -1
  444. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js +0 -143
  445. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js.map +0 -1
  446. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js.map +0 -1
  447. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js +0 -61
  448. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js.map +0 -1
  449. package/dist/lib/css/property-descriptors/__tests__/paint-order.js +0 -66
  450. package/dist/lib/css/property-descriptors/__tests__/paint-order.js.map +0 -1
  451. package/dist/lib/css/property-descriptors/__tests__/text-shadow.js +0 -82
  452. package/dist/lib/css/property-descriptors/__tests__/text-shadow.js.map +0 -1
  453. package/dist/lib/css/property-descriptors/__tests__/transform-tests.js +0 -14
  454. package/dist/lib/css/property-descriptors/__tests__/transform-tests.js.map +0 -1
  455. package/dist/lib/css/property-descriptors/background-clip.js.map +0 -1
  456. package/dist/lib/css/property-descriptors/background-color.js.map +0 -1
  457. package/dist/lib/css/property-descriptors/background-image.js.map +0 -1
  458. package/dist/lib/css/property-descriptors/background-origin.js.map +0 -1
  459. package/dist/lib/css/property-descriptors/background-position.js.map +0 -1
  460. package/dist/lib/css/property-descriptors/background-repeat.js.map +0 -1
  461. package/dist/lib/css/property-descriptors/background-size.js.map +0 -1
  462. package/dist/lib/css/property-descriptors/border-color.js.map +0 -1
  463. package/dist/lib/css/property-descriptors/border-radius.js.map +0 -1
  464. package/dist/lib/css/property-descriptors/border-style.js.map +0 -1
  465. package/dist/lib/css/property-descriptors/border-width.js.map +0 -1
  466. package/dist/lib/css/property-descriptors/box-shadow.js.map +0 -1
  467. package/dist/lib/css/property-descriptors/clip-path.js.map +0 -1
  468. package/dist/lib/css/property-descriptors/color.js.map +0 -1
  469. package/dist/lib/css/property-descriptors/content.js.map +0 -1
  470. package/dist/lib/css/property-descriptors/counter-increment.js.map +0 -1
  471. package/dist/lib/css/property-descriptors/counter-reset.js.map +0 -1
  472. package/dist/lib/css/property-descriptors/direction.js.map +0 -1
  473. package/dist/lib/css/property-descriptors/display.js.map +0 -1
  474. package/dist/lib/css/property-descriptors/duration.js.map +0 -1
  475. package/dist/lib/css/property-descriptors/float.js.map +0 -1
  476. package/dist/lib/css/property-descriptors/font-family.js.map +0 -1
  477. package/dist/lib/css/property-descriptors/font-size.js.map +0 -1
  478. package/dist/lib/css/property-descriptors/font-style.js.map +0 -1
  479. package/dist/lib/css/property-descriptors/font-variant.js.map +0 -1
  480. package/dist/lib/css/property-descriptors/font-weight.js.map +0 -1
  481. package/dist/lib/css/property-descriptors/image-rendering.js.map +0 -1
  482. package/dist/lib/css/property-descriptors/letter-spacing.js.map +0 -1
  483. package/dist/lib/css/property-descriptors/line-break.js.map +0 -1
  484. package/dist/lib/css/property-descriptors/line-height.js.map +0 -1
  485. package/dist/lib/css/property-descriptors/list-style-image.js.map +0 -1
  486. package/dist/lib/css/property-descriptors/list-style-position.js.map +0 -1
  487. package/dist/lib/css/property-descriptors/list-style-type.js.map +0 -1
  488. package/dist/lib/css/property-descriptors/margin.js.map +0 -1
  489. package/dist/lib/css/property-descriptors/object-fit.js.map +0 -1
  490. package/dist/lib/css/property-descriptors/opacity.js.map +0 -1
  491. package/dist/lib/css/property-descriptors/overflow-wrap.js.map +0 -1
  492. package/dist/lib/css/property-descriptors/overflow.js.map +0 -1
  493. package/dist/lib/css/property-descriptors/padding.js.map +0 -1
  494. package/dist/lib/css/property-descriptors/paint-order.js.map +0 -1
  495. package/dist/lib/css/property-descriptors/position.js.map +0 -1
  496. package/dist/lib/css/property-descriptors/quotes.js.map +0 -1
  497. package/dist/lib/css/property-descriptors/rotate.js.map +0 -1
  498. package/dist/lib/css/property-descriptors/text-align.js.map +0 -1
  499. package/dist/lib/css/property-descriptors/text-decoration-color.js.map +0 -1
  500. package/dist/lib/css/property-descriptors/text-decoration-line.js.map +0 -1
  501. package/dist/lib/css/property-descriptors/text-decoration-style.js.map +0 -1
  502. package/dist/lib/css/property-descriptors/text-decoration-thickness.js.map +0 -1
  503. package/dist/lib/css/property-descriptors/text-overflow.js.map +0 -1
  504. package/dist/lib/css/property-descriptors/text-shadow.js.map +0 -1
  505. package/dist/lib/css/property-descriptors/text-transform.js.map +0 -1
  506. package/dist/lib/css/property-descriptors/text-underline-offset.js.map +0 -1
  507. package/dist/lib/css/property-descriptors/transform-origin.js.map +0 -1
  508. package/dist/lib/css/property-descriptors/transform.js.map +0 -1
  509. package/dist/lib/css/property-descriptors/visibility.js.map +0 -1
  510. package/dist/lib/css/property-descriptors/webkit-line-clamp.js.map +0 -1
  511. package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js.map +0 -1
  512. package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js.map +0 -1
  513. package/dist/lib/css/property-descriptors/word-break.js.map +0 -1
  514. package/dist/lib/css/property-descriptors/writing-mode.js.map +0 -1
  515. package/dist/lib/css/property-descriptors/z-index.js.map +0 -1
  516. package/dist/lib/css/syntax/__tests__/tokernizer-tests.js +0 -26
  517. package/dist/lib/css/syntax/__tests__/tokernizer-tests.js.map +0 -1
  518. package/dist/lib/css/syntax/parser.js.map +0 -1
  519. package/dist/lib/css/syntax/tokenizer.js.map +0 -1
  520. package/dist/lib/css/types/__tests__/color-tests.js +0 -111
  521. package/dist/lib/css/types/__tests__/color-tests.js.map +0 -1
  522. package/dist/lib/css/types/__tests__/image-tests.js +0 -215
  523. package/dist/lib/css/types/__tests__/image-tests.js.map +0 -1
  524. package/dist/lib/css/types/angle.js.map +0 -1
  525. package/dist/lib/css/types/color-math.js.map +0 -1
  526. package/dist/lib/css/types/color-spaces/a98.js.map +0 -1
  527. package/dist/lib/css/types/color-spaces/p3.js.map +0 -1
  528. package/dist/lib/css/types/color-spaces/pro-photo.js.map +0 -1
  529. package/dist/lib/css/types/color-spaces/rec2020.js.map +0 -1
  530. package/dist/lib/css/types/color-spaces/srgb.js.map +0 -1
  531. package/dist/lib/css/types/color-utilities.js.map +0 -1
  532. package/dist/lib/css/types/color.js.map +0 -1
  533. package/dist/lib/css/types/functions/-prefix-linear-gradient.js.map +0 -1
  534. package/dist/lib/css/types/functions/-prefix-radial-gradient.js.map +0 -1
  535. package/dist/lib/css/types/functions/-webkit-gradient.js.map +0 -1
  536. package/dist/lib/css/types/functions/__tests__/radial-gradient.js +0 -63
  537. package/dist/lib/css/types/functions/__tests__/radial-gradient.js.map +0 -1
  538. package/dist/lib/css/types/functions/counter.js.map +0 -1
  539. package/dist/lib/css/types/functions/gradient.js.map +0 -1
  540. package/dist/lib/css/types/functions/linear-gradient.js.map +0 -1
  541. package/dist/lib/css/types/functions/radial-gradient.js.map +0 -1
  542. package/dist/lib/css/types/image.js.map +0 -1
  543. package/dist/lib/css/types/index.js.map +0 -1
  544. package/dist/lib/css/types/length-percentage.js.map +0 -1
  545. package/dist/lib/css/types/length.js.map +0 -1
  546. package/dist/lib/css/types/time.js.map +0 -1
  547. package/dist/lib/dom/__mocks__/document-cloner.js +0 -23
  548. package/dist/lib/dom/__mocks__/document-cloner.js.map +0 -1
  549. package/dist/lib/dom/__tests__/dom-normalizer.test.js.map +0 -1
  550. package/dist/lib/dom/__tests__/element-container.test.js +0 -109
  551. package/dist/lib/dom/__tests__/element-container.test.js.map +0 -1
  552. package/dist/lib/dom/document-cloner.js.map +0 -1
  553. package/dist/lib/dom/dom-normalizer.js.map +0 -1
  554. package/dist/lib/dom/element-container.js.map +0 -1
  555. package/dist/lib/dom/elements/li-element-container.js.map +0 -1
  556. package/dist/lib/dom/elements/ol-element-container.js.map +0 -1
  557. package/dist/lib/dom/elements/select-element-container.js.map +0 -1
  558. package/dist/lib/dom/elements/textarea-element-container.js.map +0 -1
  559. package/dist/lib/dom/node-parser.js.map +0 -1
  560. package/dist/lib/dom/node-type-guards.js.map +0 -1
  561. package/dist/lib/dom/replaced-elements/canvas-element-container.js.map +0 -1
  562. package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +0 -1
  563. package/dist/lib/dom/replaced-elements/image-element-container.js.map +0 -1
  564. package/dist/lib/dom/replaced-elements/index.js.map +0 -1
  565. package/dist/lib/dom/replaced-elements/input-element-container.js.map +0 -1
  566. package/dist/lib/dom/replaced-elements/pseudo-elements.js.map +0 -1
  567. package/dist/lib/dom/replaced-elements/svg-element-container.js.map +0 -1
  568. package/dist/lib/dom/text-container.js.map +0 -1
  569. package/dist/lib/index.js.map +0 -1
  570. package/dist/lib/invariant.js.map +0 -1
  571. package/dist/lib/render/background.js.map +0 -1
  572. package/dist/lib/render/bezier-curve.js.map +0 -1
  573. package/dist/lib/render/border.js.map +0 -1
  574. package/dist/lib/render/bound-curves.js.map +0 -1
  575. package/dist/lib/render/box-sizing.js.map +0 -1
  576. package/dist/lib/render/canvas/__tests__/background-renderer.test.js.map +0 -1
  577. package/dist/lib/render/canvas/__tests__/border-renderer.test.js +0 -23
  578. package/dist/lib/render/canvas/__tests__/border-renderer.test.js.map +0 -1
  579. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js +0 -30
  580. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js.map +0 -1
  581. package/dist/lib/render/canvas/__tests__/text-renderer.test.js +0 -402
  582. package/dist/lib/render/canvas/__tests__/text-renderer.test.js.map +0 -1
  583. package/dist/lib/render/canvas/background-renderer.js.map +0 -1
  584. package/dist/lib/render/canvas/border-renderer.js.map +0 -1
  585. package/dist/lib/render/canvas/canvas-renderer.js.map +0 -1
  586. package/dist/lib/render/canvas/effects-renderer.js.map +0 -1
  587. package/dist/lib/render/canvas/foreignobject-renderer.js.map +0 -1
  588. package/dist/lib/render/canvas/text-renderer.js.map +0 -1
  589. package/dist/lib/render/effects.js.map +0 -1
  590. package/dist/lib/render/font-metrics.js.map +0 -1
  591. package/dist/lib/render/path.js.map +0 -1
  592. package/dist/lib/render/renderer-interface.js.map +0 -1
  593. package/dist/lib/render/renderer.js +0 -11
  594. package/dist/lib/render/renderer.js.map +0 -1
  595. package/dist/lib/render/stacking-context.js.map +0 -1
  596. package/dist/lib/render/vector.js.map +0 -1
  597. package/dist/types/__tests__/index.d.ts +0 -1
  598. package/dist/types/core/__mocks__/cache-storage.d.ts +0 -2
  599. package/dist/types/core/__mocks__/context.d.ts +0 -9
  600. package/dist/types/core/__mocks__/features.d.ts +0 -8
  601. package/dist/types/core/__mocks__/logger.d.ts +0 -9
  602. package/dist/types/core/__tests__/cache-storage.d.ts +0 -1
  603. package/dist/types/core/__tests__/cache-storage.test.d.ts +0 -1
  604. package/dist/types/core/__tests__/logger.d.ts +0 -1
  605. package/dist/types/core/__tests__/validator.d.ts +0 -1
  606. package/dist/types/css/layout/__mocks__/bounds.d.ts +0 -2
  607. package/dist/types/css/property-descriptors/__tests__/background-tests.d.ts +0 -1
  608. package/dist/types/css/property-descriptors/__tests__/clip-path.test.d.ts +0 -1
  609. package/dist/types/css/property-descriptors/__tests__/font-family.d.ts +0 -1
  610. package/dist/types/css/property-descriptors/__tests__/image-rendering-integration.test.d.ts +0 -1
  611. package/dist/types/css/property-descriptors/__tests__/image-rendering-performance.test.d.ts +0 -1
  612. package/dist/types/css/property-descriptors/__tests__/image-rendering.test.d.ts +0 -1
  613. package/dist/types/css/property-descriptors/__tests__/paint-order.d.ts +0 -1
  614. package/dist/types/css/property-descriptors/__tests__/text-shadow.d.ts +0 -1
  615. package/dist/types/css/property-descriptors/__tests__/transform-tests.d.ts +0 -1
  616. package/dist/types/css/syntax/__tests__/tokernizer-tests.d.ts +0 -1
  617. package/dist/types/css/types/__tests__/color-tests.d.ts +0 -1
  618. package/dist/types/css/types/__tests__/image-tests.d.ts +0 -1
  619. package/dist/types/css/types/functions/__tests__/radial-gradient.d.ts +0 -1
  620. package/dist/types/dom/__mocks__/document-cloner.d.ts +0 -6
  621. package/dist/types/dom/__tests__/dom-normalizer.test.d.ts +0 -1
  622. package/dist/types/dom/__tests__/element-container.test.d.ts +0 -1
  623. package/dist/types/render/canvas/__tests__/background-renderer.test.d.ts +0 -1
  624. package/dist/types/render/canvas/__tests__/border-renderer.test.d.ts +0 -1
  625. package/dist/types/render/canvas/__tests__/effects-renderer.test.d.ts +0 -1
  626. package/dist/types/render/canvas/__tests__/text-renderer.test.d.ts +0 -1
  627. package/dist/types/render/renderer.d.ts +0 -7
  628. package/eslint.config.js +0 -35
  629. package/jest.config.cjs +0 -5
  630. package/karma.conf.cjs +0 -300
  631. /package/dist/types/css/{IPropertyDescriptor.d.ts → property-descriptor.d.ts} +0 -0
  632. /package/dist/types/css/{ITypeDescriptor.d.ts → type-descriptor.d.ts} +0 -0
@@ -0,0 +1,822 @@
1
+ // https://www.w3.org/TR/css-syntax-3
2
+
3
+ import { fromCodePoint, toCodePoints } from 'css-line-break';
4
+
5
+ export const enum TokenType {
6
+ STRING_TOKEN,
7
+ BAD_STRING_TOKEN,
8
+ LEFT_PARENTHESIS_TOKEN,
9
+ RIGHT_PARENTHESIS_TOKEN,
10
+ COMMA_TOKEN,
11
+ HASH_TOKEN,
12
+ DELIM_TOKEN,
13
+ AT_KEYWORD_TOKEN,
14
+ PREFIX_MATCH_TOKEN,
15
+ DASH_MATCH_TOKEN,
16
+ INCLUDE_MATCH_TOKEN,
17
+ LEFT_CURLY_BRACKET_TOKEN,
18
+ RIGHT_CURLY_BRACKET_TOKEN,
19
+ SUFFIX_MATCH_TOKEN,
20
+ SUBSTRING_MATCH_TOKEN,
21
+ DIMENSION_TOKEN,
22
+ PERCENTAGE_TOKEN,
23
+ NUMBER_TOKEN,
24
+ FUNCTION,
25
+ FUNCTION_TOKEN,
26
+ IDENT_TOKEN,
27
+ COLUMN_TOKEN,
28
+ URL_TOKEN,
29
+ BAD_URL_TOKEN,
30
+ CDC_TOKEN,
31
+ CDO_TOKEN,
32
+ COLON_TOKEN,
33
+ SEMICOLON_TOKEN,
34
+ LEFT_SQUARE_BRACKET_TOKEN,
35
+ RIGHT_SQUARE_BRACKET_TOKEN,
36
+ UNICODE_RANGE_TOKEN,
37
+ WHITESPACE_TOKEN,
38
+ EOF_TOKEN
39
+ }
40
+
41
+ interface IToken {
42
+ type: TokenType;
43
+ }
44
+
45
+ export interface Token extends IToken {
46
+ type:
47
+ | TokenType.BAD_URL_TOKEN
48
+ | TokenType.BAD_STRING_TOKEN
49
+ | TokenType.LEFT_PARENTHESIS_TOKEN
50
+ | TokenType.RIGHT_PARENTHESIS_TOKEN
51
+ | TokenType.COMMA_TOKEN
52
+ | TokenType.SUBSTRING_MATCH_TOKEN
53
+ | TokenType.PREFIX_MATCH_TOKEN
54
+ | TokenType.SUFFIX_MATCH_TOKEN
55
+ | TokenType.COLON_TOKEN
56
+ | TokenType.SEMICOLON_TOKEN
57
+ | TokenType.LEFT_SQUARE_BRACKET_TOKEN
58
+ | TokenType.RIGHT_SQUARE_BRACKET_TOKEN
59
+ | TokenType.LEFT_CURLY_BRACKET_TOKEN
60
+ | TokenType.RIGHT_CURLY_BRACKET_TOKEN
61
+ | TokenType.DASH_MATCH_TOKEN
62
+ | TokenType.INCLUDE_MATCH_TOKEN
63
+ | TokenType.COLUMN_TOKEN
64
+ | TokenType.WHITESPACE_TOKEN
65
+ | TokenType.CDC_TOKEN
66
+ | TokenType.CDO_TOKEN
67
+ | TokenType.EOF_TOKEN;
68
+ }
69
+
70
+ export interface StringValueToken extends IToken {
71
+ type:
72
+ | TokenType.STRING_TOKEN
73
+ | TokenType.DELIM_TOKEN
74
+ | TokenType.FUNCTION_TOKEN
75
+ | TokenType.IDENT_TOKEN
76
+ | TokenType.URL_TOKEN
77
+ | TokenType.AT_KEYWORD_TOKEN;
78
+ value: string;
79
+ }
80
+
81
+ export interface HashToken extends IToken {
82
+ type: TokenType.HASH_TOKEN;
83
+ flags: number;
84
+ value: string;
85
+ }
86
+
87
+ export interface NumberValueToken extends IToken {
88
+ type: TokenType.PERCENTAGE_TOKEN | TokenType.NUMBER_TOKEN;
89
+ flags: number;
90
+ number: number;
91
+ }
92
+
93
+ export interface DimensionToken extends IToken {
94
+ type: TokenType.DIMENSION_TOKEN;
95
+ flags: number;
96
+ unit: string;
97
+ number: number;
98
+ }
99
+
100
+ export interface UnicodeRangeToken extends IToken {
101
+ type: TokenType.UNICODE_RANGE_TOKEN;
102
+ start: number;
103
+ end: number;
104
+ }
105
+
106
+ export type CSSToken = Token | StringValueToken | NumberValueToken | DimensionToken | UnicodeRangeToken | HashToken;
107
+
108
+ export const FLAG_UNRESTRICTED = 1 << 0;
109
+ export const FLAG_ID = 1 << 1;
110
+ export const FLAG_INTEGER = 1 << 2;
111
+ export const FLAG_NUMBER = 1 << 3;
112
+
113
+ const LINE_FEED = 0x000a;
114
+ const SOLIDUS = 0x002f;
115
+ const REVERSE_SOLIDUS = 0x005c;
116
+ const CHARACTER_TABULATION = 0x0009;
117
+ const SPACE = 0x0020;
118
+ const QUOTATION_MARK = 0x0022;
119
+ const EQUALS_SIGN = 0x003d;
120
+ const NUMBER_SIGN = 0x0023;
121
+ const DOLLAR_SIGN = 0x0024;
122
+ const PERCENTAGE_SIGN = 0x0025;
123
+ const APOSTROPHE = 0x0027;
124
+ const LEFT_PARENTHESIS = 0x0028;
125
+ const RIGHT_PARENTHESIS = 0x0029;
126
+ const LOW_LINE = 0x005f;
127
+ const HYPHEN_MINUS = 0x002d;
128
+ const EXCLAMATION_MARK = 0x0021;
129
+ const LESS_THAN_SIGN = 0x003c;
130
+ const GREATER_THAN_SIGN = 0x003e;
131
+ const COMMERCIAL_AT = 0x0040;
132
+ const LEFT_SQUARE_BRACKET = 0x005b;
133
+ const RIGHT_SQUARE_BRACKET = 0x005d;
134
+ const CIRCUMFLEX_ACCENT = 0x003d;
135
+ const LEFT_CURLY_BRACKET = 0x007b;
136
+ const QUESTION_MARK = 0x003f;
137
+ const RIGHT_CURLY_BRACKET = 0x007d;
138
+ const VERTICAL_LINE = 0x007c;
139
+ const TILDE = 0x007e;
140
+ const CONTROL = 0x0080;
141
+ const REPLACEMENT_CHARACTER = 0xfffd;
142
+ const ASTERISK = 0x002a;
143
+ const PLUS_SIGN = 0x002b;
144
+ const COMMA = 0x002c;
145
+ const COLON = 0x003a;
146
+ const SEMICOLON = 0x003b;
147
+ const FULL_STOP = 0x002e;
148
+ const NULL = 0x0000;
149
+ const BACKSPACE = 0x0008;
150
+ const LINE_TABULATION = 0x000b;
151
+ const SHIFT_OUT = 0x000e;
152
+ const INFORMATION_SEPARATOR_ONE = 0x001f;
153
+ const DELETE = 0x007f;
154
+ const EOF = -1;
155
+ const ZERO = 0x0030;
156
+ const a = 0x0061;
157
+ const e = 0x0065;
158
+ const f = 0x0066;
159
+ const u = 0x0075;
160
+ const z = 0x007a;
161
+ const A = 0x0041;
162
+ const E = 0x0045;
163
+ const F = 0x0046;
164
+ const U = 0x0055;
165
+ const Z = 0x005a;
166
+
167
+ const isDigit = (codePoint: number) => codePoint >= ZERO && codePoint <= 0x0039;
168
+ const isSurrogateCodePoint = (codePoint: number) => codePoint >= 0xd800 && codePoint <= 0xdfff;
169
+ const isHex = (codePoint: number) =>
170
+ isDigit(codePoint) || (codePoint >= A && codePoint <= F) || (codePoint >= a && codePoint <= f);
171
+ const isLowerCaseLetter = (codePoint: number) => codePoint >= a && codePoint <= z;
172
+ const isUpperCaseLetter = (codePoint: number) => codePoint >= A && codePoint <= Z;
173
+ const isLetter = (codePoint: number) => isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint);
174
+ const isNonASCIICodePoint = (codePoint: number) => codePoint >= CONTROL;
175
+ const isWhiteSpace = (codePoint: number): boolean =>
176
+ codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE;
177
+ const isNameStartCodePoint = (codePoint: number): boolean =>
178
+ isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE;
179
+ const isNameCodePoint = (codePoint: number): boolean =>
180
+ isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS;
181
+ const isNonPrintableCodePoint = (codePoint: number): boolean => {
182
+ return (
183
+ (codePoint >= NULL && codePoint <= BACKSPACE) ||
184
+ codePoint === LINE_TABULATION ||
185
+ (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) ||
186
+ codePoint === DELETE
187
+ );
188
+ };
189
+ const isValidEscape = (c1: number, c2: number): boolean => {
190
+ if (c1 !== REVERSE_SOLIDUS) {
191
+ return false;
192
+ }
193
+
194
+ return c2 !== LINE_FEED;
195
+ };
196
+ const isIdentifierStart = (c1: number, c2: number, c3: number): boolean => {
197
+ if (c1 === HYPHEN_MINUS) {
198
+ return isNameStartCodePoint(c2) || isValidEscape(c2, c3);
199
+ } else if (isNameStartCodePoint(c1)) {
200
+ return true;
201
+ } else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) {
202
+ return true;
203
+ }
204
+ return false;
205
+ };
206
+
207
+ const isNumberStart = (c1: number, c2: number, c3: number): boolean => {
208
+ if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {
209
+ if (isDigit(c2)) {
210
+ return true;
211
+ }
212
+
213
+ return c2 === FULL_STOP && isDigit(c3);
214
+ }
215
+
216
+ if (c1 === FULL_STOP) {
217
+ return isDigit(c2);
218
+ }
219
+
220
+ return isDigit(c1);
221
+ };
222
+
223
+ const stringToNumber = (codePoints: number[]): number => {
224
+ let c = 0;
225
+ let sign = 1;
226
+ if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {
227
+ if (codePoints[c] === HYPHEN_MINUS) {
228
+ sign = -1;
229
+ }
230
+ c++;
231
+ }
232
+
233
+ const integers = [];
234
+
235
+ while (isDigit(codePoints[c])) {
236
+ integers.push(codePoints[c++]);
237
+ }
238
+
239
+ const int = integers.length ? parseInt(fromCodePoint(...integers), 10) : 0;
240
+
241
+ if (codePoints[c] === FULL_STOP) {
242
+ c++;
243
+ }
244
+
245
+ const fraction = [];
246
+ while (isDigit(codePoints[c])) {
247
+ fraction.push(codePoints[c++]);
248
+ }
249
+
250
+ const fracd = fraction.length;
251
+ const frac = fracd ? parseInt(fromCodePoint(...fraction), 10) : 0;
252
+
253
+ if (codePoints[c] === E || codePoints[c] === e) {
254
+ c++;
255
+ }
256
+
257
+ let expsign = 1;
258
+
259
+ if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {
260
+ if (codePoints[c] === HYPHEN_MINUS) {
261
+ expsign = -1;
262
+ }
263
+ c++;
264
+ }
265
+
266
+ const exponent = [];
267
+
268
+ while (isDigit(codePoints[c])) {
269
+ exponent.push(codePoints[c++]);
270
+ }
271
+
272
+ const exp = exponent.length ? parseInt(fromCodePoint(...exponent), 10) : 0;
273
+
274
+ return sign * (int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp);
275
+ };
276
+
277
+ const LEFT_PARENTHESIS_TOKEN: Token = {
278
+ type: TokenType.LEFT_PARENTHESIS_TOKEN
279
+ };
280
+ const RIGHT_PARENTHESIS_TOKEN: Token = {
281
+ type: TokenType.RIGHT_PARENTHESIS_TOKEN
282
+ };
283
+ const COMMA_TOKEN: Token = { type: TokenType.COMMA_TOKEN };
284
+ const SUFFIX_MATCH_TOKEN: Token = { type: TokenType.SUFFIX_MATCH_TOKEN };
285
+ const PREFIX_MATCH_TOKEN: Token = { type: TokenType.PREFIX_MATCH_TOKEN };
286
+ const COLUMN_TOKEN: Token = { type: TokenType.COLUMN_TOKEN };
287
+ const DASH_MATCH_TOKEN: Token = { type: TokenType.DASH_MATCH_TOKEN };
288
+ const INCLUDE_MATCH_TOKEN: Token = { type: TokenType.INCLUDE_MATCH_TOKEN };
289
+ const LEFT_CURLY_BRACKET_TOKEN: Token = {
290
+ type: TokenType.LEFT_CURLY_BRACKET_TOKEN
291
+ };
292
+ const RIGHT_CURLY_BRACKET_TOKEN: Token = {
293
+ type: TokenType.RIGHT_CURLY_BRACKET_TOKEN
294
+ };
295
+ const SUBSTRING_MATCH_TOKEN: Token = { type: TokenType.SUBSTRING_MATCH_TOKEN };
296
+ const BAD_URL_TOKEN: Token = { type: TokenType.BAD_URL_TOKEN };
297
+ const BAD_STRING_TOKEN: Token = { type: TokenType.BAD_STRING_TOKEN };
298
+ const CDO_TOKEN: Token = { type: TokenType.CDO_TOKEN };
299
+ const CDC_TOKEN: Token = { type: TokenType.CDC_TOKEN };
300
+ const COLON_TOKEN: Token = { type: TokenType.COLON_TOKEN };
301
+ const SEMICOLON_TOKEN: Token = { type: TokenType.SEMICOLON_TOKEN };
302
+ const LEFT_SQUARE_BRACKET_TOKEN: Token = {
303
+ type: TokenType.LEFT_SQUARE_BRACKET_TOKEN
304
+ };
305
+ const RIGHT_SQUARE_BRACKET_TOKEN: Token = {
306
+ type: TokenType.RIGHT_SQUARE_BRACKET_TOKEN
307
+ };
308
+ const WHITESPACE_TOKEN: Token = { type: TokenType.WHITESPACE_TOKEN };
309
+ export const EOF_TOKEN: Token = { type: TokenType.EOF_TOKEN };
310
+
311
+ export class Tokenizer {
312
+ private static _pool: Tokenizer[] = [];
313
+ private static readonly MAX_POOL_SIZE = 40;
314
+
315
+ static get(): Tokenizer {
316
+ return Tokenizer._pool.pop() || new Tokenizer();
317
+ }
318
+
319
+ static release(tokenizer: Tokenizer): void {
320
+ if (Tokenizer._pool.length < Tokenizer.MAX_POOL_SIZE) {
321
+ tokenizer._reset();
322
+ Tokenizer._pool.push(tokenizer);
323
+ }
324
+ }
325
+
326
+ private _value: number[];
327
+
328
+ constructor() {
329
+ this._value = [];
330
+ }
331
+
332
+ private _reset(): void {
333
+ this._value = [];
334
+ }
335
+
336
+ write(chunk: string): void {
337
+ this._value = this._value.concat(toCodePoints(chunk));
338
+ }
339
+
340
+ read(): CSSToken[] {
341
+ const tokens = [];
342
+ let token = this.consumeToken();
343
+ while (token !== EOF_TOKEN) {
344
+ tokens.push(token);
345
+ token = this.consumeToken();
346
+ }
347
+ return tokens;
348
+ }
349
+
350
+ private consumeToken(): CSSToken {
351
+ const codePoint = this.consumeCodePoint();
352
+
353
+ switch (codePoint) {
354
+ case QUOTATION_MARK:
355
+ return this.consumeStringToken(QUOTATION_MARK);
356
+ case NUMBER_SIGN:
357
+ const c1 = this.peekCodePoint(0);
358
+ const c2 = this.peekCodePoint(1);
359
+ const c3 = this.peekCodePoint(2);
360
+ if (isNameCodePoint(c1) || isValidEscape(c2, c3)) {
361
+ const flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED;
362
+ const value = this.consumeName();
363
+
364
+ return { type: TokenType.HASH_TOKEN, value, flags };
365
+ }
366
+ break;
367
+ case DOLLAR_SIGN:
368
+ if (this.peekCodePoint(0) === EQUALS_SIGN) {
369
+ this.consumeCodePoint();
370
+ return SUFFIX_MATCH_TOKEN;
371
+ }
372
+ break;
373
+ case APOSTROPHE:
374
+ return this.consumeStringToken(APOSTROPHE);
375
+ case LEFT_PARENTHESIS:
376
+ return LEFT_PARENTHESIS_TOKEN;
377
+ case RIGHT_PARENTHESIS:
378
+ return RIGHT_PARENTHESIS_TOKEN;
379
+ case ASTERISK:
380
+ if (this.peekCodePoint(0) === EQUALS_SIGN) {
381
+ this.consumeCodePoint();
382
+ return SUBSTRING_MATCH_TOKEN;
383
+ }
384
+ break;
385
+ case PLUS_SIGN:
386
+ if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {
387
+ this.reconsumeCodePoint(codePoint);
388
+ return this.consumeNumericToken();
389
+ }
390
+ break;
391
+ case COMMA:
392
+ return COMMA_TOKEN;
393
+ case HYPHEN_MINUS:
394
+ const e1 = codePoint;
395
+ const e2 = this.peekCodePoint(0);
396
+ const e3 = this.peekCodePoint(1);
397
+
398
+ if (isNumberStart(e1, e2, e3)) {
399
+ this.reconsumeCodePoint(codePoint);
400
+ return this.consumeNumericToken();
401
+ }
402
+
403
+ if (isIdentifierStart(e1, e2, e3)) {
404
+ this.reconsumeCodePoint(codePoint);
405
+ return this.consumeIdentLikeToken();
406
+ }
407
+
408
+ if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) {
409
+ this.consumeCodePoint();
410
+ this.consumeCodePoint();
411
+ return CDC_TOKEN;
412
+ }
413
+ break;
414
+
415
+ case FULL_STOP:
416
+ if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {
417
+ this.reconsumeCodePoint(codePoint);
418
+ return this.consumeNumericToken();
419
+ }
420
+ break;
421
+ case SOLIDUS:
422
+ if (this.peekCodePoint(0) === ASTERISK) {
423
+ this.consumeCodePoint();
424
+ while (true) {
425
+ let c = this.consumeCodePoint();
426
+ if (c === ASTERISK) {
427
+ c = this.consumeCodePoint();
428
+ if (c === SOLIDUS) {
429
+ return this.consumeToken();
430
+ }
431
+ }
432
+ if (c === EOF) {
433
+ return this.consumeToken();
434
+ }
435
+ }
436
+ }
437
+ break;
438
+ case COLON:
439
+ return COLON_TOKEN;
440
+ case SEMICOLON:
441
+ return SEMICOLON_TOKEN;
442
+ case LESS_THAN_SIGN:
443
+ if (
444
+ this.peekCodePoint(0) === EXCLAMATION_MARK &&
445
+ this.peekCodePoint(1) === HYPHEN_MINUS &&
446
+ this.peekCodePoint(2) === HYPHEN_MINUS
447
+ ) {
448
+ this.consumeCodePoint();
449
+ this.consumeCodePoint();
450
+ return CDO_TOKEN;
451
+ }
452
+ break;
453
+ case COMMERCIAL_AT:
454
+ const a1 = this.peekCodePoint(0);
455
+ const a2 = this.peekCodePoint(1);
456
+ const a3 = this.peekCodePoint(2);
457
+ if (isIdentifierStart(a1, a2, a3)) {
458
+ const value = this.consumeName();
459
+ return { type: TokenType.AT_KEYWORD_TOKEN, value };
460
+ }
461
+ break;
462
+ case LEFT_SQUARE_BRACKET:
463
+ return LEFT_SQUARE_BRACKET_TOKEN;
464
+ case REVERSE_SOLIDUS:
465
+ if (isValidEscape(codePoint, this.peekCodePoint(0))) {
466
+ this.reconsumeCodePoint(codePoint);
467
+ return this.consumeIdentLikeToken();
468
+ }
469
+ break;
470
+ case RIGHT_SQUARE_BRACKET:
471
+ return RIGHT_SQUARE_BRACKET_TOKEN;
472
+ case CIRCUMFLEX_ACCENT:
473
+ if (this.peekCodePoint(0) === EQUALS_SIGN) {
474
+ this.consumeCodePoint();
475
+ return PREFIX_MATCH_TOKEN;
476
+ }
477
+ break;
478
+ case LEFT_CURLY_BRACKET:
479
+ return LEFT_CURLY_BRACKET_TOKEN;
480
+ case RIGHT_CURLY_BRACKET:
481
+ return RIGHT_CURLY_BRACKET_TOKEN;
482
+ case u:
483
+ case U:
484
+ const u1 = this.peekCodePoint(0);
485
+ const u2 = this.peekCodePoint(1);
486
+ if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) {
487
+ this.consumeCodePoint();
488
+ this.consumeUnicodeRangeToken();
489
+ }
490
+ this.reconsumeCodePoint(codePoint);
491
+ return this.consumeIdentLikeToken();
492
+ case VERTICAL_LINE:
493
+ if (this.peekCodePoint(0) === EQUALS_SIGN) {
494
+ this.consumeCodePoint();
495
+ return DASH_MATCH_TOKEN;
496
+ }
497
+ if (this.peekCodePoint(0) === VERTICAL_LINE) {
498
+ this.consumeCodePoint();
499
+ return COLUMN_TOKEN;
500
+ }
501
+ break;
502
+ case TILDE:
503
+ if (this.peekCodePoint(0) === EQUALS_SIGN) {
504
+ this.consumeCodePoint();
505
+ return INCLUDE_MATCH_TOKEN;
506
+ }
507
+ break;
508
+ case EOF:
509
+ return EOF_TOKEN;
510
+ }
511
+
512
+ if (isWhiteSpace(codePoint)) {
513
+ this.consumeWhiteSpace();
514
+ return WHITESPACE_TOKEN;
515
+ }
516
+
517
+ if (isDigit(codePoint)) {
518
+ this.reconsumeCodePoint(codePoint);
519
+ return this.consumeNumericToken();
520
+ }
521
+
522
+ if (isNameStartCodePoint(codePoint)) {
523
+ this.reconsumeCodePoint(codePoint);
524
+ return this.consumeIdentLikeToken();
525
+ }
526
+
527
+ return { type: TokenType.DELIM_TOKEN, value: fromCodePoint(codePoint) };
528
+ }
529
+
530
+ private consumeCodePoint(): number {
531
+ const value = this._value.shift();
532
+
533
+ return typeof value === 'undefined' ? -1 : value;
534
+ }
535
+
536
+ private reconsumeCodePoint(codePoint: number) {
537
+ this._value.unshift(codePoint);
538
+ }
539
+
540
+ private peekCodePoint(delta: number): number {
541
+ if (delta >= this._value.length) {
542
+ return -1;
543
+ }
544
+
545
+ return this._value[delta];
546
+ }
547
+
548
+ private consumeUnicodeRangeToken(): UnicodeRangeToken {
549
+ const digits = [];
550
+ let codePoint = this.consumeCodePoint();
551
+ while (isHex(codePoint) && digits.length < 6) {
552
+ digits.push(codePoint);
553
+ codePoint = this.consumeCodePoint();
554
+ }
555
+ let questionMarks = false;
556
+ while (codePoint === QUESTION_MARK && digits.length < 6) {
557
+ digits.push(codePoint);
558
+ codePoint = this.consumeCodePoint();
559
+ questionMarks = true;
560
+ }
561
+
562
+ if (questionMarks) {
563
+ const start = parseInt(
564
+ fromCodePoint(...digits.map((digit) => (digit === QUESTION_MARK ? ZERO : digit))),
565
+ 16
566
+ );
567
+ const end = parseInt(fromCodePoint(...digits.map((digit) => (digit === QUESTION_MARK ? F : digit))), 16);
568
+ return { type: TokenType.UNICODE_RANGE_TOKEN, start, end };
569
+ }
570
+
571
+ const start = parseInt(fromCodePoint(...digits), 16);
572
+ if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) {
573
+ this.consumeCodePoint();
574
+ codePoint = this.consumeCodePoint();
575
+ const endDigits = [];
576
+ while (isHex(codePoint) && endDigits.length < 6) {
577
+ endDigits.push(codePoint);
578
+ codePoint = this.consumeCodePoint();
579
+ }
580
+ const end = parseInt(fromCodePoint(...endDigits), 16);
581
+
582
+ return { type: TokenType.UNICODE_RANGE_TOKEN, start, end };
583
+ } else {
584
+ return { type: TokenType.UNICODE_RANGE_TOKEN, start, end: start };
585
+ }
586
+ }
587
+
588
+ private consumeIdentLikeToken(): StringValueToken | Token {
589
+ const value = this.consumeName();
590
+ if (value.toLowerCase() === 'url' && this.peekCodePoint(0) === LEFT_PARENTHESIS) {
591
+ this.consumeCodePoint();
592
+ return this.consumeUrlToken();
593
+ } else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) {
594
+ this.consumeCodePoint();
595
+ return { type: TokenType.FUNCTION_TOKEN, value };
596
+ }
597
+
598
+ return { type: TokenType.IDENT_TOKEN, value };
599
+ }
600
+
601
+ private consumeUrlToken(): StringValueToken | Token {
602
+ const value = [];
603
+ this.consumeWhiteSpace();
604
+
605
+ if (this.peekCodePoint(0) === EOF) {
606
+ return { type: TokenType.URL_TOKEN, value: '' };
607
+ }
608
+
609
+ const next = this.peekCodePoint(0);
610
+ if (next === APOSTROPHE || next === QUOTATION_MARK) {
611
+ const stringToken = this.consumeStringToken(this.consumeCodePoint());
612
+ if (stringToken.type === TokenType.STRING_TOKEN) {
613
+ this.consumeWhiteSpace();
614
+
615
+ if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {
616
+ this.consumeCodePoint();
617
+ return { type: TokenType.URL_TOKEN, value: stringToken.value };
618
+ }
619
+ }
620
+
621
+ this.consumeBadUrlRemnants();
622
+ return BAD_URL_TOKEN;
623
+ }
624
+
625
+ while (true) {
626
+ const codePoint = this.consumeCodePoint();
627
+ if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) {
628
+ return { type: TokenType.URL_TOKEN, value: fromCodePoint(...value) };
629
+ } else if (isWhiteSpace(codePoint)) {
630
+ this.consumeWhiteSpace();
631
+ if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {
632
+ this.consumeCodePoint();
633
+ return { type: TokenType.URL_TOKEN, value: fromCodePoint(...value) };
634
+ }
635
+ this.consumeBadUrlRemnants();
636
+ return BAD_URL_TOKEN;
637
+ } else if (
638
+ codePoint === QUOTATION_MARK ||
639
+ codePoint === APOSTROPHE ||
640
+ codePoint === LEFT_PARENTHESIS ||
641
+ isNonPrintableCodePoint(codePoint)
642
+ ) {
643
+ this.consumeBadUrlRemnants();
644
+ return BAD_URL_TOKEN;
645
+ } else if (codePoint === REVERSE_SOLIDUS) {
646
+ if (isValidEscape(codePoint, this.peekCodePoint(0))) {
647
+ value.push(this.consumeEscapedCodePoint());
648
+ } else {
649
+ this.consumeBadUrlRemnants();
650
+ return BAD_URL_TOKEN;
651
+ }
652
+ } else {
653
+ value.push(codePoint);
654
+ }
655
+ }
656
+ }
657
+
658
+ private consumeWhiteSpace(): void {
659
+ while (isWhiteSpace(this.peekCodePoint(0))) {
660
+ this.consumeCodePoint();
661
+ }
662
+ }
663
+
664
+ private consumeBadUrlRemnants(): void {
665
+ while (true) {
666
+ const codePoint = this.consumeCodePoint();
667
+ if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) {
668
+ return;
669
+ }
670
+
671
+ if (isValidEscape(codePoint, this.peekCodePoint(0))) {
672
+ this.consumeEscapedCodePoint();
673
+ }
674
+ }
675
+ }
676
+
677
+ private consumeStringSlice(count: number): string {
678
+ const SLICE_STACK_SIZE = 50000;
679
+ let value = '';
680
+ while (count > 0) {
681
+ const amount = Math.min(SLICE_STACK_SIZE, count);
682
+ value += fromCodePoint(...this._value.splice(0, amount));
683
+ count -= amount;
684
+ }
685
+ this._value.shift();
686
+
687
+ return value;
688
+ }
689
+
690
+ private consumeStringToken(endingCodePoint: number): StringValueToken | Token {
691
+ let value = '';
692
+ let i = 0;
693
+
694
+ do {
695
+ const codePoint = this._value[i];
696
+ if (codePoint === EOF || codePoint === undefined || codePoint === endingCodePoint) {
697
+ value += this.consumeStringSlice(i);
698
+ return { type: TokenType.STRING_TOKEN, value };
699
+ }
700
+
701
+ if (codePoint === LINE_FEED) {
702
+ this._value.splice(0, i);
703
+ return BAD_STRING_TOKEN;
704
+ }
705
+
706
+ if (codePoint === REVERSE_SOLIDUS) {
707
+ const next = this._value[i + 1];
708
+ if (next !== EOF && next !== undefined) {
709
+ if (next === LINE_FEED) {
710
+ value += this.consumeStringSlice(i);
711
+ i = -1;
712
+ this._value.shift();
713
+ } else if (isValidEscape(codePoint, next)) {
714
+ value += this.consumeStringSlice(i);
715
+ value += fromCodePoint(this.consumeEscapedCodePoint());
716
+ i = -1;
717
+ }
718
+ }
719
+ }
720
+
721
+ i++;
722
+ } while (true);
723
+ }
724
+
725
+ private consumeNumber() {
726
+ const repr = [];
727
+ let type = FLAG_INTEGER;
728
+ let c1 = this.peekCodePoint(0);
729
+ if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {
730
+ repr.push(this.consumeCodePoint());
731
+ }
732
+
733
+ while (isDigit(this.peekCodePoint(0))) {
734
+ repr.push(this.consumeCodePoint());
735
+ }
736
+ c1 = this.peekCodePoint(0);
737
+ let c2 = this.peekCodePoint(1);
738
+ if (c1 === FULL_STOP && isDigit(c2)) {
739
+ repr.push(this.consumeCodePoint(), this.consumeCodePoint());
740
+ type = FLAG_NUMBER;
741
+ while (isDigit(this.peekCodePoint(0))) {
742
+ repr.push(this.consumeCodePoint());
743
+ }
744
+ }
745
+
746
+ c1 = this.peekCodePoint(0);
747
+ c2 = this.peekCodePoint(1);
748
+ const c3 = this.peekCodePoint(2);
749
+ if ((c1 === E || c1 === e) && (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || isDigit(c2))) {
750
+ repr.push(this.consumeCodePoint(), this.consumeCodePoint());
751
+ type = FLAG_NUMBER;
752
+ while (isDigit(this.peekCodePoint(0))) {
753
+ repr.push(this.consumeCodePoint());
754
+ }
755
+ }
756
+
757
+ return [stringToNumber(repr), type];
758
+ }
759
+
760
+ private consumeNumericToken(): NumberValueToken | DimensionToken {
761
+ const [number, flags] = this.consumeNumber();
762
+ const c1 = this.peekCodePoint(0);
763
+ const c2 = this.peekCodePoint(1);
764
+ const c3 = this.peekCodePoint(2);
765
+
766
+ if (isIdentifierStart(c1, c2, c3)) {
767
+ const unit = this.consumeName();
768
+ return { type: TokenType.DIMENSION_TOKEN, number, flags, unit };
769
+ }
770
+
771
+ if (c1 === PERCENTAGE_SIGN) {
772
+ this.consumeCodePoint();
773
+ return { type: TokenType.PERCENTAGE_TOKEN, number, flags };
774
+ }
775
+
776
+ return { type: TokenType.NUMBER_TOKEN, number, flags };
777
+ }
778
+
779
+ private consumeEscapedCodePoint(): number {
780
+ const codePoint = this.consumeCodePoint();
781
+
782
+ if (isHex(codePoint)) {
783
+ let hex = fromCodePoint(codePoint);
784
+ while (isHex(this.peekCodePoint(0)) && hex.length < 6) {
785
+ hex += fromCodePoint(this.consumeCodePoint());
786
+ }
787
+
788
+ if (isWhiteSpace(this.peekCodePoint(0))) {
789
+ this.consumeCodePoint();
790
+ }
791
+
792
+ const hexCodePoint = parseInt(hex, 16);
793
+
794
+ if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 0x10ffff) {
795
+ return REPLACEMENT_CHARACTER;
796
+ }
797
+
798
+ return hexCodePoint;
799
+ }
800
+
801
+ if (codePoint === EOF) {
802
+ return REPLACEMENT_CHARACTER;
803
+ }
804
+
805
+ return codePoint;
806
+ }
807
+
808
+ private consumeName(): string {
809
+ let result = '';
810
+ while (true) {
811
+ const codePoint = this.consumeCodePoint();
812
+ if (isNameCodePoint(codePoint)) {
813
+ result += fromCodePoint(codePoint);
814
+ } else if (isValidEscape(codePoint, this.peekCodePoint(0))) {
815
+ result += fromCodePoint(this.consumeEscapedCodePoint());
816
+ } else {
817
+ this.reconsumeCodePoint(codePoint);
818
+ return result;
819
+ }
820
+ }
821
+ }
822
+ }