@wdprlib/parser 3.2.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/dist/index.cjs +10471 -8406
  2. package/dist/index.d.cts +313 -337
  3. package/dist/index.d.ts +313 -337
  4. package/dist/index.js +10457 -8392
  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 +30 -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 +62 -0
  195. package/src/parser/rules/block/module/listpages/url-resolution/value.ts +34 -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
@@ -24,163 +24,6 @@
24
24
  * @module
25
25
  */
26
26
 
27
- import type { ListPagesDataRequirement, ListPagesQuery, NormalizedListPagesQuery } from "./types";
28
- import { normalizeQuery } from "./normalize";
29
-
30
- /**
31
- * Mapping of module attribute names to their corresponding `ListPagesQuery` keys
32
- * and expected value types. Only fields listed here support `@URL` resolution.
33
- */
34
- const URL_RESOLVABLE_FIELDS: ReadonlyArray<{
35
- attr: string;
36
- queryKey: keyof ListPagesQuery;
37
- type: "string" | "number" | "boolean";
38
- }> = [
39
- { attr: "offset", queryKey: "offset", type: "number" },
40
- { attr: "limit", queryKey: "limit", type: "number" },
41
- { attr: "per-page", queryKey: "perPage", type: "number" },
42
- { attr: "order", queryKey: "order", type: "string" },
43
- { attr: "tags", queryKey: "tags", type: "string" },
44
- { attr: "category", queryKey: "category", type: "string" },
45
- { attr: "parent", queryKey: "parent", type: "string" },
46
- { attr: "range", queryKey: "range", type: "string" },
47
- { attr: "name", queryKey: "name", type: "string" },
48
- { attr: "fullname", queryKey: "fullname", type: "string" },
49
- { attr: "created-at", queryKey: "createdAt", type: "string" },
50
- { attr: "updated-at", queryKey: "updatedAt", type: "string" },
51
- { attr: "created-by", queryKey: "createdBy", type: "string" },
52
- { attr: "rating", queryKey: "rating", type: "string" },
53
- { attr: "votes", queryKey: "votes", type: "string" },
54
- { attr: "reverse", queryKey: "reverse", type: "boolean" },
55
- ];
56
-
57
- /**
58
- * Parse URL path parameters like /offset/1/page2_limit/1
59
- * Returns a map of parameter name -> value
60
- */
61
- export function parseUrlParams(url: string): Map<string, string> {
62
- const params = new Map<string, string>();
63
- const parts = url.split("/").filter(Boolean);
64
-
65
- // Skip the page name (first part), parse key/value pairs
66
- for (let i = 1; i < parts.length - 1; i += 2) {
67
- const key = parts[i];
68
- const value = parts[i + 1];
69
- if (key && value) {
70
- params.set(key, value);
71
- }
72
- }
73
-
74
- return params;
75
- }
76
-
77
- /**
78
- * Resolve @URL|default format with actual URL parameters
79
- *
80
- * @param rawValue - The raw attribute value (e.g., "@URL|0")
81
- * @param paramName - The parameter name (e.g., "offset")
82
- * @param urlParams - Parsed URL parameters
83
- * @param prefix - Optional URL attribute prefix (e.g., "page2")
84
- * @returns Resolved value
85
- */
86
- export function resolveUrlValue(
87
- rawValue: string | undefined,
88
- paramName: string,
89
- urlParams: Map<string, string>,
90
- prefix?: string,
91
- ): string | undefined {
92
- if (!rawValue) return undefined;
93
-
94
- // Check for @URL or @URL|default format
95
- if (!rawValue.startsWith("@URL")) {
96
- return rawValue;
97
- }
98
-
99
- // Extract default value if present
100
- const defaultValue = rawValue.includes("|") ? rawValue.split("|")[1] : undefined;
101
-
102
- // Build the actual parameter name with prefix
103
- const actualParamName = prefix ? `${prefix}_${paramName}` : paramName;
104
-
105
- // Get from URL params or use default
106
- return urlParams.get(actualParamName) ?? defaultValue;
107
- }
108
-
109
- /**
110
- * Resolve all `@URL` parameters and build a ListPagesQuery
111
- *
112
- * Takes a ListPagesDataRequirement and URL parameters, resolves all `@URL|default`
113
- * values, and returns a complete ListPagesQuery ready for database queries.
114
- *
115
- * @param requirement - The data requirement from AST extraction
116
- * @param urlParams - Parsed URL parameters (from parseUrlParams)
117
- * @returns Resolved ListPagesQuery
118
- *
119
- * @example
120
- * ```typescript
121
- * const urlParams = parseUrlParams("/page/scp-001/page2_offset/10/page2_limit/5");
122
- * const query = resolveQuery(requirement, urlParams);
123
- * // query.offset = 10, query.limit = 5 (if urlAttrPrefix = "page2")
124
- * ```
125
- */
126
- export function resolveQuery(
127
- requirement: ListPagesDataRequirement,
128
- urlParams: Map<string, string>,
129
- ): ListPagesQuery {
130
- const { query, rawAttributes, urlAttrPrefix } = requirement;
131
- const resolved: ListPagesQuery = { ...query };
132
-
133
- for (const field of URL_RESOLVABLE_FIELDS) {
134
- const rawValue = rawAttributes[field.attr];
135
- if (!rawValue) continue;
136
-
137
- const resolvedValue = resolveUrlValue(rawValue, field.attr, urlParams, urlAttrPrefix);
138
- if (resolvedValue === undefined) continue;
139
-
140
- // Convert to appropriate type
141
- switch (field.type) {
142
- case "number": {
143
- const num = parseInt(resolvedValue, 10);
144
- if (!Number.isNaN(num)) {
145
- (resolved as Record<string, unknown>)[field.queryKey] = num;
146
- }
147
- break;
148
- }
149
- case "boolean":
150
- (resolved as Record<string, unknown>)[field.queryKey] =
151
- resolvedValue === "true" || resolvedValue === "yes" || resolvedValue === "1";
152
- break;
153
- case "string":
154
- default:
155
- (resolved as Record<string, unknown>)[field.queryKey] = resolvedValue;
156
- break;
157
- }
158
- }
159
-
160
- return resolved;
161
- }
162
-
163
- /**
164
- * Resolve all `@URL` parameters and normalize the query
165
- *
166
- * Combines URL resolution with query normalization in a single call.
167
- * This is the recommended way to process ListPages queries for HPC.
168
- *
169
- * @param requirement - The data requirement from AST extraction
170
- * @param urlParams - Parsed URL parameters (from parseUrlParams)
171
- * @returns Normalized query with all `@URL` values resolved
172
- *
173
- * @example
174
- * ```typescript
175
- * const urlParams = parseUrlParams(window.location.pathname);
176
- * const normalizedQuery = resolveAndNormalizeQuery(requirement, urlParams);
177
- * // Ready for database query building
178
- * ```
179
- */
180
- export function resolveAndNormalizeQuery(
181
- requirement: ListPagesDataRequirement,
182
- urlParams: Map<string, string>,
183
- ): NormalizedListPagesQuery {
184
- const resolved = resolveQuery(requirement, urlParams);
185
- return normalizeQuery(resolved);
186
- }
27
+ export { parseUrlParams } from "./url-resolution/params";
28
+ export { resolveAndNormalizeQuery, resolveQuery } from "./url-resolution/resolve";
29
+ export { resolveUrlValue } from "./url-resolution/value";
@@ -13,9 +13,8 @@
13
13
  */
