@wdprlib/parser 3.1.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/dist/index.cjs +10456 -8230
  2. package/dist/index.d.cts +313 -337
  3. package/dist/index.d.ts +313 -337
  4. package/dist/index.js +10460 -8234
  5. package/package.json +5 -3
  6. package/src/index.ts +170 -0
  7. package/src/lexer/anchor.ts +48 -0
  8. package/src/lexer/index.ts +21 -0
  9. package/src/lexer/lexer.ts +201 -0
  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/lexer/tokens.ts +141 -0
  22. package/src/parser/constants.ts +175 -0
  23. package/src/parser/depth/index.ts +111 -0
  24. package/src/parser/depth/stack.ts +82 -0
  25. package/src/parser/index.ts +18 -0
  26. package/src/parser/parse/block.ts +42 -0
  27. package/src/parser/parse/context.ts +26 -0
  28. package/src/parser/parse/footnotes.ts +25 -0
  29. package/src/parser/parse/index.ts +42 -0
  30. package/src/parser/parse/options.ts +34 -0
  31. package/src/parser/parse/parser.ts +79 -0
  32. package/src/parser/parse/plain-non-ascii.ts +129 -0
  33. package/src/parser/parse/result.ts +57 -0
  34. package/src/parser/parse/source.ts +11 -0
  35. package/src/parser/postprocess/divAdjacentParagraph.ts +76 -0
  36. package/src/parser/postprocess/index.ts +15 -0
  37. package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
  38. package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
  39. package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
  40. package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
  41. package/src/parser/postprocess/spanStrip/factory.ts +23 -0
  42. package/src/parser/postprocess/spanStrip/index.ts +8 -0
  43. package/src/parser/postprocess/spanStrip/merge.ts +117 -0
  44. package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
  45. package/src/parser/postprocess/spanStrip/split.ts +67 -0
  46. package/src/parser/preprocess/expr/chars.ts +15 -0
  47. package/src/parser/preprocess/expr/evaluate.ts +22 -0
  48. package/src/parser/preprocess/expr/index.ts +45 -0
  49. package/src/parser/preprocess/expr/kind.ts +19 -0
  50. package/src/parser/preprocess/expr/parse.ts +103 -0
  51. package/src/parser/preprocess/expr/scan.ts +34 -0
  52. package/src/parser/preprocess/expr/types.ts +14 -0
  53. package/src/parser/preprocess/index.ts +38 -0
  54. package/src/parser/preprocess/typography.ts +132 -0
  55. package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
  56. package/src/parser/preprocess/utils/index.ts +13 -0
  57. package/src/parser/preprocess/utils/raw-regions.ts +153 -0
  58. package/src/parser/preprocess/whitespace/detection.ts +39 -0
  59. package/src/parser/preprocess/whitespace/index.ts +79 -0
  60. package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
  61. package/src/parser/preprocess/whitespace/patterns.ts +23 -0
  62. package/src/parser/rules/block/align/body.ts +46 -0
  63. package/src/parser/rules/block/align/element.ts +13 -0
  64. package/src/parser/rules/block/align/index.ts +90 -0
  65. package/src/parser/rules/block/align/syntax.ts +113 -0
  66. package/src/parser/rules/block/bibliography/body.ts +81 -0
  67. package/src/parser/rules/block/bibliography/entries.ts +49 -0
  68. package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
  69. package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
  70. package/src/parser/rules/block/bibliography/index.ts +90 -0
  71. package/src/parser/rules/block/bibliography/open.ts +53 -0
  72. package/src/parser/rules/block/block-list/bare-content.ts +105 -0
  73. package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
  74. package/src/parser/rules/block/block-list/index.ts +51 -0
  75. package/src/parser/rules/block/block-list/item-content.ts +132 -0
  76. package/src/parser/rules/block/block-list/li-content.ts +107 -0
  77. package/src/parser/rules/block/block-list/li-item.ts +77 -0
  78. package/src/parser/rules/block/block-list/list-block.ts +100 -0
  79. package/src/parser/rules/block/block-list/open.ts +51 -0
  80. package/src/parser/rules/block/block-list/tags.ts +50 -0
  81. package/src/parser/rules/block/blockquote/build.ts +62 -0
  82. package/src/parser/rules/block/blockquote/index.ts +80 -0
  83. package/src/parser/rules/block/blockquote/line.ts +79 -0
  84. package/src/parser/rules/block/blockquote/lines.ts +39 -0
  85. package/src/parser/rules/block/center/index.ts +72 -0
  86. package/src/parser/rules/block/center/open.ts +27 -0
  87. package/src/parser/rules/block/clear-float/index.ts +51 -0
  88. package/src/parser/rules/block/clear-float/syntax.ts +43 -0
  89. package/src/parser/rules/block/code/attributes.ts +30 -0
  90. package/src/parser/rules/block/code/content.ts +57 -0
  91. package/src/parser/rules/block/code/index.ts +100 -0
  92. package/src/parser/rules/block/collapsible/attributes.ts +95 -0
  93. package/src/parser/rules/block/collapsible/body.ts +69 -0
  94. package/src/parser/rules/block/collapsible/index.ts +117 -0
  95. package/src/parser/rules/block/collapsible/open.ts +51 -0
  96. package/src/parser/rules/block/collapsible/orphans.ts +31 -0
  97. package/src/parser/rules/block/collapsible/tags.ts +17 -0
  98. package/src/parser/rules/block/comment/consume.ts +37 -0
  99. package/src/parser/rules/block/comment/index.ts +47 -0
  100. package/src/parser/rules/block/content-separator/index.ts +49 -0
  101. package/src/parser/rules/block/content-separator/syntax.ts +33 -0
  102. package/src/parser/rules/block/definition-list/collect.ts +40 -0
  103. package/src/parser/rules/block/definition-list/index.ts +63 -0
  104. package/src/parser/rules/block/definition-list/item-key.ts +95 -0
  105. package/src/parser/rules/block/definition-list/item-value.ts +56 -0
  106. package/src/parser/rules/block/definition-list/items.ts +54 -0
  107. package/src/parser/rules/block/div/body.ts +41 -0
  108. package/src/parser/rules/block/div/close.ts +41 -0
  109. package/src/parser/rules/block/div/failed.ts +117 -0
  110. package/src/parser/rules/block/div/index.ts +112 -0
  111. package/src/parser/rules/block/div/nesting.ts +37 -0
  112. package/src/parser/rules/block/div/open.ts +59 -0
  113. package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
  114. package/src/parser/rules/block/embed-block/content.ts +53 -0
  115. package/src/parser/rules/block/embed-block/index.ts +91 -0
  116. package/src/parser/rules/block/embed-block/open.ts +52 -0
  117. package/src/parser/rules/block/embed-block/tags.ts +5 -0
  118. package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
  119. package/src/parser/rules/block/footnoteblock/index.ts +82 -0
  120. package/src/parser/rules/block/footnoteblock/open.ts +53 -0
  121. package/src/parser/rules/block/heading/index.ts +87 -0
  122. package/src/parser/rules/block/heading/open.ts +50 -0
  123. package/src/parser/rules/block/heading/toc-text.ts +26 -0
  124. package/src/parser/rules/block/horizontal-rule/index.ts +44 -0
  125. package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
  126. package/src/parser/rules/block/html/body.ts +114 -0
  127. package/src/parser/rules/block/html/diagnostics.ts +11 -0
  128. package/src/parser/rules/block/html/index.ts +95 -0
  129. package/src/parser/rules/block/html/open.ts +36 -0
  130. package/src/parser/rules/block/iframe/attributes.ts +106 -0
  131. package/src/parser/rules/block/iframe/index.ts +73 -0
  132. package/src/parser/rules/block/iframe/open.ts +58 -0
  133. package/src/parser/rules/block/iframe/source.ts +24 -0
  134. package/src/parser/rules/block/iframe/url.ts +38 -0
  135. package/src/parser/rules/block/iftags/body.ts +48 -0
  136. package/src/parser/rules/block/iftags/condition.ts +24 -0
  137. package/src/parser/rules/block/iftags/index.ts +108 -0
  138. package/src/parser/rules/block/include/arguments.ts +48 -0
  139. package/src/parser/rules/block/include/index.ts +75 -0
  140. package/src/parser/rules/block/include/location.ts +24 -0
  141. package/src/parser/rules/block/include/variables.ts +37 -0
  142. package/src/parser/rules/block/index.ts +127 -0
  143. package/src/parser/rules/block/list/index.ts +73 -0
  144. package/src/parser/rules/block/list/line.ts +77 -0
  145. package/src/parser/rules/block/list/native.ts +89 -0
  146. package/src/parser/rules/block/math/content.ts +54 -0
  147. package/src/parser/rules/block/math/index.ts +106 -0
  148. package/src/parser/rules/block/math/name.ts +35 -0
  149. package/src/parser/rules/block/module/backlinks/index.ts +31 -0
  150. package/src/parser/rules/block/module/backlinks/types.ts +21 -0
  151. package/src/parser/rules/block/module/body.ts +92 -0
  152. package/src/parser/rules/block/module/categories/index.ts +34 -0
  153. package/src/parser/rules/block/module/categories/types.ts +21 -0
  154. package/src/parser/rules/block/module/css/index.ts +37 -0
  155. package/src/parser/rules/block/module/element.ts +33 -0
  156. package/src/parser/rules/block/module/iftags/condition.ts +109 -0
  157. package/src/parser/rules/block/module/iftags/index.ts +26 -0
  158. package/src/parser/rules/block/module/iftags/preprocess.ts +140 -0
  159. package/src/parser/rules/block/module/iftags/resolve.ts +73 -0
  160. package/src/parser/rules/block/module/iftags/types.ts +63 -0
  161. package/src/parser/rules/block/module/include/directive.ts +91 -0
  162. package/src/parser/rules/block/module/include/index.ts +29 -0
  163. package/src/parser/rules/block/module/include/references.ts +42 -0
  164. package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
  165. package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
  166. package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
  167. package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
  168. package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
  169. package/src/parser/rules/block/module/include/scanner.ts +121 -0
  170. package/src/parser/rules/block/module/index.ts +134 -0
  171. package/src/parser/rules/block/module/join/index.ts +34 -0
  172. package/src/parser/rules/block/module/join/types.ts +23 -0
  173. package/src/parser/rules/block/module/listpages/compiler.ts +73 -0
  174. package/src/parser/rules/block/module/listpages/extract.ts +76 -0
  175. package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
  176. package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
  177. package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
  178. package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
  179. package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
  180. package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
  181. package/src/parser/rules/block/module/listpages/index.ts +83 -0
  182. package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
  183. package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
  184. package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
  185. package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
  186. package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
  187. package/src/parser/rules/block/module/listpages/normalize.ts +74 -0
  188. package/src/parser/rules/block/module/listpages/parser.ts +106 -0
  189. package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
  190. package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
  191. package/src/parser/rules/block/module/listpages/resolve.ts +60 -0
  192. package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
  193. package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
  194. package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
  195. package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
  196. package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
  197. package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
  198. package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
  199. package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
  200. package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
  201. package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
  202. package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
  203. package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
  204. package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
  205. package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
  206. package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
  207. package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
  208. package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
  209. package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
  210. package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
  211. package/src/parser/rules/block/module/listpages/url-resolution/params.ts +19 -0
  212. package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
  213. package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +53 -0
  214. package/src/parser/rules/block/module/listpages/url-resolution/value.ts +25 -0
  215. package/src/parser/rules/block/module/listpages/url-resolver.ts +29 -0
  216. package/src/parser/rules/block/module/listusers/compiler.ts +56 -0
  217. package/src/parser/rules/block/module/listusers/extract.ts +40 -0
  218. package/src/parser/rules/block/module/listusers/getters.ts +21 -0
  219. package/src/parser/rules/block/module/listusers/index.ts +36 -0
  220. package/src/parser/rules/block/module/listusers/parser.ts +54 -0
  221. package/src/parser/rules/block/module/listusers/resolve.ts +58 -0
  222. package/src/parser/rules/block/module/listusers/types.ts +93 -0
  223. package/src/parser/rules/block/module/listusers/variables.ts +15 -0
  224. package/src/parser/rules/block/module/mapping.ts +61 -0
  225. package/src/parser/rules/block/module/open.ts +57 -0
  226. package/src/parser/rules/block/module/page-tree/index.ts +38 -0
  227. package/src/parser/rules/block/module/page-tree/types.ts +29 -0
  228. package/src/parser/rules/block/module/rate/index.ts +28 -0
  229. package/src/parser/rules/block/module/rate/types.ts +19 -0
  230. package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
  231. package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
  232. package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
  233. package/src/parser/rules/block/module/resolution/styles.ts +53 -0
  234. package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
  235. package/src/parser/rules/block/module/resolve.ts +198 -0
  236. package/src/parser/rules/block/module/rule.ts +56 -0
  237. package/src/parser/rules/block/module/types-common.ts +70 -0
  238. package/src/parser/rules/block/module/types.ts +61 -0
  239. package/src/parser/rules/block/module/utils.ts +43 -0
  240. package/src/parser/rules/block/module/walk/children.ts +35 -0
  241. package/src/parser/rules/block/module/walk/index.ts +9 -0
  242. package/src/parser/rules/block/module/walk/map/index.ts +2 -0
  243. package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
  244. package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
  245. package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
  246. package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
  247. package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
  248. package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
  249. package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
  250. package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
  251. package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
  252. package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
  253. package/src/parser/rules/block/module/walk/map/types.ts +6 -0
  254. package/src/parser/rules/block/module/walk/traverse.ts +65 -0
  255. package/src/parser/rules/block/orphan-li/content.ts +60 -0
  256. package/src/parser/rules/block/orphan-li/index.ts +75 -0
  257. package/src/parser/rules/block/orphan-li/open.ts +25 -0
  258. package/src/parser/rules/block/orphan-li/tags.ts +40 -0
  259. package/src/parser/rules/block/paragraph/content.ts +12 -0
  260. package/src/parser/rules/block/paragraph/index.ts +60 -0
  261. package/src/parser/rules/block/paragraph/normalize.ts +52 -0
  262. package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
  263. package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
  264. package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
  265. package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
  266. package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
  267. package/src/parser/rules/block/parsing/block-item.ts +29 -0
  268. package/src/parser/rules/block/parsing/content.ts +127 -0
  269. package/src/parser/rules/block/parsing/end-condition.ts +51 -0
  270. package/src/parser/rules/block/parsing/inline-content.ts +105 -0
  271. package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
  272. package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
  273. package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
  274. package/src/parser/rules/block/table/index.ts +80 -0
  275. package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
  276. package/src/parser/rules/block/table/pipe/cell.ts +106 -0
  277. package/src/parser/rules/block/table/pipe/index.ts +2 -0
  278. package/src/parser/rules/block/table/pipe/row.ts +88 -0
  279. package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
  280. package/src/parser/rules/block/table/pipe/trim.ts +50 -0
  281. package/src/parser/rules/block/table-block/body.ts +79 -0
  282. package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
  283. package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
  284. package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
  285. package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
  286. package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
  287. package/src/parser/rules/block/table-block/cell.ts +64 -0
  288. package/src/parser/rules/block/table-block/index.ts +113 -0
  289. package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
  290. package/src/parser/rules/block/table-block/structure.ts +80 -0
  291. package/src/parser/rules/block/tabview/body.ts +64 -0
  292. package/src/parser/rules/block/tabview/index.ts +90 -0
  293. package/src/parser/rules/block/tabview/open.ts +50 -0
  294. package/src/parser/rules/block/tabview/tab.ts +92 -0
  295. package/src/parser/rules/block/tabview/tags.ts +30 -0
  296. package/src/parser/rules/block/toc/element.ts +11 -0
  297. package/src/parser/rules/block/toc/index.ts +44 -0
  298. package/src/parser/rules/block/toc/open.ts +84 -0
  299. package/src/parser/rules/block/utils.ts +15 -0
  300. package/src/parser/rules/common/attribute-safety.ts +109 -0
  301. package/src/parser/rules/common/block-name.ts +33 -0
  302. package/src/parser/rules/common/index.ts +2 -0
  303. package/src/parser/rules/contracts/index.ts +3 -0
  304. package/src/parser/rules/contracts/parse-context.ts +38 -0
  305. package/src/parser/rules/contracts/rule.ts +43 -0
  306. package/src/parser/rules/contracts/scope.ts +31 -0
  307. package/src/parser/rules/index.ts +49 -0
  308. package/src/parser/rules/inline/anchor/attributes.ts +54 -0
  309. package/src/parser/rules/inline/anchor/child.ts +26 -0
  310. package/src/parser/rules/inline/anchor/close.ts +34 -0
  311. package/src/parser/rules/inline/anchor/content.ts +59 -0
  312. package/src/parser/rules/inline/anchor/index.ts +103 -0
  313. package/src/parser/rules/inline/anchor/newline.ts +26 -0
  314. package/src/parser/rules/inline/anchor/open.ts +47 -0
  315. package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
  316. package/src/parser/rules/inline/anchor/syntax.ts +40 -0
  317. package/src/parser/rules/inline/anchor-name/index.ts +38 -0
  318. package/src/parser/rules/inline/anchor-name/name.ts +39 -0
  319. package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
  320. package/src/parser/rules/inline/bibcite/element.ts +14 -0
  321. package/src/parser/rules/inline/bibcite/index.ts +34 -0
  322. package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
  323. package/src/parser/rules/inline/bold.ts +49 -0
  324. package/src/parser/rules/inline/color/index.ts +35 -0
  325. package/src/parser/rules/inline/color/syntax.ts +69 -0
  326. package/src/parser/rules/inline/comment/consume.ts +31 -0
  327. package/src/parser/rules/inline/comment/index.ts +64 -0
  328. package/src/parser/rules/inline/equation-ref/element.ts +8 -0
  329. package/src/parser/rules/inline/equation-ref/index.ts +34 -0
  330. package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
  331. package/src/parser/rules/inline/expr/branch.ts +104 -0
  332. package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
  333. package/src/parser/rules/inline/expr/conditional.ts +80 -0
  334. package/src/parser/rules/inline/expr/depth.ts +25 -0
  335. package/src/parser/rules/inline/expr/elements.ts +39 -0
  336. package/src/parser/rules/inline/expr/index.ts +84 -0
  337. package/src/parser/rules/inline/expr/syntax.ts +45 -0
  338. package/src/parser/rules/inline/footnote/child.ts +22 -0
  339. package/src/parser/rules/inline/footnote/close.ts +33 -0
  340. package/src/parser/rules/inline/footnote/content.ts +54 -0
  341. package/src/parser/rules/inline/footnote/elements.ts +38 -0
  342. package/src/parser/rules/inline/footnote/index.ts +54 -0
  343. package/src/parser/rules/inline/footnote/newline.ts +27 -0
  344. package/src/parser/rules/inline/footnote/open.ts +38 -0
  345. package/src/parser/rules/inline/formatting/container.ts +50 -0
  346. package/src/parser/rules/inline/guillemet/index.ts +56 -0
  347. package/src/parser/rules/inline/guillemet/text.ts +11 -0
  348. package/src/parser/rules/inline/html/gate.ts +64 -0
  349. package/src/parser/rules/inline/html/index.ts +81 -0
  350. package/src/parser/rules/inline/html/open.ts +37 -0
  351. package/src/parser/rules/inline/image/attributes.ts +22 -0
  352. package/src/parser/rules/inline/image/body.ts +36 -0
  353. package/src/parser/rules/inline/image/index.ts +89 -0
  354. package/src/parser/rules/inline/image/open.ts +56 -0
  355. package/src/parser/rules/inline/image/source.ts +62 -0
  356. package/src/parser/rules/inline/image/syntax.ts +76 -0
  357. package/src/parser/rules/inline/index.ts +150 -0
  358. package/src/parser/rules/inline/italic.ts +46 -0
  359. package/src/parser/rules/inline/line-break/backslash.ts +58 -0
  360. package/src/parser/rules/inline/line-break/elements.ts +9 -0
  361. package/src/parser/rules/inline/line-break/index.ts +3 -0
  362. package/src/parser/rules/inline/line-break/newline.ts +82 -0
  363. package/src/parser/rules/inline/line-break/underscore.ts +45 -0
  364. package/src/parser/rules/inline/link-anchor.ts +72 -0
  365. package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
  366. package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
  367. package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
  368. package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
  369. package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
  370. package/src/parser/rules/inline/link-single.ts +73 -0
  371. package/src/parser/rules/inline/link-star.ts +72 -0
  372. package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
  373. package/src/parser/rules/inline/link-triple/index.ts +62 -0
  374. package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
  375. package/src/parser/rules/inline/link-triple/label.ts +35 -0
  376. package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
  377. package/src/parser/rules/inline/link-triple/target.ts +36 -0
  378. package/src/parser/rules/inline/math-inline/index.ts +40 -0
  379. package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
  380. package/src/parser/rules/inline/monospace.ts +50 -0
  381. package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
  382. package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
  383. package/src/parser/rules/inline/parsing/collect.ts +23 -0
  384. package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
  385. package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
  386. package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
  387. package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
  388. package/src/parser/rules/inline/parsing/rules.ts +34 -0
  389. package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
  390. package/src/parser/rules/inline/raw/angle.ts +40 -0
  391. package/src/parser/rules/inline/raw/double-at.ts +78 -0
  392. package/src/parser/rules/inline/raw/index.ts +26 -0
  393. package/src/parser/rules/inline/raw/result.ts +26 -0
  394. package/src/parser/rules/inline/size/content.ts +65 -0
  395. package/src/parser/rules/inline/size/index.ts +55 -0
  396. package/src/parser/rules/inline/size/open.ts +43 -0
  397. package/src/parser/rules/inline/size/value.ts +45 -0
  398. package/src/parser/rules/inline/span/content.ts +97 -0
  399. package/src/parser/rules/inline/span/elements.ts +108 -0
  400. package/src/parser/rules/inline/span/index.ts +79 -0
  401. package/src/parser/rules/inline/span/newline.ts +50 -0
  402. package/src/parser/rules/inline/span/syntax.ts +70 -0
  403. package/src/parser/rules/inline/strikethrough/index.ts +60 -0
  404. package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
  405. package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
  406. package/src/parser/rules/inline/subscript.ts +47 -0
  407. package/src/parser/rules/inline/superscript.ts +49 -0
  408. package/src/parser/rules/inline/text/element.ts +5 -0
  409. package/src/parser/rules/inline/text/index.ts +85 -0
  410. package/src/parser/rules/inline/underline/child.ts +26 -0
  411. package/src/parser/rules/inline/underline/content.ts +29 -0
  412. package/src/parser/rules/inline/underline/index.ts +84 -0
  413. package/src/parser/rules/inline/user/element.ts +11 -0
  414. package/src/parser/rules/inline/user/index.ts +34 -0
  415. package/src/parser/rules/inline/user/syntax.ts +67 -0
  416. package/src/parser/rules/inline/utils.ts +4 -0
  417. package/src/parser/rules/tokens.ts +106 -0
  418. package/src/parser/rules/types.ts +9 -0
  419. package/src/parser/toc.ts +130 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * User information.
