@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,424 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Parses the Wikidot span block syntax: `[[span attributes]]content[[/span]]`
|
|
4
|
-
* and its paragraph-strip variant `[[span_]]`.
|
|
5
|
-
*
|
|
6
|
-
* A span wraps inline content in an HTML `<span>` element with arbitrary
|
|
7
|
-
* attributes (class, style, id, etc.). It supports multiline content
|
|
8
|
-
* where single newlines become `<br />` elements.
|
|
9
|
-
*
|
|
10
|
-
* Blank lines (double newlines) within spans trigger special behavior:
|
|
11
|
-
*
|
|
12
|
-
* Regular span (`[[span]]`):
|
|
13
|
-
* - Blank lines split the content into separate spans, each placed in
|
|
14
|
-
* its own paragraph. Segments after the first are marked with
|
|
15
|
-
* `_splitByBlankLine: true` for postprocessing.
|
|
16
|
-
*
|
|
17
|
-
* Paragraph-strip span (`[[span_]]`):
|
|
18
|
-
* - Content before a blank line gets `_paragraphStrip: true`, indicating
|
|
19
|
-
* it should merge with the surrounding paragraph.
|
|
20
|
-
* - Content after a blank line gets `_escapedFromParagraph: true`,
|
|
21
|
-
* indicating it should appear outside any paragraph wrapper.
|
|
22
|
-
* - An empty `[[span_]][[/span]]` produces a marker with
|
|
23
|
-
* `_emptyParagraphStrip: true` that absorbs adjacent line breaks.
|
|
24
|
-
*
|
|
25
|
-
* Spans support nesting -- a `[[span]]` inside another `[[span]]` will
|
|
26
|
-
* correctly find its own `[[/span]]` closing tag.
|
|
27
|
-
*
|
|
28
|
-
* The `closeSpanRule` handles orphaned `[[/span]]` tags that result
|
|
29
|
-
* from paragraph-break splitting. These wrap preceding inline content
|
|
30
|
-
* into a span, matching Wikidot's behavior.
|
|
31
|
-
*
|
|
32
|
-
* @module
|
|
33
|
-
*/
|
|
34
|
-
import type { Element } from "@wdprlib/ast";
|
|
35
|
-
import type { InlineRule, ParseContext, RuleResult } from "../types";
|
|
36
|
-
import { currentToken } from "../types";
|
|
37
|
-
import { inlineRules } from "../index";
|
|
38
|
-
import { parseBlockName } from "../utils";
|
|
39
|
-
import { parseAttributes } from "../block/utils";
|
|
40
|
-
import { canApplyInlineRule } from "./utils";
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Inline rule for parsing `[[span attributes]]content[[/span]]`.
|
|
44
|
-
*
|
|
45
|
-
* Triggered by a `BLOCK_OPEN` (`[[`) token. Recognizes both `span`
|
|
46
|
-
* and `span_` block names. Parses HTML attributes after the block name,
|
|
47
|
-
* then recursively parses inline content (including nested spans) until
|
|
48
|
-
* the matching `[[/span]]` closing tag.
|
|
49
|
-
*
|
|
50
|
-
* Fails if:
|
|
51
|
-
* - The block name is not `span` or `span_`
|
|
52
|
-
* - No `]]` follows the attributes
|
|
53
|
-
* - No matching `[[/span]]` closing tag is found
|
|
54
|
-
*/
|
|
55
|
-
export const spanRule: InlineRule = {
|
|
56
|
-
name: "span",
|
|
57
|
-
startTokens: ["BLOCK_OPEN"],
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Attempts to parse a span block at the current position.
|
|
61
|
-
*
|
|
62
|
-
* @param ctx - Parse context with token stream and current position
|
|
63
|
-
* @returns A successful result with one or more `"container"` elements
|
|
64
|
-
* of type `"span"`, or `{ success: false }`
|
|
65
|
-
*/
|
|
66
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
67
|
-
const openToken = currentToken(ctx);
|
|
68
|
-
if (openToken.type !== "BLOCK_OPEN") {
|
|
69
|
-
return { success: false };
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
let pos = ctx.pos + 1;
|
|
73
|
-
let consumed = 1;
|
|
74
|
-
|
|
75
|
-
// Parse block name
|
|
76
|
-
const nameResult = parseBlockName(ctx, pos);
|
|
77
|
-
if (!nameResult) {
|
|
78
|
-
return { success: false };
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const blockName = nameResult.name;
|
|
82
|
-
// Handle both span and span_ (paragraph strip mode)
|
|
83
|
-
if (blockName !== "span" && blockName !== "span_") {
|
|
84
|
-
return { success: false };
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const paragraphStrip = blockName === "span_";
|
|
88
|
-
|
|
89
|
-
pos += nameResult.consumed;
|
|
90
|
-
consumed += nameResult.consumed;
|
|
91
|
-
|
|
92
|
-
// Parse attributes
|
|
93
|
-
const attrResult = parseAttributes(ctx, pos);
|
|
94
|
-
pos += attrResult.consumed;
|
|
95
|
-
consumed += attrResult.consumed;
|
|
96
|
-
|
|
97
|
-
// Expect ]]
|
|
98
|
-
if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
|
|
99
|
-
return { success: false };
|
|
100
|
-
}
|
|
101
|
-
pos++;
|
|
102
|
-
consumed++;
|
|
103
|
-
|
|
104
|
-
// Parse inline content until [[/span]]
|
|
105
|
-
// Span supports multi-line content - newlines become line-breaks
|
|
106
|
-
// For regular span: blank lines split into separate paragraphs with spans
|
|
107
|
-
const children: Element[] = [];
|
|
108
|
-
const escapedChildren: Element[] = []; // For span_: content after blank line
|
|
109
|
-
const splitSpans: Element[][] = []; // For regular span: content segments split by blank lines
|
|
110
|
-
let foundClose = false;
|
|
111
|
-
let afterBlankLine = false; // For span_: tracks if we're after a blank line
|
|
112
|
-
|
|
113
|
-
while (pos < ctx.tokens.length) {
|
|
114
|
-
const token = ctx.tokens[pos];
|
|
115
|
-
if (!token || token.type === "EOF") {
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Check for [[/span]]
|
|
120
|
-
if (token.type === "BLOCK_END_OPEN") {
|
|
121
|
-
const closeNameResult = parseBlockName(ctx, pos + 1);
|
|
122
|
-
if (closeNameResult && closeNameResult.name === "span") {
|
|
123
|
-
// Skip [[/span]]
|
|
124
|
-
pos++; // [[/
|
|
125
|
-
consumed++;
|
|
126
|
-
pos += closeNameResult.consumed; // span
|
|
127
|
-
consumed += closeNameResult.consumed;
|
|
128
|
-
// Skip ]]
|
|
129
|
-
if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
|
|
130
|
-
pos++;
|
|
131
|
-
consumed++;
|
|
132
|
-
}
|
|
133
|
-
foundClose = true;
|
|
134
|
-
break;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Handle NEWLINE
|
|
139
|
-
if (token.type === "NEWLINE") {
|
|
140
|
-
// Check for paragraph break (blank line = double newline)
|
|
141
|
-
// Skip whitespace to find next meaningful token
|
|
142
|
-
let lookAhead = 1;
|
|
143
|
-
while (ctx.tokens[pos + lookAhead]?.type === "WHITESPACE") {
|
|
144
|
-
lookAhead++;
|
|
145
|
-
}
|
|
146
|
-
const nextToken = ctx.tokens[pos + lookAhead];
|
|
147
|
-
|
|
148
|
-
// If next token is another NEWLINE, this is a paragraph break
|
|
149
|
-
if (nextToken?.type === "NEWLINE") {
|
|
150
|
-
if (paragraphStrip) {
|
|
151
|
-
// For span_: blank lines split the span, content after goes outside paragraph
|
|
152
|
-
// Consume the blank lines and continue parsing
|
|
153
|
-
pos++; // First newline
|
|
154
|
-
consumed++;
|
|
155
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE" || ctx.tokens[pos]?.type === "NEWLINE") {
|
|
156
|
-
pos++;
|
|
157
|
-
consumed++;
|
|
158
|
-
}
|
|
159
|
-
// Mark that we're now parsing escaped content (outside paragraph)
|
|
160
|
-
afterBlankLine = true;
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
// For regular span: blank lines split into separate spans in separate paragraphs
|
|
164
|
-
// Save current content and start a new segment
|
|
165
|
-
if (children.length > 0) {
|
|
166
|
-
splitSpans.push([...children]);
|
|
167
|
-
children.length = 0;
|
|
168
|
-
}
|
|
169
|
-
pos++; // First newline
|
|
170
|
-
consumed++;
|
|
171
|
-
// Skip whitespace and additional newlines
|
|
172
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE" || ctx.tokens[pos]?.type === "NEWLINE") {
|
|
173
|
-
pos++;
|
|
174
|
-
consumed++;
|
|
175
|
-
}
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Single newline - convert to line-break
|
|
180
|
-
const targetChildren = afterBlankLine ? escapedChildren : children;
|
|
181
|
-
targetChildren.push({ element: "line-break" });
|
|
182
|
-
pos++;
|
|
183
|
-
consumed++;
|
|
184
|
-
// Skip leading whitespace after newline
|
|
185
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE" && ctx.tokens[pos]?.lineStart) {
|
|
186
|
-
pos++;
|
|
187
|
-
consumed++;
|
|
188
|
-
}
|
|
189
|
-
continue;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Skip whitespace at beginning of content (after ]] or after newline)
|
|
193
|
-
// But don't skip whitespace between words
|
|
194
|
-
if (token.type === "WHITESPACE" && token.lineStart) {
|
|
195
|
-
pos++;
|
|
196
|
-
consumed++;
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Determine which array to add content to
|
|
201
|
-
const targetChildren = afterBlankLine ? escapedChildren : children;
|
|
202
|
-
|
|
203
|
-
// Try each inline rule
|
|
204
|
-
let matched = false;
|
|
205
|
-
const inlineCtx: ParseContext = { ...ctx, pos };
|
|
206
|
-
|
|
207
|
-
for (const rule of inlineRules) {
|
|
208
|
-
// Allow nested spans - each nested span will find its own [[/span]] closing tag
|
|
209
|
-
// No infinite recursion because each span consumes its own opening and closing tags
|
|
210
|
-
if (canApplyInlineRule(rule, token)) {
|
|
211
|
-
const result = rule.parse(inlineCtx);
|
|
212
|
-
if (result.success) {
|
|
213
|
-
targetChildren.push(...result.elements);
|
|
214
|
-
pos += result.consumed;
|
|
215
|
-
consumed += result.consumed;
|
|
216
|
-
matched = true;
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
if (!matched) {
|
|
223
|
-
// Fallback: just add as text
|
|
224
|
-
targetChildren.push({ element: "text", data: token.value });
|
|
225
|
-
pos++;
|
|
226
|
-
consumed++;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// If we didn't find [[/span]], this is not a valid span
|
|
231
|
-
if (!foundClose) {
|
|
232
|
-
ctx.diagnostics.push({
|
|
233
|
-
severity: "warning",
|
|
234
|
-
code: "unclosed-block",
|
|
235
|
-
message: `Missing closing tag [[/span]] for [[${blockName}]]`,
|
|
236
|
-
position: openToken.position,
|
|
237
|
-
});
|
|
238
|
-
return { success: false };
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// For span_ (paragraph strip mode):
|
|
242
|
-
// - Empty span_ produces no output
|
|
243
|
-
// - Non-empty span_ gets a _paragraphStrip marker for paragraph merging
|
|
244
|
-
// - Content after blank line gets _escapedFromParagraph marker
|
|
245
|
-
if (paragraphStrip) {
|
|
246
|
-
// Remove leading/trailing line-breaks from both arrays
|
|
247
|
-
while (children.length > 0 && children[0]?.element === "line-break") {
|
|
248
|
-
children.shift();
|
|
249
|
-
}
|
|
250
|
-
while (children.length > 0 && children[children.length - 1]?.element === "line-break") {
|
|
251
|
-
children.pop();
|
|
252
|
-
}
|
|
253
|
-
while (escapedChildren.length > 0 && escapedChildren[0]?.element === "line-break") {
|
|
254
|
-
escapedChildren.shift();
|
|
255
|
-
}
|
|
256
|
-
while (
|
|
257
|
-
escapedChildren.length > 0 &&
|
|
258
|
-
escapedChildren[escapedChildren.length - 1]?.element === "line-break"
|
|
259
|
-
) {
|
|
260
|
-
escapedChildren.pop();
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
const elements: Element[] = [];
|
|
264
|
-
|
|
265
|
-
// Main span (before blank line) - gets _paragraphStrip
|
|
266
|
-
if (children.length > 0) {
|
|
267
|
-
elements.push({
|
|
268
|
-
element: "container",
|
|
269
|
-
data: {
|
|
270
|
-
type: "span",
|
|
271
|
-
attributes: attrResult.attrs,
|
|
272
|
-
elements: children,
|
|
273
|
-
_paragraphStrip: true,
|
|
274
|
-
},
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// Escaped spans (after blank line) - get _escapedFromParagraph
|
|
279
|
-
if (escapedChildren.length > 0) {
|
|
280
|
-
elements.push({
|
|
281
|
-
element: "container",
|
|
282
|
-
data: {
|
|
283
|
-
type: "span",
|
|
284
|
-
attributes: {},
|
|
285
|
-
elements: escapedChildren,
|
|
286
|
-
_escapedFromParagraph: true,
|
|
287
|
-
},
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// Empty span_ - return a marker that will absorb adjacent line-breaks
|
|
292
|
-
if (elements.length === 0) {
|
|
293
|
-
return {
|
|
294
|
-
success: true,
|
|
295
|
-
elements: [
|
|
296
|
-
{
|
|
297
|
-
element: "container",
|
|
298
|
-
data: {
|
|
299
|
-
type: "span",
|
|
300
|
-
attributes: {},
|
|
301
|
-
elements: [],
|
|
302
|
-
_emptyParagraphStrip: true,
|
|
303
|
-
},
|
|
304
|
-
},
|
|
305
|
-
],
|
|
306
|
-
consumed,
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
return {
|
|
311
|
-
success: true,
|
|
312
|
-
elements,
|
|
313
|
-
consumed,
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// For regular span with blank lines: return multiple spans with _splitByBlankLine marker
|
|
318
|
-
// These will be processed by postprocess to create separate paragraphs
|
|
319
|
-
if (splitSpans.length > 0) {
|
|
320
|
-
// Add remaining children as last segment
|
|
321
|
-
if (children.length > 0) {
|
|
322
|
-
splitSpans.push(children);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
const elements: Element[] = splitSpans.map((segment, index) => ({
|
|
326
|
-
element: "container" as const,
|
|
327
|
-
data: {
|
|
328
|
-
type: "span" as const,
|
|
329
|
-
attributes: index === 0 ? attrResult.attrs : {},
|
|
330
|
-
elements: segment,
|
|
331
|
-
_splitByBlankLine: index > 0, // Mark segments after first for paragraph splitting
|
|
332
|
-
},
|
|
333
|
-
}));
|
|
334
|
-
|
|
335
|
-
return {
|
|
336
|
-
success: true,
|
|
337
|
-
elements,
|
|
338
|
-
consumed,
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
return {
|
|
343
|
-
success: true,
|
|
344
|
-
elements: [
|
|
345
|
-
{
|
|
346
|
-
element: "container",
|
|
347
|
-
data: {
|
|
348
|
-
type: "span",
|
|
349
|
-
attributes: attrResult.attrs,
|
|
350
|
-
elements: children,
|
|
351
|
-
},
|
|
352
|
-
},
|
|
353
|
-
],
|
|
354
|
-
consumed,
|
|
355
|
-
};
|
|
356
|
-
},
|
|
357
|
-
};
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* Inline rule for handling orphaned `[[/span]]` closing tags.
|
|
361
|
-
*
|
|
362
|
-
* When a span is split across paragraphs by a blank line, the closing
|
|
363
|
-
* `[[/span]]` tag appears without a matching opening tag in the current
|
|
364
|
-
* inline context. This rule detects such orphaned closing tags and
|
|
365
|
-
* produces a special marker element with `_closeSpan: true`.
|
|
366
|
-
*
|
|
367
|
-
* The paragraph parser uses this marker to retroactively wrap all
|
|
368
|
-
* preceding inline content in the current paragraph into a span,
|
|
369
|
-
* replicating Wikidot's behavior for paragraph-split spans.
|
|
370
|
-
*
|
|
371
|
-
* Triggered by a `BLOCK_END_OPEN` (`[[/`) token, and only matches
|
|
372
|
-
* when the block name is `span`.
|
|
373
|
-
*/
|
|
374
|
-
export const closeSpanRule: InlineRule = {
|
|
375
|
-
name: "closeSpan",
|
|
376
|
-
startTokens: ["BLOCK_END_OPEN"],
|
|
377
|
-
|
|
378
|
-
/**
|
|
379
|
-
* Attempts to parse an orphaned `[[/span]]` tag at the current position.
|
|
380
|
-
*
|
|
381
|
-
* @param ctx - Parse context with token stream and current position
|
|
382
|
-
* @returns A successful result with a span marker element (with `_closeSpan: true`),
|
|
383
|
-
* or `{ success: false }` if this is not a `[[/span]]` tag
|
|
384
|
-
*/
|
|
385
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
386
|
-
const token = currentToken(ctx);
|
|
387
|
-
if (token.type !== "BLOCK_END_OPEN") {
|
|
388
|
-
return { success: false };
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
// Check if this is [[/span]]
|
|
392
|
-
const nameResult = parseBlockName(ctx, ctx.pos + 1);
|
|
393
|
-
if (!nameResult || nameResult.name !== "span") {
|
|
394
|
-
return { success: false };
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
let pos = ctx.pos + 1 + nameResult.consumed;
|
|
398
|
-
let consumed = 1 + nameResult.consumed;
|
|
399
|
-
|
|
400
|
-
// Skip ]]
|
|
401
|
-
if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
|
|
402
|
-
pos++;
|
|
403
|
-
consumed++;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// Return a special marker that indicates "wrap preceding content in span"
|
|
407
|
-
// The paragraph parser will handle this
|
|
408
|
-
return {
|
|
409
|
-
success: true,
|
|
410
|
-
elements: [
|
|
411
|
-
{
|
|
412
|
-
element: "container",
|
|
413
|
-
data: {
|
|
414
|
-
type: "span",
|
|
415
|
-
attributes: {},
|
|
416
|
-
elements: [],
|
|
417
|
-
_closeSpan: true,
|
|
418
|
-
},
|
|
419
|
-
},
|
|
420
|
-
],
|
|
421
|
-
consumed,
|
|
422
|
-
};
|
|
423
|
-
},
|
|
424
|
-
};
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Parses the Wikidot user reference syntax: `[[user name]]` and
|
|
4
|
-
* `[[*user name]]`.
|
|
5
|
-
*
|
|
6
|
-
* A user reference displays a linked username (typically linking to
|
|
7
|
-
* the user's profile page). The variant with a star prefix (`[[*user]]`)
|
|
8
|
-
* also displays the user's avatar alongside the username.
|
|
9
|
-
*
|
|
10
|
-
* Wikidot syntax:
|
|
11
|
-
* - `[[user some-user]]` -- displays username as a link
|
|
12
|
-
* - `[[*user some-user]]` -- displays avatar and username
|
|
13
|
-
*
|
|
14
|
-
* Note: Wikidot requires no whitespace immediately after `[[`. This
|
|
15
|
-
* means `[[ user name]]` is invalid, but `[[user name]]` and
|
|
16
|
-
* `[[*user name]]` are valid.
|
|
17
|
-
*
|
|
18
|
-
* The username may contain any characters except `]]` and newlines.
|
|
19
|
-
* Leading/trailing whitespace around the username is trimmed.
|
|
20
|
-
*
|
|
21
|
-
* Produces a `"user"` AST element with `data.name` (the username)
|
|
22
|
-
* and `data["show-avatar"]` (boolean).
|
|
23
|
-
*
|
|
24
|
-
* @module
|
|
25
|
-
*/
|
|
26
|
-
import type { Element } from "@wdprlib/ast";
|
|
27
|
-
import type { InlineRule, ParseContext, RuleResult } from "../types";
|
|
28
|
-
import { currentToken } from "../types";
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Inline rule for parsing `[[user name]]` and `[[*user name]]` references.
|
|
32
|
-
*
|
|
33
|
-
* Triggered by a `BLOCK_OPEN` (`[[`) token. Optionally detects a `*`
|
|
34
|
-
* prefix for avatar display, then verifies the keyword `user`, and
|
|
35
|
-
* collects the username until `]]`.
|
|
36
|
-
*
|
|
37
|
-
* Fails if:
|
|
38
|
-
* - Whitespace immediately follows `[[` (Wikidot requires no leading space)
|
|
39
|
-
* - The keyword is not `user`
|
|
40
|
-
* - The username is empty
|
|
41
|
-
* - No closing `]]` is found
|
|
42
|
-
*/
|
|
43
|
-
export const userRule: InlineRule = {
|
|
44
|
-
name: "user",
|
|
45
|
-
startTokens: ["BLOCK_OPEN"],
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Attempts to parse a user reference at the current position.
|
|
49
|
-
*
|
|
50
|
-
* @param ctx - Parse context with token stream and current position
|
|
51
|
-
* @returns A successful result with a `"user"` element, or `{ success: false }`
|
|
52
|
-
*/
|
|
53
|
-
parse(ctx: ParseContext): RuleResult<Element> {
|
|
54
|
-
const openToken = currentToken(ctx);
|
|
55
|
-
if (openToken.type !== "BLOCK_OPEN") {
|
|
56
|
-
return { success: false };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
let pos = ctx.pos + 1;
|
|
60
|
-
let consumed = 1;
|
|
61
|
-
|
|
62
|
-
// Wikidot requires no whitespace immediately after [[
|
|
63
|
-
// [[ user]] is invalid, [[user]] is valid
|
|
64
|
-
if (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
65
|
-
return { success: false };
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Check for star (avatar flag)
|
|
69
|
-
let showAvatar = false;
|
|
70
|
-
if (ctx.tokens[pos]?.type === "STAR") {
|
|
71
|
-
showAvatar = true;
|
|
72
|
-
pos++;
|
|
73
|
-
consumed++;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Skip whitespace after star
|
|
77
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
78
|
-
pos++;
|
|
79
|
-
consumed++;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Parse block name
|
|
83
|
-
const nameToken = ctx.tokens[pos];
|
|
84
|
-
if (!nameToken || (nameToken.type !== "TEXT" && nameToken.type !== "IDENTIFIER")) {
|
|
85
|
-
return { success: false };
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const blockName = nameToken.value.toLowerCase();
|
|
89
|
-
if (blockName !== "user") {
|
|
90
|
-
return { success: false };
|
|
91
|
-
}
|
|
92
|
-
pos++;
|
|
93
|
-
consumed++;
|
|
94
|
-
|
|
95
|
-
// Skip whitespace
|
|
96
|
-
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
97
|
-
pos++;
|
|
98
|
-
consumed++;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Parse username - collect all tokens until ]]
|
|
102
|
-
let username = "";
|
|
103
|
-
while (pos < ctx.tokens.length) {
|
|
104
|
-
const token = ctx.tokens[pos];
|
|
105
|
-
if (
|
|
106
|
-
!token ||
|
|
107
|
-
token.type === "BLOCK_CLOSE" ||
|
|
108
|
-
token.type === "NEWLINE" ||
|
|
109
|
-
token.type === "EOF"
|
|
110
|
-
) {
|
|
111
|
-
break;
|
|
112
|
-
}
|
|
113
|
-
username += token.value;
|
|
114
|
-
pos++;
|
|
115
|
-
consumed++;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Trim whitespace from username
|
|
119
|
-
username = username.trim();
|
|
120
|
-
|
|
121
|
-
// Username is required
|
|
122
|
-
if (!username) {
|
|
123
|
-
return { success: false };
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Expect ]]
|
|
127
|
-
if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
|
|
128
|
-
return { success: false };
|
|
129
|
-
}
|
|
130
|
-
pos++;
|
|
131
|
-
consumed++;
|
|
132
|
-
|
|
133
|
-
return {
|
|
134
|
-
success: true,
|
|
135
|
-
elements: [
|
|
136
|
-
{
|
|
137
|
-
element: "user",
|
|
138
|
-
data: {
|
|
139
|
-
name: username,
|
|
140
|
-
"show-avatar": showAvatar,
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
],
|
|
144
|
-
consumed,
|
|
145
|
-
};
|
|
146
|
-
},
|
|
147
|
-
};
|