@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
@@ -0,0 +1,106 @@
1
+ /**
2
+ *
3
+ * Block rule for the Wikidot math block: `[[math name]]...[[/math]]`.
4
+ *
5
+ * A math block captures LaTeX source code between the tags and stores it
6
+ * as a `math` element in the AST. The content is not parsed for inline
7
+ * markup.
8
+ *
9
+ * @module
10
+ */
11
+ import type { Element } from "@wdprlib/ast";
12
+ import type { BlockRule, ParseContext, RuleResult } from "../../types";
13
+ import { currentToken } from "../../types";
14
+ import { parseBlockName } from "../utils";
15
+ import { collectMathContent, consumeMathClose } from "./content";
16
+ import { parseMathName } from "./name";
17
+
18
+ /**
19
+ * Block rule for `[[math name]]...[[/math]]`.
20
+ *
21
+ * Content is captured as raw LaTeX source. BACKSLASH_BREAK tokens are
22
+ * restored to their original `\\\n` form for correct LaTeX rendering.
23
+ */
24
+ export const mathBlockRule: BlockRule = {
25
+ name: "math",
26
+ startTokens: ["BLOCK_OPEN"],
27
+ requiresLineStart: false,
28
+
29
+ parse(ctx: ParseContext): RuleResult<Element> {
30
+ const openToken = currentToken(ctx);
31
+ if (openToken.type !== "BLOCK_OPEN") {
32
+ return { success: false };
33
+ }
34
+
35
+ let pos = ctx.pos + 1;
36
+ let consumed = 1;
37
+
38
+ const nameResult = parseBlockName(ctx, pos);
39
+ if (!nameResult || nameResult.name !== "math") {
40
+ return { success: false };
41
+ }
42
+ pos += nameResult.consumed;
43
+ consumed += nameResult.consumed;
44
+
45
+ while (ctx.tokens[pos]?.type === "WHITESPACE") {
46
+ pos++;
47
+ consumed++;
48
+ }
49
+
50
+ const mathName = parseMathName(ctx, pos);
51
+ pos += mathName.consumed;
52
+ consumed += mathName.consumed;
53
+
54
+ while (ctx.tokens[pos]?.type === "WHITESPACE") {
55
+ pos++;
56
+ consumed++;
57
+ }
58
+
59
+ if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
60
+ return { success: false };
61
+ }
62
+ pos++;
63
+ consumed++;
64
+
65
+ if (ctx.tokens[pos]?.type === "NEWLINE") {
66
+ pos++;
67
+ consumed++;
68
+ }
69
+
70
+ const contentResult = collectMathContent(ctx, pos);
71
+ const latexSource = contentResult.latexSource.trim();
72
+ consumed += contentResult.consumed;
73
+ pos += contentResult.consumed;
74
+
75
+ if (!contentResult.foundClose) {
76
+ ctx.diagnostics.push({
77
+ severity: "warning",
78
+ code: "unclosed-block",
79
+ message: "Missing closing tag [[/math]] for [[math]]",
80
+ position: openToken.position,
81
+ });
82
+ } else {
83
+ const closeConsumed = consumeMathClose(ctx, pos);
84
+ pos += closeConsumed;
85
+ consumed += closeConsumed;
86
+ }
87
+
88
+ if (!latexSource) {
89
+ return { success: false };
90
+ }
91
+
92
+ return {
93
+ success: true,
94
+ elements: [
95
+ {
96
+ element: "math",
97
+ data: {
98
+ name: mathName.name,
99
+ "latex-source": latexSource,
100
+ },
101
+ },
102
+ ],
103
+ consumed,
104
+ };
105
+ },
106
+ };
@@ -0,0 +1,35 @@
1
+ import type { ParseContext } from "../../types";
2
+
3
+ export interface MathNameResult {
4
+ name: string | null;
5
+ consumed: number;
6
+ }
7
+
8
+ export function parseMathName(ctx: ParseContext, startPos: number): MathNameResult {
9
+ let pos = startPos;
10
+ let consumed = 0;
11
+ let name = "";
12
+
13
+ const first = ctx.tokens[pos];
14
+ if (first?.type !== "IDENTIFIER" && first?.type !== "TEXT") {
15
+ return { name: null, consumed: 0 };
16
+ }
17
+
18
+ while (pos < ctx.tokens.length) {
19
+ const token = ctx.tokens[pos];
20
+ if (
21
+ !token ||
22
+ token.type === "BLOCK_CLOSE" ||
23
+ token.type === "WHITESPACE" ||
24
+ token.type === "NEWLINE"
25
+ ) {
26
+ break;
27
+ }
28
+
29
+ name += token.value;
30
+ pos++;
31
+ consumed++;
32
+ }
33
+
34
+ return { name: name === "" ? null : name, consumed };
35
+ }
@@ -0,0 +1,92 @@
1
+ import type { ParseContext } from "../../types";
2
+ import { currentToken } from "../../types";
3
+ import { parseBlockName } from "../utils";
4
+
5
+ export interface ModuleBodyResult {
6
+ body?: string;
7
+ pos: number;
8
+ consumed: number;
9
+ }
10
+
11
+ export function parseModuleBody(
12
+ ctx: ParseContext,
13
+ startPos: number,
14
+ moduleHasBody: boolean,
15
+ ): ModuleBodyResult {
16
+ if (!moduleHasBody || ctx.tokens[startPos]?.type !== "NEWLINE") {
17
+ return { pos: startPos, consumed: 0 };
18
+ }
19
+
20
+ let pos = startPos + 1;
21
+ let consumed = 1;
22
+ const bodyParts: string[] = [];
23
+ let foundClose = false;
24
+
25
+ while (pos < ctx.tokens.length) {
26
+ const token = ctx.tokens[pos];
27
+ if (!token || token.type === "EOF") {
28
+ break;
29
+ }
30
+
31
+ if (token.type === "BLOCK_END_OPEN") {
32
+ const closeResult = parseModuleClose(ctx, pos);
33
+ if (closeResult) {
34
+ foundClose = true;
35
+ pos = closeResult.pos;
36
+ consumed += closeResult.consumed;
37
+ break;
38
+ }
39
+ }
40
+
41
+ bodyParts.push(token.value);
42
+ pos++;
43
+ consumed++;
44
+ }
45
+
46
+ if (!foundClose) {
47
+ ctx.diagnostics.push({
48
+ severity: "warning",
49
+ code: "unclosed-block",
50
+ message: "Missing closing tag [[/module]] for [[module]]",
51
+ position: currentToken(ctx).position,
52
+ });
53
+ }
54
+
55
+ const trimmed = bodyParts.join("").trim();
56
+ return {
57
+ body: trimmed ? trimmed : undefined,
58
+ pos,
59
+ consumed,
60
+ };
61
+ }
62
+
63
+ function parseModuleClose(
64
+ ctx: ParseContext,
65
+ startPos: number,
66
+ ): { pos: number; consumed: number } | null {
67
+ if (ctx.tokens[startPos]?.type !== "BLOCK_END_OPEN") {
68
+ return null;
69
+ }
70
+
71
+ const closeNameResult = parseBlockName(ctx, startPos + 1);
72
+ if (
73
+ !closeNameResult ||
74
+ (closeNameResult.name !== "module" && closeNameResult.name !== "module654")
75
+ ) {
76
+ return null;
77
+ }
78
+
79
+ let pos = startPos + 1 + closeNameResult.consumed;
80
+ let consumed = 1 + closeNameResult.consumed;
81
+
82
+ if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
83
+ pos++;
84
+ consumed++;
85
+ }
86
+ if (ctx.tokens[pos]?.type === "NEWLINE") {
87
+ pos++;
88
+ consumed++;
89
+ }
90
+
91
+ return { pos, consumed };
92
+ }
@@ -0,0 +1,33 @@
1
+ import type { Element, Module } from "@wdprlib/ast";
2
+
3
+ export function moduleParseResultToElement(result: Module | Element): Element {
4
+ if (isElement(result)) {
5
+ return result;
6
+ }
7
+
8
+ return createModuleElement(result);
9
+ }
10
+
11
+ export function createUnknownModuleElement(
12
+ name: string,
13
+ args: Record<string, string>,
14
+ body: string | undefined,
15
+ ): Element {
16
+ return createModuleElement({
17
+ module: "unknown",
18
+ name,
19
+ arguments: args,
20
+ body,
21
+ });
22
+ }
23
+
24
+ function createModuleElement(data: Module): Element {
25
+ return {
26
+ element: "module",
27
+ data,
28
+ };
29
+ }
30
+
31
+ function isElement(value: Module | Element): value is Element {
32
+ return "element" in value;
33
+ }
@@ -0,0 +1,91 @@
1
+ import type { PageRef } from "@wdprlib/ast";
2
+
3
+ export interface IncludeAssignment {
4
+ key: string;
5
+ value: string;
6
+ }
7
+
8
+ /**
9
+ * Parse the inner content of an `[[include ...]]` directive into a page reference
10
+ * and variable assignments.
11
+ */
12
+ export function parseIncludeDirective(inner: string): {
13
+ location: PageRef;
14
+ assignments: IncludeAssignment[];
15
+ } {
16
+ const normalized = inner.includes("\n") ? inner.replaceAll("\n", " ") : inner;
17
+ const parts = normalized.split("|");
18
+ const firstSegment = parts[0]!.trim();
19
+
20
+ const spaceIndex = firstSegment.indexOf(" ");
21
+ let target: string;
22
+ const varSegments: string[] = [];
23
+
24
+ if (spaceIndex !== -1) {
25
+ target = firstSegment.slice(0, spaceIndex);
26
+ const rest = firstSegment.slice(spaceIndex + 1).trim();
27
+ if (rest) {
28
+ varSegments.push(rest);
29
+ }
30
+ } else {
31
+ target = firstSegment;
32
+ }
33
+
34
+ for (let i = 1; i < parts.length; i++) {
35
+ const segment = parts[i]!.trim();
36
+ if (segment) {
37
+ varSegments.push(segment);
38
+ }
39
+ }
40
+
41
+ const assignments = parseIncludeAssignments(varSegments);
42
+ return { location: parseIncludePageRef(target), assignments };
43
+ }
44
+
45
+ export function substituteVariables(
46
+ content: string,
47
+ assignments: readonly IncludeAssignment[],
48
+ ): string {
49
+ if (assignments.length === 0) return content;
50
+ if (!content.includes("{$")) return content;
51
+
52
+ let substituted = content;
53
+ for (const { key, value } of assignments) {
54
+ substituted = substituted.replaceAll(`{$${key}}`, value);
55
+ }
56
+ return substituted;
57
+ }
58
+
59
+ function parseIncludePageRef(target: string): PageRef {
60
+ if (target.startsWith(":")) {
61
+ const rest = target.slice(1);
62
+ const colonIndex = rest.indexOf(":");
63
+ if (colonIndex !== -1) {
64
+ return { site: rest.slice(0, colonIndex), page: rest.slice(colonIndex + 1) };
65
+ }
66
+ }
67
+ return { site: null, page: target };
68
+ }
69
+
70
+ function parseIncludeAssignments(varSegments: string[]): IncludeAssignment[] {
71
+ const assignments: IncludeAssignment[] = [];
72
+
73
+ for (const segment of varSegments) {
74
+ const assignment = parseVariableSegment(segment);
75
+ if (assignment) {
76
+ assignments.push(assignment);
77
+ }
78
+ }
79
+
80
+ return assignments;
81
+ }
82
+
83
+ function parseVariableSegment(segment: string): IncludeAssignment | null {
84
+ const eqIndex = segment.indexOf("=");
85
+ if (eqIndex === -1) return null;
86
+ const key = segment.slice(0, eqIndex).trim();
87
+ if (!key) return null;
88
+ const value = segment.slice(eqIndex + 1).trim();
89
+ if (value === "") return null;
90
+ return { key, value };
91
+ }
@@ -16,5 +16,14 @@
16
16
  * @module
