@wdprlib/parser 3.2.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/dist/index.cjs +10451 -8402
  2. package/dist/index.d.cts +313 -337
  3. package/dist/index.d.ts +313 -337
  4. package/dist/index.js +10438 -8389
  5. package/package.json +1 -1
  6. package/src/index.ts +7 -0
  7. package/src/lexer/anchor.ts +48 -0
  8. package/src/lexer/index.ts +3 -2
  9. package/src/lexer/lexer.ts +73 -559
  10. package/src/lexer/options.ts +19 -0
  11. package/src/lexer/punctuation.ts +70 -0
  12. package/src/lexer/quoted-string.ts +16 -0
  13. package/src/lexer/runs.ts +85 -0
  14. package/src/lexer/spacing-actions.ts +24 -0
  15. package/src/lexer/state.ts +103 -0
  16. package/src/lexer/syntax-actions.ts +80 -0
  17. package/src/lexer/text-actions.ts +41 -0
  18. package/src/lexer/token-actions.ts +136 -0
  19. package/src/lexer/token-factory.ts +62 -0
  20. package/src/lexer/tokenize.ts +18 -0
  21. package/src/parser/constants.ts +2 -0
  22. package/src/parser/depth/index.ts +111 -0
  23. package/src/parser/depth/stack.ts +82 -0
  24. package/src/parser/parse/block.ts +42 -0
  25. package/src/parser/parse/context.ts +26 -0
  26. package/src/parser/parse/footnotes.ts +25 -0
  27. package/src/parser/parse/index.ts +42 -0
  28. package/src/parser/parse/options.ts +34 -0
  29. package/src/parser/parse/parser.ts +79 -0
  30. package/src/parser/parse/plain-non-ascii.ts +129 -0
  31. package/src/parser/parse/result.ts +57 -0
  32. package/src/parser/parse/source.ts +11 -0
  33. package/src/parser/postprocess/divAdjacentParagraph.ts +1 -1
  34. package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
  35. package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
  36. package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
  37. package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
  38. package/src/parser/postprocess/spanStrip/factory.ts +23 -0
  39. package/src/parser/postprocess/spanStrip/index.ts +8 -0
  40. package/src/parser/postprocess/spanStrip/merge.ts +117 -0
  41. package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
  42. package/src/parser/postprocess/spanStrip/split.ts +67 -0
  43. package/src/parser/preprocess/expr/chars.ts +15 -0
  44. package/src/parser/preprocess/expr/evaluate.ts +22 -0
  45. package/src/parser/preprocess/expr/index.ts +45 -0
  46. package/src/parser/preprocess/expr/kind.ts +19 -0
  47. package/src/parser/preprocess/expr/parse.ts +103 -0
  48. package/src/parser/preprocess/expr/scan.ts +34 -0
  49. package/src/parser/preprocess/expr/types.ts +14 -0
  50. package/src/parser/preprocess/typography.ts +70 -5
  51. package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
  52. package/src/parser/preprocess/utils/index.ts +13 -0
  53. package/src/parser/preprocess/utils/raw-regions.ts +153 -0
  54. package/src/parser/preprocess/whitespace/detection.ts +39 -0
  55. package/src/parser/preprocess/whitespace/index.ts +79 -0
  56. package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
  57. package/src/parser/preprocess/whitespace/patterns.ts +23 -0
  58. package/src/parser/rules/block/align/body.ts +46 -0
  59. package/src/parser/rules/block/align/element.ts +13 -0
  60. package/src/parser/rules/block/align/index.ts +90 -0
  61. package/src/parser/rules/block/align/syntax.ts +113 -0
  62. package/src/parser/rules/block/bibliography/body.ts +81 -0
  63. package/src/parser/rules/block/bibliography/entries.ts +49 -0
  64. package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
  65. package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
  66. package/src/parser/rules/block/bibliography/index.ts +90 -0
  67. package/src/parser/rules/block/bibliography/open.ts +53 -0
  68. package/src/parser/rules/block/block-list/bare-content.ts +105 -0
  69. package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
  70. package/src/parser/rules/block/block-list/index.ts +51 -0
  71. package/src/parser/rules/block/block-list/item-content.ts +132 -0
  72. package/src/parser/rules/block/block-list/li-content.ts +107 -0
  73. package/src/parser/rules/block/block-list/li-item.ts +77 -0
  74. package/src/parser/rules/block/block-list/list-block.ts +100 -0
  75. package/src/parser/rules/block/block-list/open.ts +51 -0
  76. package/src/parser/rules/block/block-list/tags.ts +50 -0
  77. package/src/parser/rules/block/blockquote/build.ts +62 -0
  78. package/src/parser/rules/block/blockquote/index.ts +80 -0
  79. package/src/parser/rules/block/blockquote/line.ts +79 -0
  80. package/src/parser/rules/block/blockquote/lines.ts +39 -0
  81. package/src/parser/rules/block/{center.ts → center/index.ts} +7 -22
  82. package/src/parser/rules/block/center/open.ts +27 -0
  83. package/src/parser/rules/block/{clear-float.ts → clear-float/index.ts} +6 -30
  84. package/src/parser/rules/block/clear-float/syntax.ts +43 -0
  85. package/src/parser/rules/block/code/attributes.ts +30 -0
  86. package/src/parser/rules/block/code/content.ts +57 -0
  87. package/src/parser/rules/block/code/index.ts +100 -0
  88. package/src/parser/rules/block/collapsible/attributes.ts +95 -0
  89. package/src/parser/rules/block/collapsible/body.ts +69 -0
  90. package/src/parser/rules/block/collapsible/index.ts +117 -0
  91. package/src/parser/rules/block/collapsible/open.ts +51 -0
  92. package/src/parser/rules/block/collapsible/orphans.ts +31 -0
  93. package/src/parser/rules/block/collapsible/tags.ts +17 -0
  94. package/src/parser/rules/block/comment/consume.ts +37 -0
  95. package/src/parser/rules/block/{comment.ts → comment/index.ts} +12 -38
  96. package/src/parser/rules/block/{content-separator.ts → content-separator/index.ts} +5 -35
  97. package/src/parser/rules/block/content-separator/syntax.ts +33 -0
  98. package/src/parser/rules/block/definition-list/collect.ts +40 -0
  99. package/src/parser/rules/block/definition-list/index.ts +63 -0
  100. package/src/parser/rules/block/definition-list/item-key.ts +95 -0
  101. package/src/parser/rules/block/definition-list/item-value.ts +56 -0
  102. package/src/parser/rules/block/definition-list/items.ts +54 -0
  103. package/src/parser/rules/block/div/body.ts +41 -0
  104. package/src/parser/rules/block/div/close.ts +41 -0
  105. package/src/parser/rules/block/div/failed.ts +117 -0
  106. package/src/parser/rules/block/div/index.ts +112 -0
  107. package/src/parser/rules/block/div/nesting.ts +37 -0
  108. package/src/parser/rules/block/div/open.ts +59 -0
  109. package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
  110. package/src/parser/rules/block/embed-block/content.ts +53 -0
  111. package/src/parser/rules/block/embed-block/index.ts +91 -0
  112. package/src/parser/rules/block/embed-block/open.ts +52 -0
  113. package/src/parser/rules/block/embed-block/tags.ts +5 -0
  114. package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
  115. package/src/parser/rules/block/footnoteblock/index.ts +82 -0
  116. package/src/parser/rules/block/footnoteblock/open.ts +53 -0
  117. package/src/parser/rules/block/heading/index.ts +87 -0
  118. package/src/parser/rules/block/heading/open.ts +50 -0
  119. package/src/parser/rules/block/heading/toc-text.ts +26 -0
  120. package/src/parser/rules/block/{horizontal-rule.ts → horizontal-rule/index.ts} +4 -21
  121. package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
  122. package/src/parser/rules/block/html/body.ts +114 -0
  123. package/src/parser/rules/block/html/diagnostics.ts +11 -0
  124. package/src/parser/rules/block/html/index.ts +95 -0
  125. package/src/parser/rules/block/html/open.ts +36 -0
  126. package/src/parser/rules/block/iframe/attributes.ts +106 -0
  127. package/src/parser/rules/block/iframe/index.ts +73 -0
  128. package/src/parser/rules/block/iframe/open.ts +58 -0
  129. package/src/parser/rules/block/iframe/source.ts +24 -0
  130. package/src/parser/rules/block/iframe/url.ts +38 -0
  131. package/src/parser/rules/block/iftags/body.ts +48 -0
  132. package/src/parser/rules/block/iftags/condition.ts +24 -0
  133. package/src/parser/rules/block/{iftags.ts → iftags/index.ts} +16 -58
  134. package/src/parser/rules/block/include/arguments.ts +48 -0
  135. package/src/parser/rules/block/include/index.ts +75 -0
  136. package/src/parser/rules/block/include/location.ts +24 -0
  137. package/src/parser/rules/block/include/variables.ts +37 -0
  138. package/src/parser/rules/block/list/index.ts +73 -0
  139. package/src/parser/rules/block/list/line.ts +77 -0
  140. package/src/parser/rules/block/list/native.ts +89 -0
  141. package/src/parser/rules/block/math/content.ts +54 -0
  142. package/src/parser/rules/block/math/index.ts +106 -0
  143. package/src/parser/rules/block/math/name.ts +35 -0
  144. package/src/parser/rules/block/module/body.ts +92 -0
  145. package/src/parser/rules/block/module/element.ts +33 -0
  146. package/src/parser/rules/block/module/include/directive.ts +91 -0
  147. package/src/parser/rules/block/module/include/index.ts +11 -2
  148. package/src/parser/rules/block/module/include/references.ts +42 -0
  149. package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
  150. package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
  151. package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
  152. package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
  153. package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
  154. package/src/parser/rules/block/module/include/scanner.ts +121 -0
  155. package/src/parser/rules/block/module/index.ts +14 -2
  156. package/src/parser/rules/block/module/listpages/compiler.ts +12 -392
  157. package/src/parser/rules/block/module/listpages/extract.ts +25 -359
  158. package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
  159. package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
  160. package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
  161. package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
  162. package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
  163. package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
  164. package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
  165. package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
  166. package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
  167. package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
  168. package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
  169. package/src/parser/rules/block/module/listpages/normalize.ts +8 -324
  170. package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
  171. package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
  172. package/src/parser/rules/block/module/listpages/resolve.ts +5 -75
  173. package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
  174. package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
  175. package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
  176. package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
  177. package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
  178. package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
  179. package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
  180. package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
  181. package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
  182. package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
  183. package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
  184. package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
  185. package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
  186. package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
  187. package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
  188. package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
  189. package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
  190. package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
  191. package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
  192. package/src/parser/rules/block/module/listpages/url-resolution/params.ts +19 -0
  193. package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
  194. package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +53 -0
  195. package/src/parser/rules/block/module/listpages/url-resolution/value.ts +25 -0
  196. package/src/parser/rules/block/module/listpages/url-resolver.ts +3 -160
  197. package/src/parser/rules/block/module/listusers/compiler.ts +4 -25
  198. package/src/parser/rules/block/module/listusers/extract.ts +4 -9
  199. package/src/parser/rules/block/module/listusers/getters.ts +21 -0
  200. package/src/parser/rules/block/module/listusers/variables.ts +15 -0
  201. package/src/parser/rules/block/module/open.ts +57 -0
  202. package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
  203. package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
  204. package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
  205. package/src/parser/rules/block/module/resolution/styles.ts +53 -0
  206. package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
  207. package/src/parser/rules/block/module/resolve.ts +79 -292
  208. package/src/parser/rules/block/module/rule.ts +56 -0
  209. package/src/parser/rules/block/module/types-common.ts +11 -0
  210. package/src/parser/rules/block/module/walk/children.ts +35 -0
  211. package/src/parser/rules/block/module/walk/index.ts +9 -0
  212. package/src/parser/rules/block/module/walk/map/index.ts +2 -0
  213. package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
  214. package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
  215. package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
  216. package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
  217. package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
  218. package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
  219. package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
  220. package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
  221. package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
  222. package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
  223. package/src/parser/rules/block/module/walk/map/types.ts +6 -0
  224. package/src/parser/rules/block/module/walk/traverse.ts +65 -0
  225. package/src/parser/rules/block/orphan-li/content.ts +60 -0
  226. package/src/parser/rules/block/orphan-li/index.ts +75 -0
  227. package/src/parser/rules/block/orphan-li/open.ts +25 -0
  228. package/src/parser/rules/block/orphan-li/tags.ts +40 -0
  229. package/src/parser/rules/block/paragraph/content.ts +12 -0
  230. package/src/parser/rules/block/paragraph/index.ts +60 -0
  231. package/src/parser/rules/block/paragraph/normalize.ts +52 -0
  232. package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
  233. package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
  234. package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
  235. package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
  236. package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
  237. package/src/parser/rules/block/parsing/block-item.ts +29 -0
  238. package/src/parser/rules/block/parsing/content.ts +127 -0
  239. package/src/parser/rules/block/parsing/end-condition.ts +51 -0
  240. package/src/parser/rules/block/parsing/inline-content.ts +105 -0
  241. package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
  242. package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
  243. package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
  244. package/src/parser/rules/block/table/index.ts +80 -0
  245. package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
  246. package/src/parser/rules/block/table/pipe/cell.ts +106 -0
  247. package/src/parser/rules/block/table/pipe/index.ts +2 -0
  248. package/src/parser/rules/block/table/pipe/row.ts +88 -0
  249. package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
  250. package/src/parser/rules/block/table/pipe/trim.ts +50 -0
  251. package/src/parser/rules/block/table-block/body.ts +79 -0
  252. package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
  253. package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
  254. package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
  255. package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
  256. package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
  257. package/src/parser/rules/block/table-block/cell.ts +64 -0
  258. package/src/parser/rules/block/table-block/index.ts +113 -0
  259. package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
  260. package/src/parser/rules/block/table-block/structure.ts +80 -0
  261. package/src/parser/rules/block/tabview/body.ts +64 -0
  262. package/src/parser/rules/block/tabview/index.ts +90 -0
  263. package/src/parser/rules/block/tabview/open.ts +50 -0
  264. package/src/parser/rules/block/tabview/tab.ts +92 -0
  265. package/src/parser/rules/block/tabview/tags.ts +30 -0
  266. package/src/parser/rules/block/toc/element.ts +11 -0
  267. package/src/parser/rules/block/toc/index.ts +44 -0
  268. package/src/parser/rules/block/toc/open.ts +84 -0
  269. package/src/parser/rules/block/utils.ts +10 -610
  270. package/src/parser/rules/{utils.ts → common/attribute-safety.ts} +3 -49
  271. package/src/parser/rules/common/block-name.ts +33 -0
  272. package/src/parser/rules/common/index.ts +2 -0
  273. package/src/parser/rules/contracts/index.ts +3 -0
  274. package/src/parser/rules/contracts/parse-context.ts +38 -0
  275. package/src/parser/rules/contracts/rule.ts +43 -0
  276. package/src/parser/rules/contracts/scope.ts +31 -0
  277. package/src/parser/rules/inline/anchor/attributes.ts +54 -0
  278. package/src/parser/rules/inline/anchor/child.ts +26 -0
  279. package/src/parser/rules/inline/anchor/close.ts +34 -0
  280. package/src/parser/rules/inline/anchor/content.ts +59 -0
  281. package/src/parser/rules/inline/anchor/index.ts +103 -0
  282. package/src/parser/rules/inline/anchor/newline.ts +26 -0
  283. package/src/parser/rules/inline/anchor/open.ts +47 -0
  284. package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
  285. package/src/parser/rules/inline/anchor/syntax.ts +40 -0
  286. package/src/parser/rules/inline/anchor-name/index.ts +38 -0
  287. package/src/parser/rules/inline/anchor-name/name.ts +39 -0
  288. package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
  289. package/src/parser/rules/inline/bibcite/element.ts +14 -0
  290. package/src/parser/rules/inline/bibcite/index.ts +34 -0
  291. package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
  292. package/src/parser/rules/inline/bold.ts +2 -39
  293. package/src/parser/rules/inline/color/index.ts +35 -0
  294. package/src/parser/rules/inline/color/syntax.ts +69 -0
  295. package/src/parser/rules/inline/comment/consume.ts +31 -0
  296. package/src/parser/rules/inline/{comment.ts → comment/index.ts} +10 -36
  297. package/src/parser/rules/inline/equation-ref/element.ts +8 -0
  298. package/src/parser/rules/inline/equation-ref/index.ts +34 -0
  299. package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
  300. package/src/parser/rules/inline/expr/branch.ts +104 -0
  301. package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
  302. package/src/parser/rules/inline/expr/conditional.ts +80 -0
  303. package/src/parser/rules/inline/expr/depth.ts +25 -0
  304. package/src/parser/rules/inline/expr/elements.ts +39 -0
  305. package/src/parser/rules/inline/expr/index.ts +84 -0
  306. package/src/parser/rules/inline/expr/syntax.ts +45 -0
  307. package/src/parser/rules/inline/footnote/child.ts +22 -0
  308. package/src/parser/rules/inline/footnote/close.ts +33 -0
  309. package/src/parser/rules/inline/footnote/content.ts +54 -0
  310. package/src/parser/rules/inline/footnote/elements.ts +38 -0
  311. package/src/parser/rules/inline/footnote/index.ts +54 -0
  312. package/src/parser/rules/inline/footnote/newline.ts +27 -0
  313. package/src/parser/rules/inline/footnote/open.ts +38 -0
  314. package/src/parser/rules/inline/formatting/container.ts +50 -0
  315. package/src/parser/rules/inline/{guillemet.ts → guillemet/index.ts} +5 -13
  316. package/src/parser/rules/inline/guillemet/text.ts +11 -0
  317. package/src/parser/rules/inline/html/gate.ts +64 -0
  318. package/src/parser/rules/inline/{html.ts → html/index.ts} +9 -60
  319. package/src/parser/rules/inline/html/open.ts +37 -0
  320. package/src/parser/rules/inline/image/attributes.ts +22 -0
  321. package/src/parser/rules/inline/image/body.ts +36 -0
  322. package/src/parser/rules/inline/image/index.ts +89 -0
  323. package/src/parser/rules/inline/image/open.ts +56 -0
  324. package/src/parser/rules/inline/image/source.ts +62 -0
  325. package/src/parser/rules/inline/image/syntax.ts +76 -0
  326. package/src/parser/rules/inline/italic.ts +2 -30
  327. package/src/parser/rules/inline/line-break/backslash.ts +58 -0
  328. package/src/parser/rules/inline/line-break/elements.ts +9 -0
  329. package/src/parser/rules/inline/line-break/index.ts +3 -0
  330. package/src/parser/rules/inline/line-break/newline.ts +82 -0
  331. package/src/parser/rules/inline/line-break/underscore.ts +45 -0
  332. package/src/parser/rules/inline/link-anchor.ts +6 -81
  333. package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
  334. package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
  335. package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
  336. package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
  337. package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
  338. package/src/parser/rules/inline/link-single.ts +7 -98
  339. package/src/parser/rules/inline/link-star.ts +7 -69
  340. package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
  341. package/src/parser/rules/inline/link-triple/index.ts +62 -0
  342. package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
  343. package/src/parser/rules/inline/link-triple/label.ts +35 -0
  344. package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
  345. package/src/parser/rules/inline/link-triple/target.ts +36 -0
  346. package/src/parser/rules/inline/math-inline/index.ts +40 -0
  347. package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
  348. package/src/parser/rules/inline/monospace.ts +2 -30
  349. package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
  350. package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
  351. package/src/parser/rules/inline/parsing/collect.ts +23 -0
  352. package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
  353. package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
  354. package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
  355. package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
  356. package/src/parser/rules/inline/parsing/rules.ts +34 -0
  357. package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
  358. package/src/parser/rules/inline/raw/angle.ts +40 -0
  359. package/src/parser/rules/inline/raw/double-at.ts +78 -0
  360. package/src/parser/rules/inline/raw/index.ts +26 -0
  361. package/src/parser/rules/inline/raw/result.ts +26 -0
  362. package/src/parser/rules/inline/size/content.ts +65 -0
  363. package/src/parser/rules/inline/size/index.ts +55 -0
  364. package/src/parser/rules/inline/size/open.ts +43 -0
  365. package/src/parser/rules/inline/size/value.ts +45 -0
  366. package/src/parser/rules/inline/span/content.ts +97 -0
  367. package/src/parser/rules/inline/span/elements.ts +108 -0
  368. package/src/parser/rules/inline/span/index.ts +79 -0
  369. package/src/parser/rules/inline/span/newline.ts +50 -0
  370. package/src/parser/rules/inline/span/syntax.ts +70 -0
  371. package/src/parser/rules/inline/{strikethrough.ts → strikethrough/index.ts} +5 -60
  372. package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
  373. package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
  374. package/src/parser/rules/inline/subscript.ts +2 -39
  375. package/src/parser/rules/inline/superscript.ts +4 -39
  376. package/src/parser/rules/inline/text/element.ts +5 -0
  377. package/src/parser/rules/inline/{text.ts → text/index.ts} +5 -4
  378. package/src/parser/rules/inline/underline/child.ts +26 -0
  379. package/src/parser/rules/inline/underline/content.ts +29 -0
  380. package/src/parser/rules/inline/{underline.ts → underline/index.ts} +6 -49
  381. package/src/parser/rules/inline/user/element.ts +11 -0
  382. package/src/parser/rules/inline/user/index.ts +34 -0
  383. package/src/parser/rules/inline/user/syntax.ts +67 -0
  384. package/src/parser/rules/inline/utils.ts +4 -344
  385. package/src/parser/rules/tokens.ts +106 -0
  386. package/src/parser/rules/types.ts +9 -252
  387. package/src/parser/depth.ts +0 -251
  388. package/src/parser/parse.ts +0 -315
  389. package/src/parser/postprocess/spanStrip.ts +0 -697
  390. package/src/parser/preprocess/expr.ts +0 -265
  391. package/src/parser/preprocess/utils.ts +0 -250
  392. package/src/parser/preprocess/whitespace.ts +0 -111
  393. package/src/parser/rules/block/align.ts +0 -282
  394. package/src/parser/rules/block/bibliography.ts +0 -359
  395. package/src/parser/rules/block/block-list.ts +0 -689
  396. package/src/parser/rules/block/blockquote.ts +0 -238
  397. package/src/parser/rules/block/code.ts +0 -187
  398. package/src/parser/rules/block/collapsible.ts +0 -337
  399. package/src/parser/rules/block/definition-list.ts +0 -270
  400. package/src/parser/rules/block/div.ts +0 -400
  401. package/src/parser/rules/block/embed-block.ts +0 -153
  402. package/src/parser/rules/block/footnoteblock.ts +0 -200
  403. package/src/parser/rules/block/heading.ts +0 -142
  404. package/src/parser/rules/block/html.ts +0 -222
  405. package/src/parser/rules/block/iframe.ts +0 -239
  406. package/src/parser/rules/block/include.ts +0 -179
  407. package/src/parser/rules/block/list.ts +0 -244
  408. package/src/parser/rules/block/math.ts +0 -183
  409. package/src/parser/rules/block/module/include/resolve.ts +0 -556
  410. package/src/parser/rules/block/module/listpages/types.ts +0 -513
  411. package/src/parser/rules/block/module/walk.ts +0 -380
  412. package/src/parser/rules/block/module.ts +0 -164
  413. package/src/parser/rules/block/orphan-li.ts +0 -177
  414. package/src/parser/rules/block/paragraph.ts +0 -157
  415. package/src/parser/rules/block/table-block.ts +0 -726
  416. package/src/parser/rules/block/table.ts +0 -441
  417. package/src/parser/rules/block/tabview.ts +0 -331
  418. package/src/parser/rules/block/toc.ts +0 -129
  419. package/src/parser/rules/inline/anchor-name.ts +0 -154
  420. package/src/parser/rules/inline/anchor.ts +0 -327
  421. package/src/parser/rules/inline/bibcite.ts +0 -153
  422. package/src/parser/rules/inline/color.ts +0 -140
  423. package/src/parser/rules/inline/equation-ref.ts +0 -115
  424. package/src/parser/rules/inline/expr.ts +0 -526
  425. package/src/parser/rules/inline/footnote.ts +0 -223
  426. package/src/parser/rules/inline/image.ts +0 -328
  427. package/src/parser/rules/inline/line-break.ts +0 -326
  428. package/src/parser/rules/inline/link-triple.ts +0 -267
  429. package/src/parser/rules/inline/math-inline.ts +0 -126
  430. package/src/parser/rules/inline/raw.ts +0 -262
  431. package/src/parser/rules/inline/size.ts +0 -244
  432. package/src/parser/rules/inline/span.ts +0 -424
  433. package/src/parser/rules/inline/user.ts +0 -147