14
14
 
15
15
  import type { ListUsersCompiledTemplate, ListUsersVariableContext } from "./types";
16
-
17
- /** Regex for matching `%%variable%%` patterns in the template. */
18
- const VARIABLE_REGEX = /%%([a-z_]+)%%/gi;
16
+ import { createListUsersVariableGetter } from "./getters";
17
+ import { LIST_USERS_VARIABLE_REGEX } from "./variables";
19
18
 
20
19
  /**
21
20
  * Compile a ListUsers template string into an executable function.
@@ -30,14 +29,14 @@ export function compileListUsersTemplate(template: string): ListUsersCompiledTem
30
29
  const parts: (string | ((ctx: ListUsersVariableContext) => string))[] = [];
31
30
  let lastIndex = 0;
32
31
 
33
- for (const match of template.matchAll(VARIABLE_REGEX)) {
32
+ for (const match of template.matchAll(LIST_USERS_VARIABLE_REGEX)) {
34
33
  if (match.index !== undefined && match.index > lastIndex) {
35
34
  parts.push(template.slice(lastIndex, match.index));
36
35
  }
37
36
 
38
37
  const [, varName] = match;
39
38
  if (!varName) continue;
40
- const getter = createVariableGetter(varName.toLowerCase());
39
+ const getter = createListUsersVariableGetter(varName.toLowerCase());
41
40
  parts.push(getter);
42
41
 
43
42
  lastIndex = match.index !== undefined ? match.index + match[0].length : lastIndex;
@@ -55,23 +54,3 @@ export function compileListUsersTemplate(template: string): ListUsersCompiledTem
55
54
  return result;
56
55
  };
57
56
  }
58
-
59
- /**
60
- * Create a getter function for a specific ListUsers variable.
61
- *
62
- * @param name - Lowercase variable name
63
- * @returns A function that extracts the variable's value from a ListUsersVariableContext.
64
- * Unknown names return a function that always returns an empty string.
65
- */
66
- function createVariableGetter(name: string): (ctx: ListUsersVariableContext) => string {
67
- switch (name) {
68
- case "number":
69
- return (ctx) => String(ctx.user.number);
70
- case "title":
71
- return (ctx) => ctx.user.title;
72
- case "name":
73
- return (ctx) => ctx.user.name;
74
- default:
75
- return () => "";
76
- }
77
- }
@@ -11,12 +11,7 @@
11
11
 
