@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.
Files changed (433) hide show
  1. package/dist/index.cjs +10451 -8402
  2. package/dist/index.d.cts +313 -337
  3. package/dist/index.d.ts +313 -337
  4. package/dist/index.js +10438 -8389
  5. package/package.json +1 -1
  6. package/src/index.ts +7 -0
  7. package/src/lexer/anchor.ts +48 -0
  8. package/src/lexer/index.ts +3 -2
  9. package/src/lexer/lexer.ts +73 -559
  10. package/src/lexer/options.ts +19 -0
  11. package/src/lexer/punctuation.ts +70 -0
  12. package/src/lexer/quoted-string.ts +16 -0
  13. package/src/lexer/runs.ts +85 -0
  14. package/src/lexer/spacing-actions.ts +24 -0
  15. package/src/lexer/state.ts +103 -0
  16. package/src/lexer/syntax-actions.ts +80 -0
  17. package/src/lexer/text-actions.ts +41 -0
  18. package/src/lexer/token-actions.ts +136 -0
  19. package/src/lexer/token-factory.ts +62 -0
  20. package/src/lexer/tokenize.ts +18 -0
  21. package/src/parser/constants.ts +2 -0
  22. package/src/parser/depth/index.ts +111 -0
  23. package/src/parser/depth/stack.ts +82 -0
  24. package/src/parser/parse/block.ts +42 -0
  25. package/src/parser/parse/context.ts +26 -0
  26. package/src/parser/parse/footnotes.ts +25 -0
  27. package/src/parser/parse/index.ts +42 -0
  28. package/src/parser/parse/options.ts +34 -0
  29. package/src/parser/parse/parser.ts +79 -0
  30. package/src/parser/parse/plain-non-ascii.ts +129 -0
  31. package/src/parser/parse/result.ts +57 -0
  32. package/src/parser/parse/source.ts +11 -0
  33. package/src/parser/postprocess/divAdjacentParagraph.ts +1 -1
  34. package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
  35. package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
  36. package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
  37. package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
  38. package/src/parser/postprocess/spanStrip/factory.ts +23 -0
  39. package/src/parser/postprocess/spanStrip/index.ts +8 -0
  40. package/src/parser/postprocess/spanStrip/merge.ts +117 -0
  41. package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
  42. package/src/parser/postprocess/spanStrip/split.ts +67 -0
  43. package/src/parser/preprocess/expr/chars.ts +15 -0
  44. package/src/parser/preprocess/expr/evaluate.ts +22 -0
  45. package/src/parser/preprocess/expr/index.ts +45 -0
  46. package/src/parser/preprocess/expr/kind.ts +19 -0
  47. package/src/parser/preprocess/expr/parse.ts +103 -0
  48. package/src/parser/preprocess/expr/scan.ts +34 -0
  49. package/src/parser/preprocess/expr/types.ts +14 -0
  50. package/src/parser/preprocess/typography.ts +70 -5
  51. package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
  52. package/src/parser/preprocess/utils/index.ts +13 -0
  53. package/src/parser/preprocess/utils/raw-regions.ts +153 -0
  54. package/src/parser/preprocess/whitespace/detection.ts +39 -0
  55. package/src/parser/preprocess/whitespace/index.ts +79 -0
  56. package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
  57. package/src/parser/preprocess/whitespace/patterns.ts +23 -0
  58. package/src/parser/rules/block/align/body.ts +46 -0
  59. package/src/parser/rules/block/align/element.ts +13 -0
  60. package/src/parser/rules/block/align/index.ts +90 -0
  61. package/src/parser/rules/block/align/syntax.ts +113 -0
  62. package/src/parser/rules/block/bibliography/body.ts +81 -0
  63. package/src/parser/rules/block/bibliography/entries.ts +49 -0
  64. package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
  65. package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
  66. package/src/parser/rules/block/bibliography/index.ts +90 -0
  67. package/src/parser/rules/block/bibliography/open.ts +53 -0
  68. package/src/parser/rules/block/block-list/bare-content.ts +105 -0
  69. package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
  70. package/src/parser/rules/block/block-list/index.ts +51 -0
  71. package/src/parser/rules/block/block-list/item-content.ts +132 -0
  72. package/src/parser/rules/block/block-list/li-content.ts +107 -0
  73. package/src/parser/rules/block/block-list/li-item.ts +77 -0
  74. package/src/parser/rules/block/block-list/list-block.ts +100 -0
  75. package/src/parser/rules/block/block-list/open.ts +51 -0
  76. package/src/parser/rules/block/block-list/tags.ts +50 -0
  77. package/src/parser/rules/block/blockquote/build.ts +62 -0
  78. package/src/parser/rules/block/blockquote/index.ts +80 -0
  79. package/src/parser/rules/block/blockquote/line.ts +79 -0
  80. package/src/parser/rules/block/blockquote/lines.ts +39 -0
  81. package/src/parser/rules/block/{center.ts → center/index.ts} +7 -22
  82. package/src/parser/rules/block/center/open.ts +27 -0
  83. package/src/parser/rules/block/{clear-float.ts → clear-float/index.ts} +6 -30
  84. package/src/parser/rules/block/clear-float/syntax.ts +43 -0
  85. package/src/parser/rules/block/code/attributes.ts +30 -0
  86. package/src/parser/rules/block/code/content.ts +57 -0
  87. package/src/parser/rules/block/code/index.ts +100 -0
  88. package/src/parser/rules/block/collapsible/attributes.ts +95 -0
  89. package/src/parser/rules/block/collapsible/body.ts +69 -0
  90. package/src/parser/rules/block/collapsible/index.ts +117 -0
  91. package/src/parser/rules/block/collapsible/open.ts +51 -0
  92. package/src/parser/rules/block/collapsible/orphans.ts +31 -0
  93. package/src/parser/rules/block/collapsible/tags.ts +17 -0
  94. package/src/parser/rules/block/comment/consume.ts +37 -0
  95. package/src/parser/rules/block/{comment.ts → comment/index.ts} +12 -38
  96. package/src/parser/rules/block/{content-separator.ts → content-separator/index.ts} +5 -35
  97. package/src/parser/rules/block/content-separator/syntax.ts +33 -0
  98. package/src/parser/rules/block/definition-list/collect.ts +40 -0
  99. package/src/parser/rules/block/definition-list/index.ts +63 -0
  100. package/src/parser/rules/block/definition-list/item-key.ts +95 -0
  101. package/src/parser/rules/block/definition-list/item-value.ts +56 -0
  102. package/src/parser/rules/block/definition-list/items.ts +54 -0
  103. package/src/parser/rules/block/div/body.ts +41 -0
  104. package/src/parser/rules/block/div/close.ts +41 -0
  105. package/src/parser/rules/block/div/failed.ts +117 -0
  106. package/src/parser/rules/block/div/index.ts +112 -0
  107. package/src/parser/rules/block/div/nesting.ts +37 -0
  108. package/src/parser/rules/block/div/open.ts +59 -0
  109. package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
  110. package/src/parser/rules/block/embed-block/content.ts +53 -0
  111. package/src/parser/rules/block/embed-block/index.ts +91 -0
  112. package/src/parser/rules/block/embed-block/open.ts +52 -0
  113. package/src/parser/rules/block/embed-block/tags.ts +5 -0
  114. package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
  115. package/src/parser/rules/block/footnoteblock/index.ts +82 -0
  116. package/src/parser/rules/block/footnoteblock/open.ts +53 -0
  117. package/src/parser/rules/block/heading/index.ts +87 -0
  118. package/src/parser/rules/block/heading/open.ts +50 -0
  119. package/src/parser/rules/block/heading/toc-text.ts +26 -0
  120. package/src/parser/rules/block/{horizontal-rule.ts → horizontal-rule/index.ts} +4 -21
  121. package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
  122. package/src/parser/rules/block/html/body.ts +114 -0
  123. package/src/parser/rules/block/html/diagnostics.ts +11 -0
  124. package/src/parser/rules/block/html/index.ts +95 -0
  125. package/src/parser/rules/block/html/open.ts +36 -0
  126. package/src/parser/rules/block/iframe/attributes.ts +106 -0
  127. package/src/parser/rules/block/iframe/index.ts +73 -0
  128. package/src/parser/rules/block/iframe/open.ts +58 -0
  129. package/src/parser/rules/block/iframe/source.ts +24 -0
  130. package/src/parser/rules/block/iframe/url.ts +38 -0
  131. package/src/parser/rules/block/iftags/body.ts +48 -0
  132. package/src/parser/rules/block/iftags/condition.ts +24 -0
  133. package/src/parser/rules/block/{iftags.ts → iftags/index.ts} +16 -58
  134. package/src/parser/rules/block/include/arguments.ts +48 -0
  135. package/src/parser/rules/block/include/index.ts +75 -0
  136. package/src/parser/rules/block/include/location.ts +24 -0
  137. package/src/parser/rules/block/include/variables.ts +37 -0
  138. package/src/parser/rules/block/list/index.ts +73 -0
  139. package/src/parser/rules/block/list/line.ts +77 -0
  140. package/src/parser/rules/block/list/native.ts +89 -0
  141. package/src/parser/rules/block/math/content.ts +54 -0
  142. package/src/parser/rules/block/math/index.ts +106 -0
  143. package/src/parser/rules/block/math/name.ts +35 -0
  144. package/src/parser/rules/block/module/body.ts +92 -0
  145. package/src/parser/rules/block/module/element.ts +33 -0
  146. package/src/parser/rules/block/module/include/directive.ts +91 -0
  147. package/src/parser/rules/block/module/include/index.ts +11 -2
  148. package/src/parser/rules/block/module/include/references.ts +42 -0
  149. package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
  150. package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
  151. package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
  152. package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
  153. package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
  154. package/src/parser/rules/block/module/include/scanner.ts +121 -0
  155. package/src/parser/rules/block/module/index.ts +14 -2
  156. package/src/parser/rules/block/module/listpages/compiler.ts +12 -392
  157. package/src/parser/rules/block/module/listpages/extract.ts +25 -359
  158. package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
  159. package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
  160. package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
  161. package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
  162. package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
  163. package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
  164. package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
  165. package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
  166. package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
  167. package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
  168. package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
  169. package/src/parser/rules/block/module/listpages/normalize.ts +8 -324
  170. package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
  171. package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
  172. package/src/parser/rules/block/module/listpages/resolve.ts +5 -75
  173. package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
  174. package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
  175. package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
  176. package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
  177. package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
  178. package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
  179. package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
  180. package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
  181. package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
  182. package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
  183. package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
  184. package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
  185. package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
  186. package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
  187. package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
  188. package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
  189. package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
  190. package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
  191. package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
  192. package/src/parser/rules/block/module/listpages/url-resolution/params.ts +19 -0
  193. package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
  194. package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +53 -0
  195. package/src/parser/rules/block/module/listpages/url-resolution/value.ts +25 -0
  196. package/src/parser/rules/block/module/listpages/url-resolver.ts +3 -160
  197. package/src/parser/rules/block/module/listusers/compiler.ts +4 -25
  198. package/src/parser/rules/block/module/listusers/extract.ts +4 -9
  199. package/src/parser/rules/block/module/listusers/getters.ts +21 -0
  200. package/src/parser/rules/block/module/listusers/variables.ts +15 -0
  201. package/src/parser/rules/block/module/open.ts +57 -0
  202. package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
  203. package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
  204. package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
  205. package/src/parser/rules/block/module/resolution/styles.ts +53 -0
  206. package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
  207. package/src/parser/rules/block/module/resolve.ts +79 -292
  208. package/src/parser/rules/block/module/rule.ts +56 -0
  209. package/src/parser/rules/block/module/types-common.ts +11 -0
  210. package/src/parser/rules/block/module/walk/children.ts +35 -0
  211. package/src/parser/rules/block/module/walk/index.ts +9 -0
  212. package/src/parser/rules/block/module/walk/map/index.ts +2 -0
  213. package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
  214. package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
  215. package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
  216. package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
  217. package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
  218. package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
  219. package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
  220. package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
  221. package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
  222. package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
  223. package/src/parser/rules/block/module/walk/map/types.ts +6 -0
  224. package/src/parser/rules/block/module/walk/traverse.ts +65 -0
  225. package/src/parser/rules/block/orphan-li/content.ts +60 -0
  226. package/src/parser/rules/block/orphan-li/index.ts +75 -0
  227. package/src/parser/rules/block/orphan-li/open.ts +25 -0
  228. package/src/parser/rules/block/orphan-li/tags.ts +40 -0
  229. package/src/parser/rules/block/paragraph/content.ts +12 -0
  230. package/src/parser/rules/block/paragraph/index.ts +60 -0
  231. package/src/parser/rules/block/paragraph/normalize.ts +52 -0
  232. package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
  233. package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
  234. package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
  235. package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
  236. package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
  237. package/src/parser/rules/block/parsing/block-item.ts +29 -0
  238. package/src/parser/rules/block/parsing/content.ts +127 -0
  239. package/src/parser/rules/block/parsing/end-condition.ts +51 -0
  240. package/src/parser/rules/block/parsing/inline-content.ts +105 -0
  241. package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
  242. package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
  243. package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
  244. package/src/parser/rules/block/table/index.ts +80 -0
  245. package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
  246. package/src/parser/rules/block/table/pipe/cell.ts +106 -0
  247. package/src/parser/rules/block/table/pipe/index.ts +2 -0
  248. package/src/parser/rules/block/table/pipe/row.ts +88 -0
  249. package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
  250. package/src/parser/rules/block/table/pipe/trim.ts +50 -0
  251. package/src/parser/rules/block/table-block/body.ts +79 -0
  252. package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
  253. package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
  254. package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
  255. package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
  256. package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
  257. package/src/parser/rules/block/table-block/cell.ts +64 -0
  258. package/src/parser/rules/block/table-block/index.ts +113 -0
  259. package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
  260. package/src/parser/rules/block/table-block/structure.ts +80 -0
  261. package/src/parser/rules/block/tabview/body.ts +64 -0
  262. package/src/parser/rules/block/tabview/index.ts +90 -0
  263. package/src/parser/rules/block/tabview/open.ts +50 -0
  264. package/src/parser/rules/block/tabview/tab.ts +92 -0
  265. package/src/parser/rules/block/tabview/tags.ts +30 -0
  266. package/src/parser/rules/block/toc/element.ts +11 -0
  267. package/src/parser/rules/block/toc/index.ts +44 -0
  268. package/src/parser/rules/block/toc/open.ts +84 -0
  269. package/src/parser/rules/block/utils.ts +10 -610
  270. package/src/parser/rules/{utils.ts → common/attribute-safety.ts} +3 -49
  271. package/src/parser/rules/common/block-name.ts +33 -0
  272. package/src/parser/rules/common/index.ts +2 -0
  273. package/src/parser/rules/contracts/index.ts +3 -0
  274. package/src/parser/rules/contracts/parse-context.ts +38 -0
  275. package/src/parser/rules/contracts/rule.ts +43 -0
  276. package/src/parser/rules/contracts/scope.ts +31 -0
  277. package/src/parser/rules/inline/anchor/attributes.ts +54 -0
  278. package/src/parser/rules/inline/anchor/child.ts +26 -0
  279. package/src/parser/rules/inline/anchor/close.ts +34 -0
  280. package/src/parser/rules/inline/anchor/content.ts +59 -0
  281. package/src/parser/rules/inline/anchor/index.ts +103 -0
  282. package/src/parser/rules/inline/anchor/newline.ts +26 -0
  283. package/src/parser/rules/inline/anchor/open.ts +47 -0
  284. package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
  285. package/src/parser/rules/inline/anchor/syntax.ts +40 -0
  286. package/src/parser/rules/inline/anchor-name/index.ts +38 -0
  287. package/src/parser/rules/inline/anchor-name/name.ts +39 -0
  288. package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
  289. package/src/parser/rules/inline/bibcite/element.ts +14 -0
  290. package/src/parser/rules/inline/bibcite/index.ts +34 -0
  291. package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
  292. package/src/parser/rules/inline/bold.ts +2 -39
  293. package/src/parser/rules/inline/color/index.ts +35 -0
  294. package/src/parser/rules/inline/color/syntax.ts +69 -0
  295. package/src/parser/rules/inline/comment/consume.ts +31 -0
  296. package/src/parser/rules/inline/{comment.ts → comment/index.ts} +10 -36
  297. package/src/parser/rules/inline/equation-ref/element.ts +8 -0
  298. package/src/parser/rules/inline/equation-ref/index.ts +34 -0
  299. package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
  300. package/src/parser/rules/inline/expr/branch.ts +104 -0
  301. package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
  302. package/src/parser/rules/inline/expr/conditional.ts +80 -0
  303. package/src/parser/rules/inline/expr/depth.ts +25 -0
  304. package/src/parser/rules/inline/expr/elements.ts +39 -0
  305. package/src/parser/rules/inline/expr/index.ts +84 -0
  306. package/src/parser/rules/inline/expr/syntax.ts +45 -0
  307. package/src/parser/rules/inline/footnote/child.ts +22 -0
  308. package/src/parser/rules/inline/footnote/close.ts +33 -0
  309. package/src/parser/rules/inline/footnote/content.ts +54 -0
  310. package/src/parser/rules/inline/footnote/elements.ts +38 -0
  311. package/src/parser/rules/inline/footnote/index.ts +54 -0
  312. package/src/parser/rules/inline/footnote/newline.ts +27 -0
  313. package/src/parser/rules/inline/footnote/open.ts +38 -0
  314. package/src/parser/rules/inline/formatting/container.ts +50 -0
  315. package/src/parser/rules/inline/{guillemet.ts → guillemet/index.ts} +5 -13
  316. package/src/parser/rules/inline/guillemet/text.ts +11 -0
  317. package/src/parser/rules/inline/html/gate.ts +64 -0
  318. package/src/parser/rules/inline/{html.ts → html/index.ts} +9 -60
  319. package/src/parser/rules/inline/html/open.ts +37 -0
  320. package/src/parser/rules/inline/image/attributes.ts +22 -0
  321. package/src/parser/rules/inline/image/body.ts +36 -0
  322. package/src/parser/rules/inline/image/index.ts +89 -0
  323. package/src/parser/rules/inline/image/open.ts +56 -0
  324. package/src/parser/rules/inline/image/source.ts +62 -0
  325. package/src/parser/rules/inline/image/syntax.ts +76 -0
  326. package/src/parser/rules/inline/italic.ts +2 -30
  327. package/src/parser/rules/inline/line-break/backslash.ts +58 -0
  328. package/src/parser/rules/inline/line-break/elements.ts +9 -0
  329. package/src/parser/rules/inline/line-break/index.ts +3 -0
  330. package/src/parser/rules/inline/line-break/newline.ts +82 -0
  331. package/src/parser/rules/inline/line-break/underscore.ts +45 -0
  332. package/src/parser/rules/inline/link-anchor.ts +6 -81
  333. package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
  334. package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
  335. package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
  336. package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
  337. package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
  338. package/src/parser/rules/inline/link-single.ts +7 -98
  339. package/src/parser/rules/inline/link-star.ts +7 -69
  340. package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
  341. package/src/parser/rules/inline/link-triple/index.ts +62 -0
  342. package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
  343. package/src/parser/rules/inline/link-triple/label.ts +35 -0
  344. package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
  345. package/src/parser/rules/inline/link-triple/target.ts +36 -0
  346. package/src/parser/rules/inline/math-inline/index.ts +40 -0
  347. package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
  348. package/src/parser/rules/inline/monospace.ts +2 -30
  349. package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
  350. package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
  351. package/src/parser/rules/inline/parsing/collect.ts +23 -0
  352. package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
  353. package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
  354. package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
  355. package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
  356. package/src/parser/rules/inline/parsing/rules.ts +34 -0
  357. package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
  358. package/src/parser/rules/inline/raw/angle.ts +40 -0
  359. package/src/parser/rules/inline/raw/double-at.ts +78 -0
  360. package/src/parser/rules/inline/raw/index.ts +26 -0
  361. package/src/parser/rules/inline/raw/result.ts +26 -0
  362. package/src/parser/rules/inline/size/content.ts +65 -0
  363. package/src/parser/rules/inline/size/index.ts +55 -0
  364. package/src/parser/rules/inline/size/open.ts +43 -0
  365. package/src/parser/rules/inline/size/value.ts +45 -0
  366. package/src/parser/rules/inline/span/content.ts +97 -0
  367. package/src/parser/rules/inline/span/elements.ts +108 -0
  368. package/src/parser/rules/inline/span/index.ts +79 -0
  369. package/src/parser/rules/inline/span/newline.ts +50 -0
  370. package/src/parser/rules/inline/span/syntax.ts +70 -0
  371. package/src/parser/rules/inline/{strikethrough.ts → strikethrough/index.ts} +5 -60
  372. package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
  373. package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
  374. package/src/parser/rules/inline/subscript.ts +2 -39
  375. package/src/parser/rules/inline/superscript.ts +4 -39
  376. package/src/parser/rules/inline/text/element.ts +5 -0
  377. package/src/parser/rules/inline/{text.ts → text/index.ts} +5 -4
  378. package/src/parser/rules/inline/underline/child.ts +26 -0
  379. package/src/parser/rules/inline/underline/content.ts +29 -0
  380. package/src/parser/rules/inline/{underline.ts → underline/index.ts} +6 -49
  381. package/src/parser/rules/inline/user/element.ts +11 -0
  382. package/src/parser/rules/inline/user/index.ts +34 -0
  383. package/src/parser/rules/inline/user/syntax.ts +67 -0
  384. package/src/parser/rules/inline/utils.ts +4 -344
  385. package/src/parser/rules/tokens.ts +106 -0
  386. package/src/parser/rules/types.ts +9 -252
  387. package/src/parser/depth.ts +0 -251
  388. package/src/parser/parse.ts +0 -315
  389. package/src/parser/postprocess/spanStrip.ts +0 -697
  390. package/src/parser/preprocess/expr.ts +0 -265
  391. package/src/parser/preprocess/utils.ts +0 -250
  392. package/src/parser/preprocess/whitespace.ts +0 -111
  393. package/src/parser/rules/block/align.ts +0 -282
  394. package/src/parser/rules/block/bibliography.ts +0 -359
  395. package/src/parser/rules/block/block-list.ts +0 -689
  396. package/src/parser/rules/block/blockquote.ts +0 -238
  397. package/src/parser/rules/block/code.ts +0 -187
  398. package/src/parser/rules/block/collapsible.ts +0 -337
  399. package/src/parser/rules/block/definition-list.ts +0 -270
  400. package/src/parser/rules/block/div.ts +0 -400
  401. package/src/parser/rules/block/embed-block.ts +0 -153
  402. package/src/parser/rules/block/footnoteblock.ts +0 -200
  403. package/src/parser/rules/block/heading.ts +0 -142
  404. package/src/parser/rules/block/html.ts +0 -222
  405. package/src/parser/rules/block/iframe.ts +0 -239
  406. package/src/parser/rules/block/include.ts +0 -179
  407. package/src/parser/rules/block/list.ts +0 -244
  408. package/src/parser/rules/block/math.ts +0 -183
  409. package/src/parser/rules/block/module/include/resolve.ts +0 -556
  410. package/src/parser/rules/block/module/listpages/types.ts +0 -513
  411. package/src/parser/rules/block/module/walk.ts +0 -380
  412. package/src/parser/rules/block/module.ts +0 -164
  413. package/src/parser/rules/block/orphan-li.ts +0 -177
  414. package/src/parser/rules/block/paragraph.ts +0 -157
  415. package/src/parser/rules/block/table-block.ts +0 -726
  416. package/src/parser/rules/block/table.ts +0 -441
  417. package/src/parser/rules/block/tabview.ts +0 -331
  418. package/src/parser/rules/block/toc.ts +0 -129
  419. package/src/parser/rules/inline/anchor-name.ts +0 -154
  420. package/src/parser/rules/inline/anchor.ts +0 -327
  421. package/src/parser/rules/inline/bibcite.ts +0 -153
  422. package/src/parser/rules/inline/color.ts +0 -140
  423. package/src/parser/rules/inline/equation-ref.ts +0 -115
  424. package/src/parser/rules/inline/expr.ts +0 -526
  425. package/src/parser/rules/inline/footnote.ts +0 -223
  426. package/src/parser/rules/inline/image.ts +0 -328
  427. package/src/parser/rules/inline/line-break.ts +0 -326
  428. package/src/parser/rules/inline/link-triple.ts +0 -267
  429. package/src/parser/rules/inline/math-inline.ts +0 -126
  430. package/src/parser/rules/inline/raw.ts +0 -262
  431. package/src/parser/rules/inline/size.ts +0 -244
  432. package/src/parser/rules/inline/span.ts +0 -424
  433. 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,2 @@
1
+ export { parseDateSelector } from "./date-selector";
2
+ export { parseNumericSelector } from "./numeric-selector";
@@ -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
- ListPagesQuery,
19
- NormalizedListPagesQuery,
20
- NormalizedTags,
21
- NormalizedCategory,
22
- NormalizedOrder,
23
- NormalizedParent,
24
- NormalizedDateSelector,
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
+ }