@wdprlib/parser 3.2.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +10451 -8402
- package/dist/index.d.cts +313 -337
- package/dist/index.d.ts +313 -337
- package/dist/index.js +10438 -8389
- package/package.json +1 -1
- package/src/index.ts +7 -0
- package/src/lexer/anchor.ts +48 -0
- package/src/lexer/index.ts +3 -2
- package/src/lexer/lexer.ts +73 -559
- package/src/lexer/options.ts +19 -0
- package/src/lexer/punctuation.ts +70 -0
- package/src/lexer/quoted-string.ts +16 -0
- package/src/lexer/runs.ts +85 -0
- package/src/lexer/spacing-actions.ts +24 -0
- package/src/lexer/state.ts +103 -0
- package/src/lexer/syntax-actions.ts +80 -0
- package/src/lexer/text-actions.ts +41 -0
- package/src/lexer/token-actions.ts +136 -0
- package/src/lexer/token-factory.ts +62 -0
- package/src/lexer/tokenize.ts +18 -0
- package/src/parser/constants.ts +2 -0
- package/src/parser/depth/index.ts +111 -0
- package/src/parser/depth/stack.ts +82 -0
- package/src/parser/parse/block.ts +42 -0
- package/src/parser/parse/context.ts +26 -0
- package/src/parser/parse/footnotes.ts +25 -0
- package/src/parser/parse/index.ts +42 -0
- package/src/parser/parse/options.ts +34 -0
- package/src/parser/parse/parser.ts +79 -0
- package/src/parser/parse/plain-non-ascii.ts +129 -0
- package/src/parser/parse/result.ts +57 -0
- package/src/parser/parse/source.ts +11 -0
- package/src/parser/postprocess/divAdjacentParagraph.ts +1 -1
- package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
- package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
- package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
- package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
- package/src/parser/postprocess/spanStrip/factory.ts +23 -0
- package/src/parser/postprocess/spanStrip/index.ts +8 -0
- package/src/parser/postprocess/spanStrip/merge.ts +117 -0
- package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
- package/src/parser/postprocess/spanStrip/split.ts +67 -0
- package/src/parser/preprocess/expr/chars.ts +15 -0
- package/src/parser/preprocess/expr/evaluate.ts +22 -0
- package/src/parser/preprocess/expr/index.ts +45 -0
- package/src/parser/preprocess/expr/kind.ts +19 -0
- package/src/parser/preprocess/expr/parse.ts +103 -0
- package/src/parser/preprocess/expr/scan.ts +34 -0
- package/src/parser/preprocess/expr/types.ts +14 -0
- package/src/parser/preprocess/typography.ts +70 -5
- package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
- package/src/parser/preprocess/utils/index.ts +13 -0
- package/src/parser/preprocess/utils/raw-regions.ts +153 -0
- package/src/parser/preprocess/whitespace/detection.ts +39 -0
- package/src/parser/preprocess/whitespace/index.ts +79 -0
- package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
- package/src/parser/preprocess/whitespace/patterns.ts +23 -0
- package/src/parser/rules/block/align/body.ts +46 -0
- package/src/parser/rules/block/align/element.ts +13 -0
- package/src/parser/rules/block/align/index.ts +90 -0
- package/src/parser/rules/block/align/syntax.ts +113 -0
- package/src/parser/rules/block/bibliography/body.ts +81 -0
- package/src/parser/rules/block/bibliography/entries.ts +49 -0
- package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
- package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
- package/src/parser/rules/block/bibliography/index.ts +90 -0
- package/src/parser/rules/block/bibliography/open.ts +53 -0
- package/src/parser/rules/block/block-list/bare-content.ts +105 -0
- package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
- package/src/parser/rules/block/block-list/index.ts +51 -0
- package/src/parser/rules/block/block-list/item-content.ts +132 -0
- package/src/parser/rules/block/block-list/li-content.ts +107 -0
- package/src/parser/rules/block/block-list/li-item.ts +77 -0
- package/src/parser/rules/block/block-list/list-block.ts +100 -0
- package/src/parser/rules/block/block-list/open.ts +51 -0
- package/src/parser/rules/block/block-list/tags.ts +50 -0
- package/src/parser/rules/block/blockquote/build.ts +62 -0
- package/src/parser/rules/block/blockquote/index.ts +80 -0
- package/src/parser/rules/block/blockquote/line.ts +79 -0
- package/src/parser/rules/block/blockquote/lines.ts +39 -0
- package/src/parser/rules/block/{center.ts → center/index.ts} +7 -22
- package/src/parser/rules/block/center/open.ts +27 -0
- package/src/parser/rules/block/{clear-float.ts → clear-float/index.ts} +6 -30
- package/src/parser/rules/block/clear-float/syntax.ts +43 -0
- package/src/parser/rules/block/code/attributes.ts +30 -0
- package/src/parser/rules/block/code/content.ts +57 -0
- package/src/parser/rules/block/code/index.ts +100 -0
- package/src/parser/rules/block/collapsible/attributes.ts +95 -0
- package/src/parser/rules/block/collapsible/body.ts +69 -0
- package/src/parser/rules/block/collapsible/index.ts +117 -0
- package/src/parser/rules/block/collapsible/open.ts +51 -0
- package/src/parser/rules/block/collapsible/orphans.ts +31 -0
- package/src/parser/rules/block/collapsible/tags.ts +17 -0
- package/src/parser/rules/block/comment/consume.ts +37 -0
- package/src/parser/rules/block/{comment.ts → comment/index.ts} +12 -38
- package/src/parser/rules/block/{content-separator.ts → content-separator/index.ts} +5 -35
- package/src/parser/rules/block/content-separator/syntax.ts +33 -0
- package/src/parser/rules/block/definition-list/collect.ts +40 -0
- package/src/parser/rules/block/definition-list/index.ts +63 -0
- package/src/parser/rules/block/definition-list/item-key.ts +95 -0
- package/src/parser/rules/block/definition-list/item-value.ts +56 -0
- package/src/parser/rules/block/definition-list/items.ts +54 -0
- package/src/parser/rules/block/div/body.ts +41 -0
- package/src/parser/rules/block/div/close.ts +41 -0
- package/src/parser/rules/block/div/failed.ts +117 -0
- package/src/parser/rules/block/div/index.ts +112 -0
- package/src/parser/rules/block/div/nesting.ts +37 -0
- package/src/parser/rules/block/div/open.ts +59 -0
- package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
- package/src/parser/rules/block/embed-block/content.ts +53 -0
- package/src/parser/rules/block/embed-block/index.ts +91 -0
- package/src/parser/rules/block/embed-block/open.ts +52 -0
- package/src/parser/rules/block/embed-block/tags.ts +5 -0
- package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
- package/src/parser/rules/block/footnoteblock/index.ts +82 -0
- package/src/parser/rules/block/footnoteblock/open.ts +53 -0
- package/src/parser/rules/block/heading/index.ts +87 -0
- package/src/parser/rules/block/heading/open.ts +50 -0
- package/src/parser/rules/block/heading/toc-text.ts +26 -0
- package/src/parser/rules/block/{horizontal-rule.ts → horizontal-rule/index.ts} +4 -21
- package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
- package/src/parser/rules/block/html/body.ts +114 -0
- package/src/parser/rules/block/html/diagnostics.ts +11 -0
- package/src/parser/rules/block/html/index.ts +95 -0
- package/src/parser/rules/block/html/open.ts +36 -0
- package/src/parser/rules/block/iframe/attributes.ts +106 -0
- package/src/parser/rules/block/iframe/index.ts +73 -0
- package/src/parser/rules/block/iframe/open.ts +58 -0
- package/src/parser/rules/block/iframe/source.ts +24 -0
- package/src/parser/rules/block/iframe/url.ts +38 -0
- package/src/parser/rules/block/iftags/body.ts +48 -0
- package/src/parser/rules/block/iftags/condition.ts +24 -0
- package/src/parser/rules/block/{iftags.ts → iftags/index.ts} +16 -58
- package/src/parser/rules/block/include/arguments.ts +48 -0
- package/src/parser/rules/block/include/index.ts +75 -0
- package/src/parser/rules/block/include/location.ts +24 -0
- package/src/parser/rules/block/include/variables.ts +37 -0
- package/src/parser/rules/block/list/index.ts +73 -0
- package/src/parser/rules/block/list/line.ts +77 -0
- package/src/parser/rules/block/list/native.ts +89 -0
- package/src/parser/rules/block/math/content.ts +54 -0
- package/src/parser/rules/block/math/index.ts +106 -0
- package/src/parser/rules/block/math/name.ts +35 -0
- package/src/parser/rules/block/module/body.ts +92 -0
- package/src/parser/rules/block/module/element.ts +33 -0
- package/src/parser/rules/block/module/include/directive.ts +91 -0
- package/src/parser/rules/block/module/include/index.ts +11 -2
- package/src/parser/rules/block/module/include/references.ts +42 -0
- package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
- package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
- package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
- package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
- package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
- package/src/parser/rules/block/module/include/scanner.ts +121 -0
- package/src/parser/rules/block/module/index.ts +14 -2
- package/src/parser/rules/block/module/listpages/compiler.ts +12 -392
- package/src/parser/rules/block/module/listpages/extract.ts +25 -359
- package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
- package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
- package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
- package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
- package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
- package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
- package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
- package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
- package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
- package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
- package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
- package/src/parser/rules/block/module/listpages/normalize.ts +8 -324
- package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
- package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
- package/src/parser/rules/block/module/listpages/resolve.ts +5 -75
- package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
- package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
- package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
- package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
- package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
- package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
- package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
- package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
- package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
- package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
- package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
- package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
- package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
- package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
- package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
- package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
- package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
- package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
- package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
- package/src/parser/rules/block/module/listpages/url-resolution/params.ts +19 -0
- package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
- package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +53 -0
- package/src/parser/rules/block/module/listpages/url-resolution/value.ts +25 -0
- package/src/parser/rules/block/module/listpages/url-resolver.ts +3 -160
- package/src/parser/rules/block/module/listusers/compiler.ts +4 -25
- package/src/parser/rules/block/module/listusers/extract.ts +4 -9
- package/src/parser/rules/block/module/listusers/getters.ts +21 -0
- package/src/parser/rules/block/module/listusers/variables.ts +15 -0
- package/src/parser/rules/block/module/open.ts +57 -0
- package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
- package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
- package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
- package/src/parser/rules/block/module/resolution/styles.ts +53 -0
- package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
- package/src/parser/rules/block/module/resolve.ts +79 -292
- package/src/parser/rules/block/module/rule.ts +56 -0
- package/src/parser/rules/block/module/types-common.ts +11 -0
- package/src/parser/rules/block/module/walk/children.ts +35 -0
- package/src/parser/rules/block/module/walk/index.ts +9 -0
- package/src/parser/rules/block/module/walk/map/index.ts +2 -0
- package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
- package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
- package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
- package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
- package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
- package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
- package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
- package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
- package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
- package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
- package/src/parser/rules/block/module/walk/map/types.ts +6 -0
- package/src/parser/rules/block/module/walk/traverse.ts +65 -0
- package/src/parser/rules/block/orphan-li/content.ts +60 -0
- package/src/parser/rules/block/orphan-li/index.ts +75 -0
- package/src/parser/rules/block/orphan-li/open.ts +25 -0
- package/src/parser/rules/block/orphan-li/tags.ts +40 -0
- package/src/parser/rules/block/paragraph/content.ts +12 -0
- package/src/parser/rules/block/paragraph/index.ts +60 -0
- package/src/parser/rules/block/paragraph/normalize.ts +52 -0
- package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
- package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
- package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
- package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
- package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
- package/src/parser/rules/block/parsing/block-item.ts +29 -0
- package/src/parser/rules/block/parsing/content.ts +127 -0
- package/src/parser/rules/block/parsing/end-condition.ts +51 -0
- package/src/parser/rules/block/parsing/inline-content.ts +105 -0
- package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
- package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
- package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
- package/src/parser/rules/block/table/index.ts +80 -0
- package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
- package/src/parser/rules/block/table/pipe/cell.ts +106 -0
- package/src/parser/rules/block/table/pipe/index.ts +2 -0
- package/src/parser/rules/block/table/pipe/row.ts +88 -0
- package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
- package/src/parser/rules/block/table/pipe/trim.ts +50 -0
- package/src/parser/rules/block/table-block/body.ts +79 -0
- package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
- package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
- package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
- package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
- package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
- package/src/parser/rules/block/table-block/cell.ts +64 -0
- package/src/parser/rules/block/table-block/index.ts +113 -0
- package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
- package/src/parser/rules/block/table-block/structure.ts +80 -0
- package/src/parser/rules/block/tabview/body.ts +64 -0
- package/src/parser/rules/block/tabview/index.ts +90 -0
- package/src/parser/rules/block/tabview/open.ts +50 -0
- package/src/parser/rules/block/tabview/tab.ts +92 -0
- package/src/parser/rules/block/tabview/tags.ts +30 -0
- package/src/parser/rules/block/toc/element.ts +11 -0
- package/src/parser/rules/block/toc/index.ts +44 -0
- package/src/parser/rules/block/toc/open.ts +84 -0
- package/src/parser/rules/block/utils.ts +10 -610
- package/src/parser/rules/{utils.ts → common/attribute-safety.ts} +3 -49
- package/src/parser/rules/common/block-name.ts +33 -0
- package/src/parser/rules/common/index.ts +2 -0
- package/src/parser/rules/contracts/index.ts +3 -0
- package/src/parser/rules/contracts/parse-context.ts +38 -0
- package/src/parser/rules/contracts/rule.ts +43 -0
- package/src/parser/rules/contracts/scope.ts +31 -0
- package/src/parser/rules/inline/anchor/attributes.ts +54 -0
- package/src/parser/rules/inline/anchor/child.ts +26 -0
- package/src/parser/rules/inline/anchor/close.ts +34 -0
- package/src/parser/rules/inline/anchor/content.ts +59 -0
- package/src/parser/rules/inline/anchor/index.ts +103 -0
- package/src/parser/rules/inline/anchor/newline.ts +26 -0
- package/src/parser/rules/inline/anchor/open.ts +47 -0
- package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
- package/src/parser/rules/inline/anchor/syntax.ts +40 -0
- package/src/parser/rules/inline/anchor-name/index.ts +38 -0
- package/src/parser/rules/inline/anchor-name/name.ts +39 -0
- package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
- package/src/parser/rules/inline/bibcite/element.ts +14 -0
- package/src/parser/rules/inline/bibcite/index.ts +34 -0
- package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
- package/src/parser/rules/inline/bold.ts +2 -39
- package/src/parser/rules/inline/color/index.ts +35 -0
- package/src/parser/rules/inline/color/syntax.ts +69 -0
- package/src/parser/rules/inline/comment/consume.ts +31 -0
- package/src/parser/rules/inline/{comment.ts → comment/index.ts} +10 -36
- package/src/parser/rules/inline/equation-ref/element.ts +8 -0
- package/src/parser/rules/inline/equation-ref/index.ts +34 -0
- package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
- package/src/parser/rules/inline/expr/branch.ts +104 -0
- package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
- package/src/parser/rules/inline/expr/conditional.ts +80 -0
- package/src/parser/rules/inline/expr/depth.ts +25 -0
- package/src/parser/rules/inline/expr/elements.ts +39 -0
- package/src/parser/rules/inline/expr/index.ts +84 -0
- package/src/parser/rules/inline/expr/syntax.ts +45 -0
- package/src/parser/rules/inline/footnote/child.ts +22 -0
- package/src/parser/rules/inline/footnote/close.ts +33 -0
- package/src/parser/rules/inline/footnote/content.ts +54 -0
- package/src/parser/rules/inline/footnote/elements.ts +38 -0
- package/src/parser/rules/inline/footnote/index.ts +54 -0
- package/src/parser/rules/inline/footnote/newline.ts +27 -0
- package/src/parser/rules/inline/footnote/open.ts +38 -0
- package/src/parser/rules/inline/formatting/container.ts +50 -0
- package/src/parser/rules/inline/{guillemet.ts → guillemet/index.ts} +5 -13
- package/src/parser/rules/inline/guillemet/text.ts +11 -0
- package/src/parser/rules/inline/html/gate.ts +64 -0
- package/src/parser/rules/inline/{html.ts → html/index.ts} +9 -60
- package/src/parser/rules/inline/html/open.ts +37 -0
- package/src/parser/rules/inline/image/attributes.ts +22 -0
- package/src/parser/rules/inline/image/body.ts +36 -0
- package/src/parser/rules/inline/image/index.ts +89 -0
- package/src/parser/rules/inline/image/open.ts +56 -0
- package/src/parser/rules/inline/image/source.ts +62 -0
- package/src/parser/rules/inline/image/syntax.ts +76 -0
- package/src/parser/rules/inline/italic.ts +2 -30
- package/src/parser/rules/inline/line-break/backslash.ts +58 -0
- package/src/parser/rules/inline/line-break/elements.ts +9 -0
- package/src/parser/rules/inline/line-break/index.ts +3 -0
- package/src/parser/rules/inline/line-break/newline.ts +82 -0
- package/src/parser/rules/inline/line-break/underscore.ts +45 -0
- package/src/parser/rules/inline/link-anchor.ts +6 -81
- package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
- package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
- package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
- package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
- package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
- package/src/parser/rules/inline/link-single.ts +7 -98
- package/src/parser/rules/inline/link-star.ts +7 -69
- package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
- package/src/parser/rules/inline/link-triple/index.ts +62 -0
- package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
- package/src/parser/rules/inline/link-triple/label.ts +35 -0
- package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
- package/src/parser/rules/inline/link-triple/target.ts +36 -0
- package/src/parser/rules/inline/math-inline/index.ts +40 -0
- package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
- package/src/parser/rules/inline/monospace.ts +2 -30
- package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
- package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
- package/src/parser/rules/inline/parsing/collect.ts +23 -0
- package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
- package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
- package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
- package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
- package/src/parser/rules/inline/parsing/rules.ts +34 -0
- package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
- package/src/parser/rules/inline/raw/angle.ts +40 -0
- package/src/parser/rules/inline/raw/double-at.ts +78 -0
- package/src/parser/rules/inline/raw/index.ts +26 -0
- package/src/parser/rules/inline/raw/result.ts +26 -0
- package/src/parser/rules/inline/size/content.ts +65 -0
- package/src/parser/rules/inline/size/index.ts +55 -0
- package/src/parser/rules/inline/size/open.ts +43 -0
- package/src/parser/rules/inline/size/value.ts +45 -0
- package/src/parser/rules/inline/span/content.ts +97 -0
- package/src/parser/rules/inline/span/elements.ts +108 -0
- package/src/parser/rules/inline/span/index.ts +79 -0
- package/src/parser/rules/inline/span/newline.ts +50 -0
- package/src/parser/rules/inline/span/syntax.ts +70 -0
- package/src/parser/rules/inline/{strikethrough.ts → strikethrough/index.ts} +5 -60
- package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
- package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
- package/src/parser/rules/inline/subscript.ts +2 -39
- package/src/parser/rules/inline/superscript.ts +4 -39
- package/src/parser/rules/inline/text/element.ts +5 -0
- package/src/parser/rules/inline/{text.ts → text/index.ts} +5 -4
- package/src/parser/rules/inline/underline/child.ts +26 -0
- package/src/parser/rules/inline/underline/content.ts +29 -0
- package/src/parser/rules/inline/{underline.ts → underline/index.ts} +6 -49
- package/src/parser/rules/inline/user/element.ts +11 -0
- package/src/parser/rules/inline/user/index.ts +34 -0
- package/src/parser/rules/inline/user/syntax.ts +67 -0
- package/src/parser/rules/inline/utils.ts +4 -344
- package/src/parser/rules/tokens.ts +106 -0
- package/src/parser/rules/types.ts +9 -252
- package/src/parser/depth.ts +0 -251
- package/src/parser/parse.ts +0 -315
- package/src/parser/postprocess/spanStrip.ts +0 -697
- package/src/parser/preprocess/expr.ts +0 -265
- package/src/parser/preprocess/utils.ts +0 -250
- package/src/parser/preprocess/whitespace.ts +0 -111
- package/src/parser/rules/block/align.ts +0 -282
- package/src/parser/rules/block/bibliography.ts +0 -359
- package/src/parser/rules/block/block-list.ts +0 -689
- package/src/parser/rules/block/blockquote.ts +0 -238
- package/src/parser/rules/block/code.ts +0 -187
- package/src/parser/rules/block/collapsible.ts +0 -337
- package/src/parser/rules/block/definition-list.ts +0 -270
- package/src/parser/rules/block/div.ts +0 -400
- package/src/parser/rules/block/embed-block.ts +0 -153
- package/src/parser/rules/block/footnoteblock.ts +0 -200
- package/src/parser/rules/block/heading.ts +0 -142
- package/src/parser/rules/block/html.ts +0 -222
- package/src/parser/rules/block/iframe.ts +0 -239
- package/src/parser/rules/block/include.ts +0 -179
- package/src/parser/rules/block/list.ts +0 -244
- package/src/parser/rules/block/math.ts +0 -183
- package/src/parser/rules/block/module/include/resolve.ts +0 -556
- package/src/parser/rules/block/module/listpages/types.ts +0 -513
- package/src/parser/rules/block/module/walk.ts +0 -380
- package/src/parser/rules/block/module.ts +0 -164
- package/src/parser/rules/block/orphan-li.ts +0 -177
- package/src/parser/rules/block/paragraph.ts +0 -157
- package/src/parser/rules/block/table-block.ts +0 -726
- package/src/parser/rules/block/table.ts +0 -441
- package/src/parser/rules/block/tabview.ts +0 -331
- package/src/parser/rules/block/toc.ts +0 -129
- package/src/parser/rules/inline/anchor-name.ts +0 -154
- package/src/parser/rules/inline/anchor.ts +0 -327
- package/src/parser/rules/inline/bibcite.ts +0 -153
- package/src/parser/rules/inline/color.ts +0 -140
- package/src/parser/rules/inline/equation-ref.ts +0 -115
- package/src/parser/rules/inline/expr.ts +0 -526
- package/src/parser/rules/inline/footnote.ts +0 -223
- package/src/parser/rules/inline/image.ts +0 -328
- package/src/parser/rules/inline/line-break.ts +0 -326
- package/src/parser/rules/inline/link-triple.ts +0 -267
- package/src/parser/rules/inline/math-inline.ts +0 -126
- package/src/parser/rules/inline/raw.ts +0 -262
- package/src/parser/rules/inline/size.ts +0 -244
- package/src/parser/rules/inline/span.ts +0 -424
- package/src/parser/rules/inline/user.ts +0 -147
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ListPagesVariable } from "../types";
|
|
2
|
+
|
|
3
|
+
const KNOWN_VARIABLES: ReadonlySet<ListPagesVariable> = new Set([
|
|
4
|
+
"created_at",
|
|
5
|
+
"created_by",
|
|
6
|
+
"created_by_unix",
|
|
7
|
+
"created_by_id",
|
|
8
|
+
"created_by_linked",
|
|
9
|
+
"updated_at",
|
|
10
|
+
"updated_by",
|
|
11
|
+
"updated_by_unix",
|
|
12
|
+
"updated_by_id",
|
|
13
|
+
"updated_by_linked",
|
|
14
|
+
"commented_at",
|
|
15
|
+
"commented_by",
|
|
16
|
+
"commented_by_unix",
|
|
17
|
+
"commented_by_id",
|
|
18
|
+
"commented_by_linked",
|
|
19
|
+
"name",
|
|
20
|
+
"category",
|
|
21
|
+
"fullname",
|
|
22
|
+
"title",
|
|
23
|
+
"title_linked",
|
|
24
|
+
"link",
|
|
25
|
+
"parent_name",
|
|
26
|
+
"parent_category",
|
|
27
|
+
"parent_fullname",
|
|
28
|
+
"parent_title",
|
|
29
|
+
"parent_title_linked",
|
|
30
|
+
"content",
|
|
31
|
+
"preview",
|
|
32
|
+
"summary",
|
|
33
|
+
"first_paragraph",
|
|
34
|
+
"tags",
|
|
35
|
+
"_tags",
|
|
36
|
+
"children",
|
|
37
|
+
"comments",
|
|
38
|
+
"size",
|
|
39
|
+
"rating",
|
|
40
|
+
"rating_votes",
|
|
41
|
+
"rating_percent",
|
|
42
|
+
"revisions",
|
|
43
|
+
"index",
|
|
44
|
+
"total",
|
|
45
|
+
"limit",
|
|
46
|
+
"total_or_limit",
|
|
47
|
+
"site_title",
|
|
48
|
+
"site_name",
|
|
49
|
+
"site_domain",
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
export function normalizeVariableName(name: string): ListPagesVariable | null {
|
|
53
|
+
if (KNOWN_VARIABLES.has(name as ListPagesVariable)) {
|
|
54
|
+
return name as ListPagesVariable;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { DateComparisonOp, NormalizedDateSelector } from "../types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Date comparison operators, ordered longest-first.
|
|
5
|
+
*/
|
|
6
|
+
const DATE_COMPARISON_OPS: DateComparisonOp[] = ["<=", ">=", "<>", "<", ">", "="];
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Pattern for relative date expressions like "last 7 days".
|
|
10
|
+
*/
|
|
11
|
+
const RELATIVE_DATE_PATTERN = /^last\s+(?:(\d+)\s+)?(day|week|month)s?$/i;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Parse date selector string into structured format.
|
|
15
|
+
*/
|
|
16
|
+
export function parseDateSelector(value: string): NormalizedDateSelector | undefined {
|
|
17
|
+
const trimmed = value.trim();
|
|
18
|
+
if (!trimmed) return undefined;
|
|
19
|
+
|
|
20
|
+
const relativeMatch = trimmed.match(RELATIVE_DATE_PATTERN);
|
|
21
|
+
if (relativeMatch && relativeMatch[2]) {
|
|
22
|
+
const count = relativeMatch[1] ? parseInt(relativeMatch[1], 10) : 1;
|
|
23
|
+
if (count < 1) return undefined;
|
|
24
|
+
const unit = relativeMatch[2].toLowerCase() as "day" | "week" | "month";
|
|
25
|
+
return { type: "relative", unit, count };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
for (const op of DATE_COMPARISON_OPS) {
|
|
29
|
+
if (trimmed.startsWith(op)) {
|
|
30
|
+
const date = trimmed.slice(op.length).trim();
|
|
31
|
+
if (date) {
|
|
32
|
+
return { type: "comparison", op, date };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (/^\d{4}$/.test(trimmed)) {
|
|
38
|
+
return { type: "year", year: parseInt(trimmed, 10) };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const monthMatch = trimmed.match(/^(\d{4})\.(\d{1,2})$/);
|
|
42
|
+
if (monthMatch && monthMatch[1] && monthMatch[2]) {
|
|
43
|
+
const month = parseInt(monthMatch[2], 10);
|
|
44
|
+
if (month < 1 || month > 12) return undefined;
|
|
45
|
+
return {
|
|
46
|
+
type: "month",
|
|
47
|
+
year: parseInt(monthMatch[1], 10),
|
|
48
|
+
month,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { NormalizedNumericSelector, NumericComparisonOp } from "../types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Numeric comparison operators, ordered longest-first.
|
|
5
|
+
*/
|
|
6
|
+
const NUMERIC_COMPARISON_OPS: NumericComparisonOp[] = ["<=", ">=", "<", ">", "="];
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Parse numeric selector string into structured format.
|
|
10
|
+
*/
|
|
11
|
+
export function parseNumericSelector(value: string): NormalizedNumericSelector | undefined {
|
|
12
|
+
const trimmed = value.trim();
|
|
13
|
+
if (!trimmed) return undefined;
|
|
14
|
+
|
|
15
|
+
for (const op of NUMERIC_COMPARISON_OPS) {
|
|
16
|
+
if (trimmed.startsWith(op)) {
|
|
17
|
+
const numStr = trimmed.slice(op.length).trim();
|
|
18
|
+
const num = parseFloat(numStr);
|
|
19
|
+
if (Number.isFinite(num) && /^-?\d+(\.\d+)?$/.test(numStr)) {
|
|
20
|
+
return { op, value: num };
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const num = parseFloat(trimmed);
|
|
27
|
+
if (Number.isFinite(num) && /^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
28
|
+
return { op: "=", value: num };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { NormalizedOrder, NormalizedParent, OrderDirection, OrderField } from "../types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Mapping from Wikidot's order field names to normalized OrderField values.
|
|
5
|
+
*/
|
|
6
|
+
const ORDER_FIELD_MAP: Record<string, OrderField> = {
|
|
7
|
+
datecreated: "created_at",
|
|
8
|
+
dateedited: "updated_at",
|
|
9
|
+
title: "title",
|
|
10
|
+
fullname: "fullname",
|
|
11
|
+
rating: "rating",
|
|
12
|
+
votes: "votes",
|
|
13
|
+
revisions: "revisions",
|
|
14
|
+
comments: "comments",
|
|
15
|
+
pagelength: "size",
|
|
16
|
+
size: "size",
|
|
17
|
+
random: "random",
|
|
18
|
+
created_at: "created_at",
|
|
19
|
+
updated_at: "updated_at",
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Parse order string into structured format.
|
|
24
|
+
*/
|
|
25
|
+
export function parseOrder(value: string): NormalizedOrder {
|
|
26
|
+
const defaultOrder: NormalizedOrder = { field: "created_at", direction: "desc" };
|
|
27
|
+
const trimmed = value.trim().toLowerCase();
|
|
28
|
+
if (!trimmed) return defaultOrder;
|
|
29
|
+
|
|
30
|
+
const spaceParts = trimmed.split(/\s+/);
|
|
31
|
+
if (spaceParts.length >= 2 && spaceParts[0] && spaceParts[1]) {
|
|
32
|
+
const field = ORDER_FIELD_MAP[spaceParts[0]];
|
|
33
|
+
const direction = spaceParts[1] === "asc" ? "asc" : "desc";
|
|
34
|
+
if (field) {
|
|
35
|
+
return { field, direction };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let direction: OrderDirection = "desc";
|
|
40
|
+
let fieldPart = trimmed;
|
|
41
|
+
|
|
42
|
+
if (trimmed.endsWith("desc")) {
|
|
43
|
+
direction = "desc";
|
|
44
|
+
fieldPart = trimmed.slice(0, -4);
|
|
45
|
+
} else if (trimmed.endsWith("asc")) {
|
|
46
|
+
direction = "asc";
|
|
47
|
+
fieldPart = trimmed.slice(0, -3);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const field = ORDER_FIELD_MAP[fieldPart];
|
|
51
|
+
if (field) {
|
|
52
|
+
return { field, direction };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const singleField = ORDER_FIELD_MAP[trimmed];
|
|
56
|
+
if (singleField) {
|
|
57
|
+
return { field: singleField, direction: "desc" };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return defaultOrder;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Parse parent string into structured format.
|
|
65
|
+
*/
|
|
66
|
+
export function parseParent(value: string): NormalizedParent | undefined {
|
|
67
|
+
const trimmed = value.trim();
|
|
68
|
+
if (!trimmed) return undefined;
|
|
69
|
+
|
|
70
|
+
switch (trimmed) {
|
|
71
|
+
case "-":
|
|
72
|
+
return { type: "none" };
|
|
73
|
+
case "=":
|
|
74
|
+
return { type: "same" };
|
|
75
|
+
case "-=":
|
|
76
|
+
return { type: "different" };
|
|
77
|
+
case ".":
|
|
78
|
+
return { type: "children" };
|
|
79
|
+
default:
|
|
80
|
+
return { type: "page", name: trimmed };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { NormalizedCategory, NormalizedTags } from "../types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Pattern for splitting multi-value attribute strings.
|
|
5
|
+
* Wikidot allows commas, semicolons, and whitespace as separators between values.
|
|
6
|
+
*/
|
|
7
|
+
const TOKEN_SEPARATOR = /[,;\s]+/;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Parse tags string into structured format.
|
|
11
|
+
*/
|
|
12
|
+
export function parseTags(value: string): NormalizedTags {
|
|
13
|
+
const result: NormalizedTags = {
|
|
14
|
+
all: [],
|
|
15
|
+
any: [],
|
|
16
|
+
none: [],
|
|
17
|
+
special: null,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const trimmed = value.trim();
|
|
21
|
+
if (!trimmed) return result;
|
|
22
|
+
|
|
23
|
+
if (trimmed === "-") {
|
|
24
|
+
result.special = "none";
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
if (trimmed === "==") {
|
|
28
|
+
result.special = "same-all";
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const tokens = trimmed.split(TOKEN_SEPARATOR).filter(Boolean);
|
|
33
|
+
|
|
34
|
+
for (const token of tokens) {
|
|
35
|
+
if (token === "=") {
|
|
36
|
+
result.special = "same-visible";
|
|
37
|
+
} else if (token.startsWith("+")) {
|
|
38
|
+
const tag = token.slice(1);
|
|
39
|
+
if (tag) result.all.push(tag);
|
|
40
|
+
} else if (token.startsWith("-")) {
|
|
41
|
+
const tag = token.slice(1);
|
|
42
|
+
if (tag) result.none.push(tag);
|
|
43
|
+
} else {
|
|
44
|
+
result.any.push(token);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Parse category string into structured format.
|
|
53
|
+
*/
|
|
54
|
+
export function parseCategory(value: string): NormalizedCategory {
|
|
55
|
+
const result: NormalizedCategory = {
|
|
56
|
+
include: [],
|
|
57
|
+
exclude: [],
|
|
58
|
+
all: false,
|
|
59
|
+
current: false,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const trimmed = value.trim().toLowerCase();
|
|
63
|
+
if (!trimmed) return result;
|
|
64
|
+
|
|
65
|
+
if (trimmed === "*") {
|
|
66
|
+
result.all = true;
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const tokens = trimmed.split(TOKEN_SEPARATOR).filter(Boolean);
|
|
71
|
+
|
|
72
|
+
for (const token of tokens) {
|
|
73
|
+
if (token === "*") {
|
|
74
|
+
result.all = true;
|
|
75
|
+
} else if (token === ".") {
|
|
76
|
+
result.current = true;
|
|
77
|
+
} else if (token.startsWith("-")) {
|
|
78
|
+
const cat = token.slice(1);
|
|
79
|
+
if (cat) result.exclude.push(cat);
|
|
80
|
+
} else {
|
|
81
|
+
result.include.push(token);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
@@ -14,330 +14,14 @@
|
|
|
14
14
|
* @module
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import type {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
NormalizedNumericSelector,
|
|
26
|
-
OrderField,
|
|
27
|
-
OrderDirection,
|
|
28
|
-
DateComparisonOp,
|
|
29
|
-
NumericComparisonOp,
|
|
30
|
-
} from "./types";
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Pattern for splitting multi-value attribute strings.
|
|
34
|
-
* Wikidot allows commas, semicolons, and whitespace as separators between values.
|
|
35
|
-
*/
|
|
36
|
-
const TOKEN_SEPARATOR = /[,;\s]+/;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Parse tags string into structured format
|
|
40
|
-
*
|
|
41
|
-
* Syntax:
|
|
42
|
-
* - `+tag`: AND condition (must have this tag)
|
|
43
|
-
* - `-tag`: NOT condition (must not have this tag)
|
|
44
|
-
* - `tag`: OR condition (any of these tags)
|
|
45
|
-
* - `=`: same visible tags as current page
|
|
46
|
-
* - `==`: exact same tags as current page
|
|
47
|
-
* - `-`: pages with no tags
|
|
48
|
-
*/
|
|
49
|
-
export function parseTags(value: string): NormalizedTags {
|
|
50
|
-
const result: NormalizedTags = {
|
|
51
|
-
all: [],
|
|
52
|
-
any: [],
|
|
53
|
-
none: [],
|
|
54
|
-
special: null,
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const trimmed = value.trim();
|
|
58
|
-
if (!trimmed) return result;
|
|
59
|
-
|
|
60
|
-
// Check for special selectors
|
|
61
|
-
if (trimmed === "-") {
|
|
62
|
-
result.special = "none";
|
|
63
|
-
return result;
|
|
64
|
-
}
|
|
65
|
-
if (trimmed === "==") {
|
|
66
|
-
result.special = "same-all";
|
|
67
|
-
return result;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const tokens = trimmed.split(TOKEN_SEPARATOR).filter(Boolean);
|
|
71
|
-
|
|
72
|
-
for (const token of tokens) {
|
|
73
|
-
if (token === "=") {
|
|
74
|
-
result.special = "same-visible";
|
|
75
|
-
} else if (token.startsWith("+")) {
|
|
76
|
-
const tag = token.slice(1);
|
|
77
|
-
if (tag) result.all.push(tag);
|
|
78
|
-
} else if (token.startsWith("-")) {
|
|
79
|
-
const tag = token.slice(1);
|
|
80
|
-
if (tag) result.none.push(tag);
|
|
81
|
-
} else {
|
|
82
|
-
result.any.push(token);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return result;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Parse category string into structured format
|
|
91
|
-
*
|
|
92
|
-
* Syntax:
|
|
93
|
-
* - `*`: all categories
|
|
94
|
-
* - `.`: current category
|
|
95
|
-
* - `-category`: exclude category
|
|
96
|
-
* - `category`: include category
|
|
97
|
-
* - Multiple categories separated by comma, semicolon, or whitespace
|
|
98
|
-
*/
|
|
99
|
-
export function parseCategory(value: string): NormalizedCategory {
|
|
100
|
-
const result: NormalizedCategory = {
|
|
101
|
-
include: [],
|
|
102
|
-
exclude: [],
|
|
103
|
-
all: false,
|
|
104
|
-
current: false,
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const trimmed = value.trim().toLowerCase();
|
|
108
|
-
if (!trimmed) return result;
|
|
109
|
-
|
|
110
|
-
if (trimmed === "*") {
|
|
111
|
-
result.all = true;
|
|
112
|
-
return result;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const tokens = trimmed.split(TOKEN_SEPARATOR).filter(Boolean);
|
|
116
|
-
|
|
117
|
-
for (const token of tokens) {
|
|
118
|
-
if (token === "*") {
|
|
119
|
-
result.all = true;
|
|
120
|
-
} else if (token === ".") {
|
|
121
|
-
result.current = true;
|
|
122
|
-
} else if (token.startsWith("-")) {
|
|
123
|
-
const cat = token.slice(1);
|
|
124
|
-
if (cat) result.exclude.push(cat);
|
|
125
|
-
} else {
|
|
126
|
-
result.include.push(token);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return result;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Mapping from Wikidot's order field names (both camelCase PHP-style and
|
|
135
|
-
* snake_case documentation-style) to normalized `OrderField` values.
|
|
136
|
-
*/
|
|
137
|
-
const ORDER_FIELD_MAP: Record<string, OrderField> = {
|
|
138
|
-
// camelCase format (Wikidot PHP style)
|
|
139
|
-
datecreated: "created_at",
|
|
140
|
-
dateedited: "updated_at",
|
|
141
|
-
title: "title",
|
|
142
|
-
fullname: "fullname",
|
|
143
|
-
rating: "rating",
|
|
144
|
-
votes: "votes",
|
|
145
|
-
revisions: "revisions",
|
|
146
|
-
comments: "comments",
|
|
147
|
-
pagelength: "size",
|
|
148
|
-
size: "size",
|
|
149
|
-
random: "random",
|
|
150
|
-
// snake_case format (documentation style)
|
|
151
|
-
created_at: "created_at",
|
|
152
|
-
updated_at: "updated_at",
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Parse order string into structured format
|
|
157
|
-
*
|
|
158
|
-
* Supports both formats:
|
|
159
|
-
* - camelCase: `dateCreatedDesc`, `titleAsc`, `ratingDesc`
|
|
160
|
-
* - Space-separated: `created_at desc`, `title asc`
|
|
161
|
-
*
|
|
162
|
-
* Default: { field: "created_at", direction: "desc" }
|
|
163
|
-
*/
|
|
164
|
-
export function parseOrder(value: string): NormalizedOrder {
|
|
165
|
-
const defaultOrder: NormalizedOrder = { field: "created_at", direction: "desc" };
|
|
166
|
-
const trimmed = value.trim().toLowerCase();
|
|
167
|
-
if (!trimmed) return defaultOrder;
|
|
168
|
-
|
|
169
|
-
// Try space-separated format: "created_at desc"
|
|
170
|
-
const spaceParts = trimmed.split(/\s+/);
|
|
171
|
-
if (spaceParts.length >= 2 && spaceParts[0] && spaceParts[1]) {
|
|
172
|
-
const field = ORDER_FIELD_MAP[spaceParts[0]];
|
|
173
|
-
const direction = spaceParts[1] === "asc" ? "asc" : "desc";
|
|
174
|
-
if (field) {
|
|
175
|
-
return { field, direction };
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Try camelCase format: "dateCreatedDesc"
|
|
180
|
-
let direction: OrderDirection = "desc";
|
|
181
|
-
let fieldPart = trimmed;
|
|
182
|
-
|
|
183
|
-
if (trimmed.endsWith("desc")) {
|
|
184
|
-
direction = "desc";
|
|
185
|
-
fieldPart = trimmed.slice(0, -4);
|
|
186
|
-
} else if (trimmed.endsWith("asc")) {
|
|
187
|
-
direction = "asc";
|
|
188
|
-
fieldPart = trimmed.slice(0, -3);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const field = ORDER_FIELD_MAP[fieldPart];
|
|
192
|
-
if (field) {
|
|
193
|
-
return { field, direction };
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Try single word (field only, use default direction)
|
|
197
|
-
const singleField = ORDER_FIELD_MAP[trimmed];
|
|
198
|
-
if (singleField) {
|
|
199
|
-
return { field: singleField, direction: "desc" };
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
return defaultOrder;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Parse parent string into structured format
|
|
207
|
-
*
|
|
208
|
-
* Syntax:
|
|
209
|
-
* - `-`: orphan pages (no parent)
|
|
210
|
-
* - `=`: sibling pages (same parent as current)
|
|
211
|
-
* - `-=`: pages with different parent
|
|
212
|
-
* - `.`: children of current page
|
|
213
|
-
* - `page-name`: children of specific page
|
|
214
|
-
*
|
|
215
|
-
* Returns undefined for empty/whitespace-only input.
|
|
216
|
-
*/
|
|
217
|
-
export function parseParent(value: string): NormalizedParent | undefined {
|
|
218
|
-
const trimmed = value.trim();
|
|
219
|
-
if (!trimmed) return undefined;
|
|
220
|
-
|
|
221
|
-
switch (trimmed) {
|
|
222
|
-
case "-":
|
|
223
|
-
return { type: "none" };
|
|
224
|
-
case "=":
|
|
225
|
-
return { type: "same" };
|
|
226
|
-
case "-=":
|
|
227
|
-
return { type: "different" };
|
|
228
|
-
case ".":
|
|
229
|
-
return { type: "children" };
|
|
230
|
-
default:
|
|
231
|
-
return { type: "page", name: trimmed };
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Date comparison operators, ordered longest-first so longer operators
|
|
237
|
-
* (like `<=`) are matched before shorter ones (like `<`).
|
|
238
|
-
*/
|
|
239
|
-
const DATE_COMPARISON_OPS: DateComparisonOp[] = ["<=", ">=", "<>", "<", ">", "="];
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Pattern for relative date expressions like "last 7 days", "last 2 weeks", "last month".
|
|
243
|
-
* The count is optional and defaults to 1 (e.g., "last month" = "last 1 month").
|
|
244
|
-
*/
|
|
245
|
-
const RELATIVE_DATE_PATTERN = /^last\s+(?:(\d+)\s+)?(day|week|month)s?$/i;
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Parse date selector string into structured format
|
|
249
|
-
*
|
|
250
|
-
* Syntax:
|
|
251
|
-
* - `yyyy`: year only
|
|
252
|
-
* - `yyyy.mm`: year and month
|
|
253
|
-
* - `>=yyyy.mm.dd`: comparison with date
|
|
254
|
-
* - `last 7 days`: relative date
|
|
255
|
-
*/
|
|
256
|
-
export function parseDateSelector(value: string): NormalizedDateSelector | undefined {
|
|
257
|
-
const trimmed = value.trim();
|
|
258
|
-
if (!trimmed) return undefined;
|
|
259
|
-
|
|
260
|
-
// Check relative date format: "last 7 days"
|
|
261
|
-
const relativeMatch = trimmed.match(RELATIVE_DATE_PATTERN);
|
|
262
|
-
if (relativeMatch && relativeMatch[2]) {
|
|
263
|
-
const count = relativeMatch[1] ? parseInt(relativeMatch[1], 10) : 1;
|
|
264
|
-
// Validate count is at least 1
|
|
265
|
-
if (count < 1) return undefined;
|
|
266
|
-
const unit = relativeMatch[2].toLowerCase() as "day" | "week" | "month";
|
|
267
|
-
return { type: "relative", unit, count };
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// Check comparison operators
|
|
271
|
-
for (const op of DATE_COMPARISON_OPS) {
|
|
272
|
-
if (trimmed.startsWith(op)) {
|
|
273
|
-
const date = trimmed.slice(op.length).trim();
|
|
274
|
-
if (date) {
|
|
275
|
-
return { type: "comparison", op, date };
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Check year format: "2024"
|
|
281
|
-
if (/^\d{4}$/.test(trimmed)) {
|
|
282
|
-
return { type: "year", year: parseInt(trimmed, 10) };
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// Check year.month format: "2024.03"
|
|
286
|
-
const monthMatch = trimmed.match(/^(\d{4})\.(\d{1,2})$/);
|
|
287
|
-
if (monthMatch && monthMatch[1] && monthMatch[2]) {
|
|
288
|
-
const month = parseInt(monthMatch[2], 10);
|
|
289
|
-
// Validate month is 1-12
|
|
290
|
-
if (month < 1 || month > 12) return undefined;
|
|
291
|
-
return {
|
|
292
|
-
type: "month",
|
|
293
|
-
year: parseInt(monthMatch[1], 10),
|
|
294
|
-
month,
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
return undefined;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* Numeric comparison operators, ordered longest-first for correct prefix matching.
|
|
303
|
-
*/
|
|
304
|
-
const NUMERIC_COMPARISON_OPS: NumericComparisonOp[] = ["<=", ">=", "<", ">", "="];
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Parse numeric selector string into structured format
|
|
308
|
-
*
|
|
309
|
-
* Syntax:
|
|
310
|
-
* - `5`: equals 5
|
|
311
|
-
* - `>=10`: greater than or equal to 10
|
|
312
|
-
* - `<0`: less than 0
|
|
313
|
-
*
|
|
314
|
-
* Returns undefined for non-numeric or infinite values.
|
|
315
|
-
*/
|
|
316
|
-
export function parseNumericSelector(value: string): NormalizedNumericSelector | undefined {
|
|
317
|
-
const trimmed = value.trim();
|
|
318
|
-
if (!trimmed) return undefined;
|
|
319
|
-
|
|
320
|
-
// Check comparison operators
|
|
321
|
-
for (const op of NUMERIC_COMPARISON_OPS) {
|
|
322
|
-
if (trimmed.startsWith(op)) {
|
|
323
|
-
const numStr = trimmed.slice(op.length).trim();
|
|
324
|
-
const num = parseFloat(numStr);
|
|
325
|
-
// Strict validation: must be finite number and entire string must be numeric
|
|
326
|
-
if (Number.isFinite(num) && /^-?\d+(\.\d+)?$/.test(numStr)) {
|
|
327
|
-
return { op, value: num };
|
|
328
|
-
}
|
|
329
|
-
return undefined;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
// Plain number (equals) - strict validation
|
|
334
|
-
const num = parseFloat(trimmed);
|
|
335
|
-
if (Number.isFinite(num) && /^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
336
|
-
return { op: "=", value: num };
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
return undefined;
|
|
340
|
-
}
|
|
17
|
+
import type { ListPagesQuery, NormalizedListPagesQuery } from "./types";
|
|
18
|
+
import { parseCategory, parseTags } from "./normalization/tags-category";
|
|
19
|
+
import { parseOrder, parseParent } from "./normalization/order-parent";
|
|
20
|
+
import { parseDateSelector, parseNumericSelector } from "./normalization/selectors";
|
|
21
|
+
|
|
22
|
+
export { parseCategory, parseTags } from "./normalization/tags-category";
|
|
23
|
+
export { parseOrder, parseParent } from "./normalization/order-parent";
|
|
24
|
+
export { parseDateSelector, parseNumericSelector } from "./normalization/selectors";
|
|
341
25
|
|
|
342
26
|
/**
|
|
343
27
|
* Normalize a ListPagesQuery into structured types
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Element } from "@wdprlib/ast";
|
|
2
|
+
import type { CompiledTemplate, ListPagesExternalData, VariableContext } from "../types";
|
|
3
|
+
import type { ParseFunction } from "../../types";
|
|
4
|
+
import type { ListPagesModuleData } from "../resolve";
|
|
5
|
+
|
|
6
|
+
export function renderListPagesItems(
|
|
7
|
+
module: ListPagesModuleData,
|
|
8
|
+
data: ListPagesExternalData,
|
|
9
|
+
compiledTemplate: CompiledTemplate,
|
|
10
|
+
parse: ParseFunction,
|
|
11
|
+
): Element[] {
|
|
12
|
+
const items: Element[] = [];
|
|
13
|
+
|
|
14
|
+
for (let i = 0; i < data.pages.length; i++) {
|
|
15
|
+
const page = data.pages[i];
|
|
16
|
+
if (!page) continue;
|
|
17
|
+
|
|
18
|
+
const ctx: VariableContext = {
|
|
19
|
+
page,
|
|
20
|
+
index: i + 1,
|
|
21
|
+
total: data.totalCount,
|
|
22
|
+
limit: module.limit,
|
|
23
|
+
site: data.site,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const itemAst = parse(compiledTemplate(ctx));
|
|
27
|
+
|
|
28
|
+
if (module.separate) {
|
|
29
|
+
items.push({
|
|
30
|
+
element: "container",
|
|
31
|
+
data: {
|
|
32
|
+
type: "div",
|
|
33
|
+
attributes: { class: "list-pages-item" },
|
|
34
|
+
elements: itemAst.elements,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
} else {
|
|
38
|
+
items.push(...itemAst.elements);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return items;
|
|
43
|
+
}
|