12
12
  import type { ListUsersVariable } from "./types";
13
13
  import { compileListUsersTemplate } from "./compiler";
14
-
15
- /** Regex for matching `%%variable%%` patterns in ListUsers templates. */
16
- const VARIABLE_REGEX = /%%([a-z_]+)%%/gi;
17
-
18
- /** The complete list of recognized ListUsers template variables. */
19
- const KNOWN_VARIABLES: ListUsersVariable[] = ["number", "title", "name"];
14
+ import { isListUsersVariable, LIST_USERS_VARIABLE_REGEX } from "./variables";
20
15
 
21
16
  /**
22
17
  * Extract the set of template variables referenced in a ListUsers template string.
@@ -30,12 +25,12 @@ const KNOWN_VARIABLES: ListUsersVariable[] = ["number", "title", "name"];
30
25
  export function extractListUsersVariables(template: string): ListUsersVariable[] {
31
26
  const variables = new Set<ListUsersVariable>();
32
27
 
33
- for (const match of template.matchAll(VARIABLE_REGEX)) {
28
+ for (const match of template.matchAll(LIST_USERS_VARIABLE_REGEX)) {
34
29
  const [, varName] = match;
35
30
  if (!varName) continue;
36
31
  const normalized = varName.toLowerCase();
37
- if (KNOWN_VARIABLES.includes(normalized as ListUsersVariable)) {
38
- variables.add(normalized as ListUsersVariable);
32
+ if (isListUsersVariable(normalized)) {
33
+ variables.add(normalized);
39
34
  }
40
35
  }
41
36
 
@@ -0,0 +1,21 @@
1
+ import type { ListUsersVariableContext } from "./types";
2
+
3
+ type ListUsersVariableGetter = (ctx: ListUsersVariableContext) => string;
4
+
5
+ /**
6
+ * Create a getter function for a specific ListUsers variable.
7
+ *
8
+ * Unknown names return a function that always returns an empty string.
9
+ */
10
+ export function createListUsersVariableGetter(name: string): ListUsersVariableGetter {
11
+ switch (name) {
12
+ case "number":
13
+ return (ctx) => String(ctx.user.number);
14
+ case "title":
15
+ return (ctx) => ctx.user.title;
16
+ case "name":
17
+ return (ctx) => ctx.user.name;
18
+ default:
19
+ return () => "";
20
+ }
21
+ }
@@ -0,0 +1,15 @@
1
+ import type { ListUsersVariable } from "./types";
2
+
3
+ /** Regex for matching `%%variable%%` patterns in ListUsers templates. */
4
+ export const LIST_USERS_VARIABLE_REGEX: RegExp = /%%([a-z_]+)%%/gi;
5
+
6
+ /** The complete set of recognized ListUsers template variables. */
7
+ const KNOWN_VARIABLES: ReadonlySet<string> = new Set<ListUsersVariable>([
8
+ "number",
9
+ "title",
10
+ "name",
11
+ ]);
12
+
13
+ export function isListUsersVariable(name: string): name is ListUsersVariable {
14
+ return KNOWN_VARIABLES.has(name);
15
+ }
@@ -0,0 +1,57 @@
1
+ import type { ParseContext } from "../../types";
2
+ import { parseAttributesRaw, parseBlockName } from "../utils";
3
+
4
+ export interface ModuleOpenResult {
5
+ moduleName: string;
6
+ attrs: Record<string, string>;
7
+ pos: number;
8
+ consumed: number;
9
+ }
10
+
11
+ export function parseModuleOpen(ctx: ParseContext): ModuleOpenResult | null {
12
+ if (ctx.tokens[ctx.pos]?.type !== "BLOCK_OPEN") {
13
+ return null;
14
+ }
15
+
16
+ let pos = ctx.pos + 1;
17
+ let consumed = 1;
18
+
19
+ const nameResult = parseBlockName(ctx, pos);
20
+ if (!nameResult || (nameResult.name !== "module" && nameResult.name !== "module654")) {
21
+ return null;
22
+ }
23
+
24
+ pos += nameResult.consumed;
25
+ consumed += nameResult.consumed;
26
+
27
+ while (ctx.tokens[pos]?.type === "WHITESPACE") {
28
+ pos++;
29
+ consumed++;
30
+ }
31
+
32
+ const nameToken = ctx.tokens[pos];
33
+ const moduleName =
34
+ nameToken?.type === "TEXT" || nameToken?.type === "IDENTIFIER" ? nameToken.value : "";
35
+ if (moduleName) {
36
+ pos++;
37
+ consumed++;
38
+ }
39
+
40
+ const attrResult = parseAttributesRaw(ctx, pos);
41
+ pos += attrResult.consumed;
42
+ consumed += attrResult.consumed;
43
+
44
+ if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
45
+ return null;
46
+ }
47
+
48
+ pos++;
49
+ consumed++;
50
+
51
+ return {
52
+ moduleName,
53
+ attrs: attrResult.attrs,
54
+ pos,
55
+ consumed,
56
+ };
57
+ }
@@ -0,0 +1,78 @@
1
+ import type { DataProvider } from "../types-common";
2
+ import type {
3
+ CompiledTemplate,
4
+ ListPagesDataRequirement,
5
+ ListPagesExternalData,
6
+ } from "../listpages/types";
7
+ import type {
8
+ ListUsersCompiledTemplate,
9
+ ListUsersDataRequirement,
10
+ ListUsersExternalData,
11
+ } from "../listusers/types";
12
+ import type { ParseFunction } from "../listpages/resolve";
13
+ import { buildListPagesDataMap, buildListUsersDataMap } from "./data-maps";
14
+
15
+ /**
16
+ * Context for ListPages resolution.
17
+ */
18
+ export interface ListPagesContext {
19
+ dataMap: Map<number, ListPagesExternalData>;
20
+ compiledTemplates: Map<number, CompiledTemplate>;
21
+ parse: ParseFunction;
22
+ }
23
+
24
+ /**
25
+ * Context for ListUsers resolution.
26
+ */
27
+ export interface ListUsersContext {
28
+ dataMap: Map<number, ListUsersExternalData>;
29
+ compiledTemplates: Map<number, ListUsersCompiledTemplate>;
30
+ parse: ParseFunction;
31
+ }
32
+
33
+ export async function buildListPagesContext(
34
+ dataProvider: DataProvider,
35
+ requirements: ListPagesDataRequirement[],
36
+ compiledTemplates: Map<number, CompiledTemplate>,
37
+ parse: ParseFunction,
38
+ urlPath: string | undefined,
39
+ ): Promise<ListPagesContext | null> {
40
+ if (requirements.length === 0 || !dataProvider.fetchListPages) {
41
+ return null;
42
+ }
43
+
44
+ const dataMap = await buildListPagesDataMap(dataProvider, requirements, urlPath);
45
+
46
+ if (dataMap.size === 0) {
47
+ return null;
48
+ }
49
+
50
+ return {
51
+ dataMap,
52
+ compiledTemplates,
53
+ parse,
54
+ };
55
+ }
56
+
57
+ export async function buildListUsersContext(
58
+ dataProvider: DataProvider,
59
+ requirements: ListUsersDataRequirement[],
60
+ compiledTemplates: Map<number, ListUsersCompiledTemplate> | undefined,
61
+ parse: ParseFunction,
62
+ ): Promise<ListUsersContext | null> {
63
+ if (requirements.length === 0 || !dataProvider.fetchListUsers) {
64
+ return null;
65
+ }
66
+
67
+ const dataMap = await buildListUsersDataMap(dataProvider, requirements);
68
+
69
+ if (dataMap.size === 0) {
70
+ return null;
71
+ }
72
+
73
+ return {
74
+ dataMap,
75
+ compiledTemplates: compiledTemplates ?? new Map(),
76
+ parse,
77
+ };
78
+ }
@@ -0,0 +1,39 @@
1
+ import type { DataProvider } from "../types-common";
2
+ import type { ListPagesDataRequirement, ListPagesExternalData } from "../listpages/types";
3
+ import type { ListUsersDataRequirement, ListUsersExternalData } from "../listusers/types";
4
+ import { parseUrlParams, resolveAndNormalizeQuery } from "../listpages/url-resolver";
5
+
6
+ export async function buildListPagesDataMap(
7
+ dataProvider: DataProvider,
8
+ requirements: ListPagesDataRequirement[],
9
+ urlPath: string | undefined,
10
+ ): Promise<Map<number, ListPagesExternalData>> {
11
+ const dataMap = new Map<number, ListPagesExternalData>();
12
+ const urlParams = parseUrlParams(urlPath ?? "");
13
+
14
+ for (const req of requirements) {
15
+ const normalizedQuery = resolveAndNormalizeQuery(req, urlParams);
16
+ const data = await dataProvider.fetchListPages?.(normalizedQuery, req);
17
+ if (data) {
18
+ dataMap.set(req.id, data);
19
+ }
20
+ }
21
+
22
+ return dataMap;
23
+ }
24
+
25
+ export async function buildListUsersDataMap(
26
+ dataProvider: DataProvider,
27
+ requirements: ListUsersDataRequirement[],
28
+ ): Promise<Map<number, ListUsersExternalData>> {
29
+ const dataMap = new Map<number, ListUsersExternalData>();
30
+
31
+ for (const req of requirements) {
32
+ const data = await dataProvider.fetchListUsers?.(req);
33
+ if (data) {
34
+ dataMap.set(req.id, data);
35
+ }
36
+ }
37
+
38
+ return dataMap;
39
+ }
@@ -0,0 +1,93 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import { isListPagesModule, resolveListPages } from "../listpages/resolve";
3
+ import { isListUsersModule, resolveListUsers } from "../listusers/resolve";
4
+ import { walkElements } from "../walk";
5
+ import type { ListPagesContext, ListUsersContext } from "./contexts";
6
+
7
+ export interface DynamicModuleContext {
8
+ listPages: ListPagesContext | null;
9
+ listUsers: ListUsersContext | null;
10
+ fetchListPagesProvided: boolean;
11
+ fetchListUsersProvided: boolean;
12
+ }
13
+
14
+ export interface DynamicModuleIds {
15
+ listPagesId: number;
16
+ listUsersId: number;
17
+ }
18
+
19
+ export interface DynamicModuleResolution {
20
+ handled: boolean;
21
+ elements: Element[];
22
+ ids: DynamicModuleIds;
23
+ }
24
+
25
+ export function resolveDynamicModuleElement(
26
+ element: Element,
27
+ ctx: DynamicModuleContext,
28
+ ids: DynamicModuleIds,
29
+ ): DynamicModuleResolution {
30
+ if (element.element !== "module") {
31
+ return { handled: false, elements: [element], ids };
32
+ }
33
+
34
+ if (isListPagesModule(element.data)) {
35
+ const elements: Element[] = [];
36
+ const listPagesId = ids.listPagesId;
37
+
38
+ if (ctx.listPages) {
39
+ const moduleData = ctx.listPages.dataMap.get(listPagesId);
40
+ const template = ctx.listPages.compiledTemplates.get(listPagesId);
41
+
42
+ if (moduleData && template) {
43
+ elements.push(...resolveListPages(element.data, moduleData, template, ctx.listPages.parse));
44
+ }
45
+ } else if (!ctx.fetchListPagesProvided) {
46
+ elements.push(element);
47
+ }
48
+
49
+ return {
50
+ handled: true,
51
+ elements,
52
+ ids: { ...ids, listPagesId: listPagesId + 1 },
53
+ };
54
+ }
55
+
56
+ if (isListUsersModule(element.data)) {
57
+ const elements: Element[] = [];
58
+ const listUsersId = ids.listUsersId;
59
+
60
+ if (ctx.listUsers) {
61
+ const moduleData = ctx.listUsers.dataMap.get(listUsersId);
62
+ const template = ctx.listUsers.compiledTemplates.get(listUsersId);
63
+
64
+ if (moduleData && template) {
65
+ elements.push(...resolveListUsers(element.data, moduleData, template, ctx.listUsers.parse));
66
+ }
67
+ } else if (!ctx.fetchListUsersProvided) {
68
+ elements.push(element);
69
+ }
70
+
71
+ return {
72
+ handled: true,
73
+ elements,
74
+ ids: { ...ids, listUsersId: listUsersId + 1 },
75
+ };
76
+ }
77
+
78
+ return { handled: false, elements: [element], ids };
79
+ }
80
+
81
+ export function countDynamicModules(elements: Element[]): DynamicModuleIds {
82
+ const counts: DynamicModuleIds = { listPagesId: 0, listUsersId: 0 };
83
+ walkElements(elements, (element) => {
84
+ if (element.element !== "module") return;
85
+
86
+ if (isListPagesModule(element.data)) {
87
+ counts.listPagesId++;
88
+ } else if (isListUsersModule(element.data)) {
89
+ counts.listUsersId++;
90
+ }
91
+ });
92
+ return counts;
93
+ }
@@ -0,0 +1,53 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import { STYLE_SLOT_PREFIX } from "@wdprlib/ast";
3
+ import { mapElementChildren } from "../walk";
4
+ import type { IfTagsData } from "../iftags/resolve";
5
+
6
+ type IfTagsDataWithStyleSlot = IfTagsData & {
7
+ _styleSlot: number;
8
+ };
9
+
10
+ /**
11
+ * Collect and remove style elements from the AST.
12
+ *
13
+ * Unresolved `if-tags` elements receive style-slot placeholders so render-time
14
+ * iftags evaluation can preserve style order relative to already collected CSS.
15
+ */
16
+ export function collectStyles(elements: Element[]): { elements: Element[]; styles: string[] } {
17
+ const styles: string[] = [];
18
+ const ctx = { nextSlotId: 0 };
19
+ const filtered = collectStylesFromElements(elements, styles, ctx);
20
+ return { elements: filtered, styles };
21
+ }
22
+
23
+ function collectStylesFromElements(
24
+ elements: Element[],
25
+ styles: string[],
26
+ ctx: { nextSlotId: number },
27
+ ): Element[] {
28
+ const result: Element[] = [];
29
+
30
+ for (const element of elements) {
31
+ if (element.element === "style") {
32
+ styles.push(element.data as string);
33
+ continue;
34
+ }
35
+
36
+ if (element.element === "if-tags") {
37
+ const slotId = ctx.nextSlotId++;
38
+ styles.push(`${STYLE_SLOT_PREFIX}${slotId}`);
39
+ const data: IfTagsDataWithStyleSlot = { ...(element.data as IfTagsData), _styleSlot: slotId };
40
+ result.push({
41
+ element: "if-tags",
42
+ data,
43
+ });
44
+ continue;
45
+ }
46
+
47
+ result.push(
48
+ mapElementChildren(element, (children) => collectStylesFromElements(children, styles, ctx)),
49
+ );
50
+ }
51
+
52
+ return result;
53
+ }