3
+ */
4
+ export interface UserInfo {
5
+ id: number;
6
+ name: string;
7
+ unixName: string;
8
+ }
9
+
10
+ /**
11
+ * Page data provided by an external source.
12
+ */
13
+ export interface PageData {
14
+ // Identity
15
+ name: string;
16
+ category: string;
17
+ fullname: string;
18
+ title: string;
19
+
20
+ // Lifecycle - created
21
+ createdAt: Date;
22
+ createdBy?: UserInfo;
23
+
24
+ // Lifecycle - updated
25
+ updatedAt: Date;
26
+ updatedBy?: UserInfo;
27
+
28
+ // Lifecycle - commented
29
+ commentedAt?: Date;
30
+ commentedBy?: UserInfo;
31
+
32
+ // Parent
33
+ parentName?: string;
34
+ parentCategory?: string;
35
+ parentFullname?: string;
36
+ parentTitle?: string;
37
+
38
+ // Wikitext content split by ==== when resolving %%content{n}%%.
39
+ content?: string;
40
+
41
+ // Tags
42
+ tags: string[];
43
+ hiddenTags: string[];
44
+
45
+ // Form data
46
+ formData?: Record<string, string>;
47
+ formRaw?: Record<string, string>;
48
+ formLabel?: Record<string, string>;
49
+ formHint?: Record<string, string>;
50
+
51
+ // Metrics
52
+ children: number;
53
+ comments: number;
54
+ size: number;
55
+ rating: number;
56
+ ratingVotes: number;
57
+ ratingPercent?: number;
58
+ revisions: number;
59
+ }
60
+
61
+ /**
62
+ * Site context information.
63
+ */
64
+ export interface SiteContext {
65
+ title: string;
66
+ name: string;
67
+ domain: string;
68
+ }
69
+
70
+ /**
71
+ * External data for a single ListPages module.
72
+ */
73
+ export interface ListPagesExternalData {
74
+ pages: PageData[];
75
+ totalCount: number;
76
+ site: SiteContext;
77
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Public type facade for the ListPages module system.
3
+ *
4
+ * The actual declarations live under `listpages/types/` by lifecycle concern:
5
+ * query input, template variables, data requirements, external data, compiled
6
+ * templates, and normalized selectors.
7
+ *
8
+ * @module
9
+ */
10
+
11
+ export type * from "./query";
12
+ export type * from "./variables";
13
+ export type * from "./data-requirements";
14
+ export type * from "./external-data";
15
+ export type * from "./data-fetcher";
16
+ export type * from "./template";
17
+ export type * from "./normalized-query";
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Normalized tags selector.
3
+ */
4
+ export interface NormalizedTags {
5
+ /** AND conditions - pages must have all of these tags (+tag). */
6
+ all: string[];
7
+ /** OR conditions - pages must have any of these tags (no prefix). */
8
+ any: string[];
9
+ /** NOT conditions - pages must not have these tags (-tag). */
10
+ none: string[];
11
+ /** Special selector. */
12
+ special: "same-visible" | "same-all" | "none" | null;
13
+ }
14
+
15
+ /**
16
+ * Normalized category selector.
17
+ */
18
+ export interface NormalizedCategory {
19
+ /** Categories to include. */
20
+ include: string[];
21
+ /** Categories to exclude (-category). */
22
+ exclude: string[];
23
+ /** Select all categories (*). */
24
+ all: boolean;
25
+ /** Select current category (.). */
26
+ current: boolean;
27
+ }
28
+
29
+ /**
30
+ * Order field options.
31
+ */
32
+ export type OrderField =
33
+ | "created_at"
34
+ | "updated_at"
35
+ | "title"
36
+ | "fullname"
37
+ | "rating"
38
+ | "votes"
39
+ | "revisions"
40
+ | "comments"
41
+ | "size"
42
+ | "random";
43
+
44
+ /**
45
+ * Order direction.
46
+ */
47
+ export type OrderDirection = "asc" | "desc";
48
+
49
+ /**
50
+ * Normalized order specification.
51
+ */
52
+ export interface NormalizedOrder {
53
+ field: OrderField;
54
+ direction: OrderDirection;
55
+ }
56
+
57
+ /**
58
+ * Normalized parent selector.
59
+ */
60
+ export type NormalizedParent =
61
+ | { type: "none" }
62
+ | { type: "same" }
63
+ | { type: "different" }
64
+ | { type: "children" }
65
+ | { type: "page"; name: string };
66
+
67
+ /**
68
+ * Date comparison operators.
69
+ */
70
+ export type DateComparisonOp = "=" | "<" | ">" | "<=" | ">=" | "<>";
71
+
72
+ /**
73
+ * Normalized date selector.
74
+ */
75
+ export type NormalizedDateSelector =
76
+ | { type: "year"; year: number }
77
+ | { type: "month"; year: number; month: number }
78
+ | { type: "comparison"; op: DateComparisonOp; date: string }
79
+ | { type: "relative"; unit: "day" | "week" | "month"; count: number };
80
+
81
+ /**
82
+ * Numeric comparison operators.
83
+ */
84
+ export type NumericComparisonOp = "=" | "<" | ">" | "<=" | ">=";
85
+
86
+ /**
87
+ * Normalized numeric selector for rating/votes.
88
+ */
89
+ export interface NormalizedNumericSelector {
90
+ op: NumericComparisonOp;
91
+ value: number;
92
+ }
93
+
94
+ /**
95
+ * Fully normalized ListPages query.
96
+ *
97
+ * All string fields are parsed into structured selector objects. Use
98
+ * `normalizeQuery()` to convert from `ListPagesQuery`.
99
+ */
100
+ export interface NormalizedListPagesQuery {
101
+ pagetype?: "normal" | "hidden" | "*";
102
+ category?: NormalizedCategory;
103
+ tags?: NormalizedTags;
104
+ parent?: NormalizedParent;
105
+ linkTo?: string;
106
+ createdAt?: NormalizedDateSelector;
107
+ updatedAt?: NormalizedDateSelector;
108
+ createdBy?: string;
109
+ rating?: NormalizedNumericSelector;
110
+ votes?: NormalizedNumericSelector;
111
+ name?: string;
112
+ fullname?: string;
113
+ range?: "." | "before" | "after" | "others";
114
+ dataFormFields?: Record<string, string>;
115
+ order?: NormalizedOrder;
116
+ offset?: number;
117
+ limit?: number;
118
+ perPage?: number;
119
+ reverse?: boolean;
120
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * ListPages query parameters for page selection.
3
+ *
4
+ * @security All string fields contain untrusted user input from wikitext.
5
+ * When using these values in database queries:
6
+ * - NEVER interpolate directly into SQL/NoSQL query strings.
7
+ * - ALWAYS use parameterized queries or prepared statements.
8
+ * - For ORDER BY clauses, use a whitelist of allowed column names.
9
+ */
10
+ export interface ListPagesQuery {
11
+ /** Page type selector */
12
+ pagetype?: "normal" | "hidden" | "*";
13
+
14
+ /** Category selector. @untrusted User input - use parameterized queries. */
15
+ category?: string;
16
+
17
+ /** Tag selector, e.g. "+fruit -admin". @untrusted User input. */
18
+ tags?: string;
19
+
20
+ /** Parent page selector. @untrusted User input. */
21
+ parent?: string;
22
+
23
+ /** Link target selector. @untrusted User input. */
24
+ linkTo?: string;
25
+
26
+ /** Created date selector. @untrusted User input. */
27
+ createdAt?: string;
28
+
29
+ /** Updated date selector. @untrusted User input. */
30
+ updatedAt?: string;
31
+
32
+ /** Author selector. @untrusted User input. */
33
+ createdBy?: string;
34
+
35
+ /** Rating selector. @untrusted User input. */
36
+ rating?: string;
37
+
38
+ /** Votes selector. @untrusted User input. */
39
+ votes?: string;
40
+
41
+ /** Page name selector. @untrusted User input. */
42
+ name?: string;
43
+
44
+ /** Full page name selector (category:name). @untrusted User input. */
45
+ fullname?: string;
46
+
47
+ /** Range selector relative to current page */
48
+ range?: "." | "before" | "after" | "others";
49
+
50
+ /** Data form field selectors. @untrusted Both keys and values are user input. */
51
+ dataFormFields?: Record<string, string>;
52
+
53
+ /** Ordering specification. @untrusted Use whitelist validation for ORDER BY. */
54
+ order?: string;
55
+
56
+ /** Pagination offset */
57
+ offset?: number;
58
+
59
+ /** Maximum number of results */
60
+ limit?: number;
61
+
62
+ /** Results per page */
63
+ perPage?: number;
64
+
65
+ /** Reverse order */
66
+ reverse?: boolean;
67
+ }
@@ -0,0 +1,17 @@
1
+ import type { PageData, SiteContext } from "./external-data";
2
+
3
+ /**
4
+ * Context passed to a compiled ListPages template.
5
+ */
6
+ export interface VariableContext {
7
+ page: PageData;
8
+ index: number;
9
+ total: number;
10
+ limit?: number;
11
+ site: SiteContext;
12
+ }
13
+
14
+ /**
15
+ * Compiled template function.
16
+ */
17
+ export type CompiledTemplate = (ctx: VariableContext) => string;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * All supported ListPages template variables.
3
+ */
4
+ export type ListPagesVariable =
5
+ // Lifecycle - created
6
+ | "created_at"
7
+ | "created_by"
8
+ | "created_by_unix"
9
+ | "created_by_id"
10
+ | "created_by_linked"
11
+ // Lifecycle - updated
12
+ | "updated_at"
13
+ | "updated_by"
14
+ | "updated_by_unix"
15
+ | "updated_by_id"
16
+ | "updated_by_linked"
17
+ // Lifecycle - commented
18
+ | "commented_at"
19
+ | "commented_by"
20
+ | "commented_by_unix"
21
+ | "commented_by_id"
22
+ | "commented_by_linked"
23
+ // Structure - page
24
+ | "name"
25
+ | "category"
26
+ | "fullname"
27
+ | "title"
28
+ | "title_linked"
29
+ | "link"
30
+ // Structure - parent
31
+ | "parent_name"
32
+ | "parent_category"
33
+ | "parent_fullname"
34
+ | "parent_title"
35
+ | "parent_title_linked"
36
+ // Content
37
+ | "content"
38
+ | "content_n"
39
+ | "preview"
40
+ | "preview_n"
41
+ | "summary"
42
+ | "first_paragraph"
43
+ // Tags
44
+ | "tags"
45
+ | "tags_linked"
46
+ | "_tags"
47
+ | "_tags_linked"
48
+ // Form data
49
+ | "form_data"
50
+ | "form_raw"
51
+ | "form_label"
52
+ | "form_hint"
53
+ // Metrics
54
+ | "children"
55
+ | "comments"
56
+ | "size"
57
+ | "rating"
58
+ | "rating_votes"
59
+ | "rating_percent"
60
+ | "revisions"
61
+ // Pagination
62
+ | "index"
63
+ | "total"
64
+ | "limit"
65
+ | "total_or_limit"
66
+ // Site context
67
+ | "site_title"
68
+ | "site_name"
69
+ | "site_domain";
@@ -0,0 +1,48 @@
1
+ import type { ListPagesQuery } from "../types";
2
+
3
+ export type UrlResolvableField =
4
+ | { attr: string; queryKey: StringUrlQueryKey; type: "string" }
5
+ | { attr: string; queryKey: NumberUrlQueryKey; type: "number" }
6
+ | { attr: string; queryKey: BooleanUrlQueryKey; type: "boolean" };
7
+
8
+ type StringUrlQueryKey = Extract<
9
+ keyof ListPagesQuery,
10
+ | "order"
11
+ | "tags"
12
+ | "category"
13
+ | "parent"
14
+ | "range"
15
+ | "name"
16
+ | "fullname"
17
+ | "createdAt"
18
+ | "updatedAt"
19
+ | "createdBy"
20
+ | "rating"
21
+ | "votes"
22
+ >;
23
+
24
+ type NumberUrlQueryKey = Extract<keyof ListPagesQuery, "offset" | "limit" | "perPage">;
25
+ type BooleanUrlQueryKey = Extract<keyof ListPagesQuery, "reverse">;
26
+
27
+ /**
28
+ * Mapping of module attribute names to their corresponding `ListPagesQuery` keys
29
+ * and expected value types. Only fields listed here support `@URL` resolution.
30
+ */
31
+ export const URL_RESOLVABLE_FIELDS: readonly UrlResolvableField[] = [
32
+ { attr: "offset", queryKey: "offset", type: "number" },
33
+ { attr: "limit", queryKey: "limit", type: "number" },
34
+ { attr: "per-page", queryKey: "perPage", type: "number" },
35
+ { attr: "order", queryKey: "order", type: "string" },
36
+ { attr: "tags", queryKey: "tags", type: "string" },
37
+ { attr: "category", queryKey: "category", type: "string" },
38
+ { attr: "parent", queryKey: "parent", type: "string" },
39
+ { attr: "range", queryKey: "range", type: "string" },
40
+ { attr: "name", queryKey: "name", type: "string" },
41
+ { attr: "fullname", queryKey: "fullname", type: "string" },
42
+ { attr: "created-at", queryKey: "createdAt", type: "string" },
43
+ { attr: "updated-at", queryKey: "updatedAt", type: "string" },
44
+ { attr: "created-by", queryKey: "createdBy", type: "string" },
45
+ { attr: "rating", queryKey: "rating", type: "string" },
46
+ { attr: "votes", queryKey: "votes", type: "string" },
47
+ { attr: "reverse", queryKey: "reverse", type: "boolean" },
48
+ ];
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Parse URL path parameters like /offset/1/page2_limit/1.
3
+ * Returns a map of parameter name -> value.
4
+ */
5
+ export function parseUrlParams(url: string): Map<string, string> {
6
+ const params = new Map<string, string>();
7
+ const parts = url.split("/").filter(Boolean);
8
+
9
+ // Skip the page name (first part), parse key/value pairs.
10
+ for (let i = 1; i < parts.length - 1; i += 2) {
11
+ const key = parts[i];
12
+ const value = parts[i + 1];
13
+ if (key && value) {
14
+ params.set(key, value);
15
+ }
16
+ }
17
+
18
+ return params;
19
+ }
@@ -0,0 +1,24 @@
1
+ import type { ListPagesQuery } from "../types";
2
+ import type { UrlResolvableField } from "./fields";
3
+
4
+ export function assignResolvedUrlField(
5
+ query: ListPagesQuery,
6
+ field: UrlResolvableField,
7
+ value: string,
8
+ ): void {
9
+ switch (field.type) {
10
+ case "number": {
11
+ const num = parseInt(value, 10);
12
+ if (!Number.isNaN(num)) {
13
+ query[field.queryKey] = num;
14
+ }
15
+ return;
16
+ }
17
+ case "boolean":
18
+ query[field.queryKey] = value === "true" || value === "yes" || value === "1";
19
+ return;
20
+ case "string":
21
+ Object.assign(query, { [field.queryKey]: value });
22
+ return;
23
+ }
24
+ }
@@ -0,0 +1,53 @@
1
+ import type { ListPagesDataRequirement, ListPagesQuery, NormalizedListPagesQuery } from "../types";
2
+ import { normalizeQuery } from "../normalize";
3
+ import { URL_RESOLVABLE_FIELDS } from "./fields";
4
+ import { assignResolvedUrlField } from "./query";
5
+ import { resolveUrlValue } from "./value";
6
+
7
+ /**
8
+ * Resolve all `@URL` parameters and build a ListPagesQuery.
9
+ *
10
+ * Takes a ListPagesDataRequirement and URL parameters, resolves all `@URL|default`
11
+ * values, and returns a complete ListPagesQuery ready for database queries.
12
+ *
13
+ * @param requirement - The data requirement from AST extraction
14
+ * @param urlParams - Parsed URL parameters (from parseUrlParams)
15
+ * @returns Resolved ListPagesQuery
16
+ */
17
+ export function resolveQuery(
18
+ requirement: ListPagesDataRequirement,
19
+ urlParams: Map<string, string>,
20
+ ): ListPagesQuery {
21
+ const { query, rawAttributes, urlAttrPrefix } = requirement;
22
+ const resolved: ListPagesQuery = { ...query };
23
+
24
+ for (const field of URL_RESOLVABLE_FIELDS) {
25
+ const rawValue = rawAttributes[field.attr];
26
+ if (!rawValue) continue;
27
+
28
+ const resolvedValue = resolveUrlValue(rawValue, field.attr, urlParams, urlAttrPrefix);
29
+ if (resolvedValue === undefined) continue;
30
+
31
+ assignResolvedUrlField(resolved, field, resolvedValue);
32
+ }
33
+
34
+ return resolved;
35
+ }
36
+
37
+ /**
38
+ * Resolve all `@URL` parameters and normalize the query.
39
+ *
40
+ * Combines URL resolution with query normalization in a single call.
41
+ * This is the recommended way to process ListPages queries for HPC.
42
+ *
43
+ * @param requirement - The data requirement from AST extraction
44
+ * @param urlParams - Parsed URL parameters (from parseUrlParams)
45
+ * @returns Normalized query with all `@URL` values resolved
46
+ */
47
+ export function resolveAndNormalizeQuery(
48
+ requirement: ListPagesDataRequirement,
49
+ urlParams: Map<string, string>,
50
+ ): NormalizedListPagesQuery {
51
+ const resolved = resolveQuery(requirement, urlParams);
52
+ return normalizeQuery(resolved);
53
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Resolve @URL|default format with actual URL parameters.
3
+ *
4
+ * @param rawValue - The raw attribute value (e.g., "@URL|0")
5
+ * @param paramName - The parameter name (e.g., "offset")
6
+ * @param urlParams - Parsed URL parameters
7
+ * @param prefix - Optional URL attribute prefix (e.g., "page2")
8
+ * @returns Resolved value
9
+ */
10
+ export function resolveUrlValue(
11
+ rawValue: string | undefined,
12
+ paramName: string,
13
+ urlParams: Map<string, string>,
14
+ prefix?: string,
15
+ ): string | undefined {
16
+ if (!rawValue) return undefined;
17
+
18
+ if (!rawValue.startsWith("@URL")) {
19
+ return rawValue;
20
+ }
21
+
22
+ const defaultValue = rawValue.includes("|") ? rawValue.split("|")[1] : undefined;
23
+ const actualParamName = prefix ? `${prefix}_${paramName}` : paramName;
24
+ return urlParams.get(actualParamName) ?? defaultValue;
25
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ *
3
+ * URL parameter resolver for the `@URL|default` format in ListPages modules.
4
+ *
5
+ * Wikidot's ListPages module supports a dynamic parameter syntax where attribute
6
+ * values can be set to `@URL` or `@URL|default`. At render time, the actual value
7
+ * is read from the page's URL path parameters. This enables "HPC" (Hyper Page
8
+ * Changer) style multi-page content where a single page definition can display
9
+ * different data based on URL parameters.
10
+ *
11
+ * URL parameters follow the pattern `/key/value/key/value/...` in the URL path.
12
+ * When a `url-attr-prefix` is set (e.g., `"page2"`), parameter names are prefixed
13
+ * (e.g., `page2_offset`, `page2_limit`), allowing multiple independent ListPages
14
+ * modules on the same page.
15
+ *
16
+ * @example
17
+ * Wikidot markup:
18
+ * ```
19
+ * [[module ListPages offset="@URL|0" limit="@URL|10" url-attr-prefix="p2"]]
20
+ * ```
21
+ * URL: `/my-page/p2_offset/20/p2_limit/5`
22
+ * Result: offset=20, limit=5
23
+ *
24
+ * @module
25
+ */
26
+
27
+ export { parseUrlParams } from "./url-resolution/params";
28
+ export { resolveAndNormalizeQuery, resolveQuery } from "./url-resolution/resolve";
29
+ export { resolveUrlValue } from "./url-resolution/value";
@@ -0,0 +1,56 @@
1
+ /**
2
+ *
3
+ * Template compiler for the ListUsers module.
4
+ *
5
+ * Compiles ListUsers template strings (e.g., `"%%title%% (%%name%%)"`) into
6
+ * executable functions for efficient rendering. The compilation approach is
7
+ * identical to the ListPages compiler: the template is split into static
8
+ * string segments and dynamic getter functions.
9
+ *
10
+ * Only three variables are supported: `%%number%%`, `%%title%%`, and `%%name%%`.
11
+ *
12
+ * @module
13
+ */
14
+
15
+ import type { ListUsersCompiledTemplate, ListUsersVariableContext } from "./types";
16
+ import { createListUsersVariableGetter } from "./getters";
17
+ import { LIST_USERS_VARIABLE_REGEX } from "./variables";
18
+
19
+ /**
20
+ * Compile a ListUsers template string into an executable function.
21
+ *
22
+ * The template is split into alternating static strings and dynamic getter
23
+ * functions. The returned function concatenates these parts for each call.
24
+ *
25
+ * @param template - The template string containing `%%variable%%` placeholders
26
+ * @returns A compiled function that accepts a `ListUsersVariableContext` and returns rendered text
27
+ */
28
+ export function compileListUsersTemplate(template: string): ListUsersCompiledTemplate {
29
+ const parts: (string | ((ctx: ListUsersVariableContext) => string))[] = [];
30
+ let lastIndex = 0;
31
+
32
+ for (const match of template.matchAll(LIST_USERS_VARIABLE_REGEX)) {
33
+ if (match.index !== undefined && match.index > lastIndex) {
34
+ parts.push(template.slice(lastIndex, match.index));
35
+ }
36
+
37
+ const [, varName] = match;
38
+ if (!varName) continue;
39
+ const getter = createListUsersVariableGetter(varName.toLowerCase());
40
+ parts.push(getter);
41
+
42
+ lastIndex = match.index !== undefined ? match.index + match[0].length : lastIndex;
43
+ }
44
+
45
+ if (lastIndex < template.length) {
46
+ parts.push(template.slice(lastIndex));
47
+ }
48
+
49
+ return (ctx: ListUsersVariableContext): string => {
50
+ let result = "";
51
+ for (const part of parts) {
52
+ result += typeof part === "string" ? part : part(ctx);
53
+ }
54
+ return result;
55
+ };
56
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ *
3
+ * Data requirement extraction for the ListUsers module.
4
+ *
5
+ * Analyzes a ListUsers template string to determine which variables
6
+ * (`%%number%%`, `%%title%%`, `%%name%%`) are referenced. This tells the
7
+ * external application which user data fields need to be provided.
8
+ *
9
+ * @module
10
+ */
11
+
12
+ import type { ListUsersVariable } from "./types";
13
+ import { compileListUsersTemplate } from "./compiler";
14
+ import { isListUsersVariable, LIST_USERS_VARIABLE_REGEX } from "./variables";
15
+
16
+ /**
17
+ * Extract the set of template variables referenced in a ListUsers template string.
18
+ *
19
+ * Scans for `%%variable%%` patterns and returns only those that match known
20
+ * ListUsers variables. Unknown variables are silently ignored.
21
+ *
22
+ * @param template - The template string from the module body
23
+ * @returns Deduplicated array of referenced variable names
24
+ */
25
+ export function extractListUsersVariables(template: string): ListUsersVariable[] {
26
+ const variables = new Set<ListUsersVariable>();
27
+
28
+ for (const match of template.matchAll(LIST_USERS_VARIABLE_REGEX)) {
29
+ const [, varName] = match;
30
+ if (!varName) continue;
31
+ const normalized = varName.toLowerCase();
32
+ if (isListUsersVariable(normalized)) {
33
+ variables.add(normalized);
34
+ }
35
+ }
36
+
37
+ return Array.from(variables);
38
+ }
39
+
40
+ export { compileListUsersTemplate };