@@ -0,0 +1,46 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import type { ParseContext } from "../../types";
3
+ import { parseBlocksUntil } from "../utils";
4
+ import { type AlignDirection, parseAlignClose } from "./syntax";
5
+
6
+ export interface AlignBodyResult {
7
+ elements: Element[];
8
+ consumed: number;
9
+ foundClose: boolean;
10
+ }
11
+
12
+ export function parseAlignBody(
13
+ ctx: ParseContext,
14
+ startPos: number,
15
+ direction: AlignDirection,
16
+ ): AlignBodyResult {
17
+ const bodyCtx: ParseContext = { ...ctx, pos: startPos };
18
+ const bodyResult = parseBlocksUntil(bodyCtx, (checkCtx) => {
19
+ return parseAlignClose(checkCtx, direction).match;
20
+ });
21
+
22
+ let pos = startPos + bodyResult.consumed;
23
+ let consumed = bodyResult.consumed;
24
+
25
+ const closeCheck = parseAlignClose({ ...ctx, pos }, direction);
26
+ if (!closeCheck.match) {
27
+ return {
28
+ elements: bodyResult.elements,
29
+ consumed,
30
+ foundClose: false,
31
+ };
32
+ }
33
+
34
+ consumed += closeCheck.consumed;
35
+ pos += closeCheck.consumed;
36
+
37
+ if (ctx.tokens[pos]?.type === "NEWLINE") {
38
+ consumed++;
39
+ }
40
+
41
+ return {
42
+ elements: bodyResult.elements,
43
+ consumed,
44
+ foundClose: true,
45
+ };
46
+ }
@@ -0,0 +1,13 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import type { AlignDirection } from "./syntax";
3
+
4
+ export function createAlignElement(direction: AlignDirection, elements: Element[]): Element {
5
+ return {
6
+ element: "container",
7
+ data: {
8
+ type: { align: direction },
9
+ attributes: {},
10
+ elements,
11
+ },
12
+ };
13
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ *
3
+ * Block rule for Wikidot alignment containers.
4
+ *
5
+ * Wikidot provides a shorthand bracket syntax for wrapping content in a
6
+ * directional alignment container:
7
+ *
8
+ * ```
9
+ * [[>]] ... [[/>]] right-aligned
10
+ * [[<]] ... [[/<]] left-aligned
11
+ * [[=]] ... [[/=]] center-aligned
12
+ * [[==]] ... [[/==]] justify-aligned
13
+ * ```
14
+ *
15
+ * Each pair acts as a block-level wrapper. The opening tag must appear at
16
+ * the start of a line and be followed by a newline. Body content is parsed
17
+ * recursively as block-level markup, and the matching closing tag terminates
18
+ * the container.
19
+ *
20
+ * @module
21
+ */
22
+ import type { Element } from "@wdprlib/ast";
23
+ import type { BlockRule, ParseContext, RuleResult } from "../../types";
24
+ import { currentToken } from "../../types";
25
+ import { parseAlignBody } from "./body";
26
+ import { createAlignElement } from "./element";
27
+ import { alignDirectionSymbol, parseAlignOpen } from "./syntax";
28
+
29
+ /**
30
+ * Block rule that matches Wikidot directional alignment containers.
31
+ *
32
+ * `preservesPrecedingLineBreak` is `true` because, unlike most block
33
+ * constructs, an alignment block does not suppress a preceding `\n` from
34
+ * becoming a `<br />` in Wikidot's output.
35
+ */
36
+ export const alignRule: BlockRule = {
37
+ name: "align",
38
+ startTokens: ["BLOCK_OPEN"],
39
+ requiresLineStart: true,
40
+ preservesPrecedingLineBreak: true,
41
+
42
+ isStartPattern(ctx: ParseContext, pos: number): boolean {
43
+ if (ctx.tokens[pos]?.type !== "BLOCK_OPEN") return false;
44
+ return parseAlignOpen(ctx, pos + 1) !== null;
45
+ },
46
+
47
+ parse(ctx: ParseContext): RuleResult<Element> {
48
+ const openToken = currentToken(ctx);
49
+ if (openToken.type !== "BLOCK_OPEN") {
50
+ return { success: false };
51
+ }
52
+
53
+ let pos = ctx.pos + 1;
54
+ let consumed = 1;
55
+
56
+ const alignResult = parseAlignOpen(ctx, pos);
57
+ if (!alignResult) {
58
+ return { success: false };
59
+ }
60
+
61
+ const { direction } = alignResult;
62
+ pos += alignResult.consumed;
63
+ consumed += alignResult.consumed;
64
+
65
+ if (ctx.tokens[pos]?.type !== "NEWLINE") {
66
+ return { success: false };
67
+ }
68
+ pos++;
69
+ consumed++;
70
+
71
+ const bodyResult = parseAlignBody(ctx, pos, direction);
72
+ consumed += bodyResult.consumed;
73
+
74
+ if (!bodyResult.foundClose) {
75
+ const directionSymbol = alignDirectionSymbol(direction);
76
+ ctx.diagnostics.push({
77
+ severity: "warning",
78
+ code: "unclosed-block",
79
+ message: `Missing closing tag [[/${directionSymbol}]] for [[${directionSymbol}]]`,
80
+ position: openToken.position,
81
+ });
82
+ }
83
+
84
+ return {
85
+ success: true,
86
+ elements: [createAlignElement(direction, bodyResult.elements)],
87
+ consumed,
88
+ };
89
+ },
90
+ };
@@ -0,0 +1,113 @@
1
+ import type { ParseContext } from "../../types";
2
+
3
+ /** The four text-alignment directions Wikidot supports. */
4
+ export type AlignDirection = "left" | "right" | "center" | "justify";
5
+
6
+ /**
7
+ * Attempts to parse the interior of an align opening tag starting after
8
+ * the BLOCK_OPEN (`[[`) token.
9
+ */
10
+ export function parseAlignOpen(
11
+ ctx: ParseContext,
12
+ pos: number,
13
+ ): { direction: AlignDirection; consumed: number } | null {
14
+ const tokens = ctx.tokens;
15
+ const firstToken = tokens[pos];
16
+ if (!firstToken) return null;
17
+
18
+ if (
19
+ firstToken.type === "BLOCKQUOTE_MARKER" &&
20
+ firstToken.value === ">" &&
21
+ tokens[pos + 1]?.type === "BLOCK_CLOSE"
22
+ ) {
23
+ return { direction: "right", consumed: 2 };
24
+ }
25
+
26
+ if (
27
+ firstToken.type === "TEXT" &&
28
+ firstToken.value === ">" &&
29
+ tokens[pos + 1]?.type === "BLOCK_CLOSE"
30
+ ) {
31
+ return { direction: "right", consumed: 2 };
32
+ }
33
+
34
+ if (
35
+ firstToken.type === "TEXT" &&
36
+ firstToken.value === "<" &&
37
+ tokens[pos + 1]?.type === "BLOCK_CLOSE"
38
+ ) {
39
+ return { direction: "left", consumed: 2 };
40
+ }
41
+
42
+ if (firstToken.type === "EQUALS" && tokens[pos + 1]?.type === "BLOCK_CLOSE") {
43
+ return { direction: "center", consumed: 2 };
44
+ }
45
+
46
+ if (
47
+ firstToken.type === "EQUALS" &&
48
+ tokens[pos + 1]?.type === "EQUALS" &&
49
+ tokens[pos + 2]?.type === "BLOCK_CLOSE"
50
+ ) {
51
+ return { direction: "justify", consumed: 3 };
52
+ }
53
+
54
+ return null;
55
+ }
56
+
57
+ /**
58
+ * Tests whether the tokens at the current position form a closing align tag.
59
+ */
60
+ export function parseAlignClose(
61
+ ctx: ParseContext,
62
+ direction: AlignDirection,
63
+ ): { match: boolean; consumed: number } {
64
+ const tokens = ctx.tokens;
65
+ let pos = ctx.pos;
66
+
67
+ if (tokens[pos]?.type !== "BLOCK_END_OPEN") {
68
+ return { match: false, consumed: 0 };
69
+ }
70
+ pos++;
71
+
72
+ if (direction === "right") {
73
+ if (
74
+ (tokens[pos]?.type === "BLOCKQUOTE_MARKER" || tokens[pos]?.type === "TEXT") &&
75
+ tokens[pos]?.value === ">" &&
76
+ tokens[pos + 1]?.type === "BLOCK_CLOSE"
77
+ ) {
78
+ return { match: true, consumed: 3 };
79
+ }
80
+ }
81
+
82
+ if (direction === "left") {
83
+ if (
84
+ tokens[pos]?.type === "TEXT" &&
85
+ tokens[pos]?.value === "<" &&
86
+ tokens[pos + 1]?.type === "BLOCK_CLOSE"
87
+ ) {
88
+ return { match: true, consumed: 3 };
89
+ }
90
+ }
91
+
92
+ if (direction === "center") {
93
+ if (tokens[pos]?.type === "EQUALS" && tokens[pos + 1]?.type === "BLOCK_CLOSE") {
94
+ return { match: true, consumed: 3 };
95
+ }
96
+ }
97
+
98
+ if (direction === "justify") {
99
+ if (
100
+ tokens[pos]?.type === "EQUALS" &&
101
+ tokens[pos + 1]?.type === "EQUALS" &&
102
+ tokens[pos + 2]?.type === "BLOCK_CLOSE"
103
+ ) {
104
+ return { match: true, consumed: 4 };
105
+ }
106
+ }
107
+
108
+ return { match: false, consumed: 0 };
109
+ }
110
+
111
+ export function alignDirectionSymbol(direction: AlignDirection): string {
112
+ return { left: "<", right: ">", center: "=", justify: "==" }[direction];
113
+ }
@@ -0,0 +1,81 @@
1
+ import type { ParseContext } from "../../types";
2
+ import { parseBlockName } from "../utils";
3
+ import { parseBibliographyEntry, type BibliographyEntry } from "./entries";
4
+
5
+ export interface BibliographyBodyResult {
6
+ entries: BibliographyEntry[];
7
+ consumed: number;
8
+ foundClose: boolean;
9
+ }
10
+
11
+ export function collectBibliographyBody(
12
+ ctx: ParseContext,
13
+ startPos: number,
14
+ ): BibliographyBodyResult {
15
+ const entries: BibliographyEntry[] = [];
16
+ let pos = startPos;
17
+ let consumed = 0;
18
+
19
+ while (pos < ctx.tokens.length) {
20
+ const token = ctx.tokens[pos];
21
+ if (!token || token.type === "EOF") {
22
+ break;
23
+ }
24
+
25
+ const closeConsumed = consumeBibliographyClose(ctx, pos);
26
+ if (closeConsumed !== null) {
27
+ return {
28
+ entries,
29
+ consumed: consumed + closeConsumed,
30
+ foundClose: true,
31
+ };
32
+ }
33
+
34
+ if (token.type === "WHITESPACE" || token.type === "NEWLINE") {
35
+ pos++;
36
+ consumed++;
37
+ continue;
38
+ }
39
+
40
+ if (token.type === "COLON" && token.lineStart) {
41
+ const result = parseBibliographyEntry(ctx, pos);
42
+ if (result) {
43
+ entries.push(result.entry);
44
+ pos += result.consumed;
45
+ consumed += result.consumed;
46
+ continue;
47
+ }
48
+ }
49
+
50
+ pos++;
51
+ consumed++;
52
+ }
53
+
54
+ return { entries, consumed, foundClose: false };
55
+ }
56
+
57
+ function consumeBibliographyClose(ctx: ParseContext, startPos: number): number | null {
58
+ const openToken = ctx.tokens[startPos];
59
+ if (openToken?.type !== "BLOCK_END_OPEN") {
60
+ return null;
61
+ }
62
+
63
+ const closeNameResult = parseBlockName(ctx, startPos + 1);
64
+ if (closeNameResult?.name !== "bibliography") {
65
+ return null;
66
+ }
67
+
68
+ let pos = startPos + 1 + closeNameResult.consumed;
69
+ let consumed = 1 + closeNameResult.consumed;
70
+
71
+ while (ctx.tokens[pos]?.type === "WHITESPACE") {
72
+ pos++;
73
+ consumed++;
74
+ }
75
+
76
+ if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
77
+ consumed++;
78
+ }
79
+
80
+ return consumed;
81
+ }
@@ -0,0 +1,49 @@
1
+ import type { DefinitionListItem, Element } from "@wdprlib/ast";
2
+ import type { ParseContext } from "../../types";
3
+ import { parseBibliographyContent } from "./entry-content";
4
+ import { parseBibliographyKey } from "./entry-key";
5
+
6
+ /**
7
+ * Internal representation of a single bibliography entry parsed from
8
+ * the `: label : content` line(s) inside the bibliography block.
9
+ */
10
+ export interface BibliographyEntry {
11
+ /** The identifier used in `((bibcite label))` references. */
12
+ label: string;
13
+ /** Parsed inline elements for the label portion (the key). */
14
+ key: Element[];
15
+ /** Parsed inline elements for the citation text. */
16
+ content: Element[];
17
+ }
18
+
19
+ /**
20
+ * Parses one bibliography entry from the token stream.
21
+ */
22
+ export function parseBibliographyEntry(
23
+ ctx: ParseContext,
24
+ startPos: number,
25
+ ): { entry: BibliographyEntry; consumed: number } | null {
26
+ const keyResult = parseBibliographyKey(ctx, startPos);
27
+ if (!keyResult) {
28
+ return null;
29
+ }
30
+
31
+ const contentResult = parseBibliographyContent(ctx, startPos + keyResult.consumed);
32
+
33
+ return {
34
+ entry: {
35
+ label: keyResult.label,
36
+ key: keyResult.key,
37
+ content: contentResult.content,
38
+ },
39
+ consumed: keyResult.consumed + contentResult.consumed,
40
+ };
41
+ }
42
+
43
+ export function toDefinitionListItems(entries: BibliographyEntry[]): DefinitionListItem[] {
44
+ return entries.map((entry) => ({
45
+ key_string: entry.label,
46
+ key: entry.key,
47
+ value: entry.content,
48
+ }));
49
+ }
@@ -0,0 +1,73 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import type { ParseContext } from "../../types";
3
+ import { parseInlineUntil } from "../../inline/utils";
4
+ import { parseBlockName } from "../utils";
5
+
6
+ export interface BibliographyContentResult {
7
+ content: Element[];
8
+ consumed: number;
9
+ }
10
+
11
+ export function parseBibliographyContent(
12
+ ctx: ParseContext,
13
+ startPos: number,
14
+ ): BibliographyContentResult {
15
+ const content: Element[] = [];
16
+ let pos = startPos;
17
+ let consumed = 0;
18
+
19
+ while (ctx.tokens[pos]?.type === "WHITESPACE") {
20
+ pos++;
21
+ consumed++;
22
+ }
23
+
24
+ while (pos < ctx.tokens.length) {
25
+ const token = ctx.tokens[pos];
26
+ if (!token || token.type === "EOF") {
27
+ break;
28
+ }
29
+
30
+ if (token.type === "BLOCK_END_OPEN") {
31
+ const closeNameResult = parseBlockName(ctx, pos + 1);
32
+ if (closeNameResult?.name === "bibliography") {
33
+ break;
34
+ }
35
+ }
36
+
37
+ if (token.type === "NEWLINE") {
38
+ const nextToken = ctx.tokens[pos + 1];
39
+ if (nextToken?.type === "COLON" && nextToken.lineStart) {
40
+ pos++;
41
+ consumed++;
42
+ break;
43
+ }
44
+ if (nextToken?.type === "BLOCK_END_OPEN") {
45
+ pos++;
46
+ consumed++;
47
+ break;
48
+ }
49
+ if (nextToken?.type === "NEWLINE" || !nextToken || nextToken.type === "EOF") {
50
+ pos++;
51
+ consumed++;
52
+ break;
53
+ }
54
+ content.push({ element: "line-break" });
55
+ pos++;
56
+ consumed++;
57
+ continue;
58
+ }
59
+
60
+ const inlineCtx: ParseContext = { ...ctx, pos };
61
+ const result = parseInlineUntil(inlineCtx, "NEWLINE");
62
+ if (result.elements.length > 0) {
63
+ content.push(...result.elements);
64
+ pos += result.consumed;
65
+ consumed += result.consumed;
66
+ } else {
67
+ pos++;
68
+ consumed++;
69
+ }
70
+ }
71
+
72
+ return { content, consumed };
73
+ }
@@ -0,0 +1,83 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import type { ParseContext } from "../../types";
3
+
4
+ export interface BibliographyKeyResult {
5
+ label: string;
6
+ key: Element[];
7
+ consumed: number;
8
+ }
9
+
10
+ export function parseBibliographyKey(
11
+ ctx: ParseContext,
12
+ startPos: number,
13
+ ): BibliographyKeyResult | null {
14
+ let pos = startPos;
15
+ let consumed = 0;
16
+
17
+ const colonToken = ctx.tokens[pos];
18
+ if (!colonToken || colonToken.type !== "COLON" || !colonToken.lineStart) {
19
+ return null;
20
+ }
21
+ pos++;
22
+ consumed++;
23
+
24
+ const whitespaceAfterColon = ctx.tokens[pos];
25
+ if (!whitespaceAfterColon || whitespaceAfterColon.type !== "WHITESPACE") {
26
+ return null;
27
+ }
28
+
29
+ while (ctx.tokens[pos]?.type === "WHITESPACE") {
30
+ pos++;
31
+ consumed++;
32
+ }
33
+
34
+ let label = "";
35
+ let foundSecondColon = false;
36
+ const key: Element[] = [];
37
+
38
+ while (pos < ctx.tokens.length) {
39
+ const token = ctx.tokens[pos];
40
+ if (!token || token.type === "NEWLINE" || token.type === "EOF") {
41
+ break;
42
+ }
43
+ if (token.type === "COLON") {
44
+ foundSecondColon = true;
45
+ pos++;
46
+ consumed++;
47
+ break;
48
+ }
49
+
50
+ label += token.value;
51
+ key.push({ element: "text", data: token.value });
52
+ pos++;
53
+ consumed++;
54
+ }
55
+
56
+ if (!foundSecondColon) {
57
+ return null;
58
+ }
59
+
60
+ trimTrailingWhitespaceText(key);
61
+
62
+ return {
63
+ label: label.trim(),
64
+ key,
65
+ consumed,
66
+ };
67
+ }
68
+
69
+ function trimTrailingWhitespaceText(nodes: Element[]): void {
70
+ while (nodes.length > 0) {
71
+ const lastNode = nodes[nodes.length - 1];
72
+ if (
73
+ lastNode &&
74
+ lastNode.element === "text" &&
75
+ typeof lastNode.data === "string" &&
76
+ lastNode.data.trim() === ""
77
+ ) {
78
+ nodes.pop();
79
+ } else {
80
+ break;
81
+ }
82
+ }
83
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ *
3
+ * Block rule for the Wikidot bibliography block: `[[bibliography]] ... [[/bibliography]]`.
4
+ *
5
+ * A bibliography block holds labelled citation entries in a definition-list
6
+ * format. Each entry follows the pattern:
7
+ *
8
+ * ```
9
+ * : label : Citation description text
10
+ * ```
11
+ *
12
+ * At render time the entries are cross-referenced with inline `((bibcite label))`
13
+ * markers that appear elsewhere in the document. The parser stores the entries
14
+ * in the AST as a `bibliography-block` element whose `entries` field is an
15
+ * array of {@link DefinitionListItem} objects.
16
+ *
17
+ * Optional attributes on the opening tag:
18
+ * - `title` -- custom heading for the bibliography section.
19
+ * - `hide` -- when `"true"` or empty string, hides the block from output.
20
+ *
21
+ * If no closing `[[/bibliography]]` tag is found, the rule fails to avoid
22
+ * accidentally consuming the rest of the document.
23
+ *
24
+ * @module
25
+ */
26
+ import type { Element } from "@wdprlib/ast";
27
+ import type { BlockRule, ParseContext, RuleResult } from "../../types";
28
+ import { currentToken } from "../../types";
29
+ import { collectBibliographyBody } from "./body";
30
+ import { toDefinitionListItems } from "./entries";
31
+ import { parseBibliographyOpen } from "./open";
32
+
33
+ /**
34
+ * Block rule for Wikidot `[[bibliography]]...[[/bibliography]]`.
35
+ *
36
+ * Parsing strategy:
37
+ * 1. Match BLOCK_OPEN + block name "bibliography".
38
+ * 2. Parse optional attributes (`title`, `hide`).
39
+ * 3. Consume the closing `]]` and optional newline.
40
+ * 4. Loop over the body, parsing each `: label : content` line via
41
+ * `parseBibliographyEntry()`.
42
+ * 5. Require and consume `[[/bibliography]]`.
43
+ * 6. Convert entries into {@link DefinitionListItem} format and emit
44
+ * a `bibliography-block` element.
45
+ */
46
+ export const bibliographyRule: BlockRule = {
47
+ name: "bibliography",
48
+ startTokens: ["BLOCK_OPEN"],
49
+ requiresLineStart: false,
50
+
51
+ parse(ctx: ParseContext): RuleResult<Element> {
52
+ const openToken = currentToken(ctx);
53
+ if (openToken.type !== "BLOCK_OPEN") {
54
+ return { success: false };
55
+ }
56
+
57
+ const openResult = parseBibliographyOpen(ctx, ctx.pos);
58
+ if (!openResult) {
59
+ return { success: false };
60
+ }
61
+
62
+ const bodyResult = collectBibliographyBody(ctx, openResult.pos);
63
+ const consumed = openResult.consumed + bodyResult.consumed;
64
+
65
+ if (!bodyResult.foundClose) {
66
+ ctx.diagnostics.push({
67
+ severity: "warning",
68
+ code: "unclosed-block",
69
+ message: "Missing closing tag [[/bibliography]] for [[bibliography]]",
70
+ position: openToken.position,
71
+ });
72
+ return { success: false };
73
+ }
74
+
75
+ return {
76
+ success: true,
77
+ elements: [
78
+ {
79
+ element: "bibliography-block",
80
+ data: {
81
+ entries: toDefinitionListItems(bodyResult.entries),
82
+ title: openResult.title,
83
+ hide: openResult.hide,
84
+ },
85
+ },
86
+ ],
87
+ consumed,
88
+ };
89
+ },
90
+ };
@@ -0,0 +1,53 @@
1
+ import type { ParseContext } from "../../types";
2
+ import { parseAttributes, parseBlockName } from "../utils";
3
+
4
+ export interface BibliographyOpenResult {
5
+ title: string | null;
6
+ hide: boolean;
7
+ pos: number;
8
+ consumed: number;
9
+ }
10
+
11
+ export function parseBibliographyOpen(
12
+ ctx: ParseContext,
13
+ startPos: number,
14
+ ): BibliographyOpenResult | null {
15
+ let pos = startPos;
16
+ let consumed = 0;
17
+
18
+ if (ctx.tokens[pos]?.type !== "BLOCK_OPEN") {
19
+ return null;
20
+ }
21
+ pos++;
22
+ consumed++;
23
+
24
+ const nameResult = parseBlockName(ctx, pos);
25
+ if (!nameResult || nameResult.name !== "bibliography") {
26
+ return null;
27
+ }
28
+
29
+ pos += nameResult.consumed;
30
+ consumed += nameResult.consumed;
31
+
32
+ const attrResult = parseAttributes(ctx, pos);
33
+ pos += attrResult.consumed;
34
+ consumed += attrResult.consumed;
35
+
36
+ if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
37
+ return null;
38
+ }
39
+ pos++;
40
+ consumed++;
41
+
42
+ if (ctx.tokens[pos]?.type === "NEWLINE") {
43
+ pos++;
44
+ consumed++;
45
+ }
46
+
47
+ return {
48
+ title: attrResult.attrs.title ?? null,
49
+ hide: attrResult.attrs.hide === "true" || attrResult.attrs.hide === "",
50
+ pos,
51
+ consumed,
52
+ };
53
+ }