@wdprlib/parser 3.1.2 → 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 +10456 -8230
- package/dist/index.d.cts +313 -337
- package/dist/index.d.ts +313 -337
- package/dist/index.js +10460 -8234
- package/package.json +5 -3
- package/src/index.ts +170 -0
- package/src/lexer/anchor.ts +48 -0
- package/src/lexer/index.ts +21 -0
- package/src/lexer/lexer.ts +201 -0
- 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/lexer/tokens.ts +141 -0
- package/src/parser/constants.ts +175 -0
- package/src/parser/depth/index.ts +111 -0
- package/src/parser/depth/stack.ts +82 -0
- package/src/parser/index.ts +18 -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 +76 -0
- package/src/parser/postprocess/index.ts +15 -0
- 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/index.ts +38 -0
- package/src/parser/preprocess/typography.ts +132 -0
- 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/index.ts +72 -0
- package/src/parser/rules/block/center/open.ts +27 -0
- package/src/parser/rules/block/clear-float/index.ts +51 -0
- 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/index.ts +47 -0
- package/src/parser/rules/block/content-separator/index.ts +49 -0
- 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/index.ts +44 -0
- 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/index.ts +108 -0
- 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/index.ts +127 -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/backlinks/index.ts +31 -0
- package/src/parser/rules/block/module/backlinks/types.ts +21 -0
- package/src/parser/rules/block/module/body.ts +92 -0
- package/src/parser/rules/block/module/categories/index.ts +34 -0
- package/src/parser/rules/block/module/categories/types.ts +21 -0
- package/src/parser/rules/block/module/css/index.ts +37 -0
- package/src/parser/rules/block/module/element.ts +33 -0
- package/src/parser/rules/block/module/iftags/condition.ts +109 -0
- package/src/parser/rules/block/module/iftags/index.ts +26 -0
- package/src/parser/rules/block/module/iftags/preprocess.ts +140 -0
- package/src/parser/rules/block/module/iftags/resolve.ts +73 -0
- package/src/parser/rules/block/module/iftags/types.ts +63 -0
- package/src/parser/rules/block/module/include/directive.ts +91 -0
- package/src/parser/rules/block/module/include/index.ts +29 -0
- 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 +134 -0
- package/src/parser/rules/block/module/join/index.ts +34 -0
- package/src/parser/rules/block/module/join/types.ts +23 -0
- package/src/parser/rules/block/module/listpages/compiler.ts +73 -0
- package/src/parser/rules/block/module/listpages/extract.ts +76 -0
- 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/index.ts +83 -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 +74 -0
- package/src/parser/rules/block/module/listpages/parser.ts +106 -0
- 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 +60 -0
- 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 +29 -0
- package/src/parser/rules/block/module/listusers/compiler.ts +56 -0
- package/src/parser/rules/block/module/listusers/extract.ts +40 -0
- package/src/parser/rules/block/module/listusers/getters.ts +21 -0
- package/src/parser/rules/block/module/listusers/index.ts +36 -0
- package/src/parser/rules/block/module/listusers/parser.ts +54 -0
- package/src/parser/rules/block/module/listusers/resolve.ts +58 -0
- package/src/parser/rules/block/module/listusers/types.ts +93 -0
- package/src/parser/rules/block/module/listusers/variables.ts +15 -0
- package/src/parser/rules/block/module/mapping.ts +61 -0
- package/src/parser/rules/block/module/open.ts +57 -0
- package/src/parser/rules/block/module/page-tree/index.ts +38 -0
- package/src/parser/rules/block/module/page-tree/types.ts +29 -0
- package/src/parser/rules/block/module/rate/index.ts +28 -0
- package/src/parser/rules/block/module/rate/types.ts +19 -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 +198 -0
- package/src/parser/rules/block/module/rule.ts +56 -0
- package/src/parser/rules/block/module/types-common.ts +70 -0
- package/src/parser/rules/block/module/types.ts +61 -0
- package/src/parser/rules/block/module/utils.ts +43 -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 +15 -0
- package/src/parser/rules/common/attribute-safety.ts +109 -0
- 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/index.ts +49 -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 +49 -0
- 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/index.ts +64 -0
- 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/index.ts +56 -0
- 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/index.ts +81 -0
- 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/index.ts +150 -0
- package/src/parser/rules/inline/italic.ts +46 -0
- 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 +72 -0
- 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 +73 -0
- package/src/parser/rules/inline/link-star.ts +72 -0
- 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 +50 -0
- 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/index.ts +60 -0
- 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 +47 -0
- package/src/parser/rules/inline/superscript.ts +49 -0
- package/src/parser/rules/inline/text/element.ts +5 -0
- package/src/parser/rules/inline/text/index.ts +85 -0
- 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/index.ts +84 -0
- 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 -0
- package/src/parser/rules/tokens.ts +106 -0
- package/src/parser/rules/types.ts +9 -0
- package/src/parser/toc.ts +130 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Central registry for all block-level parser rules.
|
|
4
|
+
*
|
|
5
|
+
* This module imports every block rule, re-exports each one individually
|
|
6
|
+
* (for selective use), and assembles them into the ordered `blockRules`
|
|
7
|
+
* array that the main parser iterates through.
|
|
8
|
+
*
|
|
9
|
+
* Rule ordering matters: rules earlier in the array are tried first.
|
|
10
|
+
* Line-start-only rules (comments, headings, lists, etc.) are naturally
|
|
11
|
+
* filtered by the `requiresLineStart` flag, but among rules that share
|
|
12
|
+
* a start token (e.g. BLOCK_OPEN), position in this array determines
|
|
13
|
+
* priority. For example, `codeBlockRule` is tried before `collapsibleRule`
|
|
14
|
+
* because both start with BLOCK_OPEN but code blocks should be matched
|
|
15
|
+
* first.
|
|
16
|
+
*
|
|
17
|
+
* The paragraph rule is deliberately excluded from the array -- it serves
|
|
18
|
+
* as a fallback and is exported separately as `blockFallbackRule`.
|
|
19
|
+
*
|
|
20
|
+
* @module
|
|
21
|
+
*/
|
|
22
|
+
import type { BlockRule } from "../types";
|
|
23
|
+
import { headingRule } from "./heading";
|
|
24
|
+
import { horizontalRuleRule } from "./horizontal-rule";
|
|
25
|
+
import { listRule } from "./list";
|
|
26
|
+
import { blockListRule } from "./block-list";
|
|
27
|
+
import { blockquoteRule } from "./blockquote";
|
|
28
|
+
import { definitionListRule } from "./definition-list";
|
|
29
|
+
import { paragraphRule } from "./paragraph";
|
|
30
|
+
import { divRule } from "./div";
|
|
31
|
+
import { codeBlockRule } from "./code";
|
|
32
|
+
import { collapsibleRule } from "./collapsible";
|
|
33
|
+
import { tableRule } from "./table";
|
|
34
|
+
import { tableBlockRule } from "./table-block";
|
|
35
|
+
import { moduleRule } from "./module";
|
|
36
|
+
import { footnoteBlockRule } from "./footnoteblock";
|
|
37
|
+
import { blockCommentRule } from "./comment";
|
|
38
|
+
import { centerRule } from "./center";
|
|
39
|
+
import { contentSeparatorRule } from "./content-separator";
|
|
40
|
+
import { clearFloatRule } from "./clear-float";
|
|
41
|
+
import { alignRule } from "./align";
|
|
42
|
+
import { tabviewRule } from "./tabview";
|
|
43
|
+
import { includeRule } from "./include";
|
|
44
|
+
import { mathBlockRule } from "./math";
|
|
45
|
+
import { htmlBlockRule } from "./html";
|
|
46
|
+
import { embedBlockRule } from "./embed-block";
|
|
47
|
+
import { iframeRule } from "./iframe";
|
|
48
|
+
import { iftagsRule } from "./iftags";
|
|
49
|
+
import { tocRule } from "./toc";
|
|
50
|
+
import { orphanLiRule } from "./orphan-li";
|
|
51
|
+
import { bibliographyRule } from "./bibliography";
|
|
52
|
+
|
|
53
|
+
export { headingRule } from "./heading";
|
|
54
|
+
export { horizontalRuleRule } from "./horizontal-rule";
|
|
55
|
+
export { listRule } from "./list";
|
|
56
|
+
export { blockListRule } from "./block-list";
|
|
57
|
+
export { blockquoteRule } from "./blockquote";
|
|
58
|
+
export { definitionListRule } from "./definition-list";
|
|
59
|
+
export { paragraphRule } from "./paragraph";
|
|
60
|
+
export { divRule } from "./div";
|
|
61
|
+
export { codeBlockRule } from "./code";
|
|
62
|
+
export { collapsibleRule } from "./collapsible";
|
|
63
|
+
export { tableRule } from "./table";
|
|
64
|
+
export { tableBlockRule } from "./table-block";
|
|
65
|
+
export { moduleRule } from "./module";
|
|
66
|
+
export { footnoteBlockRule } from "./footnoteblock";
|
|
67
|
+
export { blockCommentRule } from "./comment";
|
|
68
|
+
export { centerRule } from "./center";
|
|
69
|
+
export { contentSeparatorRule } from "./content-separator";
|
|
70
|
+
export { clearFloatRule } from "./clear-float";
|
|
71
|
+
export { alignRule } from "./align";
|
|
72
|
+
export { tabviewRule } from "./tabview";
|
|
73
|
+
export { includeRule } from "./include";
|
|
74
|
+
export { mathBlockRule } from "./math";
|
|
75
|
+
export { htmlBlockRule } from "./html";
|
|
76
|
+
export { embedBlockRule } from "./embed-block";
|
|
77
|
+
export { iframeRule } from "./iframe";
|
|
78
|
+
export { iftagsRule } from "./iftags";
|
|
79
|
+
export { tocRule } from "./toc";
|
|
80
|
+
export { orphanLiRule } from "./orphan-li";
|
|
81
|
+
export { bibliographyRule } from "./bibliography";
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* All block rules in priority order.
|
|
85
|
+
*
|
|
86
|
+
* The main parser tries each rule in sequence for the current token.
|
|
87
|
+
* Rules with `requiresLineStart: true` are only attempted when the token
|
|
88
|
+
* is at line start, so their position relative to non-line-start rules
|
|
89
|
+
* is less critical. Among rules that share the same `startTokens` entry,
|
|
90
|
+
* earlier position wins.
|
|
91
|
+
*
|
|
92
|
+
* The paragraph rule is intentionally absent -- it is used as a fallback
|
|
93
|
+
* when no other rule matches (see `blockFallbackRule`).
|
|
94
|
+
*/
|
|
95
|
+
export const blockRules: BlockRule[] = [
|
|
96
|
+
blockCommentRule,
|
|
97
|
+
clearFloatRule,
|
|
98
|
+
contentSeparatorRule,
|
|
99
|
+
centerRule,
|
|
100
|
+
headingRule,
|
|
101
|
+
horizontalRuleRule,
|
|
102
|
+
tableRule,
|
|
103
|
+
tableBlockRule,
|
|
104
|
+
listRule,
|
|
105
|
+
blockListRule,
|
|
106
|
+
orphanLiRule,
|
|
107
|
+
blockquoteRule,
|
|
108
|
+
definitionListRule,
|
|
109
|
+
codeBlockRule,
|
|
110
|
+
collapsibleRule,
|
|
111
|
+
tocRule,
|
|
112
|
+
footnoteBlockRule,
|
|
113
|
+
moduleRule,
|
|
114
|
+
alignRule,
|
|
115
|
+
tabviewRule,
|
|
116
|
+
includeRule,
|
|
117
|
+
mathBlockRule,
|
|
118
|
+
htmlBlockRule,
|
|
119
|
+
embedBlockRule,
|
|
120
|
+
iframeRule,
|
|
121
|
+
iftagsRule,
|
|
122
|
+
bibliographyRule,
|
|
123
|
+
divRule,
|
|
124
|
+
// paragraphRule is not included - used as fallback
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
export { paragraphRule as blockFallbackRule };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Block rule for Wikidot marker-based lists (`* item`, `# item`).
|
|
4
|
+
*
|
|
5
|
+
* Wikidot lists use leading `*` (bullet) or `#` (numbered) markers at the
|
|
6
|
+
* start of a line. Nesting is achieved by prepending spaces:
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* * Item 1
|
|
10
|
+
* * Nested bullet
|
|
11
|
+
* # Nested numbered
|
|
12
|
+
* * Item 2
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* The depth of each item is determined by the number of leading spaces
|
|
16
|
+
* before the marker. Mixed bullet/numbered lists are supported: when the
|
|
17
|
+
* list type changes at the same depth, a new sub-list is created.
|
|
18
|
+
*
|
|
19
|
+
* The flat depth-annotated items are converted into a recursive tree by
|
|
20
|
+
* `processDepths()`, then transformed into nested `list` AST elements
|
|
21
|
+
* by `buildListElement()`.
|
|
22
|
+
*
|
|
23
|
+
* Maximum nesting depth is capped at `MAX_LIST_DEPTH` (20).
|
|
24
|
+
*
|
|
25
|
+
* @module
|
|
26
|
+
*/
|
|
27
|
+
import type { Element } from "@wdprlib/ast";
|
|
28
|
+
import type { BlockRule, ParseContext, RuleResult } from "../../types";
|
|
29
|
+
import { currentToken } from "../../types";
|
|
30
|
+
import { buildNativeListElements, collectNativeListLines } from "./native";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Block rule for marker-based lists (`* ` bullet, `# ` numbered).
|
|
34
|
+
*
|
|
35
|
+
* Parsing strategy:
|
|
36
|
+
* 1. Verify the first token is LIST_BULLET or LIST_NUMBER at line start.
|
|
37
|
+
* 2. Collect consecutive list lines, recording each item's depth (number
|
|
38
|
+
* of leading spaces), type (bullet/numbered), and inline content.
|
|
39
|
+
* 3. Feed the flat depth array into `processDepths()` with type
|
|
40
|
+
* comparison, producing a nested tree.
|
|
41
|
+
* 4. Convert the tree into `list` AST elements via `buildListElement()`.
|
|
42
|
+
*/
|
|
43
|
+
export const listRule: BlockRule = {
|
|
44
|
+
name: "list",
|
|
45
|
+
startTokens: ["LIST_BULLET", "LIST_NUMBER"],
|
|
46
|
+
requiresLineStart: true,
|
|
47
|
+
|
|
48
|
+
parse(ctx: ParseContext): RuleResult<Element> {
|
|
49
|
+
const firstToken = currentToken(ctx);
|
|
50
|
+
|
|
51
|
+
if (!firstToken.lineStart) {
|
|
52
|
+
return { success: false };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Wikidot: list must start with list marker directly (no leading whitespace)
|
|
56
|
+
if (firstToken.type !== "LIST_BULLET" && firstToken.type !== "LIST_NUMBER") {
|
|
57
|
+
return { success: false };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const nativeList = collectNativeListLines(ctx);
|
|
61
|
+
|
|
62
|
+
// No items parsed - rule fails
|
|
63
|
+
if (nativeList.lines.length === 0) {
|
|
64
|
+
return { success: false };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
success: true,
|
|
69
|
+
elements: buildNativeListElements(nativeList.lines),
|
|
70
|
+
consumed: nativeList.consumed,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Element } from "@wdprlib/ast";
|
|
2
|
+
import type { ParseContext } from "../../types";
|
|
3
|
+
import { parseInlineUntil } from "../../inline/utils";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Safety limit for list nesting depth.
|
|
7
|
+
* Items deeper than this are not parsed, preventing stack overflow on
|
|
8
|
+
* deeply nested or adversarial input.
|
|
9
|
+
*/
|
|
10
|
+
const MAX_LIST_DEPTH = 20;
|
|
11
|
+
|
|
12
|
+
export type InternalListType = "bullet" | "numbered";
|
|
13
|
+
|
|
14
|
+
export interface ParsedListLine {
|
|
15
|
+
depth: number;
|
|
16
|
+
ltype: InternalListType;
|
|
17
|
+
value: Element[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type ListLineParseResult =
|
|
21
|
+
| { kind: "parsed"; line: ParsedListLine; consumed: number }
|
|
22
|
+
| { kind: "stop" };
|
|
23
|
+
|
|
24
|
+
export function parseNativeListLine(ctx: ParseContext, startPos: number): ListLineParseResult {
|
|
25
|
+
const firstToken = ctx.tokens[startPos];
|
|
26
|
+
|
|
27
|
+
if (!firstToken || !firstToken.lineStart) {
|
|
28
|
+
return { kind: "stop" };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
let pos = startPos;
|
|
32
|
+
let consumed = 0;
|
|
33
|
+
let depth = 0;
|
|
34
|
+
|
|
35
|
+
if (firstToken.type === "WHITESPACE") {
|
|
36
|
+
depth = firstToken.value.length;
|
|
37
|
+
pos++;
|
|
38
|
+
consumed++;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const markerToken = ctx.tokens[pos];
|
|
42
|
+
if (!markerToken || (markerToken.type !== "LIST_BULLET" && markerToken.type !== "LIST_NUMBER")) {
|
|
43
|
+
return { kind: "stop" };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (depth > MAX_LIST_DEPTH) {
|
|
47
|
+
return { kind: "stop" };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const ltype: InternalListType = markerToken.type === "LIST_BULLET" ? "bullet" : "numbered";
|
|
51
|
+
pos++;
|
|
52
|
+
consumed++;
|
|
53
|
+
|
|
54
|
+
if (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
55
|
+
pos++;
|
|
56
|
+
consumed++;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const inlineCtx: ParseContext = { ...ctx, pos };
|
|
60
|
+
const inlineResult = parseInlineUntil(inlineCtx, "NEWLINE");
|
|
61
|
+
consumed += inlineResult.consumed;
|
|
62
|
+
pos += inlineResult.consumed;
|
|
63
|
+
|
|
64
|
+
if (ctx.tokens[pos]?.type === "NEWLINE") {
|
|
65
|
+
consumed++;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
kind: "parsed",
|
|
70
|
+
line: {
|
|
71
|
+
depth,
|
|
72
|
+
ltype,
|
|
73
|
+
value: inlineResult.elements,
|
|
74
|
+
},
|
|
75
|
+
consumed,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { Element, ListData, ListItem, ListType } from "@wdprlib/ast";
|
|
2
|
+
import type { ParseContext } from "../../types";
|
|
3
|
+
import { processDepths, type DepthList } from "../../../depth";
|
|
4
|
+
import { parseNativeListLine, type InternalListType, type ParsedListLine } from "./line";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Default list type used as the top-level placeholder in
|
|
8
|
+
* `processDepths()`. The actual type of each sub-list is determined
|
|
9
|
+
* by its first item's marker.
|
|
10
|
+
*/
|
|
11
|
+
const GENERIC_LIST_TYPE: InternalListType = "bullet";
|
|
12
|
+
|
|
13
|
+
export interface ParsedNativeList {
|
|
14
|
+
lines: ParsedListLine[];
|
|
15
|
+
consumed: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function collectNativeListLines(ctx: ParseContext): ParsedNativeList {
|
|
19
|
+
const lines: ParsedListLine[] = [];
|
|
20
|
+
let pos = ctx.pos;
|
|
21
|
+
let consumed = 0;
|
|
22
|
+
|
|
23
|
+
while (pos < ctx.tokens.length) {
|
|
24
|
+
const result = parseNativeListLine(ctx, pos);
|
|
25
|
+
if (result.kind === "stop") break;
|
|
26
|
+
|
|
27
|
+
lines.push(result.line);
|
|
28
|
+
pos += result.consumed;
|
|
29
|
+
consumed += result.consumed;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return { lines, consumed };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function buildNativeListElements(lines: ParsedListLine[]): Element[] {
|
|
36
|
+
const depthTrees = processDepths<InternalListType, Element[]>(
|
|
37
|
+
GENERIC_LIST_TYPE,
|
|
38
|
+
lines,
|
|
39
|
+
(a, b) => a === b,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
return depthTrees.map(({ ltype, list }) => buildListElement(ltype, list));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Converts the internal list type enum to the AST's ListType.
|
|
47
|
+
*/
|
|
48
|
+
function toListType(ltype: InternalListType): ListType {
|
|
49
|
+
return ltype === "numbered" ? "numbered" : "bullet";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function buildListElement(
|
|
53
|
+
topLtype: InternalListType,
|
|
54
|
+
list: DepthList<InternalListType, Element[]>,
|
|
55
|
+
): Element {
|
|
56
|
+
return {
|
|
57
|
+
element: "list",
|
|
58
|
+
data: buildListData(topLtype, list),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function buildListData(
|
|
63
|
+
topLtype: InternalListType,
|
|
64
|
+
list: DepthList<InternalListType, Element[]>,
|
|
65
|
+
): ListData {
|
|
66
|
+
const items: ListItem[] = [];
|
|
67
|
+
|
|
68
|
+
for (const item of list) {
|
|
69
|
+
if (item.kind === "item") {
|
|
70
|
+
items.push({
|
|
71
|
+
"item-type": "elements",
|
|
72
|
+
attributes: {},
|
|
73
|
+
elements: item.value,
|
|
74
|
+
});
|
|
75
|
+
} else {
|
|
76
|
+
items.push({
|
|
77
|
+
"item-type": "sub-list",
|
|
78
|
+
element: "list",
|
|
79
|
+
data: buildListData(item.ltype, item.children),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
type: toListType(topLtype),
|
|
86
|
+
attributes: {},
|
|
87
|
+
items,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ParseContext } from "../../types";
|
|
2
|
+
import { parseBlockName } from "../utils";
|
|
3
|
+
|
|
4
|
+
export interface MathContentResult {
|
|
5
|
+
latexSource: string;
|
|
6
|
+
consumed: number;
|
|
7
|
+
foundClose: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function collectMathContent(ctx: ParseContext, startPos: number): MathContentResult {
|
|
11
|
+
let latexSource = "";
|
|
12
|
+
let pos = startPos;
|
|
13
|
+
let consumed = 0;
|
|
14
|
+
let foundClose = false;
|
|
15
|
+
|
|
16
|
+
while (pos < ctx.tokens.length) {
|
|
17
|
+
const token = ctx.tokens[pos];
|
|
18
|
+
if (!token) break;
|
|
19
|
+
|
|
20
|
+
if (token.type === "BLOCK_END_OPEN") {
|
|
21
|
+
const closeNameResult = parseBlockName(ctx, pos + 1);
|
|
22
|
+
if (closeNameResult?.name === "math") {
|
|
23
|
+
foundClose = true;
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
latexSource += token.type === "BACKSLASH_BREAK" ? "\\\n" : token.value;
|
|
29
|
+
pos++;
|
|
30
|
+
consumed++;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return { latexSource, consumed, foundClose };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function consumeMathClose(ctx: ParseContext, startPos: number): number {
|
|
37
|
+
let pos = startPos + 1;
|
|
38
|
+
let consumed = 1;
|
|
39
|
+
|
|
40
|
+
const closeNameResult = parseBlockName(ctx, pos);
|
|
41
|
+
if (closeNameResult) {
|
|
42
|
+
pos += closeNameResult.consumed;
|
|
43
|
+
consumed += closeNameResult.consumed;
|
|
44
|
+
}
|
|
45
|
+
if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
|
|
46
|
+
pos++;
|
|
47
|
+
consumed++;
|
|
48
|
+
}
|
|
49
|
+
if (ctx.tokens[pos]?.type === "NEWLINE") {
|
|
50
|
+
consumed++;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return consumed;
|
|
54
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Block rule for the Wikidot math block: `[[math name]]...[[/math]]`.
|
|
4
|
+
*
|
|
5
|
+
* A math block captures LaTeX source code between the tags and stores it
|
|
6
|
+
* as a `math` element in the AST. The content is not parsed for inline
|
|
7
|
+
* markup.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import type { Element } from "@wdprlib/ast";
|
|
12
|
+
import type { BlockRule, ParseContext, RuleResult } from "../../types";
|
|
13
|
+
import { currentToken } from "../../types";
|
|
14
|
+
import { parseBlockName } from "../utils";
|
|
15
|
+
import { collectMathContent, consumeMathClose } from "./content";
|
|
16
|
+
import { parseMathName } from "./name";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Block rule for `[[math name]]...[[/math]]`.
|
|
20
|
+
*
|
|
21
|
+
* Content is captured as raw LaTeX source. BACKSLASH_BREAK tokens are
|
|
22
|
+
* restored to their original `\\\n` form for correct LaTeX rendering.
|
|
23
|
+
*/
|
|
24
|
+
export const mathBlockRule: BlockRule = {
|
|
25
|
+
name: "math",
|
|
26
|
+
startTokens: ["BLOCK_OPEN"],
|
|
27
|
+
requiresLineStart: false,
|
|
28
|
+
|
|
29
|
+
parse(ctx: ParseContext): RuleResult<Element> {
|
|
30
|
+
const openToken = currentToken(ctx);
|
|
31
|
+
if (openToken.type !== "BLOCK_OPEN") {
|
|
32
|
+
return { success: false };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let pos = ctx.pos + 1;
|
|
36
|
+
let consumed = 1;
|
|
37
|
+
|
|
38
|
+
const nameResult = parseBlockName(ctx, pos);
|
|
39
|
+
if (!nameResult || nameResult.name !== "math") {
|
|
40
|
+
return { success: false };
|
|
41
|
+
}
|
|
42
|
+
pos += nameResult.consumed;
|
|
43
|
+
consumed += nameResult.consumed;
|
|
44
|
+
|
|
45
|
+
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
46
|
+
pos++;
|
|
47
|
+
consumed++;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const mathName = parseMathName(ctx, pos);
|
|
51
|
+
pos += mathName.consumed;
|
|
52
|
+
consumed += mathName.consumed;
|
|
53
|
+
|
|
54
|
+
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
55
|
+
pos++;
|
|
56
|
+
consumed++;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
|
|
60
|
+
return { success: false };
|
|
61
|
+
}
|
|
62
|
+
pos++;
|
|
63
|
+
consumed++;
|
|
64
|
+
|
|
65
|
+
if (ctx.tokens[pos]?.type === "NEWLINE") {
|
|
66
|
+
pos++;
|
|
67
|
+
consumed++;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const contentResult = collectMathContent(ctx, pos);
|
|
71
|
+
const latexSource = contentResult.latexSource.trim();
|
|
72
|
+
consumed += contentResult.consumed;
|
|
73
|
+
pos += contentResult.consumed;
|
|
74
|
+
|
|
75
|
+
if (!contentResult.foundClose) {
|
|
76
|
+
ctx.diagnostics.push({
|
|
77
|
+
severity: "warning",
|
|
78
|
+
code: "unclosed-block",
|
|
79
|
+
message: "Missing closing tag [[/math]] for [[math]]",
|
|
80
|
+
position: openToken.position,
|
|
81
|
+
});
|
|
82
|
+
} else {
|
|
83
|
+
const closeConsumed = consumeMathClose(ctx, pos);
|
|
84
|
+
pos += closeConsumed;
|
|
85
|
+
consumed += closeConsumed;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!latexSource) {
|
|
89
|
+
return { success: false };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
success: true,
|
|
94
|
+
elements: [
|
|
95
|
+
{
|
|
96
|
+
element: "math",
|
|
97
|
+
data: {
|
|
98
|
+
name: mathName.name,
|
|
99
|
+
"latex-source": latexSource,
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
consumed,
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ParseContext } from "../../types";
|
|
2
|
+
|
|
3
|
+
export interface MathNameResult {
|
|
4
|
+
name: string | null;
|
|
5
|
+
consumed: number;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function parseMathName(ctx: ParseContext, startPos: number): MathNameResult {
|
|
9
|
+
let pos = startPos;
|
|
10
|
+
let consumed = 0;
|
|
11
|
+
let name = "";
|
|
12
|
+
|
|
13
|
+
const first = ctx.tokens[pos];
|
|
14
|
+
if (first?.type !== "IDENTIFIER" && first?.type !== "TEXT") {
|
|
15
|
+
return { name: null, consumed: 0 };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
while (pos < ctx.tokens.length) {
|
|
19
|
+
const token = ctx.tokens[pos];
|
|
20
|
+
if (
|
|
21
|
+
!token ||
|
|
22
|
+
token.type === "BLOCK_CLOSE" ||
|
|
23
|
+
token.type === "WHITESPACE" ||
|
|
24
|
+
token.type === "NEWLINE"
|
|
25
|
+
) {
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
name += token.value;
|
|
30
|
+
pos++;
|
|
31
|
+
consumed++;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return { name: name === "" ? null : name, consumed };
|
|
35
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Parser rule for the Wikidot `[[module Backlinks]]` block.
|
|
4
|
+
*
|
|
5
|
+
* Displays pages that link to the current page (or a specified page).
|
|
6
|
+
* Accepts an optional `page` attribute to target a specific page.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { ModuleRule } from "../types";
|
|
12
|
+
import type { BacklinksModuleData } from "./types";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Module rule for `[[module Backlinks]]`.
|
|
16
|
+
*
|
|
17
|
+
* Parses the optional `page` attribute. When not specified, the rendering
|
|
18
|
+
* application should show backlinks for the current page.
|
|
19
|
+
*/
|
|
20
|
+
export const backlinksModuleRule: ModuleRule = {
|
|
21
|
+
name: "module-backlinks",
|
|
22
|
+
acceptsNames: ["backlinks"],
|
|
23
|
+
hasBody: false,
|
|
24
|
+
|
|
25
|
+
parse(_ctx, _pos, args): BacklinksModuleData {
|
|
26
|
+
return {
|
|
27
|
+
module: "backlinks",
|
|
28
|
+
page: args.page ?? null,
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Type definitions for the Backlinks module.
|
|
4
|
+
*
|
|
5
|
+
* The `[[module Backlinks]]` block displays a list of pages that link to
|
|
6
|
+
* the specified page (or the current page if no `page` attribute is given).
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* AST data for a `[[module Backlinks]]` element.
|
|
13
|
+
*
|
|
14
|
+
* The rendering application should query for pages that contain links to
|
|
15
|
+
* the target page and display them as a list.
|
|
16
|
+
*/
|
|
17
|
+
export interface BacklinksModuleData {
|
|
18
|
+
module: "backlinks";
|
|
19
|
+
/** Target page for which to find backlinks, or null for the current page */
|
|
20
|
+
page: string | null;
|
|
21
|
+
}
|