@wdprlib/parser 3.2.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +10471 -8406
- package/dist/index.d.cts +313 -337
- package/dist/index.d.ts +313 -337
- package/dist/index.js +10457 -8392
- 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 +30 -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 +62 -0
- package/src/parser/rules/block/module/listpages/url-resolution/value.ts +34 -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,337 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Block rule for Wikidot collapsible blocks: `[[collapsible]]...[[/collapsible]]`.
|
|
3
|
-
*
|
|
4
|
-
* A collapsible renders as a show/hide toggle with body content that can
|
|
5
|
-
* be expanded or collapsed. The opening tag accepts several attributes
|
|
6
|
-
* (which may span multiple lines):
|
|
7
|
-
*
|
|
8
|
-
* - `show` -- label text for the "show" link (default: "+ show block").
|
|
9
|
-
* - `hide` -- label text for the "hide" link (default: "- hide block").
|
|
10
|
-
* - `folded` -- when `"no"`, the block starts in the expanded state.
|
|
11
|
-
* - `hideLocation` -- where the toggle link appears: `"top"` (default),
|
|
12
|
-
* `"bottom"`, `"both"`, or `"neither"`/`"none"`.
|
|
13
|
-
*
|
|
14
|
-
* Key Wikidot-specific behaviours:
|
|
15
|
-
* - Collapsibles cannot nest. When the body parser encounters a second
|
|
16
|
-
* `[[collapsible]]`, it is treated as plain text. This is achieved by
|
|
17
|
-
* filtering the collapsible rule out of the block rule list for body parsing.
|
|
18
|
-
* - Orphaned `[[/collapsible]]` tags after the matched close are consumed and
|
|
19
|
-
* emitted as `<br />` + literal text, matching Wikidot rendering.
|
|
20
|
-
* - An inline form (`[[collapsible]]text[[/collapsible]]` on one line) is
|
|
21
|
-
* supported but uncommon.
|
|
22
|
-
*
|
|
23
|
-
* @module
|
|
24
|
-
*/
|
|
25
|
-
import type { Element } from "@wdprlib/ast";
|
|
26
|
-
import type { BlockRule, ParseContext, RuleResult } from "../types";
|
|
27
|
-
import { currentToken } from "../types";
|
|
28
|
-
import { parseBlockName, parseBlocksUntil } from "./utils";
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Parses block attributes that may be spread across multiple lines.
|
|
32
|
-
*
|
|
33
|
-
* Unlike the standard {@link parseAttributes}, this variant allows NEWLINE
|
|
34
|
-
* tokens between attribute pairs, which Wikidot permits for `[[collapsible]]`
|
|
35
|
-
* tags with many attributes.
|
|
36
|
-
*
|
|
37
|
-
* @param ctx - Parse context.
|
|
38
|
-
* @param startPos - Token index to start scanning.
|
|
39
|
-
* @returns Parsed key/value pairs and the number of tokens consumed.
|
|
40
|
-
*/
|
|
41
|
-
function parseMultilineAttributes(
|
|
42
|
-
ctx: ParseContext,
|
|
43
|
-
startPos: number,
|
|
44
|
-
): { attrs: Record<string, string>; consumed: number } {
|
|
45
|
-
const attrs: Record<string, string> = {};
|
|
46
|
-
let pos = startPos;
|
|
47
|
-
let consumed = 0;
|
|
48
|
-
|
|
49
|
-
while (pos < ctx.tokens.length) {
|
|
50
|
-
const token = ctx.tokens[pos];
|
|
51
|
-
if (!token || token.type === "BLOCK_CLOSE" || token.type === "EOF") {
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (token.type === "WHITESPACE" || token.type === "NEWLINE") {
|
|
56
|
-
pos++;
|
|
57
|
-
consumed++;
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (token.type === "TEXT" || token.type === "IDENTIFIER") {
|
|
62
|
-
let name = token.value;
|
|
63
|
-
pos++;
|
|
64
|
-
consumed++;
|
|
65
|
-
|
|
66
|
-
// Handle hyphenated names (e.g. "hide-location")
|
|
67
|
-
while (
|
|
68
|
-
ctx.tokens[pos]?.type === "TEXT" &&
|
|
69
|
-
ctx.tokens[pos]?.value === "-" &&
|
|
70
|
-
(ctx.tokens[pos + 1]?.type === "IDENTIFIER" || ctx.tokens[pos + 1]?.type === "TEXT")
|
|
71
|
-
) {
|
|
72
|
-
name += "-";
|
|
73
|
-
pos++;
|
|
74
|
-
consumed++;
|
|
75
|
-
name += ctx.tokens[pos]?.value ?? "";
|
|
76
|
-
pos++;
|
|
77
|
-
consumed++;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const eqToken = ctx.tokens[pos];
|
|
81
|
-
if (eqToken?.type === "EQUALS") {
|
|
82
|
-
pos++;
|
|
83
|
-
consumed++;
|
|
84
|
-
const valueToken = ctx.tokens[pos];
|
|
85
|
-
if (valueToken?.type === "QUOTED_STRING") {
|
|
86
|
-
let value = valueToken.value;
|
|
87
|
-
if (value.startsWith('"') && value.endsWith('"')) {
|
|
88
|
-
value = value.slice(1, -1);
|
|
89
|
-
}
|
|
90
|
-
attrs[name] = value;
|
|
91
|
-
pos++;
|
|
92
|
-
consumed++;
|
|
93
|
-
} else if (valueToken?.type === "TEXT" || valueToken?.type === "IDENTIFIER") {
|
|
94
|
-
attrs[name] = valueToken.value;
|
|
95
|
-
pos++;
|
|
96
|
-
consumed++;
|
|
97
|
-
}
|
|
98
|
-
} else {
|
|
99
|
-
attrs[name] = "true";
|
|
100
|
-
}
|
|
101
|
-
} else {
|
|
102
|
-
// Unknown token type in attribute context, stop
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return { attrs, consumed };
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Tests whether the tokens at `pos` form a `[[/collapsible]]` closing tag.
|
|
112
|
-
*
|
|
113
|
-
* @param ctx - Parse context.
|
|
114
|
-
* @param pos - Token index to inspect.
|
|
115
|
-
* @returns `true` if the closing tag is found.
|
|
116
|
-
*/
|
|
117
|
-
function isCollapsibleClose(ctx: ParseContext, pos: number): boolean {
|
|
118
|
-
if (ctx.tokens[pos]?.type !== "BLOCK_END_OPEN") return false;
|
|
119
|
-
const nameResult = parseBlockName(ctx, pos + 1);
|
|
120
|
-
return nameResult?.name === "collapsible";
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Counts the number of tokens occupied by the `[[/collapsible]]` closing
|
|
125
|
-
* tag, including the optional trailing NEWLINE.
|
|
126
|
-
*
|
|
127
|
-
* @param ctx - Parse context.
|
|
128
|
-
* @param pos - Token index at the BLOCK_END_OPEN.
|
|
129
|
-
* @returns Total token count of the closing tag.
|
|
130
|
-
*/
|
|
131
|
-
function consumeCloseTag(ctx: ParseContext, pos: number): number {
|
|
132
|
-
let closeConsumed = 1; // BLOCK_END_OPEN
|
|
133
|
-
const nameResult = parseBlockName(ctx, pos + 1);
|
|
134
|
-
if (nameResult) closeConsumed += nameResult.consumed;
|
|
135
|
-
if (ctx.tokens[pos + closeConsumed]?.type === "BLOCK_CLOSE") closeConsumed++;
|
|
136
|
-
if (ctx.tokens[pos + closeConsumed]?.type === "NEWLINE") closeConsumed++;
|
|
137
|
-
return closeConsumed;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/** Block names excluded from rule dispatch and paragraph-boundary detection. */
|
|
141
|
-
const EXCLUDED_BLOCKS = new Set(["collapsible"]);
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Block rule for `[[collapsible ...]]...[[/collapsible]]`.
|
|
145
|
-
*
|
|
146
|
-
* Parsing strategy:
|
|
147
|
-
* 1. Match BLOCK_OPEN + name "collapsible".
|
|
148
|
-
* 2. Parse multiline attributes (show, hide, folded, hideLocation, etc.).
|
|
149
|
-
* 3. If a NEWLINE follows the opening tag, parse body as block content
|
|
150
|
-
* with the collapsible rule itself excluded (to prevent nesting).
|
|
151
|
-
* Otherwise, parse inline content until close tag or end of line
|
|
152
|
-
* (inline form).
|
|
153
|
-
* 4. Consume the `[[/collapsible]]` closing tag.
|
|
154
|
-
* 5. Consume any orphaned `[[/collapsible]]` tags that follow, converting
|
|
155
|
-
* them to `<br />` + literal text.
|
|
156
|
-
* 6. Derive `show-top` / `show-bottom` booleans from the `hideLocation`
|
|
157
|
-
* attribute.
|
|
158
|
-
*/
|
|
159
|
-
export const collapsibleRule: BlockRule = {
|
|
160
|
-
name: "collapsible",
|
|
161
|
-
startTokens: ["BLOCK_OPEN"],
|
|
162
|
-
requiresLineStart: false,
|
|
163
|
-
|
|
164
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
165
|
-
const openToken = currentToken(ctx);
|
|
166
|
-
if (openToken.type !== "BLOCK_OPEN") {
|
|
167
|
-
return { success: false };
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
let pos = ctx.pos + 1;
|
|
171
|
-
let consumed = 1;
|
|
172
|
-
|
|
173
|
-
const nameResult = parseBlockName(ctx, pos);
|
|
174
|
-
if (!nameResult || nameResult.name !== "collapsible") {
|
|
175
|
-
return { success: false };
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
pos += nameResult.consumed;
|
|
179
|
-
consumed += nameResult.consumed;
|
|
180
|
-
|
|
181
|
-
const attrResult = parseMultilineAttributes(ctx, pos);
|
|
182
|
-
pos += attrResult.consumed;
|
|
183
|
-
consumed += attrResult.consumed;
|
|
184
|
-
|
|
185
|
-
if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
|
|
186
|
-
return { success: false };
|
|
187
|
-
}
|
|
188
|
-
pos++;
|
|
189
|
-
consumed++;
|
|
190
|
-
|
|
191
|
-
// Record opening tag position for diagnostics
|
|
192
|
-
const openPosition = openToken.position;
|
|
193
|
-
|
|
194
|
-
const hasNewlineAfterOpen = ctx.tokens[pos]?.type === "NEWLINE";
|
|
195
|
-
if (hasNewlineAfterOpen) {
|
|
196
|
-
pos++;
|
|
197
|
-
consumed++;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
let bodyElements: Element[];
|
|
201
|
-
|
|
202
|
-
if (
|
|
203
|
-
!hasNewlineAfterOpen &&
|
|
204
|
-
ctx.tokens[pos]?.type !== "EOF" &&
|
|
205
|
-
ctx.tokens[pos]?.type !== "BLOCK_END_OPEN"
|
|
206
|
-
) {
|
|
207
|
-
// Inline form: [[collapsible]]content[[/collapsible]] on same line
|
|
208
|
-
// Parse inline content until [[/collapsible]] or NEWLINE
|
|
209
|
-
const inlineElements: Element[] = [];
|
|
210
|
-
let inlineConsumed = 0;
|
|
211
|
-
let inlinePos = pos;
|
|
212
|
-
|
|
213
|
-
while (inlinePos < ctx.tokens.length) {
|
|
214
|
-
const token = ctx.tokens[inlinePos];
|
|
215
|
-
if (!token || token.type === "EOF" || token.type === "NEWLINE") break;
|
|
216
|
-
if (isCollapsibleClose(ctx, inlinePos)) break;
|
|
217
|
-
inlineElements.push({ element: "text", data: token.value });
|
|
218
|
-
inlinePos++;
|
|
219
|
-
inlineConsumed++;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
consumed += inlineConsumed;
|
|
223
|
-
pos += inlineConsumed;
|
|
224
|
-
|
|
225
|
-
if (inlineElements.length > 0) {
|
|
226
|
-
bodyElements = [
|
|
227
|
-
{
|
|
228
|
-
element: "container",
|
|
229
|
-
data: {
|
|
230
|
-
type: "paragraph",
|
|
231
|
-
attributes: {},
|
|
232
|
-
elements: inlineElements,
|
|
233
|
-
},
|
|
234
|
-
},
|
|
235
|
-
];
|
|
236
|
-
} else {
|
|
237
|
-
bodyElements = [];
|
|
238
|
-
}
|
|
239
|
-
} else {
|
|
240
|
-
// Block form: parse content recursively until [[/collapsible]]
|
|
241
|
-
// Collapsible cannot be nested in Wikidot - nested [[collapsible]] becomes plain text.
|
|
242
|
-
// excludedBlockNames removes the collapsible rule from dispatch AND prevents
|
|
243
|
-
// [[collapsible]] / [[/collapsible]] tokens from triggering paragraph splits.
|
|
244
|
-
const bodyCtx: ParseContext = { ...ctx, pos };
|
|
245
|
-
|
|
246
|
-
const closeCondition = (checkCtx: ParseContext): boolean => {
|
|
247
|
-
return isCollapsibleClose(checkCtx, checkCtx.pos);
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
const bodyResult = parseBlocksUntil(bodyCtx, closeCondition, {
|
|
251
|
-
excludedBlockNames: EXCLUDED_BLOCKS,
|
|
252
|
-
});
|
|
253
|
-
consumed += bodyResult.consumed;
|
|
254
|
-
pos += bodyResult.consumed;
|
|
255
|
-
|
|
256
|
-
bodyElements = bodyResult.elements;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// Check for missing close tag
|
|
260
|
-
if (!isCollapsibleClose(ctx, pos)) {
|
|
261
|
-
ctx.diagnostics.push({
|
|
262
|
-
severity: "warning",
|
|
263
|
-
code: "unclosed-block",
|
|
264
|
-
message: "Missing closing tag [[/collapsible]] for [[collapsible]]",
|
|
265
|
-
position: openPosition,
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Consume [[/collapsible]]
|
|
270
|
-
if (isCollapsibleClose(ctx, pos)) {
|
|
271
|
-
const closeConsumed = consumeCloseTag(ctx, pos);
|
|
272
|
-
consumed += closeConsumed;
|
|
273
|
-
pos += closeConsumed;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// Consume orphaned [[/collapsible]] after the block
|
|
277
|
-
// Wikidot renders these as bare <br />[[/collapsible]] (no <p> wrapper)
|
|
278
|
-
const orphanedElements: Element[] = [];
|
|
279
|
-
while (isCollapsibleClose(ctx, pos)) {
|
|
280
|
-
orphanedElements.push({ element: "line-break" });
|
|
281
|
-
|
|
282
|
-
// Convert tokens of [[/collapsible]] to text
|
|
283
|
-
while (pos < ctx.tokens.length) {
|
|
284
|
-
const t = ctx.tokens[pos];
|
|
285
|
-
if (!t || t.type === "NEWLINE" || t.type === "EOF") break;
|
|
286
|
-
orphanedElements.push({ element: "text", data: t.value });
|
|
287
|
-
consumed++;
|
|
288
|
-
pos++;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// Skip trailing NEWLINE
|
|
292
|
-
if (ctx.tokens[pos]?.type === "NEWLINE") {
|
|
293
|
-
consumed++;
|
|
294
|
-
pos++;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Determine show-top/show-bottom from hideLocation attribute
|
|
299
|
-
const hideLocation = (
|
|
300
|
-
attrResult.attrs.hideLocation ??
|
|
301
|
-
attrResult.attrs.hidelocation ??
|
|
302
|
-
"top"
|
|
303
|
-
).toLowerCase();
|
|
304
|
-
let showTop = true;
|
|
305
|
-
let showBottom = false;
|
|
306
|
-
if (hideLocation === "both") {
|
|
307
|
-
showTop = true;
|
|
308
|
-
showBottom = true;
|
|
309
|
-
} else if (hideLocation === "bottom") {
|
|
310
|
-
showTop = false;
|
|
311
|
-
showBottom = true;
|
|
312
|
-
} else if (hideLocation === "neither" || hideLocation === "none") {
|
|
313
|
-
showTop = false;
|
|
314
|
-
showBottom = false;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
return {
|
|
318
|
-
success: true,
|
|
319
|
-
elements: [
|
|
320
|
-
{
|
|
321
|
-
element: "collapsible",
|
|
322
|
-
data: {
|
|
323
|
-
elements: bodyElements,
|
|
324
|
-
attributes: {},
|
|
325
|
-
"start-open": attrResult.attrs.folded === "no",
|
|
326
|
-
"show-text": attrResult.attrs.show ?? null,
|
|
327
|
-
"hide-text": attrResult.attrs.hide ?? null,
|
|
328
|
-
"show-top": showTop,
|
|
329
|
-
"show-bottom": showBottom,
|
|
330
|
-
},
|
|
331
|
-
},
|
|
332
|
-
...orphanedElements,
|
|
333
|
-
],
|
|
334
|
-
consumed,
|
|
335
|
-
};
|
|
336
|
-
},
|
|
337
|
-
};
|
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Block rule for Wikidot definition lists written with the `: key : value` syntax.
|
|
4
|
-
*
|
|
5
|
-
* Each item starts at the beginning of a line with a COLON, followed by
|
|
6
|
-
* mandatory whitespace, the key (term), a second COLON, and then the value
|
|
7
|
-
* (definition). Multiple consecutive items form a single `<dl>` block.
|
|
8
|
-
*
|
|
9
|
-
* ```
|
|
10
|
-
* : Apple : A fruit that grows on trees.
|
|
11
|
-
* : Banana : A yellow curved fruit.
|
|
12
|
-
* ```
|
|
13
|
-
*
|
|
14
|
-
* Key parsing details:
|
|
15
|
-
* - Whitespace after the first colon is required (`": key"` not `":key"`).
|
|
16
|
-
* - The key portion supports inline markup (bold, links, etc.).
|
|
17
|
-
* - The value continues until a double newline, a new definition entry, or
|
|
18
|
-
* the end of the document.
|
|
19
|
-
* - A single newline within the value does NOT break the entry -- parsing
|
|
20
|
-
* continues on the next line.
|
|
21
|
-
*
|
|
22
|
-
* @module
|
|
23
|
-
*/
|
|
24
|
-
import type { Element, DefinitionListItem } from "@wdprlib/ast";
|
|
25
|
-
import type { BlockRule, ParseContext, RuleResult } from "../types";
|
|
26
|
-
import { parseInlineUntil } from "../inline/utils";
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Internal representation of one definition list item before conversion
|
|
30
|
-
* to the AST's {@link DefinitionListItem} format.
|
|
31
|
-
*/
|
|
32
|
-
interface ParsedDefinitionItem {
|
|
33
|
-
/** Raw string of the key, used for `key_string` in the AST. */
|
|
34
|
-
keyString: string;
|
|
35
|
-
/** Parsed inline elements representing the key / term. */
|
|
36
|
-
key: Element[];
|
|
37
|
-
/** Parsed inline elements representing the value / definition. */
|
|
38
|
-
value: Element[];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Parses a single definition list entry of the form `: key : value`.
|
|
43
|
-
*
|
|
44
|
-
* The function expects `startPos` to point at a line-start COLON token.
|
|
45
|
-
* It consumes the first colon, mandatory whitespace, key tokens up to
|
|
46
|
-
* the second colon, then value tokens until one of the following:
|
|
47
|
-
* - A double newline (paragraph break).
|
|
48
|
-
* - A new entry (COLON at line start).
|
|
49
|
-
* - End of input.
|
|
50
|
-
*
|
|
51
|
-
* The key is parsed for inline content using {@link parseInlineUntil}
|
|
52
|
-
* (stopping at COLON), and the value uses the same utility (stopping at
|
|
53
|
-
* NEWLINE).
|
|
54
|
-
*
|
|
55
|
-
* @param ctx - Parse context.
|
|
56
|
-
* @param startPos - Token index of the expected line-start COLON.
|
|
57
|
-
* @returns The parsed item and token count, or `null` on failure.
|
|
58
|
-
*/
|
|
59
|
-
function parseDefinitionItem(
|
|
60
|
-
ctx: ParseContext,
|
|
61
|
-
startPos: number,
|
|
62
|
-
): { item: ParsedDefinitionItem; consumed: number } | null {
|
|
63
|
-
let pos = startPos;
|
|
64
|
-
let consumed = 0;
|
|
65
|
-
|
|
66
|
-
// Expect COLON at line start
|
|
67
|
-
const colonToken = ctx.tokens[pos];
|
|
68
|
-
if (!colonToken || colonToken.type !== "COLON" || !colonToken.lineStart) {
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
pos++;
|
|
72
|
-
consumed++;
|
|
73
|
-
|
|
74
|
-
// Wikidot requires whitespace after first colon: ": key : value"
|
|
75
|
-
const whitespaceAfterColon = ctx.tokens[pos];
|
|
76
|
-
if (!whitespaceAfterColon || whitespaceAfterColon.type !== "WHITESPACE") {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Skip whitespace after first colon
|
|
81
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
82
|
-
pos++;
|
|
83
|
-
consumed++;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Collect key tokens until second COLON
|
|
87
|
-
const keyTokens: string[] = [];
|
|
88
|
-
const keyNodes: Element[] = [];
|
|
89
|
-
let foundSecondColon = false;
|
|
90
|
-
|
|
91
|
-
while (pos < ctx.tokens.length) {
|
|
92
|
-
const token = ctx.tokens[pos];
|
|
93
|
-
if (!token || token.type === "NEWLINE" || token.type === "EOF") {
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
if (token.type === "COLON") {
|
|
97
|
-
foundSecondColon = true;
|
|
98
|
-
pos++;
|
|
99
|
-
consumed++;
|
|
100
|
-
break;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Parse inline content for key
|
|
104
|
-
const inlineCtx: ParseContext = { ...ctx, pos };
|
|
105
|
-
const result = parseInlineUntil(inlineCtx, "COLON");
|
|
106
|
-
if (result.elements.length > 0) {
|
|
107
|
-
keyNodes.push(...result.elements);
|
|
108
|
-
// Collect raw key string
|
|
109
|
-
for (let i = 0; i < result.consumed; i++) {
|
|
110
|
-
const t = ctx.tokens[pos + i];
|
|
111
|
-
if (t) keyTokens.push(t.value);
|
|
112
|
-
}
|
|
113
|
-
pos += result.consumed;
|
|
114
|
-
consumed += result.consumed;
|
|
115
|
-
} else {
|
|
116
|
-
keyTokens.push(token.value);
|
|
117
|
-
pos++;
|
|
118
|
-
consumed++;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (!foundSecondColon) {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Skip whitespace after second colon
|
|
127
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
128
|
-
pos++;
|
|
129
|
-
consumed++;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Parse value (rest of line, can continue with line breaks)
|
|
133
|
-
const valueNodes: Element[] = [];
|
|
134
|
-
while (pos < ctx.tokens.length) {
|
|
135
|
-
const token = ctx.tokens[pos];
|
|
136
|
-
if (!token || token.type === "EOF") {
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Check for end of definition (double newline or new definition)
|
|
141
|
-
if (token.type === "NEWLINE") {
|
|
142
|
-
const nextToken = ctx.tokens[pos + 1];
|
|
143
|
-
// Look ahead for continuation with underscore line break
|
|
144
|
-
if (nextToken?.type === "COLON" && nextToken.lineStart) {
|
|
145
|
-
// New definition item starts
|
|
146
|
-
pos++;
|
|
147
|
-
consumed++;
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
if (nextToken?.type === "NEWLINE" || !nextToken || nextToken.type === "EOF") {
|
|
151
|
-
// Double newline or end - stop
|
|
152
|
-
pos++;
|
|
153
|
-
consumed++;
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
// Single newline - continue parsing (becomes line break)
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Parse inline content
|
|
160
|
-
const inlineCtx: ParseContext = { ...ctx, pos };
|
|
161
|
-
const result = parseInlineUntil(inlineCtx, "NEWLINE");
|
|
162
|
-
if (result.elements.length > 0) {
|
|
163
|
-
valueNodes.push(...result.elements);
|
|
164
|
-
pos += result.consumed;
|
|
165
|
-
consumed += result.consumed;
|
|
166
|
-
} else {
|
|
167
|
-
pos++;
|
|
168
|
-
consumed++;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Remove trailing whitespace from key
|
|
173
|
-
const keyString = keyTokens.join("").trim();
|
|
174
|
-
|
|
175
|
-
// Remove trailing whitespace nodes from key
|
|
176
|
-
while (keyNodes.length > 0) {
|
|
177
|
-
const lastNode = keyNodes[keyNodes.length - 1];
|
|
178
|
-
if (
|
|
179
|
-
lastNode &&
|
|
180
|
-
lastNode.element === "text" &&
|
|
181
|
-
typeof lastNode.data === "string" &&
|
|
182
|
-
lastNode.data.trim() === ""
|
|
183
|
-
) {
|
|
184
|
-
keyNodes.pop();
|
|
185
|
-
} else {
|
|
186
|
-
break;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return {
|
|
191
|
-
item: {
|
|
192
|
-
keyString,
|
|
193
|
-
key: keyNodes,
|
|
194
|
-
value: valueNodes,
|
|
195
|
-
},
|
|
196
|
-
consumed,
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Block rule for Wikidot definition lists (`: key : value`).
|
|
202
|
-
*
|
|
203
|
-
* Parsing strategy:
|
|
204
|
-
* 1. Verify the first token is a line-start COLON.
|
|
205
|
-
* 2. Repeatedly call `parseDefinitionItem()` to collect entries.
|
|
206
|
-
* 3. Stop when the current token is no longer a line-start COLON (i.e.
|
|
207
|
-
* the definition list block has ended).
|
|
208
|
-
* 4. Convert internal items into the AST {@link DefinitionListItem} format.
|
|
209
|
-
* 5. Emit a single `definition-list` element.
|
|
210
|
-
*/
|
|
211
|
-
export const definitionListRule: BlockRule = {
|
|
212
|
-
name: "definitionList",
|
|
213
|
-
startTokens: ["COLON"],
|
|
214
|
-
requiresLineStart: true,
|
|
215
|
-
|
|
216
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
217
|
-
const items: ParsedDefinitionItem[] = [];
|
|
218
|
-
let pos = ctx.pos;
|
|
219
|
-
let totalConsumed = 0;
|
|
220
|
-
|
|
221
|
-
while (pos < ctx.tokens.length) {
|
|
222
|
-
const token = ctx.tokens[pos];
|
|
223
|
-
if (!token || token.type === "EOF") {
|
|
224
|
-
break;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Only parse lines starting with :
|
|
228
|
-
if (token.type !== "COLON" || !token.lineStart) {
|
|
229
|
-
break;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const result = parseDefinitionItem(ctx, pos);
|
|
233
|
-
if (!result) {
|
|
234
|
-
break;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
items.push(result.item);
|
|
238
|
-
pos += result.consumed;
|
|
239
|
-
totalConsumed += result.consumed;
|
|
240
|
-
|
|
241
|
-
// Skip any whitespace between items
|
|
242
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
243
|
-
pos++;
|
|
244
|
-
totalConsumed++;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
if (items.length === 0) {
|
|
249
|
-
return { success: false };
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Convert items to DefinitionListItem format
|
|
253
|
-
const definitionItems: DefinitionListItem[] = items.map((item) => ({
|
|
254
|
-
key_string: item.keyString,
|
|
255
|
-
key: item.key,
|
|
256
|
-
value: item.value,
|
|
257
|
-
}));
|
|
258
|
-
|
|
259
|
-
return {
|
|
260
|
-
success: true,
|
|
261
|
-
elements: [
|
|
262
|
-
{
|
|
263
|
-
element: "definition-list",
|
|
264
|
-
data: definitionItems,
|
|
265
|
-
},
|
|
266
|
-
],
|
|
267
|
-
consumed: totalConsumed,
|
|
268
|
-
};
|
|
269
|
-
},
|
|
270
|
-
};
|