@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,282 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Block rule for Wikidot alignment containers.
|
|
4
|
-
*
|
|
5
|
-
* Wikidot provides a shorthand bracket syntax for wrapping content in a
|
|
6
|
-
* directional alignment container:
|
|
7
|
-
*
|
|
8
|
-
* ```
|
|
9
|
-
* [[>]] ... [[/>]] right-aligned
|
|
10
|
-
* [[<]] ... [[/<]] left-aligned
|
|
11
|
-
* [[=]] ... [[/=]] center-aligned
|
|
12
|
-
* [[==]] ... [[/==]] justify-aligned
|
|
13
|
-
* ```
|
|
14
|
-
*
|
|
15
|
-
* Each pair acts as a block-level wrapper. The opening tag must appear at
|
|
16
|
-
* the start of a line and be followed by a newline. Body content is parsed
|
|
17
|
-
* recursively as block-level markup, and the matching closing tag terminates
|
|
18
|
-
* the container.
|
|
19
|
-
*
|
|
20
|
-
* The resulting AST node is a generic container element whose `type` field
|
|
21
|
-
* carries the alignment direction (e.g. `{ align: "right" }`).
|
|
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 { parseBlocksUntil } from "./utils";
|
|
29
|
-
|
|
30
|
-
/** The four text-alignment directions Wikidot supports. */
|
|
31
|
-
type AlignDirection = "left" | "right" | "center" | "justify";
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Attempts to parse the interior of an align opening tag starting after
|
|
35
|
-
* the BLOCK_OPEN (`[[`) token.
|
|
36
|
-
*
|
|
37
|
-
* The function inspects the token(s) immediately following `[[` to determine
|
|
38
|
-
* which alignment direction is requested:
|
|
39
|
-
*
|
|
40
|
-
* | Tokens after `[[` | Direction |
|
|
41
|
-
* |----------------------|-------------|
|
|
42
|
-
* | `>` `]]` | right |
|
|
43
|
-
* | `<` `]]` | left |
|
|
44
|
-
* | `=` `]]` | center |
|
|
45
|
-
* | `=` `=` `]]` | justify |
|
|
46
|
-
*
|
|
47
|
-
* The `>` character may arrive as either a BLOCKQUOTE_MARKER (when the
|
|
48
|
-
* line starts with `[[`) or as a TEXT token (when it does not).
|
|
49
|
-
*
|
|
50
|
-
* @param ctx - Current parse context.
|
|
51
|
-
* @param pos - Token index right after the BLOCK_OPEN token.
|
|
52
|
-
* @returns The detected direction and how many tokens were consumed,
|
|
53
|
-
* or `null` if the tokens do not form a valid align open tag.
|
|
54
|
-
*/
|
|
55
|
-
function parseAlignOpen(
|
|
56
|
-
ctx: ParseContext,
|
|
57
|
-
pos: number,
|
|
58
|
-
): { direction: AlignDirection; consumed: number } | null {
|
|
59
|
-
const tokens = ctx.tokens;
|
|
60
|
-
|
|
61
|
-
// After BLOCK_OPEN, expect specific patterns
|
|
62
|
-
const firstToken = tokens[pos];
|
|
63
|
-
if (!firstToken) return null;
|
|
64
|
-
|
|
65
|
-
// [[>]] - right
|
|
66
|
-
if (
|
|
67
|
-
firstToken.type === "BLOCKQUOTE_MARKER" &&
|
|
68
|
-
firstToken.value === ">" &&
|
|
69
|
-
tokens[pos + 1]?.type === "BLOCK_CLOSE"
|
|
70
|
-
) {
|
|
71
|
-
return { direction: "right", consumed: 2 };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Also handle TEXT ">" for non-line-start cases
|
|
75
|
-
if (
|
|
76
|
-
firstToken.type === "TEXT" &&
|
|
77
|
-
firstToken.value === ">" &&
|
|
78
|
-
tokens[pos + 1]?.type === "BLOCK_CLOSE"
|
|
79
|
-
) {
|
|
80
|
-
return { direction: "right", consumed: 2 };
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// [[<]] - left (LEFT_DOUBLE_ANGLE might be tokenized, but usually it's after [[)
|
|
84
|
-
if (
|
|
85
|
-
firstToken.type === "TEXT" &&
|
|
86
|
-
firstToken.value === "<" &&
|
|
87
|
-
tokens[pos + 1]?.type === "BLOCK_CLOSE"
|
|
88
|
-
) {
|
|
89
|
-
return { direction: "left", consumed: 2 };
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// [[=]] - center (single =)
|
|
93
|
-
if (firstToken.type === "EQUALS" && tokens[pos + 1]?.type === "BLOCK_CLOSE") {
|
|
94
|
-
return { direction: "center", consumed: 2 };
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// [[==]] - justify (double =)
|
|
98
|
-
if (
|
|
99
|
-
firstToken.type === "EQUALS" &&
|
|
100
|
-
tokens[pos + 1]?.type === "EQUALS" &&
|
|
101
|
-
tokens[pos + 2]?.type === "BLOCK_CLOSE"
|
|
102
|
-
) {
|
|
103
|
-
return { direction: "justify", consumed: 3 };
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Tests whether the tokens at the current position form a closing align
|
|
111
|
-
* tag (`[[/> ]]`, `[[/< ]]`, `[[/= ]]`, or `[[/== ]]`) that matches
|
|
112
|
-
* the given direction.
|
|
113
|
-
*
|
|
114
|
-
* The closing tag always starts with a BLOCK_END_OPEN token (`[[/`)
|
|
115
|
-
* followed by the same symbol(s) as the opening tag plus BLOCK_CLOSE.
|
|
116
|
-
*
|
|
117
|
-
* @param ctx - Current parse context (reads from `ctx.pos`).
|
|
118
|
-
* @param direction - The alignment direction of the currently open block,
|
|
119
|
-
* used to select the expected closing pattern.
|
|
120
|
-
* @returns An object with `match` (whether the close tag was found) and
|
|
121
|
-
* `consumed` (number of tokens the closing tag occupies).
|
|
122
|
-
*/
|
|
123
|
-
function isAlignClose(
|
|
124
|
-
ctx: ParseContext,
|
|
125
|
-
direction: AlignDirection,
|
|
126
|
-
): { match: boolean; consumed: number } {
|
|
127
|
-
const tokens = ctx.tokens;
|
|
128
|
-
let pos = ctx.pos;
|
|
129
|
-
|
|
130
|
-
if (tokens[pos]?.type !== "BLOCK_END_OPEN") {
|
|
131
|
-
return { match: false, consumed: 0 };
|
|
132
|
-
}
|
|
133
|
-
pos++;
|
|
134
|
-
|
|
135
|
-
// [[/>]] - right
|
|
136
|
-
if (direction === "right") {
|
|
137
|
-
if (
|
|
138
|
-
(tokens[pos]?.type === "BLOCKQUOTE_MARKER" || tokens[pos]?.type === "TEXT") &&
|
|
139
|
-
tokens[pos]?.value === ">" &&
|
|
140
|
-
tokens[pos + 1]?.type === "BLOCK_CLOSE"
|
|
141
|
-
) {
|
|
142
|
-
return { match: true, consumed: 3 };
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// [[/<]] - left
|
|
147
|
-
if (direction === "left") {
|
|
148
|
-
if (
|
|
149
|
-
tokens[pos]?.type === "TEXT" &&
|
|
150
|
-
tokens[pos]?.value === "<" &&
|
|
151
|
-
tokens[pos + 1]?.type === "BLOCK_CLOSE"
|
|
152
|
-
) {
|
|
153
|
-
return { match: true, consumed: 3 };
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// [[/=]] - center
|
|
158
|
-
if (direction === "center") {
|
|
159
|
-
if (tokens[pos]?.type === "EQUALS" && tokens[pos + 1]?.type === "BLOCK_CLOSE") {
|
|
160
|
-
return { match: true, consumed: 3 };
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// [[/==]] - justify
|
|
165
|
-
if (direction === "justify") {
|
|
166
|
-
if (
|
|
167
|
-
tokens[pos]?.type === "EQUALS" &&
|
|
168
|
-
tokens[pos + 1]?.type === "EQUALS" &&
|
|
169
|
-
tokens[pos + 2]?.type === "BLOCK_CLOSE"
|
|
170
|
-
) {
|
|
171
|
-
return { match: true, consumed: 4 };
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return { match: false, consumed: 0 };
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Block rule that matches Wikidot directional alignment containers.
|
|
180
|
-
*
|
|
181
|
-
* Parsing strategy:
|
|
182
|
-
* 1. Verify the first token is BLOCK_OPEN at line start.
|
|
183
|
-
* 2. Delegate to `parseAlignOpen()` to identify direction and consume
|
|
184
|
-
* the opening tag interior.
|
|
185
|
-
* 3. Require a NEWLINE immediately after the opening tag.
|
|
186
|
-
* 4. Recursively parse body blocks via `parseBlocksUntil()`, stopping
|
|
187
|
-
* when `isAlignClose()` finds the matching closing tag.
|
|
188
|
-
* 5. Consume the closing tag and optional trailing newline.
|
|
189
|
-
* 6. Emit a container element with `type: { align: direction }`.
|
|
190
|
-
*
|
|
191
|
-
* `preservesPrecedingLineBreak` is `true` because, unlike most block
|
|
192
|
-
* constructs, an alignment block does not suppress a preceding `\n` from
|
|
193
|
-
* becoming a `<br />` in Wikidot's output.
|
|
194
|
-
*/
|
|
195
|
-
export const alignRule: BlockRule = {
|
|
196
|
-
name: "align",
|
|
197
|
-
startTokens: ["BLOCK_OPEN"],
|
|
198
|
-
requiresLineStart: true,
|
|
199
|
-
preservesPrecedingLineBreak: true,
|
|
200
|
-
|
|
201
|
-
isStartPattern(ctx: ParseContext, pos: number): boolean {
|
|
202
|
-
if (ctx.tokens[pos]?.type !== "BLOCK_OPEN") return false;
|
|
203
|
-
return parseAlignOpen(ctx, pos + 1) !== null;
|
|
204
|
-
},
|
|
205
|
-
|
|
206
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
207
|
-
const openToken = currentToken(ctx);
|
|
208
|
-
if (openToken.type !== "BLOCK_OPEN") {
|
|
209
|
-
return { success: false };
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
let pos = ctx.pos + 1;
|
|
213
|
-
let consumed = 1;
|
|
214
|
-
|
|
215
|
-
// Parse align open syntax
|
|
216
|
-
const alignResult = parseAlignOpen(ctx, pos);
|
|
217
|
-
if (!alignResult) {
|
|
218
|
-
return { success: false };
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
const { direction } = alignResult;
|
|
222
|
-
pos += alignResult.consumed;
|
|
223
|
-
consumed += alignResult.consumed;
|
|
224
|
-
|
|
225
|
-
// Must be followed by newline
|
|
226
|
-
if (ctx.tokens[pos]?.type !== "NEWLINE") {
|
|
227
|
-
return { success: false };
|
|
228
|
-
}
|
|
229
|
-
pos++;
|
|
230
|
-
consumed++;
|
|
231
|
-
|
|
232
|
-
// Close condition
|
|
233
|
-
const closeCondition = (checkCtx: ParseContext): boolean => {
|
|
234
|
-
return isAlignClose(checkCtx, direction).match;
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
// Parse body
|
|
238
|
-
const bodyCtx: ParseContext = { ...ctx, pos };
|
|
239
|
-
const bodyResult = parseBlocksUntil(bodyCtx, closeCondition);
|
|
240
|
-
consumed += bodyResult.consumed;
|
|
241
|
-
pos += bodyResult.consumed;
|
|
242
|
-
|
|
243
|
-
// Check for missing close tag
|
|
244
|
-
const directionSymbol = { left: "<", right: ">", center: "=", justify: "==" }[direction];
|
|
245
|
-
const closeCheck = isAlignClose({ ...ctx, pos }, direction);
|
|
246
|
-
if (!closeCheck.match) {
|
|
247
|
-
ctx.diagnostics.push({
|
|
248
|
-
severity: "warning",
|
|
249
|
-
code: "unclosed-block",
|
|
250
|
-
message: `Missing closing tag [[/${directionSymbol}]] for [[${directionSymbol}]]`,
|
|
251
|
-
position: openToken.position,
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Consume closing tag
|
|
256
|
-
if (closeCheck.match) {
|
|
257
|
-
consumed += closeCheck.consumed;
|
|
258
|
-
pos += closeCheck.consumed;
|
|
259
|
-
|
|
260
|
-
// Consume trailing newline
|
|
261
|
-
if (ctx.tokens[pos]?.type === "NEWLINE") {
|
|
262
|
-
pos++;
|
|
263
|
-
consumed++;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return {
|
|
268
|
-
success: true,
|
|
269
|
-
elements: [
|
|
270
|
-
{
|
|
271
|
-
element: "container",
|
|
272
|
-
data: {
|
|
273
|
-
type: { align: direction },
|
|
274
|
-
attributes: {},
|
|
275
|
-
elements: bodyResult.elements,
|
|
276
|
-
},
|
|
277
|
-
},
|
|
278
|
-
],
|
|
279
|
-
consumed,
|
|
280
|
-
};
|
|
281
|
-
},
|
|
282
|
-
};
|
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Block rule for the Wikidot bibliography block: `[[bibliography]] ... [[/bibliography]]`.
|
|
4
|
-
*
|
|
5
|
-
* A bibliography block holds labelled citation entries in a definition-list
|
|
6
|
-
* format. Each entry follows the pattern:
|
|
7
|
-
*
|
|
8
|
-
* ```
|
|
9
|
-
* : label : Citation description text
|
|
10
|
-
* ```
|
|
11
|
-
*
|
|
12
|
-
* At render time the entries are cross-referenced with inline `((bibcite label))`
|
|
13
|
-
* markers that appear elsewhere in the document. The parser stores the entries
|
|
14
|
-
* in the AST as a `bibliography-block` element whose `entries` field is an
|
|
15
|
-
* array of {@link DefinitionListItem} objects.
|
|
16
|
-
*
|
|
17
|
-
* Optional attributes on the opening tag:
|
|
18
|
-
* - `title` -- custom heading for the bibliography section.
|
|
19
|
-
* - `hide` -- when `"true"` or empty string, hides the block from output.
|
|
20
|
-
*
|
|
21
|
-
* If no closing `[[/bibliography]]` tag is found, the rule fails to avoid
|
|
22
|
-
* accidentally consuming the rest of the document.
|
|
23
|
-
*
|
|
24
|
-
* @module
|
|
25
|
-
*/
|
|
26
|
-
import type { Element, DefinitionListItem } from "@wdprlib/ast";
|
|
27
|
-
import type { BlockRule, ParseContext, RuleResult } from "../types";
|
|
28
|
-
import { currentToken } from "../types";
|
|
29
|
-
import { parseBlockName, parseAttributes } from "./utils";
|
|
30
|
-
import { parseInlineUntil } from "../inline/utils";
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Internal representation of a single bibliography entry parsed from
|
|
34
|
-
* the `: label : content` line(s) inside the bibliography block.
|
|
35
|
-
*/
|
|
36
|
-
interface BibliographyEntry {
|
|
37
|
-
/** The identifier used in `((bibcite label))` references. */
|
|
38
|
-
label: string;
|
|
39
|
-
/** Parsed inline elements for the label portion (the key). */
|
|
40
|
-
key: Element[];
|
|
41
|
-
/** Parsed inline elements for the citation text. */
|
|
42
|
-
content: Element[];
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Parses one bibliography entry from the token stream.
|
|
47
|
-
*
|
|
48
|
-
* Expected format (one logical line):
|
|
49
|
-
* ```
|
|
50
|
-
* : label : Citation text possibly spanning lines
|
|
51
|
-
* ```
|
|
52
|
-
*
|
|
53
|
-
* The entry starts with a COLON token at line start, followed by mandatory
|
|
54
|
-
* whitespace, then the label text, a second COLON, and the citation content.
|
|
55
|
-
* Content parsing continues until a double newline, a new entry (`: ...`),
|
|
56
|
-
* or the closing `[[/bibliography]]` tag is reached. Single newlines within
|
|
57
|
-
* the citation text produce `line-break` elements.
|
|
58
|
-
*
|
|
59
|
-
* @param ctx - Current parse context.
|
|
60
|
-
* @param startPos - Token index where the entry begins (expected COLON).
|
|
61
|
-
* @returns The parsed entry and number of tokens consumed, or `null` on failure.
|
|
62
|
-
*/
|
|
63
|
-
function parseBibliographyEntry(
|
|
64
|
-
ctx: ParseContext,
|
|
65
|
-
startPos: number,
|
|
66
|
-
): { entry: BibliographyEntry; consumed: number } | null {
|
|
67
|
-
let pos = startPos;
|
|
68
|
-
let consumed = 0;
|
|
69
|
-
|
|
70
|
-
// Expect COLON at line start
|
|
71
|
-
const colonToken = ctx.tokens[pos];
|
|
72
|
-
if (!colonToken || colonToken.type !== "COLON" || !colonToken.lineStart) {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
pos++;
|
|
76
|
-
consumed++;
|
|
77
|
-
|
|
78
|
-
// Wikidot requires whitespace after first colon
|
|
79
|
-
const whitespaceAfterColon = ctx.tokens[pos];
|
|
80
|
-
if (!whitespaceAfterColon || whitespaceAfterColon.type !== "WHITESPACE") {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Skip whitespace after first colon
|
|
85
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
86
|
-
pos++;
|
|
87
|
-
consumed++;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Collect label tokens until second COLON
|
|
91
|
-
let label = "";
|
|
92
|
-
let foundSecondColon = false;
|
|
93
|
-
const keyNodes: Element[] = [];
|
|
94
|
-
|
|
95
|
-
while (pos < ctx.tokens.length) {
|
|
96
|
-
const token = ctx.tokens[pos];
|
|
97
|
-
if (!token || token.type === "NEWLINE" || token.type === "EOF") {
|
|
98
|
-
break;
|
|
99
|
-
}
|
|
100
|
-
if (token.type === "COLON") {
|
|
101
|
-
foundSecondColon = true;
|
|
102
|
-
pos++;
|
|
103
|
-
consumed++;
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// For bibliography, key is just the label (identifier)
|
|
108
|
-
label += token.value;
|
|
109
|
-
keyNodes.push({ element: "text", data: token.value });
|
|
110
|
-
pos++;
|
|
111
|
-
consumed++;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (!foundSecondColon) {
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
label = label.trim();
|
|
119
|
-
|
|
120
|
-
// Skip whitespace after second colon
|
|
121
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
122
|
-
pos++;
|
|
123
|
-
consumed++;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Parse content (rest of line, can continue with line breaks)
|
|
127
|
-
const contentNodes: Element[] = [];
|
|
128
|
-
while (pos < ctx.tokens.length) {
|
|
129
|
-
const token = ctx.tokens[pos];
|
|
130
|
-
if (!token || token.type === "EOF") {
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Check for [[/bibliography]]
|
|
135
|
-
if (token.type === "BLOCK_END_OPEN") {
|
|
136
|
-
const closeNameResult = parseBlockName(ctx, pos + 1);
|
|
137
|
-
if (closeNameResult?.name === "bibliography") {
|
|
138
|
-
break;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Check for end of entry (newline followed by new entry or end)
|
|
143
|
-
if (token.type === "NEWLINE") {
|
|
144
|
-
const nextToken = ctx.tokens[pos + 1];
|
|
145
|
-
// Look ahead for new entry or block end
|
|
146
|
-
if (nextToken?.type === "COLON" && nextToken.lineStart) {
|
|
147
|
-
// New entry starts
|
|
148
|
-
pos++;
|
|
149
|
-
consumed++;
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
if (nextToken?.type === "BLOCK_END_OPEN") {
|
|
153
|
-
// Block end
|
|
154
|
-
pos++;
|
|
155
|
-
consumed++;
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
if (nextToken?.type === "NEWLINE" || !nextToken || nextToken.type === "EOF") {
|
|
159
|
-
// Double newline or end
|
|
160
|
-
pos++;
|
|
161
|
-
consumed++;
|
|
162
|
-
break;
|
|
163
|
-
}
|
|
164
|
-
// Single newline - add line break and continue
|
|
165
|
-
contentNodes.push({ element: "line-break" });
|
|
166
|
-
pos++;
|
|
167
|
-
consumed++;
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Parse inline content
|
|
172
|
-
const inlineCtx: ParseContext = { ...ctx, pos };
|
|
173
|
-
const result = parseInlineUntil(inlineCtx, "NEWLINE");
|
|
174
|
-
if (result.elements.length > 0) {
|
|
175
|
-
contentNodes.push(...result.elements);
|
|
176
|
-
pos += result.consumed;
|
|
177
|
-
consumed += result.consumed;
|
|
178
|
-
} else {
|
|
179
|
-
pos++;
|
|
180
|
-
consumed++;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Trim key nodes
|
|
185
|
-
while (keyNodes.length > 0) {
|
|
186
|
-
const lastNode = keyNodes[keyNodes.length - 1];
|
|
187
|
-
if (
|
|
188
|
-
lastNode &&
|
|
189
|
-
lastNode.element === "text" &&
|
|
190
|
-
typeof lastNode.data === "string" &&
|
|
191
|
-
lastNode.data.trim() === ""
|
|
192
|
-
) {
|
|
193
|
-
keyNodes.pop();
|
|
194
|
-
} else {
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return {
|
|
200
|
-
entry: {
|
|
201
|
-
label,
|
|
202
|
-
key: keyNodes,
|
|
203
|
-
content: contentNodes,
|
|
204
|
-
},
|
|
205
|
-
consumed,
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Block rule for Wikidot `[[bibliography]]...[[/bibliography]]`.
|
|
211
|
-
*
|
|
212
|
-
* Parsing strategy:
|
|
213
|
-
* 1. Match BLOCK_OPEN + block name "bibliography".
|
|
214
|
-
* 2. Parse optional attributes (`title`, `hide`).
|
|
215
|
-
* 3. Consume the closing `]]` and optional newline.
|
|
216
|
-
* 4. Loop over the body, parsing each `: label : content` line via
|
|
217
|
-
* `parseBibliographyEntry()`. Whitespace, newlines, and unknown
|
|
218
|
-
* tokens between entries are skipped.
|
|
219
|
-
* 5. Stop when `[[/bibliography]]` is found and consume it.
|
|
220
|
-
* 6. If no closing tag is encountered, fail the rule entirely.
|
|
221
|
-
* 7. Convert entries into {@link DefinitionListItem} format and emit
|
|
222
|
-
* a `bibliography-block` element.
|
|
223
|
-
*/
|
|
224
|
-
export const bibliographyRule: BlockRule = {
|
|
225
|
-
name: "bibliography",
|
|
226
|
-
startTokens: ["BLOCK_OPEN"],
|
|
227
|
-
requiresLineStart: false,
|
|
228
|
-
|
|
229
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
230
|
-
const openToken = currentToken(ctx);
|
|
231
|
-
if (openToken.type !== "BLOCK_OPEN") {
|
|
232
|
-
return { success: false };
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
let pos = ctx.pos + 1;
|
|
236
|
-
let consumed = 1;
|
|
237
|
-
|
|
238
|
-
// Parse block name
|
|
239
|
-
const nameResult = parseBlockName(ctx, pos);
|
|
240
|
-
if (!nameResult || nameResult.name !== "bibliography") {
|
|
241
|
-
return { success: false };
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
pos += nameResult.consumed;
|
|
245
|
-
consumed += nameResult.consumed;
|
|
246
|
-
|
|
247
|
-
// Parse optional attributes (title, hide)
|
|
248
|
-
const attrResult = parseAttributes(ctx, pos);
|
|
249
|
-
pos += attrResult.consumed;
|
|
250
|
-
consumed += attrResult.consumed;
|
|
251
|
-
|
|
252
|
-
// Expect ]]
|
|
253
|
-
if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
|
|
254
|
-
return { success: false };
|
|
255
|
-
}
|
|
256
|
-
pos++;
|
|
257
|
-
consumed++;
|
|
258
|
-
|
|
259
|
-
// Skip newline after opening tag
|
|
260
|
-
if (ctx.tokens[pos]?.type === "NEWLINE") {
|
|
261
|
-
pos++;
|
|
262
|
-
consumed++;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// Parse bibliography entries
|
|
266
|
-
const entries: BibliographyEntry[] = [];
|
|
267
|
-
let foundClose = false;
|
|
268
|
-
|
|
269
|
-
while (pos < ctx.tokens.length) {
|
|
270
|
-
const token = ctx.tokens[pos];
|
|
271
|
-
if (!token || token.type === "EOF") {
|
|
272
|
-
break;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// Check for [[/bibliography]]
|
|
276
|
-
if (token.type === "BLOCK_END_OPEN") {
|
|
277
|
-
const closeNameResult = parseBlockName(ctx, pos + 1);
|
|
278
|
-
if (closeNameResult?.name === "bibliography") {
|
|
279
|
-
foundClose = true;
|
|
280
|
-
// Consume [[/bibliography]]
|
|
281
|
-
pos++;
|
|
282
|
-
consumed++;
|
|
283
|
-
pos += closeNameResult.consumed;
|
|
284
|
-
consumed += closeNameResult.consumed;
|
|
285
|
-
// Skip whitespace
|
|
286
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
287
|
-
pos++;
|
|
288
|
-
consumed++;
|
|
289
|
-
}
|
|
290
|
-
// Expect ]]
|
|
291
|
-
if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
|
|
292
|
-
pos++;
|
|
293
|
-
consumed++;
|
|
294
|
-
}
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// Skip whitespace and newlines
|
|
300
|
-
if (token.type === "WHITESPACE" || token.type === "NEWLINE") {
|
|
301
|
-
pos++;
|
|
302
|
-
consumed++;
|
|
303
|
-
continue;
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// Parse entry
|
|
307
|
-
if (token.type === "COLON" && token.lineStart) {
|
|
308
|
-
const result = parseBibliographyEntry(ctx, pos);
|
|
309
|
-
if (result) {
|
|
310
|
-
entries.push(result.entry);
|
|
311
|
-
pos += result.consumed;
|
|
312
|
-
consumed += result.consumed;
|
|
313
|
-
continue;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// Skip unknown tokens
|
|
318
|
-
pos++;
|
|
319
|
-
consumed++;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
// Require closing tag - without it, fail to prevent consuming entire document
|
|
323
|
-
if (!foundClose) {
|
|
324
|
-
ctx.diagnostics.push({
|
|
325
|
-
severity: "warning",
|
|
326
|
-
code: "unclosed-block",
|
|
327
|
-
message: "Missing closing tag [[/bibliography]] for [[bibliography]]",
|
|
328
|
-
position: openToken.position,
|
|
329
|
-
});
|
|
330
|
-
return { success: false };
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
// Convert to definition list format for AST storage
|
|
334
|
-
const definitionItems: DefinitionListItem[] = entries.map((entry) => ({
|
|
335
|
-
key_string: entry.label,
|
|
336
|
-
key: entry.key,
|
|
337
|
-
value: entry.content,
|
|
338
|
-
}));
|
|
339
|
-
|
|
340
|
-
// Get attributes
|
|
341
|
-
const title = attrResult.attrs.title ?? null;
|
|
342
|
-
const hide = attrResult.attrs.hide === "true" || attrResult.attrs.hide === "";
|
|
343
|
-
|
|
344
|
-
return {
|
|
345
|
-
success: true,
|
|
346
|
-
elements: [
|
|
347
|
-
{
|
|
348
|
-
element: "bibliography-block",
|
|
349
|
-
data: {
|
|
350
|
-
entries: definitionItems,
|
|
351
|
-
title: typeof title === "string" ? title : null,
|
|
352
|
-
hide,
|
|
353
|
-
},
|
|
354
|
-
},
|
|
355
|
-
],
|
|
356
|
-
consumed,
|
|
357
|
-
};
|
|
358
|
-
},
|
|
359
|
-
};
|