17
17
  */
18
18
 
19
- export { resolveIncludes, resolveIncludesAsync } from "./resolve";
20
- export type { IncludeFetcher, AsyncIncludeFetcher, ResolveIncludesOptions } from "./resolve";
19
+ export { resolveIncludes, resolveIncludesAsync, resolveIncludesWithTrace } from "./resolve";
20
+ export { extractIncludeReferences } from "./references";
21
+ export type {
22
+ IncludeFetcher,
23
+ AsyncIncludeFetcher,
24
+ ResolveIncludesOptions,
25
+ IncludeReference,
26
+ IncludeDependency,
27
+ IncludeIterationTrace,
28
+ ResolveIncludesTraceResult,
29
+ } from "./resolve";
@@ -0,0 +1,42 @@
1
+ import { parseIncludeDirective } from "./directive";
2
+ import { scanIncludeDirectives, type IncludeDirectiveMatch } from "./scanner";
3
+ import type { IncludeReference, ResolveIncludesOptions } from "./resolve/types";
4
+
5
+ /**
6
+ * Extract include directives from raw source without fetching or expanding them.
7
+ *
8
+ * This uses the same scanner and directive parser as `resolveIncludes`, so it
9
+ * reports only directives that the include expansion pass would recognize.
10
+ *
11
+ * This is a source-phase API. It intentionally does not evaluate later syntax
12
+ * such as comments, expressions, or iftags. Wikidot expands includes before
13
+ * those phases, so an include inside a later comment block is still reported,
14
+ * while a token that only becomes `[[include ...]]` after comment/expression/
15
+ * iftags processing is not reported.
16
+ *
17
+ * The result is not a complete transitive dependency graph. Nested includes
18
+ * only become visible after fetching and expanding the current layer; use
19
+ * `resolveIncludesWithTrace` when the caller needs observed dependency edges
20
+ * across iterative expansion.
21
+ */
22
+ export function extractIncludeReferences(
23
+ source: string,
24
+ options?: ResolveIncludesOptions,
25
+ ): IncludeReference[] {
26
+ if (options?.settings && !options.settings.enablePageSyntax) {
27
+ return [];
28
+ }
29
+
30
+ return scanIncludeDirectives(source).map(createIncludeReference);
31
+ }
32
+
33
+ export function createIncludeReference(match: IncludeDirectiveMatch): IncludeReference {
34
+ const { location, assignments } = parseIncludeDirective(match.inner);
35
+ return {
36
+ location,
37
+ assignments,
38
+ start: match.start,
39
+ end: match.end,
40
+ inner: match.inner,
41
+ };
42
+ }
@@ -0,0 +1,44 @@
1
+ import type { PageRef } from "@wdprlib/ast";
2
+ import type { AsyncIncludeFetcher, IncludeFetcher } from "./types";
3
+
4
+ export function createCachedIncludeFetcher(
5
+ fetcher: IncludeFetcher,
6
+ normalizeKey: (pageRef: PageRef) => string,
7
+ ): IncludeFetcher {
8
+ const cache = new Map<string, string | null>();
9
+
10
+ return (pageRef: PageRef): string | null => {
11
+ const key = normalizeKey(pageRef);
12
+ if (cache.has(key)) {
13
+ return cache.get(key)!;
14
+ }
15
+
16
+ let result: string | null;
17
+ try {
18
+ result = fetcher(pageRef);
19
+ } catch {
20
+ result = null;
21
+ }
22
+ cache.set(key, result);
23
+ return result;
24
+ };
25
+ }
26
+
27
+ export function createCachedAsyncIncludeFetcher(
28
+ fetcher: AsyncIncludeFetcher,
29
+ normalizeKey: (pageRef: PageRef) => string,
30
+ ): AsyncIncludeFetcher {
31
+ const cache = new Map<string, Promise<string | null>>();
32
+
33
+ return async (pageRef: PageRef): Promise<string | null> => {
34
+ const key = normalizeKey(pageRef);
35
+ const cached = cache.get(key);
36
+ if (cached) {
37
+ return cached;
38
+ }
39
+
40
+ const result = fetcher(pageRef).catch(() => null);
41
+ cache.set(key, result);
42
+ return result;
43
+ };
44
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ *
3
+ * Text-level expansion of `[[include]]` directives.
4
+ *
5
+ * @module
6
+ */
7
+
8
+ import type { PageRef } from "@wdprlib/ast";
9
+ import { createCachedAsyncIncludeFetcher, createCachedIncludeFetcher } from "./cache";
10
+ import { expandIterative, expandIterativeAsync, expandIterativeWithTrace } from "./iterate";
11
+ import type {
12
+ AsyncIncludeFetcher,
13
+ IncludeFetcher,
14
+ ResolveIncludesOptions,
15
+ ResolveIncludesTraceResult,
16
+ } from "./types";
17
+
18
+ export type {
19
+ IncludeFetcher,
20
+ AsyncIncludeFetcher,
21
+ ResolveIncludesOptions,
22
+ IncludeReference,
23
+ IncludeDependency,
24
+ IncludeIterationTrace,
25
+ ResolveIncludesTraceResult,
26
+ } from "./types";
27
+
28
+ /**
29
+ * Expand all [[include]] directives in the source text.
30
+ *
31
+ * Uses Wikidot-compatible iterative expansion: each iteration replaces
32
+ * all include directives in the current source with fetched and
33
+ * variable-substituted content. Iteration continues until no further
34
+ * changes occur or `maxIterations` is reached.
35
+ */
36
+ export function resolveIncludes(
37
+ source: string,
38
+ fetcher: IncludeFetcher,
39
+ options?: ResolveIncludesOptions,
40
+ ): string {
41
+ if (options?.settings && !options.settings.enablePageSyntax) {
42
+ return source;
43
+ }
44
+
45
+ const maxIterations = options?.maxIterations ?? 10;
46
+ const cachedFetcher = createCachedIncludeFetcher(fetcher, normalizePageKey);
47
+ return expandIterative(source, cachedFetcher, maxIterations);
48
+ }
49
+
50
+ /**
51
+ * Expand all [[include]] directives and return dependency/iteration trace data.
52
+ *
53
+ * This follows the same sync expansion behavior as {@link resolveIncludes};
54
+ * the additional trace data is intended for application-level dependency
55
+ * graphs, cache invalidation, and diagnostics.
56
+ */
57
+ export function resolveIncludesWithTrace(
58
+ source: string,
59
+ fetcher: IncludeFetcher,
60
+ options?: ResolveIncludesOptions,
61
+ ): ResolveIncludesTraceResult {
62
+ if (options?.settings && !options.settings.enablePageSyntax) {
63
+ return {
64
+ source,
65
+ dependencies: [],
66
+ iterations: [],
67
+ reachedMaxIterations: false,
68
+ };
69
+ }
70
+
71
+ const maxIterations = options?.maxIterations ?? 10;
72
+ const cachedFetcher = createCachedIncludeFetcher(fetcher, normalizePageKey);
73
+ return expandIterativeWithTrace(source, cachedFetcher, maxIterations);
74
+ }
75
+
76
+ /**
77
+ * Async version of {@link resolveIncludes}.
78
+ *
79
+ * Expand all [[include]] directives using an async fetcher, allowing
80
+ * page content to be loaded from async sources such as databases.
81
+ */
82
+ export async function resolveIncludesAsync(
83
+ source: string,
84
+ fetcher: AsyncIncludeFetcher,
85
+ options?: ResolveIncludesOptions,
86
+ ): Promise<string> {
87
+ if (options?.settings && !options.settings.enablePageSyntax) {
88
+ return source;
89
+ }
90
+
91
+ const maxIterations = options?.maxIterations ?? 10;
92
+ const cachedFetcher = createCachedAsyncIncludeFetcher(fetcher, normalizePageKey);
93
+ return expandIterativeAsync(source, cachedFetcher, maxIterations);
94
+ }
95
+
96
+ /**
97
+ * Normalize a PageRef into a consistent string key for cache lookups.
98
+ *
99
+ * Page names are lowercased for case-insensitive matching. Cross-site
100
+ * references include the site name as a prefix.
101
+ */
102
+ function normalizePageKey(location: PageRef): string {
103
+ const site = location.site ?? "";
104
+ const page = location.page.toLowerCase();
105
+ return site ? `${site}:${page}` : page;
106
+ }