@react-x11/components 0.8.0 → 0.10.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.
- package/README.md +105 -38
- package/dist/charts/node.d.ts +12 -2
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +50 -16
- package/dist/charts/node.js.map +1 -1
- package/dist/charts/render.d.ts +12 -3
- package/dist/charts/render.d.ts.map +1 -1
- package/dist/charts/render.js +94 -25
- package/dist/charts/render.js.map +1 -1
- package/dist/code/index.d.ts.map +1 -1
- package/dist/code/index.js +3 -1
- package/dist/code/index.js.map +1 -1
- package/dist/code-editor/completion.d.ts.map +1 -1
- package/dist/code-editor/completion.js +3 -2
- package/dist/code-editor/completion.js.map +1 -1
- package/dist/code-editor/index.d.ts.map +1 -1
- package/dist/code-editor/index.js +19 -0
- package/dist/code-editor/index.js.map +1 -1
- package/dist/code-editor/node.d.ts +177 -7
- package/dist/code-editor/node.d.ts.map +1 -1
- package/dist/code-editor/node.js +1329 -164
- package/dist/code-editor/node.js.map +1 -1
- package/dist/code-language/languages/glsl.d.ts.map +1 -1
- package/dist/code-language/languages/glsl.js +10 -2
- package/dist/code-language/languages/glsl.js.map +1 -1
- package/dist/code-language/languages/javascript.d.ts.map +1 -1
- package/dist/code-language/languages/javascript.js +18 -3
- package/dist/code-language/languages/javascript.js.map +1 -1
- package/dist/code-language/languages/json.d.ts.map +1 -1
- package/dist/code-language/languages/json.js +10 -2
- package/dist/code-language/languages/json.js.map +1 -1
- package/dist/code-language/languages/shell.d.ts.map +1 -1
- package/dist/code-language/languages/shell.js +10 -2
- package/dist/code-language/languages/shell.js.map +1 -1
- package/dist/code-language/languages/sql.d.ts.map +1 -1
- package/dist/code-language/languages/sql.js +20 -2
- package/dist/code-language/languages/sql.js.map +1 -1
- package/dist/code-language/stream.d.ts +22 -0
- package/dist/code-language/stream.d.ts.map +1 -1
- package/dist/code-language/stream.js +259 -9
- package/dist/code-language/stream.js.map +1 -1
- package/dist/code-language/types.d.ts +5 -4
- package/dist/code-language/types.d.ts.map +1 -1
- package/dist/codeblock/index.d.ts +13 -2
- package/dist/codeblock/index.d.ts.map +1 -1
- package/dist/codeblock/index.js +20 -3
- package/dist/codeblock/index.js.map +1 -1
- package/dist/embed/client.d.ts +48 -3
- package/dist/embed/client.d.ts.map +1 -1
- package/dist/embed/client.js +79 -5
- package/dist/embed/client.js.map +1 -1
- package/dist/embed/index.d.ts +1 -1
- package/dist/embed/index.d.ts.map +1 -1
- package/dist/embed/index.js +1 -1
- package/dist/embed/index.js.map +1 -1
- package/dist/flow/draw.d.ts +50 -0
- package/dist/flow/draw.d.ts.map +1 -1
- package/dist/flow/draw.js +132 -33
- package/dist/flow/draw.js.map +1 -1
- package/dist/flow/gl/color.d.ts +13 -0
- package/dist/flow/gl/color.d.ts.map +1 -0
- package/dist/flow/gl/color.js +82 -0
- package/dist/flow/gl/color.js.map +1 -0
- package/dist/flow/gl/index.d.ts +60 -0
- package/dist/flow/gl/index.d.ts.map +1 -0
- package/dist/flow/gl/index.js +283 -0
- package/dist/flow/gl/index.js.map +1 -0
- package/dist/flow/gl/pack.d.ts +133 -0
- package/dist/flow/gl/pack.d.ts.map +1 -0
- package/dist/flow/gl/pack.js +408 -0
- package/dist/flow/gl/pack.js.map +1 -0
- package/dist/flow/gl/renderer.d.ts +95 -0
- package/dist/flow/gl/renderer.d.ts.map +1 -0
- package/dist/flow/gl/renderer.js +459 -0
- package/dist/flow/gl/renderer.js.map +1 -0
- package/dist/flow/gl/shaders.d.ts +79 -0
- package/dist/flow/gl/shaders.d.ts.map +1 -0
- package/dist/flow/gl/shaders.js +346 -0
- package/dist/flow/gl/shaders.js.map +1 -0
- package/dist/flow/gl/text.d.ts +318 -0
- package/dist/flow/gl/text.d.ts.map +1 -0
- package/dist/flow/gl/text.js +1103 -0
- package/dist/flow/gl/text.js.map +1 -0
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +619 -64
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/node.d.ts +621 -72
- package/dist/flow/node.d.ts.map +1 -1
- package/dist/flow/node.js +2253 -1018
- package/dist/flow/node.js.map +1 -1
- package/dist/flow/paint.d.ts +35 -0
- package/dist/flow/paint.d.ts.map +1 -0
- package/dist/flow/paint.js +393 -0
- package/dist/flow/paint.js.map +1 -0
- package/dist/flow/paths.d.ts +14 -0
- package/dist/flow/paths.d.ts.map +1 -1
- package/dist/flow/paths.js +45 -19
- package/dist/flow/paths.js.map +1 -1
- package/dist/flow/scene.d.ts +584 -0
- package/dist/flow/scene.d.ts.map +1 -0
- package/dist/flow/scene.js +1453 -0
- package/dist/flow/scene.js.map +1 -0
- package/dist/flow/types.d.ts +111 -1
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/html/controls.d.ts +28 -0
- package/dist/html/controls.d.ts.map +1 -1
- package/dist/html/controls.js +52 -2
- package/dist/html/controls.js.map +1 -1
- package/dist/html/css/calc.d.ts +14 -0
- package/dist/html/css/calc.d.ts.map +1 -0
- package/dist/html/css/calc.js +344 -0
- package/dist/html/css/calc.js.map +1 -0
- package/dist/html/css/cascade.d.ts +240 -6
- package/dist/html/css/cascade.d.ts.map +1 -1
- package/dist/html/css/cascade.js +1327 -66
- package/dist/html/css/cascade.js.map +1 -1
- package/dist/html/css/color.d.ts +23 -0
- package/dist/html/css/color.d.ts.map +1 -0
- package/dist/html/css/color.js +740 -0
- package/dist/html/css/color.js.map +1 -0
- package/dist/html/css/content.d.ts +92 -0
- package/dist/html/css/content.d.ts.map +1 -0
- package/dist/html/css/content.js +388 -0
- package/dist/html/css/content.js.map +1 -0
- package/dist/html/css/counter-styles.d.ts +76 -0
- package/dist/html/css/counter-styles.d.ts.map +1 -0
- package/dist/html/css/counter-styles.js +893 -0
- package/dist/html/css/counter-styles.js.map +1 -0
- package/dist/html/css/decode.d.ts +12 -0
- package/dist/html/css/decode.d.ts.map +1 -0
- package/dist/html/css/decode.js +116 -0
- package/dist/html/css/decode.js.map +1 -0
- package/dist/html/css/parse.d.ts +110 -10
- package/dist/html/css/parse.d.ts.map +1 -1
- package/dist/html/css/parse.js +1473 -180
- package/dist/html/css/parse.js.map +1 -1
- package/dist/html/css/style.d.ts +498 -15
- package/dist/html/css/style.d.ts.map +1 -1
- package/dist/html/css/style.js +3698 -206
- package/dist/html/css/style.js.map +1 -1
- package/dist/html/css/ua.d.ts.map +1 -1
- package/dist/html/css/ua.js +57 -11
- package/dist/html/css/ua.js.map +1 -1
- package/dist/html/css/values.d.ts +37 -3
- package/dist/html/css/values.d.ts.map +1 -1
- package/dist/html/css/values.js +122 -48
- package/dist/html/css/values.js.map +1 -1
- package/dist/html/css/vars.d.ts +52 -0
- package/dist/html/css/vars.d.ts.map +1 -0
- package/dist/html/css/vars.js +358 -0
- package/dist/html/css/vars.js.map +1 -0
- package/dist/html/dom.d.ts +30 -4
- package/dist/html/dom.d.ts.map +1 -1
- package/dist/html/dom.js +278 -17
- package/dist/html/dom.js.map +1 -1
- package/dist/html/fonts.d.ts +106 -0
- package/dist/html/fonts.d.ts.map +1 -0
- package/dist/html/fonts.js +565 -0
- package/dist/html/fonts.js.map +1 -0
- package/dist/html/gif.d.ts +15 -0
- package/dist/html/gif.d.ts.map +1 -0
- package/dist/html/gif.js +229 -0
- package/dist/html/gif.js.map +1 -0
- package/dist/html/index.d.ts +50 -11
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +115 -9
- package/dist/html/index.js.map +1 -1
- package/dist/html/layout/block.d.ts +226 -3
- package/dist/html/layout/block.d.ts.map +1 -1
- package/dist/html/layout/block.js +2937 -197
- package/dist/html/layout/block.js.map +1 -1
- package/dist/html/layout/boxes.d.ts +340 -17
- package/dist/html/layout/boxes.d.ts.map +1 -1
- package/dist/html/layout/boxes.js +1714 -182
- package/dist/html/layout/boxes.js.map +1 -1
- package/dist/html/layout/cache.d.ts +58 -0
- package/dist/html/layout/cache.d.ts.map +1 -0
- package/dist/html/layout/cache.js +224 -0
- package/dist/html/layout/cache.js.map +1 -0
- package/dist/html/layout/collapse.d.ts +45 -0
- package/dist/html/layout/collapse.d.ts.map +1 -0
- package/dist/html/layout/collapse.js +246 -0
- package/dist/html/layout/collapse.js.map +1 -0
- package/dist/html/layout/css-grid.d.ts +7 -0
- package/dist/html/layout/css-grid.d.ts.map +1 -0
- package/dist/html/layout/css-grid.js +900 -0
- package/dist/html/layout/css-grid.js.map +1 -0
- package/dist/html/layout/flex.d.ts.map +1 -1
- package/dist/html/layout/flex.js +1025 -89
- package/dist/html/layout/flex.js.map +1 -1
- package/dist/html/layout/floats.d.ts +45 -6
- package/dist/html/layout/floats.d.ts.map +1 -1
- package/dist/html/layout/floats.js +113 -14
- package/dist/html/layout/floats.js.map +1 -1
- package/dist/html/layout/grid-lines.d.ts +39 -0
- package/dist/html/layout/grid-lines.d.ts.map +1 -0
- package/dist/html/layout/grid-lines.js +119 -0
- package/dist/html/layout/grid-lines.js.map +1 -0
- package/dist/html/layout/grid.d.ts +53 -0
- package/dist/html/layout/grid.d.ts.map +1 -0
- package/dist/html/layout/grid.js +153 -0
- package/dist/html/layout/grid.js.map +1 -0
- package/dist/html/layout/inline.d.ts +151 -1
- package/dist/html/layout/inline.d.ts.map +1 -1
- package/dist/html/layout/inline.js +3375 -174
- package/dist/html/layout/inline.js.map +1 -1
- package/dist/html/layout/shaping.d.ts +6 -0
- package/dist/html/layout/shaping.d.ts.map +1 -0
- package/dist/html/layout/shaping.js +100 -0
- package/dist/html/layout/shaping.js.map +1 -0
- package/dist/html/layout/table.d.ts +3 -0
- package/dist/html/layout/table.d.ts.map +1 -1
- package/dist/html/layout/table.js +681 -175
- package/dist/html/layout/table.js.map +1 -1
- package/dist/html/layout/tracks.d.ts +44 -0
- package/dist/html/layout/tracks.d.ts.map +1 -0
- package/dist/html/layout/tracks.js +349 -0
- package/dist/html/layout/tracks.js.map +1 -0
- package/dist/html/node.d.ts +172 -5
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +1336 -103
- package/dist/html/node.js.map +1 -1
- package/dist/html/paint.d.ts +92 -3
- package/dist/html/paint.d.ts.map +1 -1
- package/dist/html/paint.js +3503 -141
- package/dist/html/paint.js.map +1 -1
- package/dist/html/resources.d.ts +60 -14
- package/dist/html/resources.d.ts.map +1 -1
- package/dist/html/resources.js +122 -36
- package/dist/html/resources.js.map +1 -1
- package/dist/html/surfaces.d.ts +23 -0
- package/dist/html/surfaces.d.ts.map +1 -0
- package/dist/html/surfaces.js +68 -0
- package/dist/html/surfaces.js.map +1 -0
- package/dist/html/svg.d.ts +80 -0
- package/dist/html/svg.d.ts.map +1 -0
- package/dist/html/svg.js +435 -0
- package/dist/html/svg.js.map +1 -0
- package/dist/html/url.d.ts +23 -0
- package/dist/html/url.d.ts.map +1 -0
- package/dist/html/url.js +80 -0
- package/dist/html/url.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/collate.d.ts +3 -0
- package/dist/internal/collate.d.ts.map +1 -0
- package/dist/internal/collate.js +11 -0
- package/dist/internal/collate.js.map +1 -0
- package/dist/{markdown → internal/markdown}/ast.d.ts +23 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -0
- package/dist/internal/markdown/ast.js +22 -0
- package/dist/internal/markdown/ast.js.map +1 -0
- package/dist/internal/markdown/parse.d.ts.map +1 -0
- package/dist/{markdown → internal/markdown}/parse.js +221 -30
- package/dist/internal/markdown/parse.js.map +1 -0
- package/dist/internal/markdown/stringify.d.ts +4 -0
- package/dist/internal/markdown/stringify.d.ts.map +1 -0
- package/dist/internal/markdown/stringify.js +684 -0
- package/dist/internal/markdown/stringify.js.map +1 -0
- package/dist/internal/markdown/tags.d.ts.map +1 -0
- package/dist/internal/markdown/tags.js.map +1 -0
- package/dist/internal/prewarm.d.ts +18 -0
- package/dist/internal/prewarm.d.ts.map +1 -0
- package/dist/internal/prewarm.js +42 -0
- package/dist/internal/prewarm.js.map +1 -0
- package/dist/internal/scroll.d.ts +3 -2
- package/dist/internal/scroll.d.ts.map +1 -1
- package/dist/internal/scroll.js +1 -0
- package/dist/internal/scroll.js.map +1 -1
- package/dist/internal/sdf.d.ts +20 -0
- package/dist/internal/sdf.d.ts.map +1 -0
- package/dist/internal/sdf.js +216 -0
- package/dist/internal/sdf.js.map +1 -0
- package/dist/internal/splice.d.ts +12 -0
- package/dist/internal/splice.d.ts.map +1 -0
- package/dist/internal/splice.js +23 -0
- package/dist/internal/splice.js.map +1 -0
- package/dist/internal/window.d.ts +12 -0
- package/dist/internal/window.d.ts.map +1 -1
- package/dist/internal/window.js +23 -6
- package/dist/internal/window.js.map +1 -1
- package/dist/maps/anchors.d.ts +103 -0
- package/dist/maps/anchors.d.ts.map +1 -0
- package/dist/maps/anchors.js +790 -0
- package/dist/maps/anchors.js.map +1 -0
- package/dist/maps/controller.d.ts +340 -0
- package/dist/maps/controller.d.ts.map +1 -0
- package/dist/maps/controller.js +822 -0
- package/dist/maps/controller.js.map +1 -0
- package/dist/maps/gl/buckets.d.ts +99 -0
- package/dist/maps/gl/buckets.d.ts.map +1 -0
- package/dist/maps/gl/buckets.js +365 -0
- package/dist/maps/gl/buckets.js.map +1 -0
- package/dist/maps/gl/build-worker.d.ts +15 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -0
- package/dist/maps/gl/build-worker.js +44 -0
- package/dist/maps/gl/build-worker.js.map +1 -0
- package/dist/maps/gl/color.d.ts +8 -0
- package/dist/maps/gl/color.d.ts.map +1 -0
- package/dist/maps/gl/color.js +57 -0
- package/dist/maps/gl/color.js.map +1 -0
- package/dist/maps/gl/cover.d.ts +70 -0
- package/dist/maps/gl/cover.d.ts.map +1 -0
- package/dist/maps/gl/cover.js +137 -0
- package/dist/maps/gl/cover.js.map +1 -0
- package/dist/maps/gl/index.d.ts +3 -0
- package/dist/maps/gl/index.d.ts.map +1 -0
- package/dist/maps/gl/index.js +20 -0
- package/dist/maps/gl/index.js.map +1 -0
- package/dist/maps/gl/markers.d.ts +28 -0
- package/dist/maps/gl/markers.d.ts.map +1 -0
- package/dist/maps/gl/markers.js +60 -0
- package/dist/maps/gl/markers.js.map +1 -0
- package/dist/maps/gl/overlays.d.ts +68 -0
- package/dist/maps/gl/overlays.d.ts.map +1 -0
- package/dist/maps/gl/overlays.js +300 -0
- package/dist/maps/gl/overlays.js.map +1 -0
- package/dist/maps/gl/pane.d.ts +12 -0
- package/dist/maps/gl/pane.d.ts.map +1 -0
- package/dist/maps/gl/pane.js +37 -0
- package/dist/maps/gl/pane.js.map +1 -0
- package/dist/maps/gl/placement.d.ts +124 -0
- package/dist/maps/gl/placement.d.ts.map +1 -0
- package/dist/maps/gl/placement.js +642 -0
- package/dist/maps/gl/placement.js.map +1 -0
- package/dist/maps/gl/renderer.d.ts +384 -0
- package/dist/maps/gl/renderer.d.ts.map +1 -0
- package/dist/maps/gl/renderer.js +1184 -0
- package/dist/maps/gl/renderer.js.map +1 -0
- package/dist/maps/gl/shaders.d.ts +121 -0
- package/dist/maps/gl/shaders.d.ts.map +1 -0
- package/dist/maps/gl/shaders.js +453 -0
- package/dist/maps/gl/shaders.js.map +1 -0
- package/dist/maps/gl/store.d.ts +125 -0
- package/dist/maps/gl/store.d.ts.map +1 -0
- package/dist/maps/gl/store.js +512 -0
- package/dist/maps/gl/store.js.map +1 -0
- package/dist/maps/gl/text.d.ts +283 -0
- package/dist/maps/gl/text.d.ts.map +1 -0
- package/dist/maps/gl/text.js +698 -0
- package/dist/maps/gl/text.js.map +1 -0
- package/dist/maps/gl/view.d.ts +345 -0
- package/dist/maps/gl/view.d.ts.map +1 -0
- package/dist/maps/gl/view.js +1209 -0
- package/dist/maps/gl/view.js.map +1 -0
- package/dist/maps/icons.d.ts +32 -0
- package/dist/maps/icons.d.ts.map +1 -0
- package/dist/maps/icons.js +151 -0
- package/dist/maps/icons.js.map +1 -0
- package/dist/maps/index.d.ts +3 -1
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +218 -52
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +91 -18
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +376 -140
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +179 -56
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +663 -537
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/overlay.d.ts +72 -9
- package/dist/maps/overlay.d.ts.map +1 -1
- package/dist/maps/overlay.js +108 -28
- package/dist/maps/overlay.js.map +1 -1
- package/dist/maps/paint.d.ts +3 -0
- package/dist/maps/paint.d.ts.map +1 -1
- package/dist/maps/paint.js.map +1 -1
- package/dist/maps/proj.d.ts +62 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +101 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/renderer.d.ts +69 -0
- package/dist/maps/renderer.d.ts.map +1 -0
- package/dist/maps/renderer.js +66 -0
- package/dist/maps/renderer.js.map +1 -0
- package/dist/maps/sources.d.ts +30 -6
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +22 -3
- package/dist/maps/sources.js.map +1 -1
- package/dist/maps/style.d.ts +35 -0
- package/dist/maps/style.d.ts.map +1 -1
- package/dist/maps/style.js.map +1 -1
- package/dist/maps/styles.d.ts +12 -0
- package/dist/maps/styles.d.ts.map +1 -1
- package/dist/maps/styles.js +120 -6
- package/dist/maps/styles.js.map +1 -1
- package/dist/maps/theme.d.ts +19 -0
- package/dist/maps/theme.d.ts.map +1 -0
- package/dist/maps/theme.js +44 -0
- package/dist/maps/theme.js.map +1 -0
- package/dist/maps/tiles.d.ts +147 -27
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +221 -54
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +213 -21
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/expressions.d.ts +1 -1
- package/dist/markdown/expressions.d.ts.map +1 -1
- package/dist/markdown/expressions.js.map +1 -1
- package/dist/markdown/index.d.ts +7 -6
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +121 -50
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/markdown/spans.js +6 -0
- package/dist/markdown/spans.js.map +1 -1
- package/dist/media-player/index.d.ts +11 -3
- package/dist/media-player/index.d.ts.map +1 -1
- package/dist/media-player/index.js +13 -2
- package/dist/media-player/index.js.map +1 -1
- package/dist/qml/containers.d.ts.map +1 -1
- package/dist/qml/containers.js +6 -1
- package/dist/qml/containers.js.map +1 -1
- package/dist/qml/interaction.d.ts.map +1 -1
- package/dist/qml/interaction.js +38 -5
- package/dist/qml/interaction.js.map +1 -1
- package/dist/qml/layouts.d.ts.map +1 -1
- package/dist/qml/layouts.js +21 -6
- package/dist/qml/layouts.js.map +1 -1
- package/dist/qml/qtquick.d.ts.map +1 -1
- package/dist/qml/qtquick.js +9 -2
- package/dist/qml/qtquick.js.map +1 -1
- package/dist/qml/react.d.ts.map +1 -1
- package/dist/qml/react.js +9 -7
- package/dist/qml/react.js.map +1 -1
- package/dist/reorder/clock.d.ts +7 -0
- package/dist/reorder/clock.d.ts.map +1 -0
- package/dist/reorder/clock.js +26 -0
- package/dist/reorder/clock.js.map +1 -0
- package/dist/reorder/index.d.ts +25 -3
- package/dist/reorder/index.d.ts.map +1 -1
- package/dist/reorder/index.js +64 -19
- package/dist/reorder/index.js.map +1 -1
- package/dist/rich-text-editor/clipboard.d.ts +23 -0
- package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
- package/dist/rich-text-editor/clipboard.js +307 -0
- package/dist/rich-text-editor/clipboard.js.map +1 -0
- package/dist/rich-text-editor/collab.d.ts +32 -0
- package/dist/rich-text-editor/collab.d.ts.map +1 -0
- package/dist/rich-text-editor/collab.js +55 -0
- package/dist/rich-text-editor/collab.js.map +1 -0
- package/dist/rich-text-editor/commands.d.ts +50 -0
- package/dist/rich-text-editor/commands.d.ts.map +1 -0
- package/dist/rich-text-editor/commands.js +376 -0
- package/dist/rich-text-editor/commands.js.map +1 -0
- package/dist/rich-text-editor/drag.d.ts +68 -0
- package/dist/rich-text-editor/drag.d.ts.map +1 -0
- package/dist/rich-text-editor/drag.js +148 -0
- package/dist/rich-text-editor/drag.js.map +1 -0
- package/dist/rich-text-editor/html.d.ts +145 -0
- package/dist/rich-text-editor/html.d.ts.map +1 -0
- package/dist/rich-text-editor/html.js +516 -0
- package/dist/rich-text-editor/html.js.map +1 -0
- package/dist/rich-text-editor/index.d.ts +252 -0
- package/dist/rich-text-editor/index.d.ts.map +1 -0
- package/dist/rich-text-editor/index.js +856 -0
- package/dist/rich-text-editor/index.js.map +1 -0
- package/dist/rich-text-editor/inline.d.ts +94 -0
- package/dist/rich-text-editor/inline.d.ts.map +1 -0
- package/dist/rich-text-editor/inline.js +252 -0
- package/dist/rich-text-editor/inline.js.map +1 -0
- package/dist/rich-text-editor/keymap.d.ts +71 -0
- package/dist/rich-text-editor/keymap.d.ts.map +1 -0
- package/dist/rich-text-editor/keymap.js +394 -0
- package/dist/rich-text-editor/keymap.js.map +1 -0
- package/dist/rich-text-editor/keys.d.ts +40 -0
- package/dist/rich-text-editor/keys.d.ts.map +1 -0
- package/dist/rich-text-editor/keys.js +202 -0
- package/dist/rich-text-editor/keys.js.map +1 -0
- package/dist/rich-text-editor/look.d.ts +71 -0
- package/dist/rich-text-editor/look.d.ts.map +1 -0
- package/dist/rich-text-editor/look.js +342 -0
- package/dist/rich-text-editor/look.js.map +1 -0
- package/dist/rich-text-editor/markdown.d.ts +18 -0
- package/dist/rich-text-editor/markdown.d.ts.map +1 -0
- package/dist/rich-text-editor/markdown.js +496 -0
- package/dist/rich-text-editor/markdown.js.map +1 -0
- package/dist/rich-text-editor/marks.d.ts +9 -0
- package/dist/rich-text-editor/marks.d.ts.map +1 -0
- package/dist/rich-text-editor/marks.js +83 -0
- package/dist/rich-text-editor/marks.js.map +1 -0
- package/dist/rich-text-editor/nodes.d.ts +135 -0
- package/dist/rich-text-editor/nodes.d.ts.map +1 -0
- package/dist/rich-text-editor/nodes.js +397 -0
- package/dist/rich-text-editor/nodes.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts +68 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -0
- package/dist/rich-text-editor/render.js +518 -0
- package/dist/rich-text-editor/render.js.map +1 -0
- package/dist/rich-text-editor/schema.d.ts +16 -0
- package/dist/rich-text-editor/schema.d.ts.map +1 -0
- package/dist/rich-text-editor/schema.js +386 -0
- package/dist/rich-text-editor/schema.js.map +1 -0
- package/dist/rich-text-editor/store.d.ts +11 -0
- package/dist/rich-text-editor/store.d.ts.map +1 -0
- package/dist/rich-text-editor/store.js +43 -0
- package/dist/rich-text-editor/store.js.map +1 -0
- package/dist/rich-text-editor/suggest.d.ts +127 -0
- package/dist/rich-text-editor/suggest.d.ts.map +1 -0
- package/dist/rich-text-editor/suggest.js +0 -0
- package/dist/rich-text-editor/suggest.js.map +1 -0
- package/dist/rich-text-editor/tables.d.ts +41 -0
- package/dist/rich-text-editor/tables.d.ts.map +1 -0
- package/dist/rich-text-editor/tables.js +204 -0
- package/dist/rich-text-editor/tables.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts +58 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
- package/dist/rich-text-editor/toolbar.js +548 -0
- package/dist/rich-text-editor/toolbar.js.map +1 -0
- package/dist/rich-text-editor/view.d.ts +368 -0
- package/dist/rich-text-editor/view.d.ts.map +1 -0
- package/dist/rich-text-editor/view.js +1968 -0
- package/dist/rich-text-editor/view.js.map +1 -0
- package/dist/rich-text-editor/virtual.d.ts +54 -0
- package/dist/rich-text-editor/virtual.d.ts.map +1 -0
- package/dist/rich-text-editor/virtual.js +279 -0
- package/dist/rich-text-editor/virtual.js.map +1 -0
- package/dist/richtext/node.d.ts +71 -4
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +233 -28
- package/dist/richtext/node.js.map +1 -1
- package/dist/richtext/runs.d.ts +13 -8
- package/dist/richtext/runs.d.ts.map +1 -1
- package/dist/richtext/runs.js +18 -8
- package/dist/richtext/runs.js.map +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +23 -0
- package/dist/table/index.js.map +1 -1
- package/dist/table/rows.d.ts +3 -2
- package/dist/table/rows.d.ts.map +1 -1
- package/dist/table/rows.js +20 -6
- package/dist/table/rows.js.map +1 -1
- package/dist/terminal/backends.d.ts +4 -1
- package/dist/terminal/backends.d.ts.map +1 -1
- package/dist/terminal/backends.js.map +1 -1
- package/dist/terminal/index.d.ts +18 -7
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +32 -11
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/vt/pty.d.ts +13 -2
- package/dist/terminal/vt/pty.d.ts.map +1 -1
- package/dist/terminal/vt/pty.js +18 -3
- package/dist/terminal/vt/pty.js.map +1 -1
- package/dist/terminal-output/index.d.ts.map +1 -1
- package/dist/terminal-output/index.js +6 -1
- package/dist/terminal-output/index.js.map +1 -1
- package/dist/three/canvas.d.ts.map +1 -1
- package/dist/three/canvas.js +85 -7
- package/dist/three/canvas.js.map +1 -1
- package/dist/three/events.d.ts +22 -4
- package/dist/three/events.d.ts.map +1 -1
- package/dist/three/events.js +34 -4
- package/dist/three/events.js.map +1 -1
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +17 -0
- package/dist/tree/index.js.map +1 -1
- package/package.json +59 -31
- package/src/charts/node.ts +68 -28
- package/src/charts/render.ts +120 -30
- package/src/code/index.ts +3 -1
- package/src/code-editor/completion.ts +3 -2
- package/src/code-editor/index.ts +19 -0
- package/src/code-editor/node.ts +1574 -184
- package/src/code-language/languages/glsl.ts +12 -2
- package/src/code-language/languages/javascript.ts +21 -4
- package/src/code-language/languages/json.ts +12 -2
- package/src/code-language/languages/shell.ts +12 -2
- package/src/code-language/languages/sql.ts +22 -2
- package/src/code-language/stream.ts +257 -17
- package/src/code-language/types.ts +5 -4
- package/src/codeblock/index.ts +20 -3
- package/src/embed/client.ts +102 -8
- package/src/embed/index.ts +2 -0
- package/src/flow/draw.ts +167 -41
- package/src/flow/gl/color.ts +85 -0
- package/src/flow/gl/index.ts +342 -0
- package/src/flow/gl/pack.ts +585 -0
- package/src/flow/gl/renderer.ts +679 -0
- package/src/flow/gl/shaders.ts +371 -0
- package/src/flow/gl/text.ts +1295 -0
- package/src/flow/index.ts +794 -67
- package/src/flow/node.ts +2496 -1256
- package/src/flow/paint.ts +511 -0
- package/src/flow/paths.ts +80 -15
- package/src/flow/scene.ts +2199 -0
- package/src/flow/types.ts +113 -1
- package/src/html/controls.ts +73 -2
- package/src/html/css/calc.ts +385 -0
- package/src/html/css/cascade.ts +1403 -62
- package/src/html/css/color.ts +755 -0
- package/src/html/css/content.ts +417 -0
- package/src/html/css/counter-styles.ts +973 -0
- package/src/html/css/decode.ts +130 -0
- package/src/html/css/parse.ts +1514 -160
- package/src/html/css/style.ts +4102 -222
- package/src/html/css/ua.ts +58 -12
- package/src/html/css/values.ts +150 -50
- package/src/html/css/vars.ts +348 -0
- package/src/html/dom.ts +284 -17
- package/src/html/fonts.ts +641 -0
- package/src/html/gif.ts +233 -0
- package/src/html/index.ts +180 -20
- package/src/html/layout/block.ts +3456 -230
- package/src/html/layout/boxes.ts +2100 -190
- package/src/html/layout/cache.ts +289 -0
- package/src/html/layout/collapse.ts +317 -0
- package/src/html/layout/css-grid.ts +1063 -0
- package/src/html/layout/flex.ts +1115 -106
- package/src/html/layout/floats.ts +128 -14
- package/src/html/layout/grid-lines.ts +141 -0
- package/src/html/layout/grid.ts +181 -0
- package/src/html/layout/inline.ts +3943 -192
- package/src/html/layout/shaping.ts +140 -0
- package/src/html/layout/table.ts +696 -186
- package/src/html/layout/tracks.ts +437 -0
- package/src/html/node.ts +1486 -121
- package/src/html/paint.ts +4293 -169
- package/src/html/resources.ts +161 -50
- package/src/html/surfaces.ts +81 -0
- package/src/html/svg.ts +493 -0
- package/src/html/url.ts +86 -0
- package/src/index.ts +4 -0
- package/src/internal/collate.ts +12 -0
- package/src/{markdown → internal/markdown}/ast.ts +35 -7
- package/src/{markdown → internal/markdown}/parse.ts +288 -35
- package/src/internal/markdown/stringify.ts +772 -0
- package/src/internal/prewarm.ts +45 -0
- package/src/internal/scroll.ts +5 -3
- package/src/internal/sdf.ts +227 -0
- package/src/internal/splice.ts +25 -0
- package/src/internal/window.ts +36 -5
- package/src/maps/anchors.ts +913 -0
- package/src/maps/controller.ts +1084 -0
- package/src/maps/gl/buckets.ts +461 -0
- package/src/maps/gl/build-worker.ts +66 -0
- package/src/maps/gl/color.ts +62 -0
- package/src/maps/gl/cover.ts +205 -0
- package/src/maps/gl/index.ts +23 -0
- package/src/maps/gl/markers.ts +83 -0
- package/src/maps/gl/overlays.ts +379 -0
- package/src/maps/gl/pane.ts +42 -0
- package/src/maps/gl/placement.ts +968 -0
- package/src/maps/gl/renderer.ts +1660 -0
- package/src/maps/gl/shaders.ts +489 -0
- package/src/maps/gl/store.ts +615 -0
- package/src/maps/gl/text.ts +868 -0
- package/src/maps/gl/view.ts +1489 -0
- package/src/maps/icons.ts +183 -0
- package/src/maps/index.ts +274 -81
- package/src/maps/labels.ts +457 -144
- package/src/maps/node.ts +832 -665
- package/src/maps/overlay.ts +148 -43
- package/src/maps/paint.ts +3 -0
- package/src/maps/proj.ts +118 -0
- package/src/maps/renderer.ts +155 -0
- package/src/maps/sources.ts +43 -6
- package/src/maps/style.ts +32 -0
- package/src/maps/styles.ts +215 -4
- package/src/maps/theme.ts +51 -0
- package/src/maps/tiles.ts +253 -62
- package/src/maps/types.ts +213 -21
- package/src/markdown/expressions.ts +5 -1
- package/src/markdown/index.ts +163 -78
- package/src/markdown/spans.ts +6 -1
- package/src/media-player/index.ts +18 -4
- package/src/qml/containers.tsx +6 -1
- package/src/qml/interaction.tsx +42 -5
- package/src/qml/layouts.tsx +21 -6
- package/src/qml/qtquick.tsx +9 -2
- package/src/qml/react.tsx +7 -5
- package/src/reorder/clock.ts +27 -0
- package/src/reorder/index.ts +100 -27
- package/src/rich-text-editor/clipboard.ts +439 -0
- package/src/rich-text-editor/collab.ts +91 -0
- package/src/rich-text-editor/commands.ts +448 -0
- package/src/rich-text-editor/dom-globals.d.ts +23 -0
- package/src/rich-text-editor/drag.ts +211 -0
- package/src/rich-text-editor/html.ts +619 -0
- package/src/rich-text-editor/index.ts +1364 -0
- package/src/rich-text-editor/inline.ts +345 -0
- package/src/rich-text-editor/keymap.ts +510 -0
- package/src/rich-text-editor/keys.ts +228 -0
- package/src/rich-text-editor/look.ts +427 -0
- package/src/rich-text-editor/markdown.ts +653 -0
- package/src/rich-text-editor/marks.ts +101 -0
- package/src/rich-text-editor/nodes.ts +497 -0
- package/src/rich-text-editor/render.ts +837 -0
- package/src/rich-text-editor/schema.ts +431 -0
- package/src/rich-text-editor/store.ts +39 -0
- package/src/rich-text-editor/suggest.ts +597 -0
- package/src/rich-text-editor/tables.ts +272 -0
- package/src/rich-text-editor/toolbar.ts +724 -0
- package/src/rich-text-editor/view.ts +2287 -0
- package/src/rich-text-editor/virtual.ts +372 -0
- package/src/richtext/node.ts +294 -44
- package/src/richtext/runs.ts +23 -12
- package/src/table/index.ts +29 -0
- package/src/table/rows.ts +18 -8
- package/src/terminal/backends.ts +4 -1
- package/src/terminal/index.ts +47 -15
- package/src/terminal/vt/pty.ts +16 -2
- package/src/terminal-output/index.ts +6 -1
- package/src/three/canvas.ts +102 -8
- package/src/three/events.ts +49 -9
- package/src/tree/index.ts +19 -0
- package/dist/markdown/ast.d.ts.map +0 -1
- package/dist/markdown/ast.js +0 -17
- package/dist/markdown/ast.js.map +0 -1
- package/dist/markdown/parse.d.ts.map +0 -1
- package/dist/markdown/parse.js.map +0 -1
- package/dist/markdown/tags.d.ts.map +0 -1
- package/dist/markdown/tags.js.map +0 -1
- /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.js +0 -0
- /package/src/{markdown → internal/markdown}/tags.ts +0 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
// Custom properties and `var()` (CSS Custom Properties 1). A `--name`
|
|
2
|
+
// declaration is kept as written, per element and inherited; a `var()` in
|
|
3
|
+
// any other declaration is replaced by it before the declaration is read,
|
|
4
|
+
// so a shorthand, a `calc()` or a colour function sees the value it names.
|
|
5
|
+
//
|
|
6
|
+
// A document with none of either pays nothing: the cascade asks only when
|
|
7
|
+
// some declaration has one (`Declaration.custom`, `Declaration.vars`).
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* An element's custom properties: its own over those it inherits, with
|
|
11
|
+
* every `var()` in them already replaced. A chain rather than a copy: an
|
|
12
|
+
* element that sets two properties over a theme of three hundred holds
|
|
13
|
+
* two, where a copy made every such element pay for the theme.
|
|
14
|
+
*/
|
|
15
|
+
export class CustomProps {
|
|
16
|
+
/** Its own, where `null` is none over an inherited one (`initial`). */
|
|
17
|
+
readonly own: Map<string, string | null>;
|
|
18
|
+
readonly parent: CustomProps | null;
|
|
19
|
+
private readonly depth: number;
|
|
20
|
+
|
|
21
|
+
constructor(parent: CustomProps | null) {
|
|
22
|
+
// a lookup walks the chain, so a long one is folded into one map
|
|
23
|
+
if (parent && parent.depth >= FOLD_DEPTH) parent = parent.folded();
|
|
24
|
+
this.own = new Map();
|
|
25
|
+
this.parent = parent;
|
|
26
|
+
this.depth = parent ? parent.depth + 1 : 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get(name: string): string | undefined {
|
|
30
|
+
for (let at: CustomProps | null = this; at; at = at.parent) {
|
|
31
|
+
const value = at.own.get(name);
|
|
32
|
+
if (value !== undefined) return value ?? undefined;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** The whole chain as one link, with the same answers. */
|
|
38
|
+
private folded(): CustomProps {
|
|
39
|
+
const out = new CustomProps(null);
|
|
40
|
+
const links: CustomProps[] = [];
|
|
41
|
+
for (let at: CustomProps | null = this; at; at = at.parent) links.push(at);
|
|
42
|
+
for (let i = links.length - 1; i >= 0; i -= 1) {
|
|
43
|
+
for (const [name, value] of links[i].own) {
|
|
44
|
+
if (value === null) out.own.delete(name);
|
|
45
|
+
else out.own.set(name, value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const FOLD_DEPTH = 16;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The custom properties an element has: `own`, its declarations in cascade
|
|
56
|
+
* order, over `parent`'s. A `var()` in one of its own is resolved against
|
|
57
|
+
* the rest, and one that names a property in a cycle with it, or none with
|
|
58
|
+
* no fallback, leaves it no value at all (CSS Custom Properties 1 2.3, 3).
|
|
59
|
+
*/
|
|
60
|
+
export function customProperties(
|
|
61
|
+
own: ReadonlyMap<string, string>,
|
|
62
|
+
parent: CustomProps | null,
|
|
63
|
+
): CustomProps {
|
|
64
|
+
const out = new CustomProps(parent);
|
|
65
|
+
for (const [name, value] of own) {
|
|
66
|
+
const keyword = value.trim().toLowerCase();
|
|
67
|
+
if (keyword === 'initial') {
|
|
68
|
+
out.own.set(name, null);
|
|
69
|
+
} else if (
|
|
70
|
+
keyword === 'inherit' ||
|
|
71
|
+
keyword === 'unset' ||
|
|
72
|
+
keyword === 'revert' ||
|
|
73
|
+
keyword === 'revert-layer'
|
|
74
|
+
) {
|
|
75
|
+
// a custom property inherits, so each of these is its parent's
|
|
76
|
+
out.own.set(name, parent?.get(name) ?? null);
|
|
77
|
+
} else {
|
|
78
|
+
out.own.set(name, value);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const state = new Map<string, boolean>();
|
|
82
|
+
const stack: string[] = [];
|
|
83
|
+
const cyclic = new Set<string>();
|
|
84
|
+
const visit = (name: string): string | undefined => {
|
|
85
|
+
// an inherited one was resolved where it was declared
|
|
86
|
+
if (!own.has(name)) return parent?.get(name);
|
|
87
|
+
const done = state.get(name);
|
|
88
|
+
if (done === false) {
|
|
89
|
+
// on the stack: a cycle, and nothing in it has a value, whatever
|
|
90
|
+
// its fallbacks say
|
|
91
|
+
for (let i = stack.lastIndexOf(name); i < stack.length; i += 1) {
|
|
92
|
+
cyclic.add(stack[i]);
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
if (done === true) return out.own.get(name) ?? undefined;
|
|
97
|
+
state.set(name, false);
|
|
98
|
+
stack.push(name);
|
|
99
|
+
const raw = out.own.get(name);
|
|
100
|
+
if (raw && hasVar(raw)) {
|
|
101
|
+
const value = substitute(raw, visit);
|
|
102
|
+
out.own.set(name, value === null || cyclic.has(name) ? null : value);
|
|
103
|
+
}
|
|
104
|
+
stack.pop();
|
|
105
|
+
state.set(name, true);
|
|
106
|
+
return out.own.get(name) ?? undefined;
|
|
107
|
+
};
|
|
108
|
+
for (const name of own.keys()) visit(name);
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* `substitute`, remembered for the properties it was asked against: the
|
|
114
|
+
* elements under one that sets custom properties share its `CustomProps`,
|
|
115
|
+
* so a `var()` a utility class writes is replaced once for all of them.
|
|
116
|
+
* What is remembered goes with the properties. With none, there is nothing
|
|
117
|
+
* to key it on that would go, and only fallbacks to read.
|
|
118
|
+
*/
|
|
119
|
+
export function substituteIn(
|
|
120
|
+
value: string,
|
|
121
|
+
props: CustomProps | null,
|
|
122
|
+
): string | null {
|
|
123
|
+
if (!props) return substitute(value, null);
|
|
124
|
+
let memo = SUBSTITUTED.get(props);
|
|
125
|
+
if (!memo) {
|
|
126
|
+
memo = new Map();
|
|
127
|
+
SUBSTITUTED.set(props, memo);
|
|
128
|
+
}
|
|
129
|
+
const hit = memo.get(value);
|
|
130
|
+
if (hit !== undefined) return hit;
|
|
131
|
+
const out = substitute(value, props);
|
|
132
|
+
memo.set(value, out);
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const SUBSTITUTED = new WeakMap<CustomProps, Map<string, string | null>>();
|
|
137
|
+
|
|
138
|
+
/** Whether a value has a `var()` in it. */
|
|
139
|
+
export function hasVar(value: string): boolean {
|
|
140
|
+
return VAR.test(value);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Whether each `var()` in a value is one: closed, naming a custom property,
|
|
145
|
+
* and with a fallback, if it has one, that could be a declaration's value —
|
|
146
|
+
* no `;` or `!` outside its brackets, no string a newline cuts off. One that
|
|
147
|
+
* is not makes its declaration invalid as it is parsed, not as it is used,
|
|
148
|
+
* so the declaration before it stands (CSS Custom Properties 1 3).
|
|
149
|
+
*/
|
|
150
|
+
export function validVars(value: string): boolean {
|
|
151
|
+
let i = 0;
|
|
152
|
+
for (;;) {
|
|
153
|
+
const at = findVar(value, i);
|
|
154
|
+
if (at < 0) return true;
|
|
155
|
+
const open = at + 4;
|
|
156
|
+
const close = closingParen(value, open);
|
|
157
|
+
if (close < 0) return false;
|
|
158
|
+
const inner = value.slice(open, close);
|
|
159
|
+
const comma = topLevelComma(inner);
|
|
160
|
+
const name = (comma < 0 ? inner : inner.slice(0, comma)).trim();
|
|
161
|
+
if (!NAME.test(name)) return false;
|
|
162
|
+
if (comma >= 0) {
|
|
163
|
+
const fallback = inner.slice(comma + 1);
|
|
164
|
+
if (topLevel(fallback, ';') >= 0 || topLevel(fallback, '!') >= 0) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
if (hasVar(fallback) && !validVars(fallback)) return false;
|
|
168
|
+
}
|
|
169
|
+
i = close + 1;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** A name a `var()` may give: two dashes, and name characters. `--` alone
|
|
174
|
+
* names nothing a declaration can set, and so falls back. */
|
|
175
|
+
const NAME =
|
|
176
|
+
/^--(?:[\w-]|[^\x00-\x7f]|\\[0-9a-f]{1,6}[ \t\n\r\f]?|\\[^0-9a-f\n\r\f])*$/i;
|
|
177
|
+
|
|
178
|
+
/** A name with its escapes read: `--\30 ` is `--0`. */
|
|
179
|
+
function unescapeName(name: string): string {
|
|
180
|
+
if (!name.includes('\\')) return name;
|
|
181
|
+
return name.replace(
|
|
182
|
+
/\\(?:([0-9a-f]{1,6})[ \t\n\r\f]?|([\s\S]))/gi,
|
|
183
|
+
(_, hex: string | undefined, ch: string | undefined) => {
|
|
184
|
+
if (!hex) return ch ?? '';
|
|
185
|
+
// nothing, a surrogate or past Unicode is the replacement character,
|
|
186
|
+
// as CSS reads it, where `fromCodePoint` would throw
|
|
187
|
+
const code = parseInt(hex, 16);
|
|
188
|
+
const valid =
|
|
189
|
+
code > 0 && code <= 0x10ffff && !(code >= 0xd800 && code <= 0xdfff);
|
|
190
|
+
return String.fromCodePoint(valid ? code : 0xfffd);
|
|
191
|
+
},
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const VAR = /(?:^|[^\w-])var\(/i;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* `value` with each `var()` in it replaced by the custom property it names,
|
|
199
|
+
* or by its fallback where there is none — or null where there is neither,
|
|
200
|
+
* which makes the declaration invalid at computed-value time. A value is
|
|
201
|
+
* put in with a space either side, so what the tokenizer would not join
|
|
202
|
+
* is not joined: `var(--size)px` is no length.
|
|
203
|
+
*/
|
|
204
|
+
export function substitute(
|
|
205
|
+
value: string,
|
|
206
|
+
lookup: CustomProps | ((name: string) => string | undefined) | null,
|
|
207
|
+
): string | null {
|
|
208
|
+
const get =
|
|
209
|
+
typeof lookup === 'function' ? lookup : (name: string) => lookup?.get(name);
|
|
210
|
+
let out = '';
|
|
211
|
+
let i = 0;
|
|
212
|
+
for (;;) {
|
|
213
|
+
const at = findVar(value, i);
|
|
214
|
+
if (at < 0) break;
|
|
215
|
+
const open = at + 4;
|
|
216
|
+
const close = closingParen(value, open);
|
|
217
|
+
if (close < 0) return null;
|
|
218
|
+
const inner = value.slice(open, close);
|
|
219
|
+
const comma = topLevelComma(inner);
|
|
220
|
+
const name = (comma < 0 ? inner : inner.slice(0, comma)).trim();
|
|
221
|
+
if (!NAME.test(name)) return null;
|
|
222
|
+
let replacement = get(unescapeName(name));
|
|
223
|
+
if (replacement === undefined) {
|
|
224
|
+
if (comma < 0) return null;
|
|
225
|
+
const fallback = inner.slice(comma + 1);
|
|
226
|
+
const resolved = hasVar(fallback) ? substitute(fallback, get) : fallback;
|
|
227
|
+
if (resolved === null) return null;
|
|
228
|
+
replacement = resolved;
|
|
229
|
+
}
|
|
230
|
+
out += `${value.slice(i, at)} ${replacement.trim()} `;
|
|
231
|
+
i = close + 1;
|
|
232
|
+
}
|
|
233
|
+
return (out + value.slice(i)).trim();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Where the next `var(` that is a function of its own starts, from `from`. */
|
|
237
|
+
function findVar(value: string, from: number): number {
|
|
238
|
+
const lower = value.toLowerCase();
|
|
239
|
+
let at = lower.indexOf('var(', from);
|
|
240
|
+
while (at > 0 && /[\w-]/.test(value[at - 1])) {
|
|
241
|
+
at = lower.indexOf('var(', at + 4);
|
|
242
|
+
}
|
|
243
|
+
return at;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** The `)` that closes a bracket opened just before `from`, strings and
|
|
247
|
+
* brackets inside it passed over; -1 where none does. */
|
|
248
|
+
function closingParen(value: string, from: number): number {
|
|
249
|
+
let depth = 0;
|
|
250
|
+
for (let i = from; i < value.length; i += 1) {
|
|
251
|
+
const c = value[i];
|
|
252
|
+
if (c === '\\') {
|
|
253
|
+
i += 1;
|
|
254
|
+
} else if (c === '"' || c === "'") {
|
|
255
|
+
const end = stringEnd(value, i);
|
|
256
|
+
if (end < 0) return -1;
|
|
257
|
+
i = end;
|
|
258
|
+
} else if (c === '(' || c === '[' || c === '{') {
|
|
259
|
+
depth += 1;
|
|
260
|
+
} else if (c === ')' || c === ']' || c === '}') {
|
|
261
|
+
if (depth === 0) return c === ')' ? i : -1;
|
|
262
|
+
depth -= 1;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// the end of a style sheet closes what it leaves open (CSS Syntax 3 5.4)
|
|
266
|
+
return value.length;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/** Where a string opened at `at` closes: its quote, or the end, which
|
|
270
|
+
* closes it too — or -1 where a newline cuts it off, a bad string. */
|
|
271
|
+
function stringEnd(value: string, at: number): number {
|
|
272
|
+
const quote = value[at];
|
|
273
|
+
for (let i = at + 1; i < value.length; i += 1) {
|
|
274
|
+
const c = value[i];
|
|
275
|
+
if (c === '\\') i += 1;
|
|
276
|
+
else if (c === quote) return i;
|
|
277
|
+
else if (c === '\n' || c === '\r' || c === '\f') return -1;
|
|
278
|
+
}
|
|
279
|
+
return value.length;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/** Whether a bracket closes that nothing opened, which no value holds. */
|
|
283
|
+
export function unbalanced(value: string): boolean {
|
|
284
|
+
const open: string[] = [];
|
|
285
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
286
|
+
const c = value[i];
|
|
287
|
+
if (c === '\\') {
|
|
288
|
+
i += 1;
|
|
289
|
+
} else if (c === '"' || c === "'") {
|
|
290
|
+
const end = stringEnd(value, i);
|
|
291
|
+
if (end < 0) return true;
|
|
292
|
+
i = end;
|
|
293
|
+
} else if (c === '(' || c === '[' || c === '{') {
|
|
294
|
+
open.push(c === '(' ? ')' : c === '[' ? ']' : '}');
|
|
295
|
+
} else if (c === ')' || c === ']' || c === '}') {
|
|
296
|
+
if (open.pop() !== c) return true;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/** The first `ch` outside brackets and strings, or -1. */
|
|
303
|
+
function topLevel(value: string, ch: string): number {
|
|
304
|
+
let depth = 0;
|
|
305
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
306
|
+
const c = value[i];
|
|
307
|
+
if (c === '\\') {
|
|
308
|
+
i += 1;
|
|
309
|
+
} else if (c === '"' || c === "'") {
|
|
310
|
+
const end = stringEnd(value, i);
|
|
311
|
+
if (end < 0) return -1;
|
|
312
|
+
i = end;
|
|
313
|
+
} else if (c === '(' || c === '[' || c === '{') {
|
|
314
|
+
depth += 1;
|
|
315
|
+
} else if (c === ')' || c === ']' || c === '}') {
|
|
316
|
+
depth -= 1;
|
|
317
|
+
} else if (c === ch && depth === 0) {
|
|
318
|
+
// `<!--` is a token of its own, and no `!`
|
|
319
|
+
if (ch === '!' && value[i - 1] === '<' && value.startsWith('--', i + 1)) {
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
return i;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return -1;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/** The first comma not inside a bracket or a string, or -1. */
|
|
329
|
+
function topLevelComma(value: string): number {
|
|
330
|
+
let depth = 0;
|
|
331
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
332
|
+
const c = value[i];
|
|
333
|
+
if (c === '\\') {
|
|
334
|
+
i += 1;
|
|
335
|
+
} else if (c === '"' || c === "'") {
|
|
336
|
+
const end = value.indexOf(c, i + 1);
|
|
337
|
+
if (end < 0) return -1;
|
|
338
|
+
i = end;
|
|
339
|
+
} else if (c === '(' || c === '[' || c === '{') {
|
|
340
|
+
depth += 1;
|
|
341
|
+
} else if (c === ')' || c === ']' || c === '}') {
|
|
342
|
+
depth -= 1;
|
|
343
|
+
} else if (c === ',' && depth === 0) {
|
|
344
|
+
return i;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return -1;
|
|
348
|
+
}
|
package/src/html/dom.ts
CHANGED
|
@@ -36,27 +36,74 @@ export { Element, Text, Comment } from 'domhandler';
|
|
|
36
36
|
* set is here because the box builder has to skip the same ones. */
|
|
37
37
|
const RAW_TEXT = new Set(['script', 'style', 'textarea', 'title']);
|
|
38
38
|
|
|
39
|
-
/** Never rendered, whatever the stylesheet says
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
|
|
43
|
-
'
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
/** Never rendered, whatever the stylesheet says: a `<template>`'s
|
|
40
|
+
* content is inert. The rest of what has no box of its own — `<head>` and
|
|
41
|
+
* what is in it, `<script>`, `<style>` — is `display: none` by the UA
|
|
42
|
+
* sheet, and shown where an author's sheet says otherwise, as a browser
|
|
43
|
+
* shows it: `head, meta { display: block }` makes a `<meta>`'s `::before`
|
|
44
|
+
* a line of the page. */
|
|
45
|
+
export const NON_RENDERED = new Set(['template']);
|
|
46
|
+
|
|
47
|
+
/** What the HTML parser puts in `<head>`. Where the markup has no `<head>`
|
|
48
|
+
* around it, at the top of the document, it is still the head's, which a
|
|
49
|
+
* browser implies and the UA sheet hides: `* { display: block }` shows no
|
|
50
|
+
* `<title>` or `<style>` there (`inImpliedHead`). */
|
|
51
|
+
const HEAD_CONTENT = new Set([
|
|
52
|
+
'title',
|
|
46
53
|
'meta',
|
|
47
54
|
'link',
|
|
48
|
-
'
|
|
55
|
+
'style',
|
|
56
|
+
'script',
|
|
49
57
|
'base',
|
|
50
|
-
'
|
|
58
|
+
'basefont',
|
|
59
|
+
'bgsound',
|
|
60
|
+
'noframes',
|
|
51
61
|
'noscript',
|
|
62
|
+
'template',
|
|
52
63
|
]);
|
|
53
64
|
|
|
65
|
+
/** Whether an element is head content with no `<head>` around it: at the
|
|
66
|
+
* top of the document or right under `<html>`. */
|
|
67
|
+
export function inImpliedHead(el: Element, tag: string): boolean {
|
|
68
|
+
if (!HEAD_CONTENT.has(tag)) return false;
|
|
69
|
+
const parent = el.parent;
|
|
70
|
+
return !parent || !isElement(parent) || tagOf(parent) === 'html';
|
|
71
|
+
}
|
|
72
|
+
|
|
54
73
|
/** An element's tag name, lowercased — htmlparser2 already lowercases in
|
|
55
|
-
* HTML mode, so this is the assertion rather than the work.
|
|
74
|
+
* HTML mode, so this is the assertion rather than the work. An SVG root
|
|
75
|
+
* under a prefix (`isSvgRoot`) is `svg`, which is what a type selector and
|
|
76
|
+
* everything else here that asks for the tag sees. */
|
|
56
77
|
export function tagOf(node: AnyNode): string {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
78
|
+
if (node.type !== 'tag' && node.type !== 'script' && node.type !== 'style') {
|
|
79
|
+
return '';
|
|
80
|
+
}
|
|
81
|
+
const name = (node as Element).name.toLowerCase();
|
|
82
|
+
return name.endsWith(':svg') && isSvgRoot(node as Element) ? 'svg' : name;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Whether an element is the root of an SVG drawing. The HTML parser names
|
|
89
|
+
* an inline `<svg>` plainly; XHTML may bind a prefix to the SVG namespace
|
|
90
|
+
* (`<svg:svg xmlns:svg="http://www.w3.org/2000/svg">`), which is the same
|
|
91
|
+
* element to an XML parser, and is honoured where the prefix is declared.
|
|
92
|
+
* Only SVG's: a Word document's `<o:p>` under `xmlns:o` is not a paragraph,
|
|
93
|
+
* to this any more than to a browser reading it as HTML.
|
|
94
|
+
*/
|
|
95
|
+
export function isSvgRoot(el: Element): boolean {
|
|
96
|
+
const name = el.name.toLowerCase();
|
|
97
|
+
if (name === 'svg') return true;
|
|
98
|
+
if (!name.endsWith(':svg')) return false;
|
|
99
|
+
const declaration = `xmlns:${name.slice(0, -4)}`;
|
|
100
|
+
for (let node: Element | null = el; node;) {
|
|
101
|
+
const bound = node.attribs[declaration];
|
|
102
|
+
if (bound !== undefined) return bound === SVG_NS;
|
|
103
|
+
const parent: ParentNode | null = node.parent;
|
|
104
|
+
node = parent && parent.type === 'tag' ? (parent as Element) : null;
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
60
107
|
}
|
|
61
108
|
|
|
62
109
|
export function isElement(node: AnyNode | null | undefined): node is Element {
|
|
@@ -84,6 +131,20 @@ export function attr(el: Element, name: string): string | undefined {
|
|
|
84
131
|
return el.attribs?.[name];
|
|
85
132
|
}
|
|
86
133
|
|
|
134
|
+
/** Where an image element's image is: an `<img>`'s `src`, an `<object>`'s
|
|
135
|
+
* `data` — which is shown as an image when it is one (HTML's "the object
|
|
136
|
+
* element"), and as the element's fallback content otherwise — an
|
|
137
|
+
* `<embed>`'s `src` the same, and a `<video>`'s `poster`, the frame it
|
|
138
|
+
* shows until it plays, which here it does not. */
|
|
139
|
+
export function imageUrlOf(el: Element): string | undefined {
|
|
140
|
+
const tag = tagOf(el);
|
|
141
|
+
return tag === 'object'
|
|
142
|
+
? attr(el, 'data')
|
|
143
|
+
: tag === 'video'
|
|
144
|
+
? attr(el, 'poster')
|
|
145
|
+
: attr(el, 'src');
|
|
146
|
+
}
|
|
147
|
+
|
|
87
148
|
/** The text under a node, uncollapsed — what `<style>` hands the CSS parser
|
|
88
149
|
* and what a `<script>` seam is given. */
|
|
89
150
|
export function rawTextOf(node: AnyNode): string {
|
|
@@ -141,6 +202,9 @@ export interface DocumentFacts {
|
|
|
141
202
|
resources: Element[];
|
|
142
203
|
/** `<title>`, when the document had one. */
|
|
143
204
|
title: string | null;
|
|
205
|
+
/** The first `<base>` with an `href`, as written: the document's base URL
|
|
206
|
+
* wherever in the document it stands (HTML 2.5.3). */
|
|
207
|
+
base: string | null;
|
|
144
208
|
}
|
|
145
209
|
|
|
146
210
|
export type SheetRef =
|
|
@@ -273,10 +337,19 @@ export class HtmlSource {
|
|
|
273
337
|
}
|
|
274
338
|
} else if (tag === 'script') {
|
|
275
339
|
facts.scripts.push(el);
|
|
276
|
-
} else if (
|
|
277
|
-
|
|
340
|
+
} else if (
|
|
341
|
+
tag === 'img' ||
|
|
342
|
+
tag === 'image' ||
|
|
343
|
+
tag === 'object' ||
|
|
344
|
+
tag === 'embed' ||
|
|
345
|
+
tag === 'video'
|
|
346
|
+
) {
|
|
347
|
+
if (imageUrlOf(el)) facts.resources.push(el);
|
|
278
348
|
} else if (tag === 'title' && facts.title === null) {
|
|
279
349
|
facts.title = rawTextOf(el).trim();
|
|
350
|
+
} else if (tag === 'base' && facts.base === null) {
|
|
351
|
+
const href = attr(el, 'href');
|
|
352
|
+
if (href !== undefined) facts.base = href;
|
|
280
353
|
}
|
|
281
354
|
}
|
|
282
355
|
this._facts = facts;
|
|
@@ -296,11 +369,205 @@ interface ScannedFacts extends DocumentFacts {
|
|
|
296
369
|
}
|
|
297
370
|
|
|
298
371
|
function freshFacts(): ScannedFacts {
|
|
299
|
-
return {
|
|
372
|
+
return {
|
|
373
|
+
sheets: [],
|
|
374
|
+
scripts: [],
|
|
375
|
+
resources: [],
|
|
376
|
+
title: null,
|
|
377
|
+
base: null,
|
|
378
|
+
scanned: -1,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* domhandler's handler, with the one rule of HTML's tree construction about
|
|
384
|
+
* text that htmlparser2 leaves out: a newline straight after the start tag
|
|
385
|
+
* of a `<pre>`, a `<listing>` or a `<textarea>` is not content (HTML
|
|
386
|
+
* 13.2.6.4.7, "newlines at the start of pre blocks are ignored as an
|
|
387
|
+
* authoring convenience"). Without it every code block written `<pre>` and
|
|
388
|
+
* a line break began with an empty line. A chunk of a stream that ends
|
|
389
|
+
* between the tag and the newline keeps the rule, since the handler does.
|
|
390
|
+
*/
|
|
391
|
+
class Handler extends DomHandler {
|
|
392
|
+
private _afterPre = false;
|
|
393
|
+
/** A written `<html>` at the top of the document, and the document's
|
|
394
|
+
* body, written or implied: where HTML's parser puts content the markup
|
|
395
|
+
* leaves outside them. */
|
|
396
|
+
private _html: Element | null = null;
|
|
397
|
+
private _body: Element | null = null;
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Past `MAX_DEPTH` open elements, what is opened goes into the element at
|
|
401
|
+
* that depth rather than into the one open, still open itself so its end
|
|
402
|
+
* tag closes it: Chrome's parser does the same past 512. Everything that
|
|
403
|
+
* walks a document here — the cascade, the box builder, layout, paint —
|
|
404
|
+
* goes a call deeper for each level, and a page of a few hundred unclosed
|
|
405
|
+
* `<div>`s, which a broken generator writes, ran the stack out.
|
|
406
|
+
*/
|
|
407
|
+
protected override addNode(node: ChildNode): void {
|
|
408
|
+
const stack = this.tagStack;
|
|
409
|
+
if (stack.length <= MAX_DEPTH) {
|
|
410
|
+
super.addNode(node);
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
const parent = stack[MAX_DEPTH - 1];
|
|
414
|
+
const previous = parent.children[parent.children.length - 1];
|
|
415
|
+
parent.children.push(node);
|
|
416
|
+
if (previous) {
|
|
417
|
+
node.prev = previous;
|
|
418
|
+
previous.next = node;
|
|
419
|
+
}
|
|
420
|
+
node.parent = parent;
|
|
421
|
+
this.lastNode = null;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* HTML's parser puts a document's content in a `<body>` whether or not
|
|
426
|
+
* the markup wrote one, and htmlparser2's puts it where it stands. So
|
|
427
|
+
* with a written `<html>`, the first thing that is not head content opens
|
|
428
|
+
* the body it goes in (HTML 13.2.6.4.6, "after head"); without one, a
|
|
429
|
+
* `<body>` written after content takes that content in, which HTML's
|
|
430
|
+
* parser had put in the body it implied; and what comes after the body
|
|
431
|
+
* has ended goes back into it ("after body"), as does a second
|
|
432
|
+
* `<body>`'s attributes. Without it the root box stood in for a body
|
|
433
|
+
* around the `<html>`, and a first paragraph's margin stood below the
|
|
434
|
+
* body's rather than collapsing with it. A fragment — no `<html>`, no
|
|
435
|
+
* `<body>` — is left as it was written, and the root box stands in.
|
|
436
|
+
*/
|
|
437
|
+
override onopentag(name: string, attribs: Record<string, string>): void {
|
|
438
|
+
if (name === 'body' && this._body) {
|
|
439
|
+
// a second body is its attributes, on the first; the parser will end
|
|
440
|
+
// it, so what it ends is the body outside one, or else what is open
|
|
441
|
+
for (const key in attribs) this._body.attribs[key] ??= attribs[key];
|
|
442
|
+
const stack = this.tagStack;
|
|
443
|
+
if (this._outsideBody()) this._reopen();
|
|
444
|
+
else stack.push(stack[stack.length - 1]);
|
|
445
|
+
this._afterPre = false;
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
if (this._outsideBody()) {
|
|
449
|
+
if (this._body) {
|
|
450
|
+
if (name !== 'html') this._reopen();
|
|
451
|
+
} else if (this._html && inBody(name)) this._reopen();
|
|
452
|
+
}
|
|
453
|
+
super.onopentag(name, attribs);
|
|
454
|
+
const opened = this.tagStack[this.tagStack.length - 1] as Element;
|
|
455
|
+
if (name === 'html' && !this._html && opened.parent === this.root) {
|
|
456
|
+
this._html = opened;
|
|
457
|
+
} else if (name === 'body' && !this._body) {
|
|
458
|
+
if (opened.parent === this._html) this._body = opened;
|
|
459
|
+
else if (!this._html && opened.parent === this.root) {
|
|
460
|
+
this._body = opened;
|
|
461
|
+
this._adopt(opened);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
this._afterPre =
|
|
465
|
+
name === 'pre' || name === 'listing' || name === 'textarea';
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/** Whether what is open is the top of the document, or the written
|
|
469
|
+
* `<html>`: where content is outside any body. */
|
|
470
|
+
private _outsideBody(): boolean {
|
|
471
|
+
const top = this.tagStack[this.tagStack.length - 1];
|
|
472
|
+
return top === this.root || (top === this._html && top !== null);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/** Open the `<html>` and its body again, or the body for the first time.
|
|
476
|
+
* The parser never saw them open, so it closes them in the place of what
|
|
477
|
+
* it did open — which is where they would end anyway. */
|
|
478
|
+
private _reopen(): void {
|
|
479
|
+
const stack = this.tagStack;
|
|
480
|
+
if (stack[stack.length - 1] === this.root && this._html) {
|
|
481
|
+
stack.push(this._html);
|
|
482
|
+
}
|
|
483
|
+
if (this._body) stack.push(this._body);
|
|
484
|
+
else {
|
|
485
|
+
super.onopentag('body', {});
|
|
486
|
+
this._body = stack[stack.length - 1] as Element;
|
|
487
|
+
}
|
|
488
|
+
this.lastNode = null;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/** Move into a `<body>` written at the top of the document what went
|
|
492
|
+
* before it there from the first thing that is not head content on. */
|
|
493
|
+
private _adopt(body: Element): void {
|
|
494
|
+
const kids = this.root.children;
|
|
495
|
+
const end = kids.length - 1;
|
|
496
|
+
let start = 0;
|
|
497
|
+
while (start < end && !startsBody(kids[start])) start += 1;
|
|
498
|
+
if (start === end) return;
|
|
499
|
+
const moved = kids.splice(start, end - start);
|
|
500
|
+
const before = kids[start - 1] ?? null;
|
|
501
|
+
body.prev = before;
|
|
502
|
+
if (before) before.next = body;
|
|
503
|
+
moved[0].prev = null;
|
|
504
|
+
moved[moved.length - 1].next = null;
|
|
505
|
+
for (const node of moved) node.parent = body;
|
|
506
|
+
body.children.unshift(...moved);
|
|
507
|
+
if (body.children.length > moved.length) {
|
|
508
|
+
const first = body.children[moved.length];
|
|
509
|
+
first.prev = moved[moved.length - 1];
|
|
510
|
+
moved[moved.length - 1].next = first;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
override onclosetag(): void {
|
|
515
|
+
this._afterPre = false;
|
|
516
|
+
super.onclosetag();
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
override oncomment(data: string): void {
|
|
520
|
+
this._afterPre = false;
|
|
521
|
+
super.oncomment(data);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
override ontext(data: string): void {
|
|
525
|
+
if (
|
|
526
|
+
(this._html || this._body) &&
|
|
527
|
+
NOT_SPACE.test(data) &&
|
|
528
|
+
this._outsideBody()
|
|
529
|
+
) {
|
|
530
|
+
this._reopen();
|
|
531
|
+
}
|
|
532
|
+
if (this._afterPre) {
|
|
533
|
+
this._afterPre = false;
|
|
534
|
+
const skip = data.startsWith('\r\n') ? 2 : data.startsWith('\n') ? 1 : 0;
|
|
535
|
+
if (skip) {
|
|
536
|
+
if (data.length === skip) return;
|
|
537
|
+
data = data.slice(skip);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
super.ontext(data);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/** How deep a document's elements nest (`Handler.addNode`). */
|
|
545
|
+
const MAX_DEPTH = 256;
|
|
546
|
+
|
|
547
|
+
/** Text that is not all the white space HTML's parser leaves in the head. */
|
|
548
|
+
const NOT_SPACE = /[^ \t\n\f\r]/;
|
|
549
|
+
|
|
550
|
+
/** Whether an element opened before the body goes in the body HTML's
|
|
551
|
+
* parser implies, rather than in the head or the `<html>` itself. */
|
|
552
|
+
function inBody(name: string): boolean {
|
|
553
|
+
return (
|
|
554
|
+
name !== 'body' &&
|
|
555
|
+
name !== 'frameset' &&
|
|
556
|
+
name !== 'head' &&
|
|
557
|
+
name !== 'html' &&
|
|
558
|
+
!HEAD_CONTENT.has(name)
|
|
559
|
+
);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/** Whether a node at the top of a document is where HTML's parser would
|
|
563
|
+
* have opened the body: an element that goes in one, or text. */
|
|
564
|
+
function startsBody(node: ChildNode): boolean {
|
|
565
|
+
if (node instanceof Element) return inBody(node.name);
|
|
566
|
+
return node instanceof Text && NOT_SPACE.test(node.data);
|
|
300
567
|
}
|
|
301
568
|
|
|
302
569
|
function createParser(): { parser: Parser; handler: DomHandler } {
|
|
303
|
-
const handler = new
|
|
570
|
+
const handler = new Handler(null, {
|
|
304
571
|
// Positions cost time and memory per node and nothing here reads them.
|
|
305
572
|
withStartIndices: false,
|
|
306
573
|
withEndIndices: false,
|