@wdprlib/parser 3.2.0 → 4.0.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/dist/index.cjs +10451 -8402
- package/dist/index.d.cts +313 -337
- package/dist/index.d.ts +313 -337
- package/dist/index.js +10438 -8389
- package/package.json +1 -1
- package/src/index.ts +7 -0
- package/src/lexer/anchor.ts +48 -0
- package/src/lexer/index.ts +3 -2
- package/src/lexer/lexer.ts +73 -559
- package/src/lexer/options.ts +19 -0
- package/src/lexer/punctuation.ts +70 -0
- package/src/lexer/quoted-string.ts +16 -0
- package/src/lexer/runs.ts +85 -0
- package/src/lexer/spacing-actions.ts +24 -0
- package/src/lexer/state.ts +103 -0
- package/src/lexer/syntax-actions.ts +80 -0
- package/src/lexer/text-actions.ts +41 -0
- package/src/lexer/token-actions.ts +136 -0
- package/src/lexer/token-factory.ts +62 -0
- package/src/lexer/tokenize.ts +18 -0
- package/src/parser/constants.ts +2 -0
- package/src/parser/depth/index.ts +111 -0
- package/src/parser/depth/stack.ts +82 -0
- package/src/parser/parse/block.ts +42 -0
- package/src/parser/parse/context.ts +26 -0
- package/src/parser/parse/footnotes.ts +25 -0
- package/src/parser/parse/index.ts +42 -0
- package/src/parser/parse/options.ts +34 -0
- package/src/parser/parse/parser.ts +79 -0
- package/src/parser/parse/plain-non-ascii.ts +129 -0
- package/src/parser/parse/result.ts +57 -0
- package/src/parser/parse/source.ts +11 -0
- package/src/parser/postprocess/divAdjacentParagraph.ts +1 -1
- package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
- package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
- package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
- package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
- package/src/parser/postprocess/spanStrip/factory.ts +23 -0
- package/src/parser/postprocess/spanStrip/index.ts +8 -0
- package/src/parser/postprocess/spanStrip/merge.ts +117 -0
- package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
- package/src/parser/postprocess/spanStrip/split.ts +67 -0
- package/src/parser/preprocess/expr/chars.ts +15 -0
- package/src/parser/preprocess/expr/evaluate.ts +22 -0
- package/src/parser/preprocess/expr/index.ts +45 -0
- package/src/parser/preprocess/expr/kind.ts +19 -0
- package/src/parser/preprocess/expr/parse.ts +103 -0
- package/src/parser/preprocess/expr/scan.ts +34 -0
- package/src/parser/preprocess/expr/types.ts +14 -0
- package/src/parser/preprocess/typography.ts +70 -5
- package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
- package/src/parser/preprocess/utils/index.ts +13 -0
- package/src/parser/preprocess/utils/raw-regions.ts +153 -0
- package/src/parser/preprocess/whitespace/detection.ts +39 -0
- package/src/parser/preprocess/whitespace/index.ts +79 -0
- package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
- package/src/parser/preprocess/whitespace/patterns.ts +23 -0
- package/src/parser/rules/block/align/body.ts +46 -0
- package/src/parser/rules/block/align/element.ts +13 -0
- package/src/parser/rules/block/align/index.ts +90 -0
- package/src/parser/rules/block/align/syntax.ts +113 -0
- package/src/parser/rules/block/bibliography/body.ts +81 -0
- package/src/parser/rules/block/bibliography/entries.ts +49 -0
- package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
- package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
- package/src/parser/rules/block/bibliography/index.ts +90 -0
- package/src/parser/rules/block/bibliography/open.ts +53 -0
- package/src/parser/rules/block/block-list/bare-content.ts +105 -0
- package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
- package/src/parser/rules/block/block-list/index.ts +51 -0
- package/src/parser/rules/block/block-list/item-content.ts +132 -0
- package/src/parser/rules/block/block-list/li-content.ts +107 -0
- package/src/parser/rules/block/block-list/li-item.ts +77 -0
- package/src/parser/rules/block/block-list/list-block.ts +100 -0
- package/src/parser/rules/block/block-list/open.ts +51 -0
- package/src/parser/rules/block/block-list/tags.ts +50 -0
- package/src/parser/rules/block/blockquote/build.ts +62 -0
- package/src/parser/rules/block/blockquote/index.ts +80 -0
- package/src/parser/rules/block/blockquote/line.ts +79 -0
- package/src/parser/rules/block/blockquote/lines.ts +39 -0
- package/src/parser/rules/block/{center.ts → center/index.ts} +7 -22
- package/src/parser/rules/block/center/open.ts +27 -0
- package/src/parser/rules/block/{clear-float.ts → clear-float/index.ts} +6 -30
- package/src/parser/rules/block/clear-float/syntax.ts +43 -0
- package/src/parser/rules/block/code/attributes.ts +30 -0
- package/src/parser/rules/block/code/content.ts +57 -0
- package/src/parser/rules/block/code/index.ts +100 -0
- package/src/parser/rules/block/collapsible/attributes.ts +95 -0
- package/src/parser/rules/block/collapsible/body.ts +69 -0
- package/src/parser/rules/block/collapsible/index.ts +117 -0
- package/src/parser/rules/block/collapsible/open.ts +51 -0
- package/src/parser/rules/block/collapsible/orphans.ts +31 -0
- package/src/parser/rules/block/collapsible/tags.ts +17 -0
- package/src/parser/rules/block/comment/consume.ts +37 -0
- package/src/parser/rules/block/{comment.ts → comment/index.ts} +12 -38
- package/src/parser/rules/block/{content-separator.ts → content-separator/index.ts} +5 -35
- package/src/parser/rules/block/content-separator/syntax.ts +33 -0
- package/src/parser/rules/block/definition-list/collect.ts +40 -0
- package/src/parser/rules/block/definition-list/index.ts +63 -0
- package/src/parser/rules/block/definition-list/item-key.ts +95 -0
- package/src/parser/rules/block/definition-list/item-value.ts +56 -0
- package/src/parser/rules/block/definition-list/items.ts +54 -0
- package/src/parser/rules/block/div/body.ts +41 -0
- package/src/parser/rules/block/div/close.ts +41 -0
- package/src/parser/rules/block/div/failed.ts +117 -0
- package/src/parser/rules/block/div/index.ts +112 -0
- package/src/parser/rules/block/div/nesting.ts +37 -0
- package/src/parser/rules/block/div/open.ts +59 -0
- package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
- package/src/parser/rules/block/embed-block/content.ts +53 -0
- package/src/parser/rules/block/embed-block/index.ts +91 -0
- package/src/parser/rules/block/embed-block/open.ts +52 -0
- package/src/parser/rules/block/embed-block/tags.ts +5 -0
- package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
- package/src/parser/rules/block/footnoteblock/index.ts +82 -0
- package/src/parser/rules/block/footnoteblock/open.ts +53 -0
- package/src/parser/rules/block/heading/index.ts +87 -0
- package/src/parser/rules/block/heading/open.ts +50 -0
- package/src/parser/rules/block/heading/toc-text.ts +26 -0
- package/src/parser/rules/block/{horizontal-rule.ts → horizontal-rule/index.ts} +4 -21
- package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
- package/src/parser/rules/block/html/body.ts +114 -0
- package/src/parser/rules/block/html/diagnostics.ts +11 -0
- package/src/parser/rules/block/html/index.ts +95 -0
- package/src/parser/rules/block/html/open.ts +36 -0
- package/src/parser/rules/block/iframe/attributes.ts +106 -0
- package/src/parser/rules/block/iframe/index.ts +73 -0
- package/src/parser/rules/block/iframe/open.ts +58 -0
- package/src/parser/rules/block/iframe/source.ts +24 -0
- package/src/parser/rules/block/iframe/url.ts +38 -0
- package/src/parser/rules/block/iftags/body.ts +48 -0
- package/src/parser/rules/block/iftags/condition.ts +24 -0
- package/src/parser/rules/block/{iftags.ts → iftags/index.ts} +16 -58
- package/src/parser/rules/block/include/arguments.ts +48 -0
- package/src/parser/rules/block/include/index.ts +75 -0
- package/src/parser/rules/block/include/location.ts +24 -0
- package/src/parser/rules/block/include/variables.ts +37 -0
- package/src/parser/rules/block/list/index.ts +73 -0
- package/src/parser/rules/block/list/line.ts +77 -0
- package/src/parser/rules/block/list/native.ts +89 -0
- package/src/parser/rules/block/math/content.ts +54 -0
- package/src/parser/rules/block/math/index.ts +106 -0
- package/src/parser/rules/block/math/name.ts +35 -0
- package/src/parser/rules/block/module/body.ts +92 -0
- package/src/parser/rules/block/module/element.ts +33 -0
- package/src/parser/rules/block/module/include/directive.ts +91 -0
- package/src/parser/rules/block/module/include/index.ts +11 -2
- package/src/parser/rules/block/module/include/references.ts +42 -0
- package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
- package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
- package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
- package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
- package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
- package/src/parser/rules/block/module/include/scanner.ts +121 -0
- package/src/parser/rules/block/module/index.ts +14 -2
- package/src/parser/rules/block/module/listpages/compiler.ts +12 -392
- package/src/parser/rules/block/module/listpages/extract.ts +25 -359
- package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
- package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
- package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
- package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
- package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
- package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
- package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
- package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
- package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
- package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
- package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
- package/src/parser/rules/block/module/listpages/normalize.ts +8 -324
- package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
- package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
- package/src/parser/rules/block/module/listpages/resolve.ts +5 -75
- package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
- package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
- package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
- package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
- package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
- package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
- package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
- package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
- package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
- package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
- package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
- package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
- package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
- package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
- package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
- package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
- package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
- package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
- package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
- package/src/parser/rules/block/module/listpages/url-resolution/params.ts +19 -0
- package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
- package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +53 -0
- package/src/parser/rules/block/module/listpages/url-resolution/value.ts +25 -0
- package/src/parser/rules/block/module/listpages/url-resolver.ts +3 -160
- package/src/parser/rules/block/module/listusers/compiler.ts +4 -25
- package/src/parser/rules/block/module/listusers/extract.ts +4 -9
- package/src/parser/rules/block/module/listusers/getters.ts +21 -0
- package/src/parser/rules/block/module/listusers/variables.ts +15 -0
- package/src/parser/rules/block/module/open.ts +57 -0
- package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
- package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
- package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
- package/src/parser/rules/block/module/resolution/styles.ts +53 -0
- package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
- package/src/parser/rules/block/module/resolve.ts +79 -292
- package/src/parser/rules/block/module/rule.ts +56 -0
- package/src/parser/rules/block/module/types-common.ts +11 -0
- package/src/parser/rules/block/module/walk/children.ts +35 -0
- package/src/parser/rules/block/module/walk/index.ts +9 -0
- package/src/parser/rules/block/module/walk/map/index.ts +2 -0
- package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
- package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
- package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
- package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
- package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
- package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
- package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
- package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
- package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
- package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
- package/src/parser/rules/block/module/walk/map/types.ts +6 -0
- package/src/parser/rules/block/module/walk/traverse.ts +65 -0
- package/src/parser/rules/block/orphan-li/content.ts +60 -0
- package/src/parser/rules/block/orphan-li/index.ts +75 -0
- package/src/parser/rules/block/orphan-li/open.ts +25 -0
- package/src/parser/rules/block/orphan-li/tags.ts +40 -0
- package/src/parser/rules/block/paragraph/content.ts +12 -0
- package/src/parser/rules/block/paragraph/index.ts +60 -0
- package/src/parser/rules/block/paragraph/normalize.ts +52 -0
- package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
- package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
- package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
- package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
- package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
- package/src/parser/rules/block/parsing/block-item.ts +29 -0
- package/src/parser/rules/block/parsing/content.ts +127 -0
- package/src/parser/rules/block/parsing/end-condition.ts +51 -0
- package/src/parser/rules/block/parsing/inline-content.ts +105 -0
- package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
- package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
- package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
- package/src/parser/rules/block/table/index.ts +80 -0
- package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
- package/src/parser/rules/block/table/pipe/cell.ts +106 -0
- package/src/parser/rules/block/table/pipe/index.ts +2 -0
- package/src/parser/rules/block/table/pipe/row.ts +88 -0
- package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
- package/src/parser/rules/block/table/pipe/trim.ts +50 -0
- package/src/parser/rules/block/table-block/body.ts +79 -0
- package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
- package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
- package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
- package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
- package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
- package/src/parser/rules/block/table-block/cell.ts +64 -0
- package/src/parser/rules/block/table-block/index.ts +113 -0
- package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
- package/src/parser/rules/block/table-block/structure.ts +80 -0
- package/src/parser/rules/block/tabview/body.ts +64 -0
- package/src/parser/rules/block/tabview/index.ts +90 -0
- package/src/parser/rules/block/tabview/open.ts +50 -0
- package/src/parser/rules/block/tabview/tab.ts +92 -0
- package/src/parser/rules/block/tabview/tags.ts +30 -0
- package/src/parser/rules/block/toc/element.ts +11 -0
- package/src/parser/rules/block/toc/index.ts +44 -0
- package/src/parser/rules/block/toc/open.ts +84 -0
- package/src/parser/rules/block/utils.ts +10 -610
- package/src/parser/rules/{utils.ts → common/attribute-safety.ts} +3 -49
- package/src/parser/rules/common/block-name.ts +33 -0
- package/src/parser/rules/common/index.ts +2 -0
- package/src/parser/rules/contracts/index.ts +3 -0
- package/src/parser/rules/contracts/parse-context.ts +38 -0
- package/src/parser/rules/contracts/rule.ts +43 -0
- package/src/parser/rules/contracts/scope.ts +31 -0
- package/src/parser/rules/inline/anchor/attributes.ts +54 -0
- package/src/parser/rules/inline/anchor/child.ts +26 -0
- package/src/parser/rules/inline/anchor/close.ts +34 -0
- package/src/parser/rules/inline/anchor/content.ts +59 -0
- package/src/parser/rules/inline/anchor/index.ts +103 -0
- package/src/parser/rules/inline/anchor/newline.ts +26 -0
- package/src/parser/rules/inline/anchor/open.ts +47 -0
- package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
- package/src/parser/rules/inline/anchor/syntax.ts +40 -0
- package/src/parser/rules/inline/anchor-name/index.ts +38 -0
- package/src/parser/rules/inline/anchor-name/name.ts +39 -0
- package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
- package/src/parser/rules/inline/bibcite/element.ts +14 -0
- package/src/parser/rules/inline/bibcite/index.ts +34 -0
- package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
- package/src/parser/rules/inline/bold.ts +2 -39
- package/src/parser/rules/inline/color/index.ts +35 -0
- package/src/parser/rules/inline/color/syntax.ts +69 -0
- package/src/parser/rules/inline/comment/consume.ts +31 -0
- package/src/parser/rules/inline/{comment.ts → comment/index.ts} +10 -36
- package/src/parser/rules/inline/equation-ref/element.ts +8 -0
- package/src/parser/rules/inline/equation-ref/index.ts +34 -0
- package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
- package/src/parser/rules/inline/expr/branch.ts +104 -0
- package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
- package/src/parser/rules/inline/expr/conditional.ts +80 -0
- package/src/parser/rules/inline/expr/depth.ts +25 -0
- package/src/parser/rules/inline/expr/elements.ts +39 -0
- package/src/parser/rules/inline/expr/index.ts +84 -0
- package/src/parser/rules/inline/expr/syntax.ts +45 -0
- package/src/parser/rules/inline/footnote/child.ts +22 -0
- package/src/parser/rules/inline/footnote/close.ts +33 -0
- package/src/parser/rules/inline/footnote/content.ts +54 -0
- package/src/parser/rules/inline/footnote/elements.ts +38 -0
- package/src/parser/rules/inline/footnote/index.ts +54 -0
- package/src/parser/rules/inline/footnote/newline.ts +27 -0
- package/src/parser/rules/inline/footnote/open.ts +38 -0
- package/src/parser/rules/inline/formatting/container.ts +50 -0
- package/src/parser/rules/inline/{guillemet.ts → guillemet/index.ts} +5 -13
- package/src/parser/rules/inline/guillemet/text.ts +11 -0
- package/src/parser/rules/inline/html/gate.ts +64 -0
- package/src/parser/rules/inline/{html.ts → html/index.ts} +9 -60
- package/src/parser/rules/inline/html/open.ts +37 -0
- package/src/parser/rules/inline/image/attributes.ts +22 -0
- package/src/parser/rules/inline/image/body.ts +36 -0
- package/src/parser/rules/inline/image/index.ts +89 -0
- package/src/parser/rules/inline/image/open.ts +56 -0
- package/src/parser/rules/inline/image/source.ts +62 -0
- package/src/parser/rules/inline/image/syntax.ts +76 -0
- package/src/parser/rules/inline/italic.ts +2 -30
- package/src/parser/rules/inline/line-break/backslash.ts +58 -0
- package/src/parser/rules/inline/line-break/elements.ts +9 -0
- package/src/parser/rules/inline/line-break/index.ts +3 -0
- package/src/parser/rules/inline/line-break/newline.ts +82 -0
- package/src/parser/rules/inline/line-break/underscore.ts +45 -0
- package/src/parser/rules/inline/link-anchor.ts +6 -81
- package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
- package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
- package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
- package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
- package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
- package/src/parser/rules/inline/link-single.ts +7 -98
- package/src/parser/rules/inline/link-star.ts +7 -69
- package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
- package/src/parser/rules/inline/link-triple/index.ts +62 -0
- package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
- package/src/parser/rules/inline/link-triple/label.ts +35 -0
- package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
- package/src/parser/rules/inline/link-triple/target.ts +36 -0
- package/src/parser/rules/inline/math-inline/index.ts +40 -0
- package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
- package/src/parser/rules/inline/monospace.ts +2 -30
- package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
- package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
- package/src/parser/rules/inline/parsing/collect.ts +23 -0
- package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
- package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
- package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
- package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
- package/src/parser/rules/inline/parsing/rules.ts +34 -0
- package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
- package/src/parser/rules/inline/raw/angle.ts +40 -0
- package/src/parser/rules/inline/raw/double-at.ts +78 -0
- package/src/parser/rules/inline/raw/index.ts +26 -0
- package/src/parser/rules/inline/raw/result.ts +26 -0
- package/src/parser/rules/inline/size/content.ts +65 -0
- package/src/parser/rules/inline/size/index.ts +55 -0
- package/src/parser/rules/inline/size/open.ts +43 -0
- package/src/parser/rules/inline/size/value.ts +45 -0
- package/src/parser/rules/inline/span/content.ts +97 -0
- package/src/parser/rules/inline/span/elements.ts +108 -0
- package/src/parser/rules/inline/span/index.ts +79 -0
- package/src/parser/rules/inline/span/newline.ts +50 -0
- package/src/parser/rules/inline/span/syntax.ts +70 -0
- package/src/parser/rules/inline/{strikethrough.ts → strikethrough/index.ts} +5 -60
- package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
- package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
- package/src/parser/rules/inline/subscript.ts +2 -39
- package/src/parser/rules/inline/superscript.ts +4 -39
- package/src/parser/rules/inline/text/element.ts +5 -0
- package/src/parser/rules/inline/{text.ts → text/index.ts} +5 -4
- package/src/parser/rules/inline/underline/child.ts +26 -0
- package/src/parser/rules/inline/underline/content.ts +29 -0
- package/src/parser/rules/inline/{underline.ts → underline/index.ts} +6 -49
- package/src/parser/rules/inline/user/element.ts +11 -0
- package/src/parser/rules/inline/user/index.ts +34 -0
- package/src/parser/rules/inline/user/syntax.ts +67 -0
- package/src/parser/rules/inline/utils.ts +4 -344
- package/src/parser/rules/tokens.ts +106 -0
- package/src/parser/rules/types.ts +9 -252
- package/src/parser/depth.ts +0 -251
- package/src/parser/parse.ts +0 -315
- package/src/parser/postprocess/spanStrip.ts +0 -697
- package/src/parser/preprocess/expr.ts +0 -265
- package/src/parser/preprocess/utils.ts +0 -250
- package/src/parser/preprocess/whitespace.ts +0 -111
- package/src/parser/rules/block/align.ts +0 -282
- package/src/parser/rules/block/bibliography.ts +0 -359
- package/src/parser/rules/block/block-list.ts +0 -689
- package/src/parser/rules/block/blockquote.ts +0 -238
- package/src/parser/rules/block/code.ts +0 -187
- package/src/parser/rules/block/collapsible.ts +0 -337
- package/src/parser/rules/block/definition-list.ts +0 -270
- package/src/parser/rules/block/div.ts +0 -400
- package/src/parser/rules/block/embed-block.ts +0 -153
- package/src/parser/rules/block/footnoteblock.ts +0 -200
- package/src/parser/rules/block/heading.ts +0 -142
- package/src/parser/rules/block/html.ts +0 -222
- package/src/parser/rules/block/iframe.ts +0 -239
- package/src/parser/rules/block/include.ts +0 -179
- package/src/parser/rules/block/list.ts +0 -244
- package/src/parser/rules/block/math.ts +0 -183
- package/src/parser/rules/block/module/include/resolve.ts +0 -556
- package/src/parser/rules/block/module/listpages/types.ts +0 -513
- package/src/parser/rules/block/module/walk.ts +0 -380
- package/src/parser/rules/block/module.ts +0 -164
- package/src/parser/rules/block/orphan-li.ts +0 -177
- package/src/parser/rules/block/paragraph.ts +0 -157
- package/src/parser/rules/block/table-block.ts +0 -726
- package/src/parser/rules/block/table.ts +0 -441
- package/src/parser/rules/block/tabview.ts +0 -331
- package/src/parser/rules/block/toc.ts +0 -129
- package/src/parser/rules/inline/anchor-name.ts +0 -154
- package/src/parser/rules/inline/anchor.ts +0 -327
- package/src/parser/rules/inline/bibcite.ts +0 -153
- package/src/parser/rules/inline/color.ts +0 -140
- package/src/parser/rules/inline/equation-ref.ts +0 -115
- package/src/parser/rules/inline/expr.ts +0 -526
- package/src/parser/rules/inline/footnote.ts +0 -223
- package/src/parser/rules/inline/image.ts +0 -328
- package/src/parser/rules/inline/line-break.ts +0 -326
- package/src/parser/rules/inline/link-triple.ts +0 -267
- package/src/parser/rules/inline/math-inline.ts +0 -126
- package/src/parser/rules/inline/raw.ts +0 -262
- package/src/parser/rules/inline/size.ts +0 -244
- package/src/parser/rules/inline/span.ts +0 -424
- package/src/parser/rules/inline/user.ts +0 -147
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Block rule for the Wikidot footnote block: `[[footnoteblock]]`.
|
|
4
|
-
*
|
|
5
|
-
* This self-closing block tag marks the location in the page where all
|
|
6
|
-
* collected footnotes (from `[[footnote]]...[[/footnote]]` inline markers)
|
|
7
|
-
* should be rendered. It is analogous to a "footnotes section" placeholder.
|
|
8
|
-
*
|
|
9
|
-
* Optional attributes:
|
|
10
|
-
* - `title` -- custom heading text for the footnotes section.
|
|
11
|
-
* - `hide` -- when `"true"` or `"yes"`, suppresses footnote rendering.
|
|
12
|
-
*
|
|
13
|
-
* Wikidot only honours the FIRST `[[footnoteblock]]` in a document;
|
|
14
|
-
* subsequent occurrences are treated as plain text. The parser tracks
|
|
15
|
-
* this via `ctx.scope.footnoteBlockParsed`, but note: that flag is per
|
|
16
|
-
* spread copy of `ParseContext` (see {@link ScopeContext.footnoteBlockParsed}).
|
|
17
|
-
* In practice the duplicate-rejection only fires for two top-level
|
|
18
|
-
* `[[footnoteblock]]` tokens; siblings inside the same body or across
|
|
19
|
-
* nested bodies both succeed today. The auto-append decision in
|
|
20
|
-
* `Parser.parse` uses a post-parse AST walk, so it is unaffected.
|
|
21
|
-
*
|
|
22
|
-
* @module
|
|
23
|
-
*/
|
|
24
|
-
import type { Element } from "@wdprlib/ast";
|
|
25
|
-
import type { BlockRule, ParseContext, RuleResult } from "../types";
|
|
26
|
-
import { currentToken } from "../types";
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Parses key/value attributes from tokens (e.g. `title="Custom title"`).
|
|
30
|
-
*
|
|
31
|
-
* This is a local attribute parser specific to the footnoteblock rule.
|
|
32
|
-
* It handles TEXT or IDENTIFIER names, optional `=` with quoted or
|
|
33
|
-
* unquoted values, and boolean attributes (name without value).
|
|
34
|
-
*
|
|
35
|
-
* @param ctx - Parse context.
|
|
36
|
-
* @param startPos - Token index to start scanning.
|
|
37
|
-
* @returns Parsed attribute map and the number of tokens consumed.
|
|
38
|
-
*/
|
|
39
|
-
function parseAttributes(
|
|
40
|
-
ctx: ParseContext,
|
|
41
|
-
startPos: number,
|
|
42
|
-
): { attrs: Record<string, string>; consumed: number } {
|
|
43
|
-
const attrs: Record<string, string> = {};
|
|
44
|
-
let pos = startPos;
|
|
45
|
-
let consumed = 0;
|
|
46
|
-
|
|
47
|
-
while (pos < ctx.tokens.length) {
|
|
48
|
-
const token = ctx.tokens[pos];
|
|
49
|
-
if (
|
|
50
|
-
!token ||
|
|
51
|
-
token.type === "BLOCK_CLOSE" ||
|
|
52
|
-
token.type === "NEWLINE" ||
|
|
53
|
-
token.type === "EOF"
|
|
54
|
-
) {
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Skip whitespace
|
|
59
|
-
if (token.type === "WHITESPACE") {
|
|
60
|
-
pos++;
|
|
61
|
-
consumed++;
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Attribute name (TEXT or IDENTIFIER token)
|
|
66
|
-
if (token.type === "TEXT" || token.type === "IDENTIFIER") {
|
|
67
|
-
const name = token.value.toLowerCase();
|
|
68
|
-
pos++;
|
|
69
|
-
consumed++;
|
|
70
|
-
|
|
71
|
-
// Check for =
|
|
72
|
-
const eqToken = ctx.tokens[pos];
|
|
73
|
-
if (eqToken?.type === "EQUALS") {
|
|
74
|
-
pos++;
|
|
75
|
-
consumed++;
|
|
76
|
-
|
|
77
|
-
// Get value (quoted string or text)
|
|
78
|
-
const valueToken = ctx.tokens[pos];
|
|
79
|
-
if (valueToken?.type === "QUOTED_STRING") {
|
|
80
|
-
// Remove quotes
|
|
81
|
-
let value = valueToken.value;
|
|
82
|
-
if (value.startsWith('"') && value.endsWith('"')) {
|
|
83
|
-
value = value.slice(1, -1);
|
|
84
|
-
}
|
|
85
|
-
attrs[name] = value;
|
|
86
|
-
pos++;
|
|
87
|
-
consumed++;
|
|
88
|
-
} else if (valueToken?.type === "TEXT" || valueToken?.type === "IDENTIFIER") {
|
|
89
|
-
attrs[name] = valueToken.value;
|
|
90
|
-
pos++;
|
|
91
|
-
consumed++;
|
|
92
|
-
}
|
|
93
|
-
} else {
|
|
94
|
-
// Boolean attribute
|
|
95
|
-
attrs[name] = "true";
|
|
96
|
-
}
|
|
97
|
-
} else {
|
|
98
|
-
// Unknown token, skip
|
|
99
|
-
pos++;
|
|
100
|
-
consumed++;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return { attrs, consumed };
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Block rule for `[[footnoteblock]]`.
|
|
109
|
-
*
|
|
110
|
-
* Parsing strategy:
|
|
111
|
-
* 1. Match BLOCK_OPEN + name "footnoteblock" (case-insensitive).
|
|
112
|
-
* 2. Parse optional attributes (`title`, `hide`).
|
|
113
|
-
* 3. Consume closing `]]`.
|
|
114
|
-
* 4. If `ctx.scope.footnoteBlockParsed` is already `true` on the current
|
|
115
|
-
* `ParseContext` copy, fail. Because `parseBlocksUntil` spreads a
|
|
116
|
-
* fresh `ctx` per sibling rule, this only rejects a second
|
|
117
|
-
* `[[footnoteblock]]` that arrives via the parser's top-level
|
|
118
|
-
* dispatch loop in practice. See {@link ScopeContext.footnoteBlockParsed}.
|
|
119
|
-
* 5. Replace `ctx.scope` with the flag set to `true` and emit a `footnote-block`
|
|
120
|
-
* element.
|
|
121
|
-
*/
|
|
122
|
-
export const footnoteBlockRule: BlockRule = {
|
|
123
|
-
name: "footnoteBlock",
|
|
124
|
-
startTokens: ["BLOCK_OPEN"],
|
|
125
|
-
requiresLineStart: true,
|
|
126
|
-
|
|
127
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
128
|
-
const openToken = currentToken(ctx);
|
|
129
|
-
if (openToken.type !== "BLOCK_OPEN") {
|
|
130
|
-
return { success: false };
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
let pos = ctx.pos + 1;
|
|
134
|
-
let consumed = 1;
|
|
135
|
-
|
|
136
|
-
// Skip whitespace
|
|
137
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
138
|
-
pos++;
|
|
139
|
-
consumed++;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Check for block name
|
|
143
|
-
const nameToken = ctx.tokens[pos];
|
|
144
|
-
if (!nameToken || (nameToken.type !== "TEXT" && nameToken.type !== "IDENTIFIER")) {
|
|
145
|
-
return { success: false };
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const blockName = nameToken.value.toLowerCase();
|
|
149
|
-
if (blockName !== "footnoteblock") {
|
|
150
|
-
return { success: false };
|
|
151
|
-
}
|
|
152
|
-
pos++;
|
|
153
|
-
consumed++;
|
|
154
|
-
|
|
155
|
-
// Parse optional attributes (title="...")
|
|
156
|
-
const { attrs, consumed: attrConsumed } = parseAttributes(ctx, pos);
|
|
157
|
-
pos += attrConsumed;
|
|
158
|
-
consumed += attrConsumed;
|
|
159
|
-
|
|
160
|
-
// Expect ]]
|
|
161
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
162
|
-
pos++;
|
|
163
|
-
consumed++;
|
|
164
|
-
}
|
|
165
|
-
if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
|
|
166
|
-
return { success: false };
|
|
167
|
-
}
|
|
168
|
-
pos++;
|
|
169
|
-
consumed++;
|
|
170
|
-
|
|
171
|
-
// Reject a second `[[footnoteblock]]` that arrives on the same
|
|
172
|
-
// `ParseContext` copy (in practice: at the top level — siblings
|
|
173
|
-
// inside `parseBlocksUntil` each get a fresh spread). The flag
|
|
174
|
-
// lives in the immutable `scope` group, so the mutation is
|
|
175
|
-
// expressed as a scope replacement. The cross-scope duplicate-
|
|
176
|
-
// rejection is a separate, known limitation.
|
|
177
|
-
if (ctx.scope.footnoteBlockParsed) {
|
|
178
|
-
return { success: false };
|
|
179
|
-
}
|
|
180
|
-
ctx.scope = { ...ctx.scope, footnoteBlockParsed: true };
|
|
181
|
-
|
|
182
|
-
// Extract title and hide from attributes
|
|
183
|
-
const title = attrs.title !== undefined ? attrs.title : null;
|
|
184
|
-
const hide = attrs.hide === "true" || attrs.hide === "yes";
|
|
185
|
-
|
|
186
|
-
return {
|
|
187
|
-
success: true,
|
|
188
|
-
elements: [
|
|
189
|
-
{
|
|
190
|
-
element: "footnote-block",
|
|
191
|
-
data: {
|
|
192
|
-
title,
|
|
193
|
-
hide,
|
|
194
|
-
},
|
|
195
|
-
},
|
|
196
|
-
],
|
|
197
|
-
consumed,
|
|
198
|
-
};
|
|
199
|
-
},
|
|
200
|
-
};
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Block rule for Wikidot headings: `+ Heading` through `++++++ Heading`.
|
|
4
|
-
*
|
|
5
|
-
* Headings are written with one to six `+` characters at the start of a
|
|
6
|
-
* line, followed by mandatory whitespace and then inline content:
|
|
7
|
-
*
|
|
8
|
-
* ```
|
|
9
|
-
* + H1 heading
|
|
10
|
-
* ++ H2 heading
|
|
11
|
-
* +++ H3 heading
|
|
12
|
-
* ```
|
|
13
|
-
*
|
|
14
|
-
* An optional `*` immediately after the `+` markers hides the heading
|
|
15
|
-
* from the table of contents:
|
|
16
|
-
*
|
|
17
|
-
* ```
|
|
18
|
-
* +* Hidden H1
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* Seven or more `+` characters are NOT valid headings in Wikidot and
|
|
22
|
-
* the rule will fail, letting them fall through to paragraph parsing.
|
|
23
|
-
*
|
|
24
|
-
* Non-hidden headings are registered in `ctx.tocEntries` for later use
|
|
25
|
-
* by the table-of-contents module.
|
|
26
|
-
*
|
|
27
|
-
* @module
|
|
28
|
-
*/
|
|
29
|
-
import type { Element, HeadingLevel } from "@wdprlib/ast";
|
|
30
|
-
import type { BlockRule, ParseContext, RuleResult } from "../types";
|
|
31
|
-
import { currentToken } from "../types";
|
|
32
|
-
import { parseInlineUntil } from "../inline/utils";
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Block rule for Wikidot headings (`+ ` through `++++++ `).
|
|
36
|
-
*
|
|
37
|
-
* Produces a container element with `type: { header: { level, "has-toc" } }`.
|
|
38
|
-
* The heading text is parsed for inline markup (bold, links, etc.).
|
|
39
|
-
*/
|
|
40
|
-
export const headingRule: BlockRule = {
|
|
41
|
-
name: "heading",
|
|
42
|
-
startTokens: ["HEADING_MARKER"],
|
|
43
|
-
requiresLineStart: true,
|
|
44
|
-
|
|
45
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
46
|
-
const marker = currentToken(ctx);
|
|
47
|
-
|
|
48
|
-
if (!marker.lineStart) {
|
|
49
|
-
return { success: false };
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Wikidot requires whitespace after heading marker
|
|
53
|
-
// Check format: + (space)content OR +* (space)content
|
|
54
|
-
let pos = ctx.pos + 1;
|
|
55
|
-
let consumed = 1;
|
|
56
|
-
let hidden = false;
|
|
57
|
-
|
|
58
|
-
// Check for hidden marker (*) - must come immediately after + markers
|
|
59
|
-
if (ctx.tokens[pos]?.type === "STAR") {
|
|
60
|
-
hidden = true;
|
|
61
|
-
pos++;
|
|
62
|
-
consumed++;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Whitespace is required after + or +*
|
|
66
|
-
if (ctx.tokens[pos]?.type !== "WHITESPACE") {
|
|
67
|
-
return { success: false };
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Wikidot only supports h1-h6 (1-6 plus signs). 7+ is not a heading.
|
|
71
|
-
if (marker.value.length > 6) {
|
|
72
|
-
return { success: false };
|
|
73
|
-
}
|
|
74
|
-
const depth = marker.value.length as 1 | 2 | 3 | 4 | 5 | 6;
|
|
75
|
-
|
|
76
|
-
// Skip whitespace
|
|
77
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
78
|
-
pos++;
|
|
79
|
-
consumed++;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Parse inline content until newline
|
|
83
|
-
const inlineCtx: ParseContext = { ...ctx, pos };
|
|
84
|
-
const inlineResult = parseInlineUntil(inlineCtx, "NEWLINE");
|
|
85
|
-
const children: Element[] = inlineResult.elements;
|
|
86
|
-
consumed += inlineResult.consumed;
|
|
87
|
-
pos += inlineResult.consumed;
|
|
88
|
-
|
|
89
|
-
// Consume newline
|
|
90
|
-
if (ctx.tokens[pos]?.type === "NEWLINE") {
|
|
91
|
-
consumed++;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Store TOC entry (only non-hidden headings)
|
|
95
|
-
if (!hidden) {
|
|
96
|
-
const headingText = extractText(children);
|
|
97
|
-
ctx.tocEntries.push({ level: depth, text: headingText });
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return {
|
|
101
|
-
success: true,
|
|
102
|
-
elements: [
|
|
103
|
-
{
|
|
104
|
-
element: "container",
|
|
105
|
-
data: {
|
|
106
|
-
type: { header: { level: depth as HeadingLevel, "has-toc": !hidden } },
|
|
107
|
-
attributes: {},
|
|
108
|
-
elements: children,
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
],
|
|
112
|
-
consumed,
|
|
113
|
-
};
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Recursively extracts the plain-text content from a tree of elements.
|
|
119
|
-
*
|
|
120
|
-
* Used to build the `text` field for table-of-contents entries. Only
|
|
121
|
-
* `text` elements and containers with nested `elements` are traversed;
|
|
122
|
-
* other element types (images, etc.) are ignored.
|
|
123
|
-
*
|
|
124
|
-
* @param elements - The heading's inline child elements.
|
|
125
|
-
* @returns Concatenated plain text.
|
|
126
|
-
*/
|
|
127
|
-
function extractText(elements: Element[]): string {
|
|
128
|
-
let text = "";
|
|
129
|
-
for (const el of elements) {
|
|
130
|
-
if (el.element === "text" && typeof el.data === "string") {
|
|
131
|
-
text += el.data;
|
|
132
|
-
} else if (
|
|
133
|
-
el.element === "container" &&
|
|
134
|
-
el.data &&
|
|
135
|
-
typeof el.data === "object" &&
|
|
136
|
-
"elements" in el.data
|
|
137
|
-
) {
|
|
138
|
-
text += extractText(el.data.elements as Element[]);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return text;
|
|
142
|
-
}
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Block rule for the Wikidot HTML block: `[[html]]...[[/html]]`.
|
|
4
|
-
*
|
|
5
|
-
* An HTML block embeds raw HTML that Wikidot renders inside a sandboxed
|
|
6
|
-
* `<iframe>`. The content between the tags is captured verbatim (no inline
|
|
7
|
-
* parsing) and stored as an `html` element in the AST.
|
|
8
|
-
*
|
|
9
|
-
* Supported attributes on the opening tag:
|
|
10
|
-
* - `style` -- applied to the containing iframe. Other attributes are
|
|
11
|
-
* parsed but only `style` is used by Wikidot's renderer.
|
|
12
|
-
*
|
|
13
|
-
* The raw content is also pushed into `ctx.htmlBlocks` for document-level
|
|
14
|
-
* enumeration.
|
|
15
|
-
*
|
|
16
|
-
* If no `[[/html]]` closing tag is found, the rule fails and the opening
|
|
17
|
-
* tag falls through to text rendering (matching Wikidot behaviour).
|
|
18
|
-
*
|
|
19
|
-
* @module
|
|
20
|
-
*/
|
|
21
|
-
import type { Element } from "@wdprlib/ast";
|
|
22
|
-
import type { BlockRule, ParseContext, RuleResult } from "../types";
|
|
23
|
-
import { currentToken } from "../types";
|
|
24
|
-
import { parseBlockName, parseAttributesRaw } from "./utils";
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Scan forward from `from` to see whether a real `[[/html]]` close tag
|
|
28
|
-
* exists later in the token stream. Used by the disabled path to decide
|
|
29
|
-
* whether the blank-line stop should fire.
|
|
30
|
-
*
|
|
31
|
-
* Recognises whitespace between the name and the closing `]]` so the
|
|
32
|
-
* answer matches what the main consume loop would actually accept.
|
|
33
|
-
*/
|
|
34
|
-
export function lookaheadHasHtmlClose(ctx: ParseContext, from: number): boolean {
|
|
35
|
-
for (let i = from; i < ctx.tokens.length; i++) {
|
|
36
|
-
const t = ctx.tokens[i];
|
|
37
|
-
if (!t || t.type === "EOF") return false;
|
|
38
|
-
if (t.type !== "BLOCK_END_OPEN") continue;
|
|
39
|
-
const closeName = parseBlockName(ctx, i + 1);
|
|
40
|
-
if (closeName?.name.toLowerCase() !== "html") continue;
|
|
41
|
-
let cp = i + 1 + closeName.consumed;
|
|
42
|
-
while (ctx.tokens[cp]?.type === "WHITESPACE") cp++;
|
|
43
|
-
if (ctx.tokens[cp]?.type === "BLOCK_CLOSE") return true;
|
|
44
|
-
}
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Block rule for `[[html]]...[[/html]]`.
|
|
50
|
-
*
|
|
51
|
-
* Body content is stored as raw text. The optional `style` attribute is
|
|
52
|
-
* passed through to the AST element for iframe styling.
|
|
53
|
-
*/
|
|
54
|
-
export const htmlBlockRule: BlockRule = {
|
|
55
|
-
name: "html",
|
|
56
|
-
startTokens: ["BLOCK_OPEN"],
|
|
57
|
-
requiresLineStart: false,
|
|
58
|
-
|
|
59
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
60
|
-
const openToken = currentToken(ctx);
|
|
61
|
-
if (openToken.type !== "BLOCK_OPEN") {
|
|
62
|
-
return { success: false };
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
let pos = ctx.pos + 1;
|
|
66
|
-
let consumed = 1;
|
|
67
|
-
|
|
68
|
-
// Parse block name
|
|
69
|
-
const nameResult = parseBlockName(ctx, pos);
|
|
70
|
-
if (!nameResult || nameResult.name.toLowerCase() !== "html") {
|
|
71
|
-
return { success: false };
|
|
72
|
-
}
|
|
73
|
-
pos += nameResult.consumed;
|
|
74
|
-
consumed += nameResult.consumed;
|
|
75
|
-
|
|
76
|
-
// Parse attributes (type="css", style="...", etc.)
|
|
77
|
-
// Only style attribute is used by Wikidot (applied to iframe)
|
|
78
|
-
const attrResult = parseAttributesRaw(ctx, pos);
|
|
79
|
-
pos += attrResult.consumed;
|
|
80
|
-
consumed += attrResult.consumed;
|
|
81
|
-
const style = attrResult.attrs.style;
|
|
82
|
-
|
|
83
|
-
// Expect ]]
|
|
84
|
-
if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
|
|
85
|
-
return { success: false };
|
|
86
|
-
}
|
|
87
|
-
pos++;
|
|
88
|
-
consumed++;
|
|
89
|
-
|
|
90
|
-
// Settings-level gate: when `[[html]]` is disabled, still consume the
|
|
91
|
-
// entire block so the raw body cannot leak as text, but produce no
|
|
92
|
-
// AST element and skip the `ctx.htmlBlocks` push. The malformed
|
|
93
|
-
// opener path above (missing `]]`) is intentionally not affected —
|
|
94
|
-
// it falls through to text rendering as before.
|
|
95
|
-
const disabled = ctx.settings.allowHtmlBlocks === false;
|
|
96
|
-
|
|
97
|
-
// When disabled, the blank-line stop must only kick in if no real
|
|
98
|
-
// `[[/html]]` exists later in the stream. A closed block legitimately
|
|
99
|
-
// contains blank lines between paragraphs.
|
|
100
|
-
const hasCloseAhead = disabled && lookaheadHasHtmlClose(ctx, pos);
|
|
101
|
-
|
|
102
|
-
// Collect HTML content until [[/html]]. When disabled, the body is
|
|
103
|
-
// discarded so accumulation is skipped entirely to avoid building a
|
|
104
|
-
// large string only to drop it.
|
|
105
|
-
let contents = "";
|
|
106
|
-
let foundClose = false;
|
|
107
|
-
|
|
108
|
-
while (pos < ctx.tokens.length) {
|
|
109
|
-
const token = ctx.tokens[pos];
|
|
110
|
-
if (!token || token.type === "EOF") break;
|
|
111
|
-
|
|
112
|
-
// When disabled with no close ahead, stop at a blank line so the
|
|
113
|
-
// rule does not swallow subsequent paragraphs.
|
|
114
|
-
if (
|
|
115
|
-
disabled &&
|
|
116
|
-
!hasCloseAhead &&
|
|
117
|
-
token.type === "NEWLINE" &&
|
|
118
|
-
ctx.tokens[pos + 1]?.type === "NEWLINE"
|
|
119
|
-
) {
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Check for closing [[/html]] — require the trailing `]]` so a
|
|
124
|
-
// malformed `[[/html` without its close does not falsely terminate
|
|
125
|
-
// the body and leak the rest as text.
|
|
126
|
-
if (token.type === "BLOCK_END_OPEN") {
|
|
127
|
-
const closeNameResult = parseBlockName(ctx, pos + 1);
|
|
128
|
-
if (closeNameResult?.name.toLowerCase() === "html") {
|
|
129
|
-
let checkPos = pos + 1 + closeNameResult.consumed;
|
|
130
|
-
while (ctx.tokens[checkPos]?.type === "WHITESPACE") checkPos++;
|
|
131
|
-
if (ctx.tokens[checkPos]?.type === "BLOCK_CLOSE") {
|
|
132
|
-
foundClose = true;
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
if (!disabled) {
|
|
139
|
-
contents += token.value;
|
|
140
|
-
}
|
|
141
|
-
pos++;
|
|
142
|
-
consumed++;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// If no closing tag found:
|
|
146
|
-
// - enabled: fail (matches Wikidot fallback to text)
|
|
147
|
-
// - disabled: still consume to EOF so the body cannot leak, but emit
|
|
148
|
-
// both the unclosed warning and the disabled-info diagnostics.
|
|
149
|
-
if (!foundClose) {
|
|
150
|
-
ctx.diagnostics.push({
|
|
151
|
-
severity: "warning",
|
|
152
|
-
code: "unclosed-block",
|
|
153
|
-
message: "Missing closing tag [[/html]] for [[html]]",
|
|
154
|
-
position: openToken.position,
|
|
155
|
-
});
|
|
156
|
-
if (!disabled) {
|
|
157
|
-
return { success: false };
|
|
158
|
-
}
|
|
159
|
-
ctx.diagnostics.push({
|
|
160
|
-
severity: "info",
|
|
161
|
-
code: "html-block-disabled",
|
|
162
|
-
message: "[[html]] block ignored: disabled by settings",
|
|
163
|
-
position: openToken.position,
|
|
164
|
-
});
|
|
165
|
-
return { success: true, elements: [], consumed };
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Consume [[/html]] (skipping any whitespace between name and `]]`
|
|
169
|
-
// to match the close-detection above).
|
|
170
|
-
if (ctx.tokens[pos]?.type === "BLOCK_END_OPEN") {
|
|
171
|
-
pos++;
|
|
172
|
-
consumed++;
|
|
173
|
-
const closeNameResult = parseBlockName(ctx, pos);
|
|
174
|
-
if (closeNameResult) {
|
|
175
|
-
pos += closeNameResult.consumed;
|
|
176
|
-
consumed += closeNameResult.consumed;
|
|
177
|
-
}
|
|
178
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
179
|
-
pos++;
|
|
180
|
-
consumed++;
|
|
181
|
-
}
|
|
182
|
-
if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
|
|
183
|
-
pos++;
|
|
184
|
-
consumed++;
|
|
185
|
-
}
|
|
186
|
-
if (ctx.tokens[pos]?.type === "NEWLINE") {
|
|
187
|
-
pos++;
|
|
188
|
-
consumed++;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (disabled) {
|
|
193
|
-
ctx.diagnostics.push({
|
|
194
|
-
severity: "info",
|
|
195
|
-
code: "html-block-disabled",
|
|
196
|
-
message: "[[html]] block ignored: disabled by settings",
|
|
197
|
-
position: openToken.position,
|
|
198
|
-
});
|
|
199
|
-
return { success: true, elements: [], consumed };
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Trim the contents
|
|
203
|
-
contents = contents.trim();
|
|
204
|
-
|
|
205
|
-
// Store html block in context
|
|
206
|
-
ctx.htmlBlocks.push(contents);
|
|
207
|
-
|
|
208
|
-
return {
|
|
209
|
-
success: true,
|
|
210
|
-
elements: [
|
|
211
|
-
{
|
|
212
|
-
element: "html",
|
|
213
|
-
data: {
|
|
214
|
-
contents,
|
|
215
|
-
...(style && { style }),
|
|
216
|
-
},
|
|
217
|
-
},
|
|
218
|
-
],
|
|
219
|
-
consumed,
|
|
220
|
-
};
|
|
221
|
-
},
|
|
222
|
-
};
|