@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,252 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
* expressed as a replacement: `ctx.scope = { ...ctx.scope, X: ... }`
|
|
11
|
-
* (or, more commonly, by constructing a new child context with the
|
|
12
|
-
* desired scope override).
|
|
13
|
-
*
|
|
14
|
-
* The motivation is to keep speculative parse rollback safe: when a
|
|
15
|
-
* block rule fails, any scope it built up is discarded with the failed
|
|
16
|
-
* context. A shared-state design that mutates fields in place does not
|
|
17
|
-
* survive rollback — grouping per-scope fields here and forbidding
|
|
18
|
-
* nested mutation makes the semantics explicit at the type level.
|
|
19
|
-
*/
|
|
20
|
-
export interface ScopeContext {
|
|
21
|
-
/**
|
|
22
|
-
* Close condition for the current block. The paragraph parser calls
|
|
23
|
-
* it to decide when to stop collecting inline content.
|
|
24
|
-
*/
|
|
25
|
-
readonly blockCloseCondition?: (ctx: ParseContext) => boolean;
|
|
26
|
-
/**
|
|
27
|
-
* Block names excluded from paragraph-boundary detection. When a
|
|
28
|
-
* BLOCK_OPEN/BLOCK_END_OPEN for an excluded name appears at line
|
|
29
|
-
* start, the inline parser does NOT treat it as a paragraph break.
|
|
30
|
-
* Used by `[[collapsible]]` to prevent nested `[[collapsible]]` from
|
|
31
|
-
* splitting paragraphs.
|
|
32
|
-
*/
|
|
33
|
-
readonly excludedBlockNames?: ReadonlySet<string>;
|
|
34
|
-
/**
|
|
35
|
-
* Budget for div nesting: tracks how many more nested divs can open.
|
|
36
|
-
* When 0, the div rule fails (innermost excess opens become text).
|
|
37
|
-
* `undefined` means "not yet calculated" (top-level or non-div context).
|
|
38
|
-
*/
|
|
39
|
-
readonly divClosesBudget?: number;
|
|
40
|
-
/**
|
|
41
|
-
* Used by the footnote-block rule to reject duplicate occurrences.
|
|
42
|
-
*
|
|
43
|
-
* **Scope is per spread copy of `ParseContext`, not document-global.**
|
|
44
|
-
* `parseBlocksUntil` creates a fresh `{ ...ctx, pos, ... }` on every
|
|
45
|
-
* iteration, so the flag does not propagate between sibling rules in
|
|
46
|
-
* a body, between sibling bodies, or up to the top-level parser.
|
|
47
|
-
*
|
|
48
|
-
* Practical effect today:
|
|
49
|
-
* - Two `[[footnoteblock]]` at the top level: the second one fails
|
|
50
|
-
* (the top-level dispatch hands the parser's own `ctx` to rules,
|
|
51
|
-
* so mutations are visible to the next top-level iteration).
|
|
52
|
-
* - Two `[[footnoteblock]]` inside the same body, or across nested
|
|
53
|
-
* bodies: both currently succeed, even though Wikidot's
|
|
54
|
-
* "first-only" rule should reject the duplicate.
|
|
55
|
-
*
|
|
56
|
-
* Fixing the cross-scope case requires either an AST-level dedup pass
|
|
57
|
-
* after parsing (similar to the auto-append walk) or a shared-state
|
|
58
|
-
* design with proper rollback for speculative parses. Tracked
|
|
59
|
-
* separately; this flag intentionally keeps the original primitive
|
|
60
|
-
* semantics to avoid regressing the top-level duplicate-rejection
|
|
61
|
-
* test fixtures.
|
|
62
|
-
*
|
|
63
|
-
* The auto-append decision in `Parser.parse` deliberately ignores
|
|
64
|
-
* this flag and walks the final AST instead — see `containsFootnoteBlock`.
|
|
65
|
-
*/
|
|
66
|
-
readonly footnoteBlockParsed: boolean;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Parser context passed to rules.
|
|
71
|
-
*
|
|
72
|
-
* Fields are grouped by lifecycle:
|
|
73
|
-
* - Static config (`tokens`, `version`, `trackPositions`, `settings`,
|
|
74
|
-
* rule arrays): constructor-fixed.
|
|
75
|
-
* - `pos`: per-scope cursor; kept top-level for ergonomics because
|
|
76
|
-
* every rule spread overrides it.
|
|
77
|
-
* - Accumulators (`footnotes`, `tocEntries`, …, `diagnostics`):
|
|
78
|
-
* reference-shared via array identity across spreads.
|
|
79
|
-
* - `scope`: per-scope state explicitly grouped; see {@link ScopeContext}.
|
|
80
|
-
*/
|
|
81
|
-
export interface ParseContext {
|
|
82
|
-
tokens: Token[];
|
|
83
|
-
pos: number;
|
|
84
|
-
version: Version;
|
|
85
|
-
trackPositions: boolean;
|
|
86
|
-
settings: WikitextSettings;
|
|
87
|
-
// Collections for SyntaxTree output
|
|
88
|
-
footnotes: Element[][];
|
|
89
|
-
tocEntries: TocEntry[];
|
|
90
|
-
codeBlocks: CodeBlockData[];
|
|
91
|
-
htmlBlocks: string[];
|
|
92
|
-
// Bibliography citation labels collected during parsing
|
|
93
|
-
bibcites: string[];
|
|
94
|
-
// Rules (injected to avoid circular dependency)
|
|
95
|
-
blockRules: BlockRule[];
|
|
96
|
-
blockFallbackRule: BlockRule;
|
|
97
|
-
inlineRules: InlineRule[];
|
|
98
|
-
// Diagnostics collected during parsing
|
|
99
|
-
diagnostics: Diagnostic[];
|
|
100
|
-
// Per-scope state (readonly fields, immutable-replace semantics).
|
|
101
|
-
scope: ScopeContext;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Result of a rule attempt
|
|
106
|
-
* Returns elements array None/Single/Multiple
|
|
107
|
-
*
|
|
108
|
-
* During migration: T can be either internal AST node or Element
|
|
109
|
-
*/
|
|
110
|
-
export type RuleResult<T> = { success: true; elements: T[]; consumed: number } | { success: false };
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Block rule interface
|
|
114
|
-
*/
|
|
115
|
-
export interface BlockRule {
|
|
116
|
-
/** Rule name for debugging */
|
|
117
|
-
name: string;
|
|
118
|
-
/** Token types that can start this rule */
|
|
119
|
-
startTokens: TokenType[];
|
|
120
|
-
/** Whether this rule requires line start */
|
|
121
|
-
requiresLineStart: boolean;
|
|
122
|
-
/** Try to parse this block */
|
|
123
|
-
parse(ctx: ParseContext): RuleResult<Element>;
|
|
124
|
-
/**
|
|
125
|
-
* Check if tokens at the given position match this rule's start pattern.
|
|
126
|
-
* Used by inline parser to determine behavior before a block boundary
|
|
127
|
-
* (e.g. whether to generate a trailing line-break).
|
|
128
|
-
*/
|
|
129
|
-
isStartPattern?(ctx: ParseContext, pos: number): boolean;
|
|
130
|
-
/**
|
|
131
|
-
* When true, a single newline before this block becomes a line-break.
|
|
132
|
-
* Wikidot's Divalign expands content inline, so \n before nested blocks
|
|
133
|
-
* becomes <br />. Other blocks (Code, Div, etc.) suppress this.
|
|
134
|
-
*/
|
|
135
|
-
preservesPrecedingLineBreak?: boolean;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Inline rule interface
|
|
140
|
-
*/
|
|
141
|
-
export interface InlineRule {
|
|
142
|
-
/** Rule name for debugging */
|
|
143
|
-
name: string;
|
|
144
|
-
/** Token types that can start this rule */
|
|
145
|
-
startTokens: TokenType[];
|
|
146
|
-
/** Try to parse this inline element */
|
|
147
|
-
parse(ctx: ParseContext): RuleResult<Element>;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Helper to get current token
|
|
152
|
-
*/
|
|
153
|
-
export function currentToken(ctx: ParseContext): Token {
|
|
154
|
-
return ctx.tokens[ctx.pos] ?? eofToken();
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Helper to peek ahead
|
|
159
|
-
*/
|
|
160
|
-
export function peekToken(ctx: ParseContext, n = 1): Token {
|
|
161
|
-
return ctx.tokens[ctx.pos + n] ?? eofToken();
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Helper to check token type
|
|
166
|
-
*/
|
|
167
|
-
export function checkToken(ctx: ParseContext, type: TokenType): boolean {
|
|
168
|
-
return currentToken(ctx).type === type;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Helper to check if at end
|
|
173
|
-
*/
|
|
174
|
-
export function isAtEnd(ctx: ParseContext): boolean {
|
|
175
|
-
return ctx.pos >= ctx.tokens.length || currentToken(ctx).type === "EOF";
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Create EOF token
|
|
180
|
-
*/
|
|
181
|
-
function eofToken(): Token {
|
|
182
|
-
return {
|
|
183
|
-
type: "EOF",
|
|
184
|
-
value: "",
|
|
185
|
-
position: { start: { line: 0, column: 0, offset: 0 }, end: { line: 0, column: 0, offset: 0 } },
|
|
186
|
-
lineStart: false,
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Check if closing marker exists before newline
|
|
192
|
-
* If markerValue is provided, also check that the token value matches
|
|
193
|
-
*/
|
|
194
|
-
export function hasClosingMarkerBeforeNewline(
|
|
195
|
-
ctx: ParseContext,
|
|
196
|
-
markerType: TokenType,
|
|
197
|
-
markerValue?: string,
|
|
198
|
-
): boolean {
|
|
199
|
-
let pos = ctx.pos;
|
|
200
|
-
while (pos < ctx.tokens.length) {
|
|
201
|
-
const token = ctx.tokens[pos];
|
|
202
|
-
if (!token || token.type === "NEWLINE" || token.type === "EOF") {
|
|
203
|
-
return false;
|
|
204
|
-
}
|
|
205
|
-
if (token.type === markerType) {
|
|
206
|
-
if (markerValue === undefined || token.value === markerValue) {
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
pos++;
|
|
211
|
-
}
|
|
212
|
-
return false;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Check if closing marker exists before paragraph break (double newline)
|
|
217
|
-
* Allows inline formatting to span multiple lines within a paragraph
|
|
218
|
-
*/
|
|
219
|
-
export function hasClosingMarkerBeforeParagraphBreak(
|
|
220
|
-
ctx: ParseContext,
|
|
221
|
-
markerType: TokenType,
|
|
222
|
-
markerValue?: string,
|
|
223
|
-
): boolean {
|
|
224
|
-
let pos = ctx.pos;
|
|
225
|
-
while (pos < ctx.tokens.length) {
|
|
226
|
-
const token = ctx.tokens[pos];
|
|
227
|
-
if (!token || token.type === "EOF") {
|
|
228
|
-
return false;
|
|
229
|
-
}
|
|
230
|
-
// Check for paragraph break (NEWLINE followed by NEWLINE after optional whitespace)
|
|
231
|
-
if (token.type === "NEWLINE") {
|
|
232
|
-
let lookAhead = 1;
|
|
233
|
-
while (ctx.tokens[pos + lookAhead]?.type === "WHITESPACE") {
|
|
234
|
-
lookAhead++;
|
|
235
|
-
}
|
|
236
|
-
if (
|
|
237
|
-
ctx.tokens[pos + lookAhead]?.type === "NEWLINE" ||
|
|
238
|
-
ctx.tokens[pos + lookAhead]?.type === "EOF" ||
|
|
239
|
-
!ctx.tokens[pos + lookAhead]
|
|
240
|
-
) {
|
|
241
|
-
return false; // Paragraph break - stop
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
if (token.type === markerType) {
|
|
245
|
-
if (markerValue === undefined || token.value === markerValue) {
|
|
246
|
-
return true;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
pos++;
|
|
250
|
-
}
|
|
251
|
-
return false;
|
|
252
|
-
}
|
|
1
|
+
export type { BlockRule, InlineRule, ParseContext, RuleResult, ScopeContext } from "./contracts";
|
|
2
|
+
export {
|
|
3
|
+
checkToken,
|
|
4
|
+
currentToken,
|
|
5
|
+
hasClosingMarkerBeforeNewline,
|
|
6
|
+
hasClosingMarkerBeforeParagraphBreak,
|
|
7
|
+
isAtEnd,
|
|
8
|
+
peekToken,
|
|
9
|
+
} from "./tokens";
|
package/src/parser/depth.ts
DELETED
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Depth processing module for converting flat lists into nested tree structures.
|
|
4
|
-
*
|
|
5
|
-
* This is a TypeScript port of Wikidot's `depth.rs`. It handles the conversion
|
|
6
|
-
* of flat depth-annotated items (such as bullet/numbered list entries at various
|
|
7
|
-
* indentation levels) into properly nested tree structures. The algorithm uses an
|
|
8
|
-
* internal stack to track open nesting levels and collapses them as depth decreases.
|
|
9
|
-
*
|
|
10
|
-
* Used primarily by the list parser and the table-of-contents builder to transform
|
|
11
|
-
* flat sequences of items with depth annotations into hierarchical AST structures.
|
|
12
|
-
*
|
|
13
|
-
* @module
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Represents a single node in a depth tree.
|
|
18
|
-
*
|
|
19
|
-
* A node is either a leaf item containing a value, or a nested list containing
|
|
20
|
-
* children. This recursive type allows arbitrarily deep nesting.
|
|
21
|
-
*
|
|
22
|
-
* @typeParam L - The list type discriminator (e.g., "bullet" vs "number" for lists,
|
|
23
|
-
* or `null` when list type distinction is not needed)
|
|
24
|
-
* @typeParam T - The type of leaf item values
|
|
25
|
-
*/
|
|
26
|
-
export type DepthItem<L, T> =
|
|
27
|
-
| { kind: "item"; value: T }
|
|
28
|
-
| { kind: "list"; ltype: L; children: DepthList<L, T> };
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* An ordered collection of depth tree nodes at the same level.
|
|
32
|
-
*
|
|
33
|
-
* @typeParam L - The list type discriminator
|
|
34
|
-
* @typeParam T - The type of leaf item values
|
|
35
|
-
*/
|
|
36
|
-
export type DepthList<L, T> = DepthItem<L, T>[];
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Internal stack-based builder for constructing depth trees incrementally.
|
|
40
|
-
*
|
|
41
|
-
* The stack tracks open nesting levels. As items are added at increasing depths,
|
|
42
|
-
* new levels are pushed. When depth decreases, levels are popped and collapsed
|
|
43
|
-
* into their parent as nested list nodes. When the list type changes at the same
|
|
44
|
-
* depth, the current list is finalized and a new one begins.
|
|
45
|
-
*
|
|
46
|
-
* @typeParam L - The list type discriminator
|
|
47
|
-
* @typeParam T - The type of leaf item values
|
|
48
|
-
*/
|
|
49
|
-
class DepthStack<L, T> {
|
|
50
|
-
private finished: Array<{ ltype: L; list: DepthList<L, T> }> = [];
|
|
51
|
-
private stack: Array<{ ltype: L; items: DepthItem<L, T>[] }>;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* @param topLtype - The list type for the initial (top-level) nesting layer
|
|
55
|
-
*/
|
|
56
|
-
constructor(topLtype: L) {
|
|
57
|
-
this.stack = [{ ltype: topLtype, items: [] }];
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** Returns the topmost (deepest nesting) layer on the stack. */
|
|
61
|
-
private get last(): { ltype: L; items: DepthItem<L, T>[] } {
|
|
62
|
-
return this.stack[this.stack.length - 1]!;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** Returns the bottommost (root) layer on the stack. */
|
|
66
|
-
private get first(): { ltype: L; items: DepthItem<L, T>[] } {
|
|
67
|
-
return this.stack[0]!;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** Returns true if only the root layer remains on the stack. */
|
|
71
|
-
private isSingle(): boolean {
|
|
72
|
-
return this.stack.length === 1;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Push a new nesting level onto the stack.
|
|
77
|
-
* @param ltype - The list type for the new level
|
|
78
|
-
*/
|
|
79
|
-
increaseDepth(ltype: L): void {
|
|
80
|
-
this.stack.push({ ltype, items: [] });
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Pop the topmost nesting level and collapse it into a list node on its parent.
|
|
85
|
-
* @throws Error if there is no level to pop (stack is empty)
|
|
86
|
-
*/
|
|
87
|
-
decreaseDepth(): void {
|
|
88
|
-
const popped = this.stack.pop();
|
|
89
|
-
if (!popped) {
|
|
90
|
-
throw new Error("No depth to pop off!");
|
|
91
|
-
}
|
|
92
|
-
this.push({ kind: "list", ltype: popped.ltype, children: popped.items });
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Start a new list at the current depth with a different list type.
|
|
97
|
-
*
|
|
98
|
-
* When the list type changes (e.g., from bullet to numbered) at the same depth,
|
|
99
|
-
* this method finalizes the current list and begins a new one. At the root layer
|
|
100
|
-
* the entire tree is finalized; at deeper layers a pop/push cycle suffices.
|
|
101
|
-
*
|
|
102
|
-
* @param ltype - The list type for the new list
|
|
103
|
-
*/
|
|
104
|
-
newList(ltype: L): void {
|
|
105
|
-
if (this.isSingle()) {
|
|
106
|
-
// This is the last layer, so the pop/push trick doesn't work.
|
|
107
|
-
// Instead, output this entire thing as a finished list tree,
|
|
108
|
-
// then create a new one for the process to continue.
|
|
109
|
-
this.finishDepthList(ltype);
|
|
110
|
-
} else {
|
|
111
|
-
// We can just decrease and increase to make a new list
|
|
112
|
-
this.decreaseDepth();
|
|
113
|
-
this.increaseDepth(ltype);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/** Append a depth item to the current (topmost) layer. */
|
|
118
|
-
private push(item: DepthItem<L, T>): void {
|
|
119
|
-
this.last.items.push(item);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Add a leaf item to the current nesting level.
|
|
124
|
-
* @param item - The value to wrap in a leaf node
|
|
125
|
-
*/
|
|
126
|
-
pushItem(item: T): void {
|
|
127
|
-
this.push({ kind: "item", value: item });
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/** Returns the list type of the topmost nesting level. */
|
|
131
|
-
lastType(): L {
|
|
132
|
-
return this.last.ltype;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Finalize the current tree by collapsing all open layers into a single
|
|
137
|
-
* finished tree, then reset the stack for continued processing.
|
|
138
|
-
*
|
|
139
|
-
* @param newLtype - The list type for the next tree, or null to reuse the current type.
|
|
140
|
-
* Null is used by {@link intoTrees} since no further items will be added.
|
|
141
|
-
*/
|
|
142
|
-
private finishDepthList(newLtype: L | null): void {
|
|
143
|
-
// Wrap all opened layers
|
|
144
|
-
// Start at 1 since we always have at least one layer
|
|
145
|
-
while (this.stack.length > 1) {
|
|
146
|
-
this.decreaseDepth();
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Return top-level layer
|
|
150
|
-
const first = this.first;
|
|
151
|
-
const ltype = first.ltype;
|
|
152
|
-
const list = first.items;
|
|
153
|
-
|
|
154
|
-
// For intoTrees(), we don't care what the new ltype is,
|
|
155
|
-
// so we just reuse the last one.
|
|
156
|
-
// But for newList() we do, we want a new list layer.
|
|
157
|
-
const actualNewLtype = newLtype ?? ltype;
|
|
158
|
-
|
|
159
|
-
// Reset the first layer
|
|
160
|
-
first.ltype = actualNewLtype;
|
|
161
|
-
first.items = [];
|
|
162
|
-
|
|
163
|
-
// Only push if the list has elements
|
|
164
|
-
if (list.length > 0) {
|
|
165
|
-
this.finished.push({ ltype, list });
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Finalize all remaining layers and return the completed trees.
|
|
171
|
-
* @returns Array of finished trees, each with its list type and items
|
|
172
|
-
*/
|
|
173
|
-
intoTrees(): Array<{ ltype: L; list: DepthList<L, T> }> {
|
|
174
|
-
this.finishDepthList(null);
|
|
175
|
-
return this.finished;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Process a flat list of depth-annotated items into nested tree structures.
|
|
181
|
-
*
|
|
182
|
-
* This is the main entry point for the depth module. It takes a sequence of items,
|
|
183
|
-
* each annotated with a nesting depth and a list type, and produces one or more
|
|
184
|
-
* nested trees. Multiple trees are produced when the list type changes at the
|
|
185
|
-
* root level (depth 0).
|
|
186
|
-
*
|
|
187
|
-
* The algorithm iterates through items sequentially, using a stack to track
|
|
188
|
-
* open nesting levels. When depth increases, new levels are pushed; when depth
|
|
189
|
-
* decreases, levels are popped and collapsed into their parent. When the list
|
|
190
|
-
* type changes at the same depth, the current list is finalized and a new one begins.
|
|
191
|
-
*
|
|
192
|
-
* @typeParam L - The list type discriminator
|
|
193
|
-
* @typeParam T - The type of leaf item values
|
|
194
|
-
* @param topLtype - The default list type for the root level
|
|
195
|
-
* @param items - Flat sequence of depth-annotated items, where each item has:
|
|
196
|
-
* - `depth`: the 0-based nesting level
|
|
197
|
-
* - `ltype`: the list type for grouping (e.g., "bullet" vs "number")
|
|
198
|
-
* - `value`: the actual item content
|
|
199
|
-
* @param ltypeEquals - Equality comparator for list types (defaults to `===`)
|
|
200
|
-
* @returns Array of finished trees, each with an `ltype` and a `list` of nested items.
|
|
201
|
-
* Multiple trees are returned when the list type changes at depth 0.
|
|
202
|
-
*/
|
|
203
|
-
export function processDepths<L, T>(
|
|
204
|
-
topLtype: L,
|
|
205
|
-
items: Array<{ depth: number; ltype: L; value: T }>,
|
|
206
|
-
ltypeEquals: (a: L, b: L) => boolean = (a, b) => a === b,
|
|
207
|
-
): Array<{ ltype: L; list: DepthList<L, T> }> {
|
|
208
|
-
const stack = new DepthStack<L, T>(topLtype);
|
|
209
|
-
|
|
210
|
-
// The depth value for the previous item
|
|
211
|
-
let previous = 0;
|
|
212
|
-
|
|
213
|
-
// Iterate through each of the items
|
|
214
|
-
for (const { depth, ltype, value } of items) {
|
|
215
|
-
// Add or remove new depth levels as appropriate,
|
|
216
|
-
// based on what our new depth value is compared
|
|
217
|
-
// to the value in the previous iteration.
|
|
218
|
-
//
|
|
219
|
-
// If previous == depth, then neither of these for loops will run
|
|
220
|
-
// If previous < depth, then only the first will run
|
|
221
|
-
// If previous > depth, then only the second will run
|
|
222
|
-
|
|
223
|
-
// Open new levels
|
|
224
|
-
for (let i = previous; i < depth; i++) {
|
|
225
|
-
stack.increaseDepth(ltype);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Close existing levels
|
|
229
|
-
for (let i = depth; i < previous; i++) {
|
|
230
|
-
stack.decreaseDepth();
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// Create new level if the type doesn't match
|
|
234
|
-
//
|
|
235
|
-
// Here we decrease and increase the depth to close
|
|
236
|
-
// the current layer, then make a new one with the
|
|
237
|
-
// type this item has.
|
|
238
|
-
//
|
|
239
|
-
// We'll keep appending to this remade layer until
|
|
240
|
-
// we hit a different depth or a different type.
|
|
241
|
-
if (!ltypeEquals(stack.lastType(), ltype)) {
|
|
242
|
-
stack.newList(ltype);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Push element and update state
|
|
246
|
-
stack.pushItem(value);
|
|
247
|
-
previous = depth;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
return stack.intoTrees();
|
|
251
|
-
}
|