@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
@@ -1,282 +0,0 @@
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
- * The resulting AST node is a generic container element whose `type` field
21
- * carries the alignment direction (e.g. `{ align: "right" }`).
22
- *
23
- * @module
24
- */
25
- import type { Element } from "@wdprlib/ast";
26
- import type { BlockRule, ParseContext, RuleResult } from "../types";
27
- import { currentToken } from "../types";
28
- import { parseBlocksUntil } from "./utils";
29
-
30
- /** The four text-alignment directions Wikidot supports. */
31
- type AlignDirection = "left" | "right" | "center" | "justify";
32
-
33
- /**
34
- * Attempts to parse the interior of an align opening tag starting after
35
- * the BLOCK_OPEN (`[[`) token.
36
- *
37
- * The function inspects the token(s) immediately following `[[` to determine
38
- * which alignment direction is requested:
39
- *
40
- * | Tokens after `[[` | Direction |
41
- * |----------------------|-------------|
42
- * | `>` `]]` | right |
43
- * | `<` `]]` | left |
44
- * | `=` `]]` | center |
45
- * | `=` `=` `]]` | justify |
46
- *
47
- * The `>` character may arrive as either a BLOCKQUOTE_MARKER (when the
48
- * line starts with `[[`) or as a TEXT token (when it does not).
49
- *
50
- * @param ctx - Current parse context.
51
- * @param pos - Token index right after the BLOCK_OPEN token.
52
- * @returns The detected direction and how many tokens were consumed,
53
- * or `null` if the tokens do not form a valid align open tag.
54
- */
55
- function parseAlignOpen(
56
- ctx: ParseContext,
57
- pos: number,
58
- ): { direction: AlignDirection; consumed: number } | null {
59
- const tokens = ctx.tokens;
60
-
61
- // After BLOCK_OPEN, expect specific patterns
62
- const firstToken = tokens[pos];
63
- if (!firstToken) return null;
64
-
65
- // [[>]] - right
66
- if (
67
- firstToken.type === "BLOCKQUOTE_MARKER" &&
68
- firstToken.value === ">" &&
69
- tokens[pos + 1]?.type === "BLOCK_CLOSE"
70
- ) {
71
- return { direction: "right", consumed: 2 };
72
- }
73
-
74
- // Also handle TEXT ">" for non-line-start cases
75
- if (
76
- firstToken.type === "TEXT" &&
77
- firstToken.value === ">" &&
78
- tokens[pos + 1]?.type === "BLOCK_CLOSE"
79
- ) {
80
- return { direction: "right", consumed: 2 };
81
- }
82
-
83
- // [[<]] - left (LEFT_DOUBLE_ANGLE might be tokenized, but usually it's after [[)
84
- if (
85
- firstToken.type === "TEXT" &&
86
- firstToken.value === "<" &&
87
- tokens[pos + 1]?.type === "BLOCK_CLOSE"
88
- ) {
89
- return { direction: "left", consumed: 2 };
90
- }
91
-
92
- // [[=]] - center (single =)
93
- if (firstToken.type === "EQUALS" && tokens[pos + 1]?.type === "BLOCK_CLOSE") {
94
- return { direction: "center", consumed: 2 };
95
- }
96
-
97
- // [[==]] - justify (double =)
98
- if (
99
- firstToken.type === "EQUALS" &&
100
- tokens[pos + 1]?.type === "EQUALS" &&
101
- tokens[pos + 2]?.type === "BLOCK_CLOSE"
102
- ) {
103
- return { direction: "justify", consumed: 3 };
104
- }
105
-
106
- return null;
107
- }
108
-
109
- /**
110
- * Tests whether the tokens at the current position form a closing align
111
- * tag (`[[/> ]]`, `[[/< ]]`, `[[/= ]]`, or `[[/== ]]`) that matches
112
- * the given direction.
113
- *
114
- * The closing tag always starts with a BLOCK_END_OPEN token (`[[/`)
115
- * followed by the same symbol(s) as the opening tag plus BLOCK_CLOSE.
116
- *
117
- * @param ctx - Current parse context (reads from `ctx.pos`).
118
- * @param direction - The alignment direction of the currently open block,
119
- * used to select the expected closing pattern.
120
- * @returns An object with `match` (whether the close tag was found) and
121
- * `consumed` (number of tokens the closing tag occupies).
122
- */
123
- function isAlignClose(
124
- ctx: ParseContext,
125
- direction: AlignDirection,
126
- ): { match: boolean; consumed: number } {
127
- const tokens = ctx.tokens;
128
- let pos = ctx.pos;
129
-
130
- if (tokens[pos]?.type !== "BLOCK_END_OPEN") {
131
- return { match: false, consumed: 0 };
132
- }
133
- pos++;
134
-
135
- // [[/>]] - right
136
- if (direction === "right") {
137
- if (
138
- (tokens[pos]?.type === "BLOCKQUOTE_MARKER" || tokens[pos]?.type === "TEXT") &&
139
- tokens[pos]?.value === ">" &&
140
- tokens[pos + 1]?.type === "BLOCK_CLOSE"
141
- ) {
142
- return { match: true, consumed: 3 };
143
- }
144
- }
145
-
146
- // [[/<]] - left
147
- if (direction === "left") {
148
- if (
149
- tokens[pos]?.type === "TEXT" &&
150
- tokens[pos]?.value === "<" &&
151
- tokens[pos + 1]?.type === "BLOCK_CLOSE"
152
- ) {
153
- return { match: true, consumed: 3 };
154
- }
155
- }
156
-
157
- // [[/=]] - center
158
- if (direction === "center") {
159
- if (tokens[pos]?.type === "EQUALS" && tokens[pos + 1]?.type === "BLOCK_CLOSE") {
160
- return { match: true, consumed: 3 };
161
- }
162
- }
163
-
164
- // [[/==]] - justify
165
- if (direction === "justify") {
166
- if (
167
- tokens[pos]?.type === "EQUALS" &&
168
- tokens[pos + 1]?.type === "EQUALS" &&
169
- tokens[pos + 2]?.type === "BLOCK_CLOSE"
170
- ) {
171
- return { match: true, consumed: 4 };
172
- }
173
- }
174
-
175
- return { match: false, consumed: 0 };
176
- }
177
-
178
- /**
179
- * Block rule that matches Wikidot directional alignment containers.
180
- *
181
- * Parsing strategy:
182
- * 1. Verify the first token is BLOCK_OPEN at line start.
183
- * 2. Delegate to `parseAlignOpen()` to identify direction and consume
184
- * the opening tag interior.
185
- * 3. Require a NEWLINE immediately after the opening tag.
186
- * 4. Recursively parse body blocks via `parseBlocksUntil()`, stopping
187
- * when `isAlignClose()` finds the matching closing tag.
188
- * 5. Consume the closing tag and optional trailing newline.
189
- * 6. Emit a container element with `type: { align: direction }`.
190
- *
191
- * `preservesPrecedingLineBreak` is `true` because, unlike most block
192
- * constructs, an alignment block does not suppress a preceding `\n` from
193
- * becoming a `<br />` in Wikidot's output.
194
- */
195
- export const alignRule: BlockRule = {
196
- name: "align",
197
- startTokens: ["BLOCK_OPEN"],
198
- requiresLineStart: true,
199
- preservesPrecedingLineBreak: true,
200
-
201
- isStartPattern(ctx: ParseContext, pos: number): boolean {
202
- if (ctx.tokens[pos]?.type !== "BLOCK_OPEN") return false;
203
- return parseAlignOpen(ctx, pos + 1) !== null;
204
- },
205
-
206
- parse(ctx: ParseContext): RuleResult<Element> {
207
- const openToken = currentToken(ctx);
208
- if (openToken.type !== "BLOCK_OPEN") {
209
- return { success: false };
210
- }
211
-
212
- let pos = ctx.pos + 1;
213
- let consumed = 1;
214
-
215
- // Parse align open syntax
216
- const alignResult = parseAlignOpen(ctx, pos);
217
- if (!alignResult) {
218
- return { success: false };
219
- }
220
-
221
- const { direction } = alignResult;
222
- pos += alignResult.consumed;
223
- consumed += alignResult.consumed;
224
-
225
- // Must be followed by newline
226
- if (ctx.tokens[pos]?.type !== "NEWLINE") {
227
- return { success: false };
228
- }
229
- pos++;
230
- consumed++;
231
-
232
- // Close condition
233
- const closeCondition = (checkCtx: ParseContext): boolean => {
234
- return isAlignClose(checkCtx, direction).match;
235
- };
236
-
237
- // Parse body
238
- const bodyCtx: ParseContext = { ...ctx, pos };
239
- const bodyResult = parseBlocksUntil(bodyCtx, closeCondition);
240
- consumed += bodyResult.consumed;
241
- pos += bodyResult.consumed;
242
-
243
- // Check for missing close tag
244
- const directionSymbol = { left: "<", right: ">", center: "=", justify: "==" }[direction];
245
- const closeCheck = isAlignClose({ ...ctx, pos }, direction);
246
- if (!closeCheck.match) {
247
- ctx.diagnostics.push({
248
- severity: "warning",
249
- code: "unclosed-block",
250
- message: `Missing closing tag [[/${directionSymbol}]] for [[${directionSymbol}]]`,
251
- position: openToken.position,
252
- });
253
- }
254
-
255
- // Consume closing tag
256
- if (closeCheck.match) {
257
- consumed += closeCheck.consumed;
258
- pos += closeCheck.consumed;
259
-
260
- // Consume trailing newline
261
- if (ctx.tokens[pos]?.type === "NEWLINE") {
262
- pos++;
263
- consumed++;
264
- }
265
- }
266
-
267
- return {
268
- success: true,
269
- elements: [
270
- {
271
- element: "container",
272
- data: {
273
- type: { align: direction },
274
- attributes: {},
275
- elements: bodyResult.elements,
276
- },
277
- },
278
- ],
279
- consumed,
280
- };
281
- },
282
- };
@@ -1,359 +0,0 @@
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, DefinitionListItem } from "@wdprlib/ast";
27
- import type { BlockRule, ParseContext, RuleResult } from "../types";
28
- import { currentToken } from "../types";
29
- import { parseBlockName, parseAttributes } from "./utils";
30
- import { parseInlineUntil } from "../inline/utils";
31
-
32
- /**
33
- * Internal representation of a single bibliography entry parsed from
34
- * the `: label : content` line(s) inside the bibliography block.
35
- */
36
- interface BibliographyEntry {
37
- /** The identifier used in `((bibcite label))` references. */
38
- label: string;
39
- /** Parsed inline elements for the label portion (the key). */
40
- key: Element[];
41
- /** Parsed inline elements for the citation text. */
42
- content: Element[];
43
- }
44
-
45
- /**
46
- * Parses one bibliography entry from the token stream.
47
- *
48
- * Expected format (one logical line):
49
- * ```
50
- * : label : Citation text possibly spanning lines
51
- * ```
52
- *
53
- * The entry starts with a COLON token at line start, followed by mandatory
54
- * whitespace, then the label text, a second COLON, and the citation content.
55
- * Content parsing continues until a double newline, a new entry (`: ...`),
56
- * or the closing `[[/bibliography]]` tag is reached. Single newlines within
57
- * the citation text produce `line-break` elements.
58
- *
59
- * @param ctx - Current parse context.
60
- * @param startPos - Token index where the entry begins (expected COLON).
61
- * @returns The parsed entry and number of tokens consumed, or `null` on failure.
62
- */
63
- function parseBibliographyEntry(
64
- ctx: ParseContext,
65
- startPos: number,
66
- ): { entry: BibliographyEntry; consumed: number } | null {
67
- let pos = startPos;
68
- let consumed = 0;
69
-
70
- // Expect COLON at line start
71
- const colonToken = ctx.tokens[pos];
72
- if (!colonToken || colonToken.type !== "COLON" || !colonToken.lineStart) {
73
- return null;
74
- }
75
- pos++;
76
- consumed++;
77
-
78
- // Wikidot requires whitespace after first colon
79
- const whitespaceAfterColon = ctx.tokens[pos];
80
- if (!whitespaceAfterColon || whitespaceAfterColon.type !== "WHITESPACE") {
81
- return null;
82
- }
83
-
84
- // Skip whitespace after first colon
85
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
86
- pos++;
87
- consumed++;
88
- }
89
-
90
- // Collect label tokens until second COLON
91
- let label = "";
92
- let foundSecondColon = false;
93
- const keyNodes: Element[] = [];
94
-
95
- while (pos < ctx.tokens.length) {
96
- const token = ctx.tokens[pos];
97
- if (!token || token.type === "NEWLINE" || token.type === "EOF") {
98
- break;
99
- }
100
- if (token.type === "COLON") {
101
- foundSecondColon = true;
102
- pos++;
103
- consumed++;
104
- break;
105
- }
106
-
107
- // For bibliography, key is just the label (identifier)
108
- label += token.value;
109
- keyNodes.push({ element: "text", data: token.value });
110
- pos++;
111
- consumed++;
112
- }
113
-
114
- if (!foundSecondColon) {
115
- return null;
116
- }
117
-
118
- label = label.trim();
119
-
120
- // Skip whitespace after second colon
121
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
122
- pos++;
123
- consumed++;
124
- }
125
-
126
- // Parse content (rest of line, can continue with line breaks)
127
- const contentNodes: Element[] = [];
128
- while (pos < ctx.tokens.length) {
129
- const token = ctx.tokens[pos];
130
- if (!token || token.type === "EOF") {
131
- break;
132
- }
133
-
134
- // Check for [[/bibliography]]
135
- if (token.type === "BLOCK_END_OPEN") {
136
- const closeNameResult = parseBlockName(ctx, pos + 1);
137
- if (closeNameResult?.name === "bibliography") {
138
- break;
139
- }
140
- }
141
-
142
- // Check for end of entry (newline followed by new entry or end)
143
- if (token.type === "NEWLINE") {
144
- const nextToken = ctx.tokens[pos + 1];
145
- // Look ahead for new entry or block end
146
- if (nextToken?.type === "COLON" && nextToken.lineStart) {
147
- // New entry starts
148
- pos++;
149
- consumed++;
150
- break;
151
- }
152
- if (nextToken?.type === "BLOCK_END_OPEN") {
153
- // Block end
154
- pos++;
155
- consumed++;
156
- break;
157
- }
158
- if (nextToken?.type === "NEWLINE" || !nextToken || nextToken.type === "EOF") {
159
- // Double newline or end
160
- pos++;
161
- consumed++;
162
- break;
163
- }
164
- // Single newline - add line break and continue
165
- contentNodes.push({ element: "line-break" });
166
- pos++;
167
- consumed++;
168
- continue;
169
- }
170
-
171
- // Parse inline content
172
- const inlineCtx: ParseContext = { ...ctx, pos };
173
- const result = parseInlineUntil(inlineCtx, "NEWLINE");
174
- if (result.elements.length > 0) {
175
- contentNodes.push(...result.elements);
176
- pos += result.consumed;
177
- consumed += result.consumed;
178
- } else {
179
- pos++;
180
- consumed++;
181
- }
182
- }
183
-
184
- // Trim key nodes
185
- while (keyNodes.length > 0) {
186
- const lastNode = keyNodes[keyNodes.length - 1];
187
- if (
188
- lastNode &&
189
- lastNode.element === "text" &&
190
- typeof lastNode.data === "string" &&
191
- lastNode.data.trim() === ""
192
- ) {
193
- keyNodes.pop();
194
- } else {
195
- break;
196
- }
197
- }
198
-
199
- return {
200
- entry: {
201
- label,
202
- key: keyNodes,
203
- content: contentNodes,
204
- },
205
- consumed,
206
- };
207
- }
208
-
209
- /**
210
- * Block rule for Wikidot `[[bibliography]]...[[/bibliography]]`.
211
- *
212
- * Parsing strategy:
213
- * 1. Match BLOCK_OPEN + block name "bibliography".
214
- * 2. Parse optional attributes (`title`, `hide`).
215
- * 3. Consume the closing `]]` and optional newline.
216
- * 4. Loop over the body, parsing each `: label : content` line via
217
- * `parseBibliographyEntry()`. Whitespace, newlines, and unknown
218
- * tokens between entries are skipped.
219
- * 5. Stop when `[[/bibliography]]` is found and consume it.
220
- * 6. If no closing tag is encountered, fail the rule entirely.
221
- * 7. Convert entries into {@link DefinitionListItem} format and emit
222
- * a `bibliography-block` element.
223
- */
224
- export const bibliographyRule: BlockRule = {
225
- name: "bibliography",
226
- startTokens: ["BLOCK_OPEN"],
227
- requiresLineStart: false,
228
-
229
- parse(ctx: ParseContext): RuleResult<Element> {
230
- const openToken = currentToken(ctx);
231
- if (openToken.type !== "BLOCK_OPEN") {
232
- return { success: false };
233
- }
234
-
235
- let pos = ctx.pos + 1;
236
- let consumed = 1;
237
-
238
- // Parse block name
239
- const nameResult = parseBlockName(ctx, pos);
240
- if (!nameResult || nameResult.name !== "bibliography") {
241
- return { success: false };
242
- }
243
-
244
- pos += nameResult.consumed;
245
- consumed += nameResult.consumed;
246
-
247
- // Parse optional attributes (title, hide)
248
- const attrResult = parseAttributes(ctx, pos);
249
- pos += attrResult.consumed;
250
- consumed += attrResult.consumed;
251
-
252
- // Expect ]]
253
- if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
254
- return { success: false };
255
- }
256
- pos++;
257
- consumed++;
258
-
259
- // Skip newline after opening tag
260
- if (ctx.tokens[pos]?.type === "NEWLINE") {
261
- pos++;
262
- consumed++;
263
- }
264
-
265
- // Parse bibliography entries
266
- const entries: BibliographyEntry[] = [];
267
- let foundClose = false;
268
-
269
- while (pos < ctx.tokens.length) {
270
- const token = ctx.tokens[pos];
271
- if (!token || token.type === "EOF") {
272
- break;
273
- }
274
-
275
- // Check for [[/bibliography]]
276
- if (token.type === "BLOCK_END_OPEN") {
277
- const closeNameResult = parseBlockName(ctx, pos + 1);
278
- if (closeNameResult?.name === "bibliography") {
279
- foundClose = true;
280
- // Consume [[/bibliography]]
281
- pos++;
282
- consumed++;
283
- pos += closeNameResult.consumed;
284
- consumed += closeNameResult.consumed;
285
- // Skip whitespace
286
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
287
- pos++;
288
- consumed++;
289
- }
290
- // Expect ]]
291
- if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
292
- pos++;
293
- consumed++;
294
- }
295
- break;
296
- }
297
- }
298
-
299
- // Skip whitespace and newlines
300
- if (token.type === "WHITESPACE" || token.type === "NEWLINE") {
301
- pos++;
302
- consumed++;
303
- continue;
304
- }
305
-
306
- // Parse entry
307
- if (token.type === "COLON" && token.lineStart) {
308
- const result = parseBibliographyEntry(ctx, pos);
309
- if (result) {
310
- entries.push(result.entry);
311
- pos += result.consumed;
312
- consumed += result.consumed;
313
- continue;
314
- }
315
- }
316
-
317
- // Skip unknown tokens
318
- pos++;
319
- consumed++;
320
- }
321
-
322
- // Require closing tag - without it, fail to prevent consuming entire document
323
- if (!foundClose) {
324
- ctx.diagnostics.push({
325
- severity: "warning",
326
- code: "unclosed-block",
327
- message: "Missing closing tag [[/bibliography]] for [[bibliography]]",
328
- position: openToken.position,
329
- });
330
- return { success: false };
331
- }
332
-
333
- // Convert to definition list format for AST storage
334
- const definitionItems: DefinitionListItem[] = entries.map((entry) => ({
335
- key_string: entry.label,
336
- key: entry.key,
337
- value: entry.content,
338
- }));
339
-
340
- // Get attributes
341
- const title = attrResult.attrs.title ?? null;
342
- const hide = attrResult.attrs.hide === "true" || attrResult.attrs.hide === "";
343
-
344
- return {
345
- success: true,
346
- elements: [
347
- {
348
- element: "bibliography-block",
349
- data: {
350
- entries: definitionItems,
351
- title: typeof title === "string" ? title : null,
352
- hide,
353
- },
354
- },
355
- ],
356
- consumed,
357
- };
358
- },
359
- };