@wdprlib/parser 3.2.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +10471 -8406
- package/dist/index.d.cts +313 -337
- package/dist/index.d.ts +313 -337
- package/dist/index.js +10457 -8392
- package/package.json +1 -1
- package/src/index.ts +7 -0
- package/src/lexer/anchor.ts +48 -0
- package/src/lexer/index.ts +3 -2
- package/src/lexer/lexer.ts +73 -559
- package/src/lexer/options.ts +19 -0
- package/src/lexer/punctuation.ts +70 -0
- package/src/lexer/quoted-string.ts +16 -0
- package/src/lexer/runs.ts +85 -0
- package/src/lexer/spacing-actions.ts +24 -0
- package/src/lexer/state.ts +103 -0
- package/src/lexer/syntax-actions.ts +80 -0
- package/src/lexer/text-actions.ts +41 -0
- package/src/lexer/token-actions.ts +136 -0
- package/src/lexer/token-factory.ts +62 -0
- package/src/lexer/tokenize.ts +18 -0
- package/src/parser/constants.ts +2 -0
- package/src/parser/depth/index.ts +111 -0
- package/src/parser/depth/stack.ts +82 -0
- package/src/parser/parse/block.ts +42 -0
- package/src/parser/parse/context.ts +26 -0
- package/src/parser/parse/footnotes.ts +25 -0
- package/src/parser/parse/index.ts +42 -0
- package/src/parser/parse/options.ts +34 -0
- package/src/parser/parse/parser.ts +79 -0
- package/src/parser/parse/plain-non-ascii.ts +129 -0
- package/src/parser/parse/result.ts +57 -0
- package/src/parser/parse/source.ts +11 -0
- package/src/parser/postprocess/divAdjacentParagraph.ts +1 -1
- package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
- package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
- package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
- package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
- package/src/parser/postprocess/spanStrip/factory.ts +23 -0
- package/src/parser/postprocess/spanStrip/index.ts +8 -0
- package/src/parser/postprocess/spanStrip/merge.ts +117 -0
- package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
- package/src/parser/postprocess/spanStrip/split.ts +67 -0
- package/src/parser/preprocess/expr/chars.ts +15 -0
- package/src/parser/preprocess/expr/evaluate.ts +22 -0
- package/src/parser/preprocess/expr/index.ts +45 -0
- package/src/parser/preprocess/expr/kind.ts +19 -0
- package/src/parser/preprocess/expr/parse.ts +103 -0
- package/src/parser/preprocess/expr/scan.ts +34 -0
- package/src/parser/preprocess/expr/types.ts +14 -0
- package/src/parser/preprocess/typography.ts +70 -5
- package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
- package/src/parser/preprocess/utils/index.ts +13 -0
- package/src/parser/preprocess/utils/raw-regions.ts +153 -0
- package/src/parser/preprocess/whitespace/detection.ts +39 -0
- package/src/parser/preprocess/whitespace/index.ts +79 -0
- package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
- package/src/parser/preprocess/whitespace/patterns.ts +23 -0
- package/src/parser/rules/block/align/body.ts +46 -0
- package/src/parser/rules/block/align/element.ts +13 -0
- package/src/parser/rules/block/align/index.ts +90 -0
- package/src/parser/rules/block/align/syntax.ts +113 -0
- package/src/parser/rules/block/bibliography/body.ts +81 -0
- package/src/parser/rules/block/bibliography/entries.ts +49 -0
- package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
- package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
- package/src/parser/rules/block/bibliography/index.ts +90 -0
- package/src/parser/rules/block/bibliography/open.ts +53 -0
- package/src/parser/rules/block/block-list/bare-content.ts +105 -0
- package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
- package/src/parser/rules/block/block-list/index.ts +51 -0
- package/src/parser/rules/block/block-list/item-content.ts +132 -0
- package/src/parser/rules/block/block-list/li-content.ts +107 -0
- package/src/parser/rules/block/block-list/li-item.ts +77 -0
- package/src/parser/rules/block/block-list/list-block.ts +100 -0
- package/src/parser/rules/block/block-list/open.ts +51 -0
- package/src/parser/rules/block/block-list/tags.ts +50 -0
- package/src/parser/rules/block/blockquote/build.ts +62 -0
- package/src/parser/rules/block/blockquote/index.ts +80 -0
- package/src/parser/rules/block/blockquote/line.ts +79 -0
- package/src/parser/rules/block/blockquote/lines.ts +39 -0
- package/src/parser/rules/block/{center.ts → center/index.ts} +7 -22
- package/src/parser/rules/block/center/open.ts +27 -0
- package/src/parser/rules/block/{clear-float.ts → clear-float/index.ts} +6 -30
- package/src/parser/rules/block/clear-float/syntax.ts +43 -0
- package/src/parser/rules/block/code/attributes.ts +30 -0
- package/src/parser/rules/block/code/content.ts +57 -0
- package/src/parser/rules/block/code/index.ts +100 -0
- package/src/parser/rules/block/collapsible/attributes.ts +95 -0
- package/src/parser/rules/block/collapsible/body.ts +69 -0
- package/src/parser/rules/block/collapsible/index.ts +117 -0
- package/src/parser/rules/block/collapsible/open.ts +51 -0
- package/src/parser/rules/block/collapsible/orphans.ts +31 -0
- package/src/parser/rules/block/collapsible/tags.ts +17 -0
- package/src/parser/rules/block/comment/consume.ts +37 -0
- package/src/parser/rules/block/{comment.ts → comment/index.ts} +12 -38
- package/src/parser/rules/block/{content-separator.ts → content-separator/index.ts} +5 -35
- package/src/parser/rules/block/content-separator/syntax.ts +33 -0
- package/src/parser/rules/block/definition-list/collect.ts +40 -0
- package/src/parser/rules/block/definition-list/index.ts +63 -0
- package/src/parser/rules/block/definition-list/item-key.ts +95 -0
- package/src/parser/rules/block/definition-list/item-value.ts +56 -0
- package/src/parser/rules/block/definition-list/items.ts +54 -0
- package/src/parser/rules/block/div/body.ts +41 -0
- package/src/parser/rules/block/div/close.ts +41 -0
- package/src/parser/rules/block/div/failed.ts +117 -0
- package/src/parser/rules/block/div/index.ts +112 -0
- package/src/parser/rules/block/div/nesting.ts +37 -0
- package/src/parser/rules/block/div/open.ts +59 -0
- package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
- package/src/parser/rules/block/embed-block/content.ts +53 -0
- package/src/parser/rules/block/embed-block/index.ts +91 -0
- package/src/parser/rules/block/embed-block/open.ts +52 -0
- package/src/parser/rules/block/embed-block/tags.ts +5 -0
- package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
- package/src/parser/rules/block/footnoteblock/index.ts +82 -0
- package/src/parser/rules/block/footnoteblock/open.ts +53 -0
- package/src/parser/rules/block/heading/index.ts +87 -0
- package/src/parser/rules/block/heading/open.ts +50 -0
- package/src/parser/rules/block/heading/toc-text.ts +26 -0
- package/src/parser/rules/block/{horizontal-rule.ts → horizontal-rule/index.ts} +4 -21
- package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
- package/src/parser/rules/block/html/body.ts +114 -0
- package/src/parser/rules/block/html/diagnostics.ts +11 -0
- package/src/parser/rules/block/html/index.ts +95 -0
- package/src/parser/rules/block/html/open.ts +36 -0
- package/src/parser/rules/block/iframe/attributes.ts +106 -0
- package/src/parser/rules/block/iframe/index.ts +73 -0
- package/src/parser/rules/block/iframe/open.ts +58 -0
- package/src/parser/rules/block/iframe/source.ts +24 -0
- package/src/parser/rules/block/iframe/url.ts +38 -0
- package/src/parser/rules/block/iftags/body.ts +48 -0
- package/src/parser/rules/block/iftags/condition.ts +24 -0
- package/src/parser/rules/block/{iftags.ts → iftags/index.ts} +16 -58
- package/src/parser/rules/block/include/arguments.ts +48 -0
- package/src/parser/rules/block/include/index.ts +75 -0
- package/src/parser/rules/block/include/location.ts +24 -0
- package/src/parser/rules/block/include/variables.ts +37 -0
- package/src/parser/rules/block/list/index.ts +73 -0
- package/src/parser/rules/block/list/line.ts +77 -0
- package/src/parser/rules/block/list/native.ts +89 -0
- package/src/parser/rules/block/math/content.ts +54 -0
- package/src/parser/rules/block/math/index.ts +106 -0
- package/src/parser/rules/block/math/name.ts +35 -0
- package/src/parser/rules/block/module/body.ts +92 -0
- package/src/parser/rules/block/module/element.ts +33 -0
- package/src/parser/rules/block/module/include/directive.ts +91 -0
- package/src/parser/rules/block/module/include/index.ts +11 -2
- package/src/parser/rules/block/module/include/references.ts +42 -0
- package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
- package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
- package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
- package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
- package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
- package/src/parser/rules/block/module/include/scanner.ts +121 -0
- package/src/parser/rules/block/module/index.ts +14 -2
- package/src/parser/rules/block/module/listpages/compiler.ts +12 -392
- package/src/parser/rules/block/module/listpages/extract.ts +25 -359
- package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
- package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
- package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
- package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
- package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
- package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
- package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
- package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
- package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
- package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
- package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
- package/src/parser/rules/block/module/listpages/normalize.ts +8 -324
- package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
- package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
- package/src/parser/rules/block/module/listpages/resolve.ts +5 -75
- package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
- package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
- package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
- package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
- package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
- package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
- package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
- package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
- package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
- package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
- package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
- package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
- package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
- package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
- package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
- package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
- package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
- package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
- package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
- package/src/parser/rules/block/module/listpages/url-resolution/params.ts +30 -0
- package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
- package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +62 -0
- package/src/parser/rules/block/module/listpages/url-resolution/value.ts +34 -0
- package/src/parser/rules/block/module/listpages/url-resolver.ts +3 -160
- package/src/parser/rules/block/module/listusers/compiler.ts +4 -25
- package/src/parser/rules/block/module/listusers/extract.ts +4 -9
- package/src/parser/rules/block/module/listusers/getters.ts +21 -0
- package/src/parser/rules/block/module/listusers/variables.ts +15 -0
- package/src/parser/rules/block/module/open.ts +57 -0
- package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
- package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
- package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
- package/src/parser/rules/block/module/resolution/styles.ts +53 -0
- package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
- package/src/parser/rules/block/module/resolve.ts +79 -292
- package/src/parser/rules/block/module/rule.ts +56 -0
- package/src/parser/rules/block/module/types-common.ts +11 -0
- package/src/parser/rules/block/module/walk/children.ts +35 -0
- package/src/parser/rules/block/module/walk/index.ts +9 -0
- package/src/parser/rules/block/module/walk/map/index.ts +2 -0
- package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
- package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
- package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
- package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
- package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
- package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
- package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
- package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
- package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
- package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
- package/src/parser/rules/block/module/walk/map/types.ts +6 -0
- package/src/parser/rules/block/module/walk/traverse.ts +65 -0
- package/src/parser/rules/block/orphan-li/content.ts +60 -0
- package/src/parser/rules/block/orphan-li/index.ts +75 -0
- package/src/parser/rules/block/orphan-li/open.ts +25 -0
- package/src/parser/rules/block/orphan-li/tags.ts +40 -0
- package/src/parser/rules/block/paragraph/content.ts +12 -0
- package/src/parser/rules/block/paragraph/index.ts +60 -0
- package/src/parser/rules/block/paragraph/normalize.ts +52 -0
- package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
- package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
- package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
- package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
- package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
- package/src/parser/rules/block/parsing/block-item.ts +29 -0
- package/src/parser/rules/block/parsing/content.ts +127 -0
- package/src/parser/rules/block/parsing/end-condition.ts +51 -0
- package/src/parser/rules/block/parsing/inline-content.ts +105 -0
- package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
- package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
- package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
- package/src/parser/rules/block/table/index.ts +80 -0
- package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
- package/src/parser/rules/block/table/pipe/cell.ts +106 -0
- package/src/parser/rules/block/table/pipe/index.ts +2 -0
- package/src/parser/rules/block/table/pipe/row.ts +88 -0
- package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
- package/src/parser/rules/block/table/pipe/trim.ts +50 -0
- package/src/parser/rules/block/table-block/body.ts +79 -0
- package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
- package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
- package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
- package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
- package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
- package/src/parser/rules/block/table-block/cell.ts +64 -0
- package/src/parser/rules/block/table-block/index.ts +113 -0
- package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
- package/src/parser/rules/block/table-block/structure.ts +80 -0
- package/src/parser/rules/block/tabview/body.ts +64 -0
- package/src/parser/rules/block/tabview/index.ts +90 -0
- package/src/parser/rules/block/tabview/open.ts +50 -0
- package/src/parser/rules/block/tabview/tab.ts +92 -0
- package/src/parser/rules/block/tabview/tags.ts +30 -0
- package/src/parser/rules/block/toc/element.ts +11 -0
- package/src/parser/rules/block/toc/index.ts +44 -0
- package/src/parser/rules/block/toc/open.ts +84 -0
- package/src/parser/rules/block/utils.ts +10 -610
- package/src/parser/rules/{utils.ts → common/attribute-safety.ts} +3 -49
- package/src/parser/rules/common/block-name.ts +33 -0
- package/src/parser/rules/common/index.ts +2 -0
- package/src/parser/rules/contracts/index.ts +3 -0
- package/src/parser/rules/contracts/parse-context.ts +38 -0
- package/src/parser/rules/contracts/rule.ts +43 -0
- package/src/parser/rules/contracts/scope.ts +31 -0
- package/src/parser/rules/inline/anchor/attributes.ts +54 -0
- package/src/parser/rules/inline/anchor/child.ts +26 -0
- package/src/parser/rules/inline/anchor/close.ts +34 -0
- package/src/parser/rules/inline/anchor/content.ts +59 -0
- package/src/parser/rules/inline/anchor/index.ts +103 -0
- package/src/parser/rules/inline/anchor/newline.ts +26 -0
- package/src/parser/rules/inline/anchor/open.ts +47 -0
- package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
- package/src/parser/rules/inline/anchor/syntax.ts +40 -0
- package/src/parser/rules/inline/anchor-name/index.ts +38 -0
- package/src/parser/rules/inline/anchor-name/name.ts +39 -0
- package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
- package/src/parser/rules/inline/bibcite/element.ts +14 -0
- package/src/parser/rules/inline/bibcite/index.ts +34 -0
- package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
- package/src/parser/rules/inline/bold.ts +2 -39
- package/src/parser/rules/inline/color/index.ts +35 -0
- package/src/parser/rules/inline/color/syntax.ts +69 -0
- package/src/parser/rules/inline/comment/consume.ts +31 -0
- package/src/parser/rules/inline/{comment.ts → comment/index.ts} +10 -36
- package/src/parser/rules/inline/equation-ref/element.ts +8 -0
- package/src/parser/rules/inline/equation-ref/index.ts +34 -0
- package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
- package/src/parser/rules/inline/expr/branch.ts +104 -0
- package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
- package/src/parser/rules/inline/expr/conditional.ts +80 -0
- package/src/parser/rules/inline/expr/depth.ts +25 -0
- package/src/parser/rules/inline/expr/elements.ts +39 -0
- package/src/parser/rules/inline/expr/index.ts +84 -0
- package/src/parser/rules/inline/expr/syntax.ts +45 -0
- package/src/parser/rules/inline/footnote/child.ts +22 -0
- package/src/parser/rules/inline/footnote/close.ts +33 -0
- package/src/parser/rules/inline/footnote/content.ts +54 -0
- package/src/parser/rules/inline/footnote/elements.ts +38 -0
- package/src/parser/rules/inline/footnote/index.ts +54 -0
- package/src/parser/rules/inline/footnote/newline.ts +27 -0
- package/src/parser/rules/inline/footnote/open.ts +38 -0
- package/src/parser/rules/inline/formatting/container.ts +50 -0
- package/src/parser/rules/inline/{guillemet.ts → guillemet/index.ts} +5 -13
- package/src/parser/rules/inline/guillemet/text.ts +11 -0
- package/src/parser/rules/inline/html/gate.ts +64 -0
- package/src/parser/rules/inline/{html.ts → html/index.ts} +9 -60
- package/src/parser/rules/inline/html/open.ts +37 -0
- package/src/parser/rules/inline/image/attributes.ts +22 -0
- package/src/parser/rules/inline/image/body.ts +36 -0
- package/src/parser/rules/inline/image/index.ts +89 -0
- package/src/parser/rules/inline/image/open.ts +56 -0
- package/src/parser/rules/inline/image/source.ts +62 -0
- package/src/parser/rules/inline/image/syntax.ts +76 -0
- package/src/parser/rules/inline/italic.ts +2 -30
- package/src/parser/rules/inline/line-break/backslash.ts +58 -0
- package/src/parser/rules/inline/line-break/elements.ts +9 -0
- package/src/parser/rules/inline/line-break/index.ts +3 -0
- package/src/parser/rules/inline/line-break/newline.ts +82 -0
- package/src/parser/rules/inline/line-break/underscore.ts +45 -0
- package/src/parser/rules/inline/link-anchor.ts +6 -81
- package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
- package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
- package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
- package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
- package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
- package/src/parser/rules/inline/link-single.ts +7 -98
- package/src/parser/rules/inline/link-star.ts +7 -69
- package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
- package/src/parser/rules/inline/link-triple/index.ts +62 -0
- package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
- package/src/parser/rules/inline/link-triple/label.ts +35 -0
- package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
- package/src/parser/rules/inline/link-triple/target.ts +36 -0
- package/src/parser/rules/inline/math-inline/index.ts +40 -0
- package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
- package/src/parser/rules/inline/monospace.ts +2 -30
- package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
- package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
- package/src/parser/rules/inline/parsing/collect.ts +23 -0
- package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
- package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
- package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
- package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
- package/src/parser/rules/inline/parsing/rules.ts +34 -0
- package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
- package/src/parser/rules/inline/raw/angle.ts +40 -0
- package/src/parser/rules/inline/raw/double-at.ts +78 -0
- package/src/parser/rules/inline/raw/index.ts +26 -0
- package/src/parser/rules/inline/raw/result.ts +26 -0
- package/src/parser/rules/inline/size/content.ts +65 -0
- package/src/parser/rules/inline/size/index.ts +55 -0
- package/src/parser/rules/inline/size/open.ts +43 -0
- package/src/parser/rules/inline/size/value.ts +45 -0
- package/src/parser/rules/inline/span/content.ts +97 -0
- package/src/parser/rules/inline/span/elements.ts +108 -0
- package/src/parser/rules/inline/span/index.ts +79 -0
- package/src/parser/rules/inline/span/newline.ts +50 -0
- package/src/parser/rules/inline/span/syntax.ts +70 -0
- package/src/parser/rules/inline/{strikethrough.ts → strikethrough/index.ts} +5 -60
- package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
- package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
- package/src/parser/rules/inline/subscript.ts +2 -39
- package/src/parser/rules/inline/superscript.ts +4 -39
- package/src/parser/rules/inline/text/element.ts +5 -0
- package/src/parser/rules/inline/{text.ts → text/index.ts} +5 -4
- package/src/parser/rules/inline/underline/child.ts +26 -0
- package/src/parser/rules/inline/underline/content.ts +29 -0
- package/src/parser/rules/inline/{underline.ts → underline/index.ts} +6 -49
- package/src/parser/rules/inline/user/element.ts +11 -0
- package/src/parser/rules/inline/user/index.ts +34 -0
- package/src/parser/rules/inline/user/syntax.ts +67 -0
- package/src/parser/rules/inline/utils.ts +4 -344
- package/src/parser/rules/tokens.ts +106 -0
- package/src/parser/rules/types.ts +9 -252
- package/src/parser/depth.ts +0 -251
- package/src/parser/parse.ts +0 -315
- package/src/parser/postprocess/spanStrip.ts +0 -697
- package/src/parser/preprocess/expr.ts +0 -265
- package/src/parser/preprocess/utils.ts +0 -250
- package/src/parser/preprocess/whitespace.ts +0 -111
- package/src/parser/rules/block/align.ts +0 -282
- package/src/parser/rules/block/bibliography.ts +0 -359
- package/src/parser/rules/block/block-list.ts +0 -689
- package/src/parser/rules/block/blockquote.ts +0 -238
- package/src/parser/rules/block/code.ts +0 -187
- package/src/parser/rules/block/collapsible.ts +0 -337
- package/src/parser/rules/block/definition-list.ts +0 -270
- package/src/parser/rules/block/div.ts +0 -400
- package/src/parser/rules/block/embed-block.ts +0 -153
- package/src/parser/rules/block/footnoteblock.ts +0 -200
- package/src/parser/rules/block/heading.ts +0 -142
- package/src/parser/rules/block/html.ts +0 -222
- package/src/parser/rules/block/iframe.ts +0 -239
- package/src/parser/rules/block/include.ts +0 -179
- package/src/parser/rules/block/list.ts +0 -244
- package/src/parser/rules/block/math.ts +0 -183
- package/src/parser/rules/block/module/include/resolve.ts +0 -556
- package/src/parser/rules/block/module/listpages/types.ts +0 -513
- package/src/parser/rules/block/module/walk.ts +0 -380
- package/src/parser/rules/block/module.ts +0 -164
- package/src/parser/rules/block/orphan-li.ts +0 -177
- package/src/parser/rules/block/paragraph.ts +0 -157
- package/src/parser/rules/block/table-block.ts +0 -726
- package/src/parser/rules/block/table.ts +0 -441
- package/src/parser/rules/block/tabview.ts +0 -331
- package/src/parser/rules/block/toc.ts +0 -129
- package/src/parser/rules/inline/anchor-name.ts +0 -154
- package/src/parser/rules/inline/anchor.ts +0 -327
- package/src/parser/rules/inline/bibcite.ts +0 -153
- package/src/parser/rules/inline/color.ts +0 -140
- package/src/parser/rules/inline/equation-ref.ts +0 -115
- package/src/parser/rules/inline/expr.ts +0 -526
- package/src/parser/rules/inline/footnote.ts +0 -223
- package/src/parser/rules/inline/image.ts +0 -328
- package/src/parser/rules/inline/line-break.ts +0 -326
- package/src/parser/rules/inline/link-triple.ts +0 -267
- package/src/parser/rules/inline/math-inline.ts +0 -126
- package/src/parser/rules/inline/raw.ts +0 -262
- package/src/parser/rules/inline/size.ts +0 -244
- package/src/parser/rules/inline/span.ts +0 -424
- package/src/parser/rules/inline/user.ts +0 -147
|
@@ -24,163 +24,6 @@
|
|
|
24
24
|
* @module
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Mapping of module attribute names to their corresponding `ListPagesQuery` keys
|
|
32
|
-
* and expected value types. Only fields listed here support `@URL` resolution.
|
|
33
|
-
*/
|
|
34
|
-
const URL_RESOLVABLE_FIELDS: ReadonlyArray<{
|
|
35
|
-
attr: string;
|
|
36
|
-
queryKey: keyof ListPagesQuery;
|
|
37
|
-
type: "string" | "number" | "boolean";
|
|
38
|
-
}> = [
|
|
39
|
-
{ attr: "offset", queryKey: "offset", type: "number" },
|
|
40
|
-
{ attr: "limit", queryKey: "limit", type: "number" },
|
|
41
|
-
{ attr: "per-page", queryKey: "perPage", type: "number" },
|
|
42
|
-
{ attr: "order", queryKey: "order", type: "string" },
|
|
43
|
-
{ attr: "tags", queryKey: "tags", type: "string" },
|
|
44
|
-
{ attr: "category", queryKey: "category", type: "string" },
|
|
45
|
-
{ attr: "parent", queryKey: "parent", type: "string" },
|
|
46
|
-
{ attr: "range", queryKey: "range", type: "string" },
|
|
47
|
-
{ attr: "name", queryKey: "name", type: "string" },
|
|
48
|
-
{ attr: "fullname", queryKey: "fullname", type: "string" },
|
|
49
|
-
{ attr: "created-at", queryKey: "createdAt", type: "string" },
|
|
50
|
-
{ attr: "updated-at", queryKey: "updatedAt", type: "string" },
|
|
51
|
-
{ attr: "created-by", queryKey: "createdBy", type: "string" },
|
|
52
|
-
{ attr: "rating", queryKey: "rating", type: "string" },
|
|
53
|
-
{ attr: "votes", queryKey: "votes", type: "string" },
|
|
54
|
-
{ attr: "reverse", queryKey: "reverse", type: "boolean" },
|
|
55
|
-
];
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Parse URL path parameters like /offset/1/page2_limit/1
|
|
59
|
-
* Returns a map of parameter name -> value
|
|
60
|
-
*/
|
|
61
|
-
export function parseUrlParams(url: string): Map<string, string> {
|
|
62
|
-
const params = new Map<string, string>();
|
|
63
|
-
const parts = url.split("/").filter(Boolean);
|
|
64
|
-
|
|
65
|
-
// Skip the page name (first part), parse key/value pairs
|
|
66
|
-
for (let i = 1; i < parts.length - 1; i += 2) {
|
|
67
|
-
const key = parts[i];
|
|
68
|
-
const value = parts[i + 1];
|
|
69
|
-
if (key && value) {
|
|
70
|
-
params.set(key, value);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return params;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Resolve @URL|default format with actual URL parameters
|
|
79
|
-
*
|
|
80
|
-
* @param rawValue - The raw attribute value (e.g., "@URL|0")
|
|
81
|
-
* @param paramName - The parameter name (e.g., "offset")
|
|
82
|
-
* @param urlParams - Parsed URL parameters
|
|
83
|
-
* @param prefix - Optional URL attribute prefix (e.g., "page2")
|
|
84
|
-
* @returns Resolved value
|
|
85
|
-
*/
|
|
86
|
-
export function resolveUrlValue(
|
|
87
|
-
rawValue: string | undefined,
|
|
88
|
-
paramName: string,
|
|
89
|
-
urlParams: Map<string, string>,
|
|
90
|
-
prefix?: string,
|
|
91
|
-
): string | undefined {
|
|
92
|
-
if (!rawValue) return undefined;
|
|
93
|
-
|
|
94
|
-
// Check for @URL or @URL|default format
|
|
95
|
-
if (!rawValue.startsWith("@URL")) {
|
|
96
|
-
return rawValue;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Extract default value if present
|
|
100
|
-
const defaultValue = rawValue.includes("|") ? rawValue.split("|")[1] : undefined;
|
|
101
|
-
|
|
102
|
-
// Build the actual parameter name with prefix
|
|
103
|
-
const actualParamName = prefix ? `${prefix}_${paramName}` : paramName;
|
|
104
|
-
|
|
105
|
-
// Get from URL params or use default
|
|
106
|
-
return urlParams.get(actualParamName) ?? defaultValue;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Resolve all `@URL` parameters and build a ListPagesQuery
|
|
111
|
-
*
|
|
112
|
-
* Takes a ListPagesDataRequirement and URL parameters, resolves all `@URL|default`
|
|
113
|
-
* values, and returns a complete ListPagesQuery ready for database queries.
|
|
114
|
-
*
|
|
115
|
-
* @param requirement - The data requirement from AST extraction
|
|
116
|
-
* @param urlParams - Parsed URL parameters (from parseUrlParams)
|
|
117
|
-
* @returns Resolved ListPagesQuery
|
|
118
|
-
*
|
|
119
|
-
* @example
|
|
120
|
-
* ```typescript
|
|
121
|
-
* const urlParams = parseUrlParams("/page/scp-001/page2_offset/10/page2_limit/5");
|
|
122
|
-
* const query = resolveQuery(requirement, urlParams);
|
|
123
|
-
* // query.offset = 10, query.limit = 5 (if urlAttrPrefix = "page2")
|
|
124
|
-
* ```
|
|
125
|
-
*/
|
|
126
|
-
export function resolveQuery(
|
|
127
|
-
requirement: ListPagesDataRequirement,
|
|
128
|
-
urlParams: Map<string, string>,
|
|
129
|
-
): ListPagesQuery {
|
|
130
|
-
const { query, rawAttributes, urlAttrPrefix } = requirement;
|
|
131
|
-
const resolved: ListPagesQuery = { ...query };
|
|
132
|
-
|
|
133
|
-
for (const field of URL_RESOLVABLE_FIELDS) {
|
|
134
|
-
const rawValue = rawAttributes[field.attr];
|
|
135
|
-
if (!rawValue) continue;
|
|
136
|
-
|
|
137
|
-
const resolvedValue = resolveUrlValue(rawValue, field.attr, urlParams, urlAttrPrefix);
|
|
138
|
-
if (resolvedValue === undefined) continue;
|
|
139
|
-
|
|
140
|
-
// Convert to appropriate type
|
|
141
|
-
switch (field.type) {
|
|
142
|
-
case "number": {
|
|
143
|
-
const num = parseInt(resolvedValue, 10);
|
|
144
|
-
if (!Number.isNaN(num)) {
|
|
145
|
-
(resolved as Record<string, unknown>)[field.queryKey] = num;
|
|
146
|
-
}
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
case "boolean":
|
|
150
|
-
(resolved as Record<string, unknown>)[field.queryKey] =
|
|
151
|
-
resolvedValue === "true" || resolvedValue === "yes" || resolvedValue === "1";
|
|
152
|
-
break;
|
|
153
|
-
case "string":
|
|
154
|
-
default:
|
|
155
|
-
(resolved as Record<string, unknown>)[field.queryKey] = resolvedValue;
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return resolved;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Resolve all `@URL` parameters and normalize the query
|
|
165
|
-
*
|
|
166
|
-
* Combines URL resolution with query normalization in a single call.
|
|
167
|
-
* This is the recommended way to process ListPages queries for HPC.
|
|
168
|
-
*
|
|
169
|
-
* @param requirement - The data requirement from AST extraction
|
|
170
|
-
* @param urlParams - Parsed URL parameters (from parseUrlParams)
|
|
171
|
-
* @returns Normalized query with all `@URL` values resolved
|
|
172
|
-
*
|
|
173
|
-
* @example
|
|
174
|
-
* ```typescript
|
|
175
|
-
* const urlParams = parseUrlParams(window.location.pathname);
|
|
176
|
-
* const normalizedQuery = resolveAndNormalizeQuery(requirement, urlParams);
|
|
177
|
-
* // Ready for database query building
|
|
178
|
-
* ```
|
|
179
|
-
*/
|
|
180
|
-
export function resolveAndNormalizeQuery(
|
|
181
|
-
requirement: ListPagesDataRequirement,
|
|
182
|
-
urlParams: Map<string, string>,
|
|
183
|
-
): NormalizedListPagesQuery {
|
|
184
|
-
const resolved = resolveQuery(requirement, urlParams);
|
|
185
|
-
return normalizeQuery(resolved);
|
|
186
|
-
}
|
|
27
|
+
export { parseUrlParams } from "./url-resolution/params";
|
|
28
|
+
export { resolveAndNormalizeQuery, resolveQuery } from "./url-resolution/resolve";
|
|
29
|
+
export { resolveUrlValue } from "./url-resolution/value";
|
|
@@ -13,9 +13,8 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import type { ListUsersCompiledTemplate, ListUsersVariableContext } from "./types";
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const VARIABLE_REGEX = /%%([a-z_]+)%%/gi;
|
|
16
|
+
import { createListUsersVariableGetter } from "./getters";
|
|
17
|
+
import { LIST_USERS_VARIABLE_REGEX } from "./variables";
|
|
19
18
|
|
|
20
19
|
/**
|
|
21
20
|
* Compile a ListUsers template string into an executable function.
|
|
@@ -30,14 +29,14 @@ export function compileListUsersTemplate(template: string): ListUsersCompiledTem
|
|
|
30
29
|
const parts: (string | ((ctx: ListUsersVariableContext) => string))[] = [];
|
|
31
30
|
let lastIndex = 0;
|
|
32
31
|
|
|
33
|
-
for (const match of template.matchAll(
|
|
32
|
+
for (const match of template.matchAll(LIST_USERS_VARIABLE_REGEX)) {
|
|
34
33
|
if (match.index !== undefined && match.index > lastIndex) {
|
|
35
34
|
parts.push(template.slice(lastIndex, match.index));
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
const [, varName] = match;
|
|
39
38
|
if (!varName) continue;
|
|
40
|
-
const getter =
|
|
39
|
+
const getter = createListUsersVariableGetter(varName.toLowerCase());
|
|
41
40
|
parts.push(getter);
|
|
42
41
|
|
|
43
42
|
lastIndex = match.index !== undefined ? match.index + match[0].length : lastIndex;
|
|
@@ -55,23 +54,3 @@ export function compileListUsersTemplate(template: string): ListUsersCompiledTem
|
|
|
55
54
|
return result;
|
|
56
55
|
};
|
|
57
56
|
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Create a getter function for a specific ListUsers variable.
|
|
61
|
-
*
|
|
62
|
-
* @param name - Lowercase variable name
|
|
63
|
-
* @returns A function that extracts the variable's value from a ListUsersVariableContext.
|
|
64
|
-
* Unknown names return a function that always returns an empty string.
|
|
65
|
-
*/
|
|
66
|
-
function createVariableGetter(name: string): (ctx: ListUsersVariableContext) => string {
|
|
67
|
-
switch (name) {
|
|
68
|
-
case "number":
|
|
69
|
-
return (ctx) => String(ctx.user.number);
|
|
70
|
-
case "title":
|
|
71
|
-
return (ctx) => ctx.user.title;
|
|
72
|
-
case "name":
|
|
73
|
-
return (ctx) => ctx.user.name;
|
|
74
|
-
default:
|
|
75
|
-
return () => "";
|
|
76
|
-
}
|
|
77
|
-
}
|
|
@@ -11,12 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
import type { ListUsersVariable } from "./types";
|
|
13
13
|
import { compileListUsersTemplate } from "./compiler";
|
|
14
|
-
|
|
15
|
-
/** Regex for matching `%%variable%%` patterns in ListUsers templates. */
|
|
16
|
-
const VARIABLE_REGEX = /%%([a-z_]+)%%/gi;
|
|
17
|
-
|
|
18
|
-
/** The complete list of recognized ListUsers template variables. */
|
|
19
|
-
const KNOWN_VARIABLES: ListUsersVariable[] = ["number", "title", "name"];
|
|
14
|
+
import { isListUsersVariable, LIST_USERS_VARIABLE_REGEX } from "./variables";
|
|
20
15
|
|
|
21
16
|
/**
|
|
22
17
|
* Extract the set of template variables referenced in a ListUsers template string.
|
|
@@ -30,12 +25,12 @@ const KNOWN_VARIABLES: ListUsersVariable[] = ["number", "title", "name"];
|
|
|
30
25
|
export function extractListUsersVariables(template: string): ListUsersVariable[] {
|
|
31
26
|
const variables = new Set<ListUsersVariable>();
|
|
32
27
|
|
|
33
|
-
for (const match of template.matchAll(
|
|
28
|
+
for (const match of template.matchAll(LIST_USERS_VARIABLE_REGEX)) {
|
|
34
29
|
const [, varName] = match;
|
|
35
30
|
if (!varName) continue;
|
|
36
31
|
const normalized = varName.toLowerCase();
|
|
37
|
-
if (
|
|
38
|
-
variables.add(normalized
|
|
32
|
+
if (isListUsersVariable(normalized)) {
|
|
33
|
+
variables.add(normalized);
|
|
39
34
|
}
|
|
40
35
|
}
|
|
41
36
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ListUsersVariableContext } from "./types";
|
|
2
|
+
|
|
3
|
+
type ListUsersVariableGetter = (ctx: ListUsersVariableContext) => string;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Create a getter function for a specific ListUsers variable.
|
|
7
|
+
*
|
|
8
|
+
* Unknown names return a function that always returns an empty string.
|
|
9
|
+
*/
|
|
10
|
+
export function createListUsersVariableGetter(name: string): ListUsersVariableGetter {
|
|
11
|
+
switch (name) {
|
|
12
|
+
case "number":
|
|
13
|
+
return (ctx) => String(ctx.user.number);
|
|
14
|
+
case "title":
|
|
15
|
+
return (ctx) => ctx.user.title;
|
|
16
|
+
case "name":
|
|
17
|
+
return (ctx) => ctx.user.name;
|
|
18
|
+
default:
|
|
19
|
+
return () => "";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ListUsersVariable } from "./types";
|
|
2
|
+
|
|
3
|
+
/** Regex for matching `%%variable%%` patterns in ListUsers templates. */
|
|
4
|
+
export const LIST_USERS_VARIABLE_REGEX: RegExp = /%%([a-z_]+)%%/gi;
|
|
5
|
+
|
|
6
|
+
/** The complete set of recognized ListUsers template variables. */
|
|
7
|
+
const KNOWN_VARIABLES: ReadonlySet<string> = new Set<ListUsersVariable>([
|
|
8
|
+
"number",
|
|
9
|
+
"title",
|
|
10
|
+
"name",
|
|
11
|
+
]);
|
|
12
|
+
|
|
13
|
+
export function isListUsersVariable(name: string): name is ListUsersVariable {
|
|
14
|
+
return KNOWN_VARIABLES.has(name);
|
|
15
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ParseContext } from "../../types";
|
|
2
|
+
import { parseAttributesRaw, parseBlockName } from "../utils";
|
|
3
|
+
|
|
4
|
+
export interface ModuleOpenResult {
|
|
5
|
+
moduleName: string;
|
|
6
|
+
attrs: Record<string, string>;
|
|
7
|
+
pos: number;
|
|
8
|
+
consumed: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function parseModuleOpen(ctx: ParseContext): ModuleOpenResult | null {
|
|
12
|
+
if (ctx.tokens[ctx.pos]?.type !== "BLOCK_OPEN") {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let pos = ctx.pos + 1;
|
|
17
|
+
let consumed = 1;
|
|
18
|
+
|
|
19
|
+
const nameResult = parseBlockName(ctx, pos);
|
|
20
|
+
if (!nameResult || (nameResult.name !== "module" && nameResult.name !== "module654")) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
pos += nameResult.consumed;
|
|
25
|
+
consumed += nameResult.consumed;
|
|
26
|
+
|
|
27
|
+
while (ctx.tokens[pos]?.type === "WHITESPACE") {
|
|
28
|
+
pos++;
|
|
29
|
+
consumed++;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const nameToken = ctx.tokens[pos];
|
|
33
|
+
const moduleName =
|
|
34
|
+
nameToken?.type === "TEXT" || nameToken?.type === "IDENTIFIER" ? nameToken.value : "";
|
|
35
|
+
if (moduleName) {
|
|
36
|
+
pos++;
|
|
37
|
+
consumed++;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const attrResult = parseAttributesRaw(ctx, pos);
|
|
41
|
+
pos += attrResult.consumed;
|
|
42
|
+
consumed += attrResult.consumed;
|
|
43
|
+
|
|
44
|
+
if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
pos++;
|
|
49
|
+
consumed++;
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
moduleName,
|
|
53
|
+
attrs: attrResult.attrs,
|
|
54
|
+
pos,
|
|
55
|
+
consumed,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { DataProvider } from "../types-common";
|
|
2
|
+
import type {
|
|
3
|
+
CompiledTemplate,
|
|
4
|
+
ListPagesDataRequirement,
|
|
5
|
+
ListPagesExternalData,
|
|
6
|
+
} from "../listpages/types";
|
|
7
|
+
import type {
|
|
8
|
+
ListUsersCompiledTemplate,
|
|
9
|
+
ListUsersDataRequirement,
|
|
10
|
+
ListUsersExternalData,
|
|
11
|
+
} from "../listusers/types";
|
|
12
|
+
import type { ParseFunction } from "../listpages/resolve";
|
|
13
|
+
import { buildListPagesDataMap, buildListUsersDataMap } from "./data-maps";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Context for ListPages resolution.
|
|
17
|
+
*/
|
|
18
|
+
export interface ListPagesContext {
|
|
19
|
+
dataMap: Map<number, ListPagesExternalData>;
|
|
20
|
+
compiledTemplates: Map<number, CompiledTemplate>;
|
|
21
|
+
parse: ParseFunction;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Context for ListUsers resolution.
|
|
26
|
+
*/
|
|
27
|
+
export interface ListUsersContext {
|
|
28
|
+
dataMap: Map<number, ListUsersExternalData>;
|
|
29
|
+
compiledTemplates: Map<number, ListUsersCompiledTemplate>;
|
|
30
|
+
parse: ParseFunction;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function buildListPagesContext(
|
|
34
|
+
dataProvider: DataProvider,
|
|
35
|
+
requirements: ListPagesDataRequirement[],
|
|
36
|
+
compiledTemplates: Map<number, CompiledTemplate>,
|
|
37
|
+
parse: ParseFunction,
|
|
38
|
+
urlPath: string | undefined,
|
|
39
|
+
): Promise<ListPagesContext | null> {
|
|
40
|
+
if (requirements.length === 0 || !dataProvider.fetchListPages) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const dataMap = await buildListPagesDataMap(dataProvider, requirements, urlPath);
|
|
45
|
+
|
|
46
|
+
if (dataMap.size === 0) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
dataMap,
|
|
52
|
+
compiledTemplates,
|
|
53
|
+
parse,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export async function buildListUsersContext(
|
|
58
|
+
dataProvider: DataProvider,
|
|
59
|
+
requirements: ListUsersDataRequirement[],
|
|
60
|
+
compiledTemplates: Map<number, ListUsersCompiledTemplate> | undefined,
|
|
61
|
+
parse: ParseFunction,
|
|
62
|
+
): Promise<ListUsersContext | null> {
|
|
63
|
+
if (requirements.length === 0 || !dataProvider.fetchListUsers) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const dataMap = await buildListUsersDataMap(dataProvider, requirements);
|
|
68
|
+
|
|
69
|
+
if (dataMap.size === 0) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
dataMap,
|
|
75
|
+
compiledTemplates: compiledTemplates ?? new Map(),
|
|
76
|
+
parse,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { DataProvider } from "../types-common";
|
|
2
|
+
import type { ListPagesDataRequirement, ListPagesExternalData } from "../listpages/types";
|
|
3
|
+
import type { ListUsersDataRequirement, ListUsersExternalData } from "../listusers/types";
|
|
4
|
+
import { parseUrlParams, resolveAndNormalizeQuery } from "../listpages/url-resolver";
|
|
5
|
+
|
|
6
|
+
export async function buildListPagesDataMap(
|
|
7
|
+
dataProvider: DataProvider,
|
|
8
|
+
requirements: ListPagesDataRequirement[],
|
|
9
|
+
urlPath: string | undefined,
|
|
10
|
+
): Promise<Map<number, ListPagesExternalData>> {
|
|
11
|
+
const dataMap = new Map<number, ListPagesExternalData>();
|
|
12
|
+
const urlParams = parseUrlParams(urlPath ?? "");
|
|
13
|
+
|
|
14
|
+
for (const req of requirements) {
|
|
15
|
+
const normalizedQuery = resolveAndNormalizeQuery(req, urlParams);
|
|
16
|
+
const data = await dataProvider.fetchListPages?.(normalizedQuery, req);
|
|
17
|
+
if (data) {
|
|
18
|
+
dataMap.set(req.id, data);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return dataMap;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export async function buildListUsersDataMap(
|
|
26
|
+
dataProvider: DataProvider,
|
|
27
|
+
requirements: ListUsersDataRequirement[],
|
|
28
|
+
): Promise<Map<number, ListUsersExternalData>> {
|
|
29
|
+
const dataMap = new Map<number, ListUsersExternalData>();
|
|
30
|
+
|
|
31
|
+
for (const req of requirements) {
|
|
32
|
+
const data = await dataProvider.fetchListUsers?.(req);
|
|
33
|
+
if (data) {
|
|
34
|
+
dataMap.set(req.id, data);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return dataMap;
|
|
39
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Element } from "@wdprlib/ast";
|
|
2
|
+
import { isListPagesModule, resolveListPages } from "../listpages/resolve";
|
|
3
|
+
import { isListUsersModule, resolveListUsers } from "../listusers/resolve";
|
|
4
|
+
import { walkElements } from "../walk";
|
|
5
|
+
import type { ListPagesContext, ListUsersContext } from "./contexts";
|
|
6
|
+
|
|
7
|
+
export interface DynamicModuleContext {
|
|
8
|
+
listPages: ListPagesContext | null;
|
|
9
|
+
listUsers: ListUsersContext | null;
|
|
10
|
+
fetchListPagesProvided: boolean;
|
|
11
|
+
fetchListUsersProvided: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface DynamicModuleIds {
|
|
15
|
+
listPagesId: number;
|
|
16
|
+
listUsersId: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface DynamicModuleResolution {
|
|
20
|
+
handled: boolean;
|
|
21
|
+
elements: Element[];
|
|
22
|
+
ids: DynamicModuleIds;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function resolveDynamicModuleElement(
|
|
26
|
+
element: Element,
|
|
27
|
+
ctx: DynamicModuleContext,
|
|
28
|
+
ids: DynamicModuleIds,
|
|
29
|
+
): DynamicModuleResolution {
|
|
30
|
+
if (element.element !== "module") {
|
|
31
|
+
return { handled: false, elements: [element], ids };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (isListPagesModule(element.data)) {
|
|
35
|
+
const elements: Element[] = [];
|
|
36
|
+
const listPagesId = ids.listPagesId;
|
|
37
|
+
|
|
38
|
+
if (ctx.listPages) {
|
|
39
|
+
const moduleData = ctx.listPages.dataMap.get(listPagesId);
|
|
40
|
+
const template = ctx.listPages.compiledTemplates.get(listPagesId);
|
|
41
|
+
|
|
42
|
+
if (moduleData && template) {
|
|
43
|
+
elements.push(...resolveListPages(element.data, moduleData, template, ctx.listPages.parse));
|
|
44
|
+
}
|
|
45
|
+
} else if (!ctx.fetchListPagesProvided) {
|
|
46
|
+
elements.push(element);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
handled: true,
|
|
51
|
+
elements,
|
|
52
|
+
ids: { ...ids, listPagesId: listPagesId + 1 },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (isListUsersModule(element.data)) {
|
|
57
|
+
const elements: Element[] = [];
|
|
58
|
+
const listUsersId = ids.listUsersId;
|
|
59
|
+
|
|
60
|
+
if (ctx.listUsers) {
|
|
61
|
+
const moduleData = ctx.listUsers.dataMap.get(listUsersId);
|
|
62
|
+
const template = ctx.listUsers.compiledTemplates.get(listUsersId);
|
|
63
|
+
|
|
64
|
+
if (moduleData && template) {
|
|
65
|
+
elements.push(...resolveListUsers(element.data, moduleData, template, ctx.listUsers.parse));
|
|
66
|
+
}
|
|
67
|
+
} else if (!ctx.fetchListUsersProvided) {
|
|
68
|
+
elements.push(element);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
handled: true,
|
|
73
|
+
elements,
|
|
74
|
+
ids: { ...ids, listUsersId: listUsersId + 1 },
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return { handled: false, elements: [element], ids };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function countDynamicModules(elements: Element[]): DynamicModuleIds {
|
|
82
|
+
const counts: DynamicModuleIds = { listPagesId: 0, listUsersId: 0 };
|
|
83
|
+
walkElements(elements, (element) => {
|
|
84
|
+
if (element.element !== "module") return;
|
|
85
|
+
|
|
86
|
+
if (isListPagesModule(element.data)) {
|
|
87
|
+
counts.listPagesId++;
|
|
88
|
+
} else if (isListUsersModule(element.data)) {
|
|
89
|
+
counts.listUsersId++;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return counts;
|
|
93
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Element } from "@wdprlib/ast";
|
|
2
|
+
import { STYLE_SLOT_PREFIX } from "@wdprlib/ast";
|
|
3
|
+
import { mapElementChildren } from "../walk";
|
|
4
|
+
import type { IfTagsData } from "../iftags/resolve";
|
|
5
|
+
|
|
6
|
+
type IfTagsDataWithStyleSlot = IfTagsData & {
|
|
7
|
+
_styleSlot: number;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Collect and remove style elements from the AST.
|
|
12
|
+
*
|
|
13
|
+
* Unresolved `if-tags` elements receive style-slot placeholders so render-time
|
|
14
|
+
* iftags evaluation can preserve style order relative to already collected CSS.
|
|
15
|
+
*/
|
|
16
|
+
export function collectStyles(elements: Element[]): { elements: Element[]; styles: string[] } {
|
|
17
|
+
const styles: string[] = [];
|
|
18
|
+
const ctx = { nextSlotId: 0 };
|
|
19
|
+
const filtered = collectStylesFromElements(elements, styles, ctx);
|
|
20
|
+
return { elements: filtered, styles };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function collectStylesFromElements(
|
|
24
|
+
elements: Element[],
|
|
25
|
+
styles: string[],
|
|
26
|
+
ctx: { nextSlotId: number },
|
|
27
|
+
): Element[] {
|
|
28
|
+
const result: Element[] = [];
|
|
29
|
+
|
|
30
|
+
for (const element of elements) {
|
|
31
|
+
if (element.element === "style") {
|
|
32
|
+
styles.push(element.data as string);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (element.element === "if-tags") {
|
|
37
|
+
const slotId = ctx.nextSlotId++;
|
|
38
|
+
styles.push(`${STYLE_SLOT_PREFIX}${slotId}`);
|
|
39
|
+
const data: IfTagsDataWithStyleSlot = { ...(element.data as IfTagsData), _styleSlot: slotId };
|
|
40
|
+
result.push({
|
|
41
|
+
element: "if-tags",
|
|
42
|
+
data,
|
|
43
|
+
});
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
result.push(
|
|
48
|
+
mapElementChildren(element, (children) => collectStylesFromElements(children, styles, ctx)),
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return result;
|
|
53
|
+
}
|