@wdprlib/parser 3.2.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/dist/index.cjs +10471 -8406
  2. package/dist/index.d.cts +313 -337
  3. package/dist/index.d.ts +313 -337
  4. package/dist/index.js +10457 -8392
  5. package/package.json +1 -1
  6. package/src/index.ts +7 -0
  7. package/src/lexer/anchor.ts +48 -0
  8. package/src/lexer/index.ts +3 -2
  9. package/src/lexer/lexer.ts +73 -559
  10. package/src/lexer/options.ts +19 -0
  11. package/src/lexer/punctuation.ts +70 -0
  12. package/src/lexer/quoted-string.ts +16 -0
  13. package/src/lexer/runs.ts +85 -0
  14. package/src/lexer/spacing-actions.ts +24 -0
  15. package/src/lexer/state.ts +103 -0
  16. package/src/lexer/syntax-actions.ts +80 -0
  17. package/src/lexer/text-actions.ts +41 -0
  18. package/src/lexer/token-actions.ts +136 -0
  19. package/src/lexer/token-factory.ts +62 -0
  20. package/src/lexer/tokenize.ts +18 -0
  21. package/src/parser/constants.ts +2 -0
  22. package/src/parser/depth/index.ts +111 -0
  23. package/src/parser/depth/stack.ts +82 -0
  24. package/src/parser/parse/block.ts +42 -0
  25. package/src/parser/parse/context.ts +26 -0
  26. package/src/parser/parse/footnotes.ts +25 -0
  27. package/src/parser/parse/index.ts +42 -0
  28. package/src/parser/parse/options.ts +34 -0
  29. package/src/parser/parse/parser.ts +79 -0
  30. package/src/parser/parse/plain-non-ascii.ts +129 -0
  31. package/src/parser/parse/result.ts +57 -0
  32. package/src/parser/parse/source.ts +11 -0
  33. package/src/parser/postprocess/divAdjacentParagraph.ts +1 -1
  34. package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
  35. package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
  36. package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
  37. package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
  38. package/src/parser/postprocess/spanStrip/factory.ts +23 -0
  39. package/src/parser/postprocess/spanStrip/index.ts +8 -0
  40. package/src/parser/postprocess/spanStrip/merge.ts +117 -0
  41. package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
  42. package/src/parser/postprocess/spanStrip/split.ts +67 -0
  43. package/src/parser/preprocess/expr/chars.ts +15 -0
  44. package/src/parser/preprocess/expr/evaluate.ts +22 -0
  45. package/src/parser/preprocess/expr/index.ts +45 -0
  46. package/src/parser/preprocess/expr/kind.ts +19 -0
  47. package/src/parser/preprocess/expr/parse.ts +103 -0
  48. package/src/parser/preprocess/expr/scan.ts +34 -0
  49. package/src/parser/preprocess/expr/types.ts +14 -0
  50. package/src/parser/preprocess/typography.ts +70 -5
  51. package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
  52. package/src/parser/preprocess/utils/index.ts +13 -0
  53. package/src/parser/preprocess/utils/raw-regions.ts +153 -0
  54. package/src/parser/preprocess/whitespace/detection.ts +39 -0
  55. package/src/parser/preprocess/whitespace/index.ts +79 -0
  56. package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
  57. package/src/parser/preprocess/whitespace/patterns.ts +23 -0
  58. package/src/parser/rules/block/align/body.ts +46 -0
  59. package/src/parser/rules/block/align/element.ts +13 -0
  60. package/src/parser/rules/block/align/index.ts +90 -0
  61. package/src/parser/rules/block/align/syntax.ts +113 -0
  62. package/src/parser/rules/block/bibliography/body.ts +81 -0
  63. package/src/parser/rules/block/bibliography/entries.ts +49 -0
  64. package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
  65. package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
  66. package/src/parser/rules/block/bibliography/index.ts +90 -0
  67. package/src/parser/rules/block/bibliography/open.ts +53 -0
  68. package/src/parser/rules/block/block-list/bare-content.ts +105 -0
  69. package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
  70. package/src/parser/rules/block/block-list/index.ts +51 -0
  71. package/src/parser/rules/block/block-list/item-content.ts +132 -0
  72. package/src/parser/rules/block/block-list/li-content.ts +107 -0
  73. package/src/parser/rules/block/block-list/li-item.ts +77 -0
  74. package/src/parser/rules/block/block-list/list-block.ts +100 -0
  75. package/src/parser/rules/block/block-list/open.ts +51 -0
  76. package/src/parser/rules/block/block-list/tags.ts +50 -0
  77. package/src/parser/rules/block/blockquote/build.ts +62 -0
  78. package/src/parser/rules/block/blockquote/index.ts +80 -0
  79. package/src/parser/rules/block/blockquote/line.ts +79 -0
  80. package/src/parser/rules/block/blockquote/lines.ts +39 -0
  81. package/src/parser/rules/block/{center.ts → center/index.ts} +7 -22
  82. package/src/parser/rules/block/center/open.ts +27 -0
  83. package/src/parser/rules/block/{clear-float.ts → clear-float/index.ts} +6 -30
  84. package/src/parser/rules/block/clear-float/syntax.ts +43 -0
  85. package/src/parser/rules/block/code/attributes.ts +30 -0
  86. package/src/parser/rules/block/code/content.ts +57 -0
  87. package/src/parser/rules/block/code/index.ts +100 -0
  88. package/src/parser/rules/block/collapsible/attributes.ts +95 -0
  89. package/src/parser/rules/block/collapsible/body.ts +69 -0
  90. package/src/parser/rules/block/collapsible/index.ts +117 -0
  91. package/src/parser/rules/block/collapsible/open.ts +51 -0
  92. package/src/parser/rules/block/collapsible/orphans.ts +31 -0
  93. package/src/parser/rules/block/collapsible/tags.ts +17 -0
  94. package/src/parser/rules/block/comment/consume.ts +37 -0
  95. package/src/parser/rules/block/{comment.ts → comment/index.ts} +12 -38
  96. package/src/parser/rules/block/{content-separator.ts → content-separator/index.ts} +5 -35
  97. package/src/parser/rules/block/content-separator/syntax.ts +33 -0
  98. package/src/parser/rules/block/definition-list/collect.ts +40 -0
  99. package/src/parser/rules/block/definition-list/index.ts +63 -0
  100. package/src/parser/rules/block/definition-list/item-key.ts +95 -0
  101. package/src/parser/rules/block/definition-list/item-value.ts +56 -0
  102. package/src/parser/rules/block/definition-list/items.ts +54 -0
  103. package/src/parser/rules/block/div/body.ts +41 -0
  104. package/src/parser/rules/block/div/close.ts +41 -0
  105. package/src/parser/rules/block/div/failed.ts +117 -0
  106. package/src/parser/rules/block/div/index.ts +112 -0
  107. package/src/parser/rules/block/div/nesting.ts +37 -0
  108. package/src/parser/rules/block/div/open.ts +59 -0
  109. package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
  110. package/src/parser/rules/block/embed-block/content.ts +53 -0
  111. package/src/parser/rules/block/embed-block/index.ts +91 -0
  112. package/src/parser/rules/block/embed-block/open.ts +52 -0
  113. package/src/parser/rules/block/embed-block/tags.ts +5 -0
  114. package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
  115. package/src/parser/rules/block/footnoteblock/index.ts +82 -0
  116. package/src/parser/rules/block/footnoteblock/open.ts +53 -0
  117. package/src/parser/rules/block/heading/index.ts +87 -0
  118. package/src/parser/rules/block/heading/open.ts +50 -0
  119. package/src/parser/rules/block/heading/toc-text.ts +26 -0
  120. package/src/parser/rules/block/{horizontal-rule.ts → horizontal-rule/index.ts} +4 -21
  121. package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
  122. package/src/parser/rules/block/html/body.ts +114 -0
  123. package/src/parser/rules/block/html/diagnostics.ts +11 -0
  124. package/src/parser/rules/block/html/index.ts +95 -0
  125. package/src/parser/rules/block/html/open.ts +36 -0
  126. package/src/parser/rules/block/iframe/attributes.ts +106 -0
  127. package/src/parser/rules/block/iframe/index.ts +73 -0
  128. package/src/parser/rules/block/iframe/open.ts +58 -0
  129. package/src/parser/rules/block/iframe/source.ts +24 -0
  130. package/src/parser/rules/block/iframe/url.ts +38 -0
  131. package/src/parser/rules/block/iftags/body.ts +48 -0
  132. package/src/parser/rules/block/iftags/condition.ts +24 -0
  133. package/src/parser/rules/block/{iftags.ts → iftags/index.ts} +16 -58
  134. package/src/parser/rules/block/include/arguments.ts +48 -0
  135. package/src/parser/rules/block/include/index.ts +75 -0
  136. package/src/parser/rules/block/include/location.ts +24 -0
  137. package/src/parser/rules/block/include/variables.ts +37 -0
  138. package/src/parser/rules/block/list/index.ts +73 -0
  139. package/src/parser/rules/block/list/line.ts +77 -0
  140. package/src/parser/rules/block/list/native.ts +89 -0
  141. package/src/parser/rules/block/math/content.ts +54 -0
  142. package/src/parser/rules/block/math/index.ts +106 -0
  143. package/src/parser/rules/block/math/name.ts +35 -0
  144. package/src/parser/rules/block/module/body.ts +92 -0
  145. package/src/parser/rules/block/module/element.ts +33 -0
  146. package/src/parser/rules/block/module/include/directive.ts +91 -0
  147. package/src/parser/rules/block/module/include/index.ts +11 -2
  148. package/src/parser/rules/block/module/include/references.ts +42 -0
  149. package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
  150. package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
  151. package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
  152. package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
  153. package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
  154. package/src/parser/rules/block/module/include/scanner.ts +121 -0
  155. package/src/parser/rules/block/module/index.ts +14 -2
  156. package/src/parser/rules/block/module/listpages/compiler.ts +12 -392
  157. package/src/parser/rules/block/module/listpages/extract.ts +25 -359
  158. package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
  159. package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
  160. package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
  161. package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
  162. package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
  163. package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
  164. package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
  165. package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
  166. package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
  167. package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
  168. package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
  169. package/src/parser/rules/block/module/listpages/normalize.ts +8 -324
  170. package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
  171. package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
  172. package/src/parser/rules/block/module/listpages/resolve.ts +5 -75
  173. package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
  174. package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
  175. package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
  176. package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
  177. package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
  178. package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
  179. package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
  180. package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
  181. package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
  182. package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
  183. package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
  184. package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
  185. package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
  186. package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
  187. package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
  188. package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
  189. package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
  190. package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
  191. package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
  192. package/src/parser/rules/block/module/listpages/url-resolution/params.ts +30 -0
  193. package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
  194. package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +62 -0
  195. package/src/parser/rules/block/module/listpages/url-resolution/value.ts +34 -0
  196. package/src/parser/rules/block/module/listpages/url-resolver.ts +3 -160
  197. package/src/parser/rules/block/module/listusers/compiler.ts +4 -25
  198. package/src/parser/rules/block/module/listusers/extract.ts +4 -9
  199. package/src/parser/rules/block/module/listusers/getters.ts +21 -0
  200. package/src/parser/rules/block/module/listusers/variables.ts +15 -0
  201. package/src/parser/rules/block/module/open.ts +57 -0
  202. package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
  203. package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
  204. package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
  205. package/src/parser/rules/block/module/resolution/styles.ts +53 -0
  206. package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
  207. package/src/parser/rules/block/module/resolve.ts +79 -292
  208. package/src/parser/rules/block/module/rule.ts +56 -0
  209. package/src/parser/rules/block/module/types-common.ts +11 -0
  210. package/src/parser/rules/block/module/walk/children.ts +35 -0
  211. package/src/parser/rules/block/module/walk/index.ts +9 -0
  212. package/src/parser/rules/block/module/walk/map/index.ts +2 -0
  213. package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
  214. package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
  215. package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
  216. package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
  217. package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
  218. package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
  219. package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
  220. package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
  221. package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
  222. package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
  223. package/src/parser/rules/block/module/walk/map/types.ts +6 -0
  224. package/src/parser/rules/block/module/walk/traverse.ts +65 -0
  225. package/src/parser/rules/block/orphan-li/content.ts +60 -0
  226. package/src/parser/rules/block/orphan-li/index.ts +75 -0
  227. package/src/parser/rules/block/orphan-li/open.ts +25 -0
  228. package/src/parser/rules/block/orphan-li/tags.ts +40 -0
  229. package/src/parser/rules/block/paragraph/content.ts +12 -0
  230. package/src/parser/rules/block/paragraph/index.ts +60 -0
  231. package/src/parser/rules/block/paragraph/normalize.ts +52 -0
  232. package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
  233. package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
  234. package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
  235. package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
  236. package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
  237. package/src/parser/rules/block/parsing/block-item.ts +29 -0
  238. package/src/parser/rules/block/parsing/content.ts +127 -0
  239. package/src/parser/rules/block/parsing/end-condition.ts +51 -0
  240. package/src/parser/rules/block/parsing/inline-content.ts +105 -0
  241. package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
  242. package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
  243. package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
  244. package/src/parser/rules/block/table/index.ts +80 -0
  245. package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
  246. package/src/parser/rules/block/table/pipe/cell.ts +106 -0
  247. package/src/parser/rules/block/table/pipe/index.ts +2 -0
  248. package/src/parser/rules/block/table/pipe/row.ts +88 -0
  249. package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
  250. package/src/parser/rules/block/table/pipe/trim.ts +50 -0
  251. package/src/parser/rules/block/table-block/body.ts +79 -0
  252. package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
  253. package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
  254. package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
  255. package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
  256. package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
  257. package/src/parser/rules/block/table-block/cell.ts +64 -0
  258. package/src/parser/rules/block/table-block/index.ts +113 -0
  259. package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
  260. package/src/parser/rules/block/table-block/structure.ts +80 -0
  261. package/src/parser/rules/block/tabview/body.ts +64 -0
  262. package/src/parser/rules/block/tabview/index.ts +90 -0
  263. package/src/parser/rules/block/tabview/open.ts +50 -0
  264. package/src/parser/rules/block/tabview/tab.ts +92 -0
  265. package/src/parser/rules/block/tabview/tags.ts +30 -0
  266. package/src/parser/rules/block/toc/element.ts +11 -0
  267. package/src/parser/rules/block/toc/index.ts +44 -0
  268. package/src/parser/rules/block/toc/open.ts +84 -0
  269. package/src/parser/rules/block/utils.ts +10 -610
  270. package/src/parser/rules/{utils.ts → common/attribute-safety.ts} +3 -49
  271. package/src/parser/rules/common/block-name.ts +33 -0
  272. package/src/parser/rules/common/index.ts +2 -0
  273. package/src/parser/rules/contracts/index.ts +3 -0
  274. package/src/parser/rules/contracts/parse-context.ts +38 -0
  275. package/src/parser/rules/contracts/rule.ts +43 -0
  276. package/src/parser/rules/contracts/scope.ts +31 -0
  277. package/src/parser/rules/inline/anchor/attributes.ts +54 -0
  278. package/src/parser/rules/inline/anchor/child.ts +26 -0
  279. package/src/parser/rules/inline/anchor/close.ts +34 -0
  280. package/src/parser/rules/inline/anchor/content.ts +59 -0
  281. package/src/parser/rules/inline/anchor/index.ts +103 -0
  282. package/src/parser/rules/inline/anchor/newline.ts +26 -0
  283. package/src/parser/rules/inline/anchor/open.ts +47 -0
  284. package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
  285. package/src/parser/rules/inline/anchor/syntax.ts +40 -0
  286. package/src/parser/rules/inline/anchor-name/index.ts +38 -0
  287. package/src/parser/rules/inline/anchor-name/name.ts +39 -0
  288. package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
  289. package/src/parser/rules/inline/bibcite/element.ts +14 -0
  290. package/src/parser/rules/inline/bibcite/index.ts +34 -0
  291. package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
  292. package/src/parser/rules/inline/bold.ts +2 -39
  293. package/src/parser/rules/inline/color/index.ts +35 -0
  294. package/src/parser/rules/inline/color/syntax.ts +69 -0
  295. package/src/parser/rules/inline/comment/consume.ts +31 -0
  296. package/src/parser/rules/inline/{comment.ts → comment/index.ts} +10 -36
  297. package/src/parser/rules/inline/equation-ref/element.ts +8 -0
  298. package/src/parser/rules/inline/equation-ref/index.ts +34 -0
  299. package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
  300. package/src/parser/rules/inline/expr/branch.ts +104 -0
  301. package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
  302. package/src/parser/rules/inline/expr/conditional.ts +80 -0
  303. package/src/parser/rules/inline/expr/depth.ts +25 -0
  304. package/src/parser/rules/inline/expr/elements.ts +39 -0
  305. package/src/parser/rules/inline/expr/index.ts +84 -0
  306. package/src/parser/rules/inline/expr/syntax.ts +45 -0
  307. package/src/parser/rules/inline/footnote/child.ts +22 -0
  308. package/src/parser/rules/inline/footnote/close.ts +33 -0
  309. package/src/parser/rules/inline/footnote/content.ts +54 -0
  310. package/src/parser/rules/inline/footnote/elements.ts +38 -0
  311. package/src/parser/rules/inline/footnote/index.ts +54 -0
  312. package/src/parser/rules/inline/footnote/newline.ts +27 -0
  313. package/src/parser/rules/inline/footnote/open.ts +38 -0
  314. package/src/parser/rules/inline/formatting/container.ts +50 -0
  315. package/src/parser/rules/inline/{guillemet.ts → guillemet/index.ts} +5 -13
  316. package/src/parser/rules/inline/guillemet/text.ts +11 -0
  317. package/src/parser/rules/inline/html/gate.ts +64 -0
  318. package/src/parser/rules/inline/{html.ts → html/index.ts} +9 -60
  319. package/src/parser/rules/inline/html/open.ts +37 -0
  320. package/src/parser/rules/inline/image/attributes.ts +22 -0
  321. package/src/parser/rules/inline/image/body.ts +36 -0
  322. package/src/parser/rules/inline/image/index.ts +89 -0
  323. package/src/parser/rules/inline/image/open.ts +56 -0
  324. package/src/parser/rules/inline/image/source.ts +62 -0
  325. package/src/parser/rules/inline/image/syntax.ts +76 -0
  326. package/src/parser/rules/inline/italic.ts +2 -30
  327. package/src/parser/rules/inline/line-break/backslash.ts +58 -0
  328. package/src/parser/rules/inline/line-break/elements.ts +9 -0
  329. package/src/parser/rules/inline/line-break/index.ts +3 -0
  330. package/src/parser/rules/inline/line-break/newline.ts +82 -0
  331. package/src/parser/rules/inline/line-break/underscore.ts +45 -0
  332. package/src/parser/rules/inline/link-anchor.ts +6 -81
  333. package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
  334. package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
  335. package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
  336. package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
  337. package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
  338. package/src/parser/rules/inline/link-single.ts +7 -98
  339. package/src/parser/rules/inline/link-star.ts +7 -69
  340. package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
  341. package/src/parser/rules/inline/link-triple/index.ts +62 -0
  342. package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
  343. package/src/parser/rules/inline/link-triple/label.ts +35 -0
  344. package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
  345. package/src/parser/rules/inline/link-triple/target.ts +36 -0
  346. package/src/parser/rules/inline/math-inline/index.ts +40 -0
  347. package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
  348. package/src/parser/rules/inline/monospace.ts +2 -30
  349. package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
  350. package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
  351. package/src/parser/rules/inline/parsing/collect.ts +23 -0
  352. package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
  353. package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
  354. package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
  355. package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
  356. package/src/parser/rules/inline/parsing/rules.ts +34 -0
  357. package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
  358. package/src/parser/rules/inline/raw/angle.ts +40 -0
  359. package/src/parser/rules/inline/raw/double-at.ts +78 -0
  360. package/src/parser/rules/inline/raw/index.ts +26 -0
  361. package/src/parser/rules/inline/raw/result.ts +26 -0
  362. package/src/parser/rules/inline/size/content.ts +65 -0
  363. package/src/parser/rules/inline/size/index.ts +55 -0
  364. package/src/parser/rules/inline/size/open.ts +43 -0
  365. package/src/parser/rules/inline/size/value.ts +45 -0
  366. package/src/parser/rules/inline/span/content.ts +97 -0
  367. package/src/parser/rules/inline/span/elements.ts +108 -0
  368. package/src/parser/rules/inline/span/index.ts +79 -0
  369. package/src/parser/rules/inline/span/newline.ts +50 -0
  370. package/src/parser/rules/inline/span/syntax.ts +70 -0
  371. package/src/parser/rules/inline/{strikethrough.ts → strikethrough/index.ts} +5 -60
  372. package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
  373. package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
  374. package/src/parser/rules/inline/subscript.ts +2 -39
  375. package/src/parser/rules/inline/superscript.ts +4 -39
  376. package/src/parser/rules/inline/text/element.ts +5 -0
  377. package/src/parser/rules/inline/{text.ts → text/index.ts} +5 -4
  378. package/src/parser/rules/inline/underline/child.ts +26 -0
  379. package/src/parser/rules/inline/underline/content.ts +29 -0
  380. package/src/parser/rules/inline/{underline.ts → underline/index.ts} +6 -49
  381. package/src/parser/rules/inline/user/element.ts +11 -0
  382. package/src/parser/rules/inline/user/index.ts +34 -0
  383. package/src/parser/rules/inline/user/syntax.ts +67 -0
  384. package/src/parser/rules/inline/utils.ts +4 -344
  385. package/src/parser/rules/tokens.ts +106 -0
  386. package/src/parser/rules/types.ts +9 -252
  387. package/src/parser/depth.ts +0 -251
  388. package/src/parser/parse.ts +0 -315
  389. package/src/parser/postprocess/spanStrip.ts +0 -697
  390. package/src/parser/preprocess/expr.ts +0 -265
  391. package/src/parser/preprocess/utils.ts +0 -250
  392. package/src/parser/preprocess/whitespace.ts +0 -111
  393. package/src/parser/rules/block/align.ts +0 -282
  394. package/src/parser/rules/block/bibliography.ts +0 -359
  395. package/src/parser/rules/block/block-list.ts +0 -689
  396. package/src/parser/rules/block/blockquote.ts +0 -238
  397. package/src/parser/rules/block/code.ts +0 -187
  398. package/src/parser/rules/block/collapsible.ts +0 -337
  399. package/src/parser/rules/block/definition-list.ts +0 -270
  400. package/src/parser/rules/block/div.ts +0 -400
  401. package/src/parser/rules/block/embed-block.ts +0 -153
  402. package/src/parser/rules/block/footnoteblock.ts +0 -200
  403. package/src/parser/rules/block/heading.ts +0 -142
  404. package/src/parser/rules/block/html.ts +0 -222
  405. package/src/parser/rules/block/iframe.ts +0 -239
  406. package/src/parser/rules/block/include.ts +0 -179
  407. package/src/parser/rules/block/list.ts +0 -244
  408. package/src/parser/rules/block/math.ts +0 -183
  409. package/src/parser/rules/block/module/include/resolve.ts +0 -556
  410. package/src/parser/rules/block/module/listpages/types.ts +0 -513
  411. package/src/parser/rules/block/module/walk.ts +0 -380
  412. package/src/parser/rules/block/module.ts +0 -164
  413. package/src/parser/rules/block/orphan-li.ts +0 -177
  414. package/src/parser/rules/block/paragraph.ts +0 -157
  415. package/src/parser/rules/block/table-block.ts +0 -726
  416. package/src/parser/rules/block/table.ts +0 -441
  417. package/src/parser/rules/block/tabview.ts +0 -331
  418. package/src/parser/rules/block/toc.ts +0 -129
  419. package/src/parser/rules/inline/anchor-name.ts +0 -154
  420. package/src/parser/rules/inline/anchor.ts +0 -327
  421. package/src/parser/rules/inline/bibcite.ts +0 -153
  422. package/src/parser/rules/inline/color.ts +0 -140
  423. package/src/parser/rules/inline/equation-ref.ts +0 -115
  424. package/src/parser/rules/inline/expr.ts +0 -526
  425. package/src/parser/rules/inline/footnote.ts +0 -223
  426. package/src/parser/rules/inline/image.ts +0 -328
  427. package/src/parser/rules/inline/line-break.ts +0 -326
  428. package/src/parser/rules/inline/link-triple.ts +0 -267
  429. package/src/parser/rules/inline/math-inline.ts +0 -126
  430. package/src/parser/rules/inline/raw.ts +0 -262
  431. package/src/parser/rules/inline/size.ts +0 -244
  432. package/src/parser/rules/inline/span.ts +0 -424
  433. package/src/parser/rules/inline/user.ts +0 -147
@@ -1,337 +0,0 @@
1
- /**
2
- * Block rule for Wikidot collapsible blocks: `[[collapsible]]...[[/collapsible]]`.
3
- *
4
- * A collapsible renders as a show/hide toggle with body content that can
5
- * be expanded or collapsed. The opening tag accepts several attributes
6
- * (which may span multiple lines):
7
- *
8
- * - `show` -- label text for the "show" link (default: "+ show block").
9
- * - `hide` -- label text for the "hide" link (default: "- hide block").
10
- * - `folded` -- when `"no"`, the block starts in the expanded state.
11
- * - `hideLocation` -- where the toggle link appears: `"top"` (default),
12
- * `"bottom"`, `"both"`, or `"neither"`/`"none"`.
13
- *
14
- * Key Wikidot-specific behaviours:
15
- * - Collapsibles cannot nest. When the body parser encounters a second
16
- * `[[collapsible]]`, it is treated as plain text. This is achieved by
17
- * filtering the collapsible rule out of the block rule list for body parsing.
18
- * - Orphaned `[[/collapsible]]` tags after the matched close are consumed and
19
- * emitted as `<br />` + literal text, matching Wikidot rendering.
20
- * - An inline form (`[[collapsible]]text[[/collapsible]]` on one line) is
21
- * supported but uncommon.
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 { parseBlockName, parseBlocksUntil } from "./utils";
29
-
30
- /**
31
- * Parses block attributes that may be spread across multiple lines.
32
- *
33
- * Unlike the standard {@link parseAttributes}, this variant allows NEWLINE
34
- * tokens between attribute pairs, which Wikidot permits for `[[collapsible]]`
35
- * tags with many attributes.
36
- *
37
- * @param ctx - Parse context.
38
- * @param startPos - Token index to start scanning.
39
- * @returns Parsed key/value pairs and the number of tokens consumed.
40
- */
41
- function parseMultilineAttributes(
42
- ctx: ParseContext,
43
- startPos: number,
44
- ): { attrs: Record<string, string>; consumed: number } {
45
- const attrs: Record<string, string> = {};
46
- let pos = startPos;
47
- let consumed = 0;
48
-
49
- while (pos < ctx.tokens.length) {
50
- const token = ctx.tokens[pos];
51
- if (!token || token.type === "BLOCK_CLOSE" || token.type === "EOF") {
52
- break;
53
- }
54
-
55
- if (token.type === "WHITESPACE" || token.type === "NEWLINE") {
56
- pos++;
57
- consumed++;
58
- continue;
59
- }
60
-
61
- if (token.type === "TEXT" || token.type === "IDENTIFIER") {
62
- let name = token.value;
63
- pos++;
64
- consumed++;
65
-
66
- // Handle hyphenated names (e.g. "hide-location")
67
- while (
68
- ctx.tokens[pos]?.type === "TEXT" &&
69
- ctx.tokens[pos]?.value === "-" &&
70
- (ctx.tokens[pos + 1]?.type === "IDENTIFIER" || ctx.tokens[pos + 1]?.type === "TEXT")
71
- ) {
72
- name += "-";
73
- pos++;
74
- consumed++;
75
- name += ctx.tokens[pos]?.value ?? "";
76
- pos++;
77
- consumed++;
78
- }
79
-
80
- const eqToken = ctx.tokens[pos];
81
- if (eqToken?.type === "EQUALS") {
82
- pos++;
83
- consumed++;
84
- const valueToken = ctx.tokens[pos];
85
- if (valueToken?.type === "QUOTED_STRING") {
86
- let value = valueToken.value;
87
- if (value.startsWith('"') && value.endsWith('"')) {
88
- value = value.slice(1, -1);
89
- }
90
- attrs[name] = value;
91
- pos++;
92
- consumed++;
93
- } else if (valueToken?.type === "TEXT" || valueToken?.type === "IDENTIFIER") {
94
- attrs[name] = valueToken.value;
95
- pos++;
96
- consumed++;
97
- }
98
- } else {
99
- attrs[name] = "true";
100
- }
101
- } else {
102
- // Unknown token type in attribute context, stop
103
- break;
104
- }
105
- }
106
-
107
- return { attrs, consumed };
108
- }
109
-
110
- /**
111
- * Tests whether the tokens at `pos` form a `[[/collapsible]]` closing tag.
112
- *
113
- * @param ctx - Parse context.
114
- * @param pos - Token index to inspect.
115
- * @returns `true` if the closing tag is found.
116
- */
117
- function isCollapsibleClose(ctx: ParseContext, pos: number): boolean {
118
- if (ctx.tokens[pos]?.type !== "BLOCK_END_OPEN") return false;
119
- const nameResult = parseBlockName(ctx, pos + 1);
120
- return nameResult?.name === "collapsible";
121
- }
122
-
123
- /**
124
- * Counts the number of tokens occupied by the `[[/collapsible]]` closing
125
- * tag, including the optional trailing NEWLINE.
126
- *
127
- * @param ctx - Parse context.
128
- * @param pos - Token index at the BLOCK_END_OPEN.
129
- * @returns Total token count of the closing tag.
130
- */
131
- function consumeCloseTag(ctx: ParseContext, pos: number): number {
132
- let closeConsumed = 1; // BLOCK_END_OPEN
133
- const nameResult = parseBlockName(ctx, pos + 1);
134
- if (nameResult) closeConsumed += nameResult.consumed;
135
- if (ctx.tokens[pos + closeConsumed]?.type === "BLOCK_CLOSE") closeConsumed++;
136
- if (ctx.tokens[pos + closeConsumed]?.type === "NEWLINE") closeConsumed++;
137
- return closeConsumed;
138
- }
139
-
140
- /** Block names excluded from rule dispatch and paragraph-boundary detection. */
141
- const EXCLUDED_BLOCKS = new Set(["collapsible"]);
142
-
143
- /**
144
- * Block rule for `[[collapsible ...]]...[[/collapsible]]`.
145
- *
146
- * Parsing strategy:
147
- * 1. Match BLOCK_OPEN + name "collapsible".
148
- * 2. Parse multiline attributes (show, hide, folded, hideLocation, etc.).
149
- * 3. If a NEWLINE follows the opening tag, parse body as block content
150
- * with the collapsible rule itself excluded (to prevent nesting).
151
- * Otherwise, parse inline content until close tag or end of line
152
- * (inline form).
153
- * 4. Consume the `[[/collapsible]]` closing tag.
154
- * 5. Consume any orphaned `[[/collapsible]]` tags that follow, converting
155
- * them to `<br />` + literal text.
156
- * 6. Derive `show-top` / `show-bottom` booleans from the `hideLocation`
157
- * attribute.
158
- */
159
- export const collapsibleRule: BlockRule = {
160
- name: "collapsible",
161
- startTokens: ["BLOCK_OPEN"],
162
- requiresLineStart: false,
163
-
164
- parse(ctx: ParseContext): RuleResult<Element> {
165
- const openToken = currentToken(ctx);
166
- if (openToken.type !== "BLOCK_OPEN") {
167
- return { success: false };
168
- }
169
-
170
- let pos = ctx.pos + 1;
171
- let consumed = 1;
172
-
173
- const nameResult = parseBlockName(ctx, pos);
174
- if (!nameResult || nameResult.name !== "collapsible") {
175
- return { success: false };
176
- }
177
-
178
- pos += nameResult.consumed;
179
- consumed += nameResult.consumed;
180
-
181
- const attrResult = parseMultilineAttributes(ctx, pos);
182
- pos += attrResult.consumed;
183
- consumed += attrResult.consumed;
184
-
185
- if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
186
- return { success: false };
187
- }
188
- pos++;
189
- consumed++;
190
-
191
- // Record opening tag position for diagnostics
192
- const openPosition = openToken.position;
193
-
194
- const hasNewlineAfterOpen = ctx.tokens[pos]?.type === "NEWLINE";
195
- if (hasNewlineAfterOpen) {
196
- pos++;
197
- consumed++;
198
- }
199
-
200
- let bodyElements: Element[];
201
-
202
- if (
203
- !hasNewlineAfterOpen &&
204
- ctx.tokens[pos]?.type !== "EOF" &&
205
- ctx.tokens[pos]?.type !== "BLOCK_END_OPEN"
206
- ) {
207
- // Inline form: [[collapsible]]content[[/collapsible]] on same line
208
- // Parse inline content until [[/collapsible]] or NEWLINE
209
- const inlineElements: Element[] = [];
210
- let inlineConsumed = 0;
211
- let inlinePos = pos;
212
-
213
- while (inlinePos < ctx.tokens.length) {
214
- const token = ctx.tokens[inlinePos];
215
- if (!token || token.type === "EOF" || token.type === "NEWLINE") break;
216
- if (isCollapsibleClose(ctx, inlinePos)) break;
217
- inlineElements.push({ element: "text", data: token.value });
218
- inlinePos++;
219
- inlineConsumed++;
220
- }
221
-
222
- consumed += inlineConsumed;
223
- pos += inlineConsumed;
224
-
225
- if (inlineElements.length > 0) {
226
- bodyElements = [
227
- {
228
- element: "container",
229
- data: {
230
- type: "paragraph",
231
- attributes: {},
232
- elements: inlineElements,
233
- },
234
- },
235
- ];
236
- } else {
237
- bodyElements = [];
238
- }
239
- } else {
240
- // Block form: parse content recursively until [[/collapsible]]
241
- // Collapsible cannot be nested in Wikidot - nested [[collapsible]] becomes plain text.
242
- // excludedBlockNames removes the collapsible rule from dispatch AND prevents
243
- // [[collapsible]] / [[/collapsible]] tokens from triggering paragraph splits.
244
- const bodyCtx: ParseContext = { ...ctx, pos };
245
-
246
- const closeCondition = (checkCtx: ParseContext): boolean => {
247
- return isCollapsibleClose(checkCtx, checkCtx.pos);
248
- };
249
-
250
- const bodyResult = parseBlocksUntil(bodyCtx, closeCondition, {
251
- excludedBlockNames: EXCLUDED_BLOCKS,
252
- });
253
- consumed += bodyResult.consumed;
254
- pos += bodyResult.consumed;
255
-
256
- bodyElements = bodyResult.elements;
257
- }
258
-
259
- // Check for missing close tag
260
- if (!isCollapsibleClose(ctx, pos)) {
261
- ctx.diagnostics.push({
262
- severity: "warning",
263
- code: "unclosed-block",
264
- message: "Missing closing tag [[/collapsible]] for [[collapsible]]",
265
- position: openPosition,
266
- });
267
- }
268
-
269
- // Consume [[/collapsible]]
270
- if (isCollapsibleClose(ctx, pos)) {
271
- const closeConsumed = consumeCloseTag(ctx, pos);
272
- consumed += closeConsumed;
273
- pos += closeConsumed;
274
- }
275
-
276
- // Consume orphaned [[/collapsible]] after the block
277
- // Wikidot renders these as bare <br />[[/collapsible]] (no <p> wrapper)
278
- const orphanedElements: Element[] = [];
279
- while (isCollapsibleClose(ctx, pos)) {
280
- orphanedElements.push({ element: "line-break" });
281
-
282
- // Convert tokens of [[/collapsible]] to text
283
- while (pos < ctx.tokens.length) {
284
- const t = ctx.tokens[pos];
285
- if (!t || t.type === "NEWLINE" || t.type === "EOF") break;
286
- orphanedElements.push({ element: "text", data: t.value });
287
- consumed++;
288
- pos++;
289
- }
290
-
291
- // Skip trailing NEWLINE
292
- if (ctx.tokens[pos]?.type === "NEWLINE") {
293
- consumed++;
294
- pos++;
295
- }
296
- }
297
-
298
- // Determine show-top/show-bottom from hideLocation attribute
299
- const hideLocation = (
300
- attrResult.attrs.hideLocation ??
301
- attrResult.attrs.hidelocation ??
302
- "top"
303
- ).toLowerCase();
304
- let showTop = true;
305
- let showBottom = false;
306
- if (hideLocation === "both") {
307
- showTop = true;
308
- showBottom = true;
309
- } else if (hideLocation === "bottom") {
310
- showTop = false;
311
- showBottom = true;
312
- } else if (hideLocation === "neither" || hideLocation === "none") {
313
- showTop = false;
314
- showBottom = false;
315
- }
316
-
317
- return {
318
- success: true,
319
- elements: [
320
- {
321
- element: "collapsible",
322
- data: {
323
- elements: bodyElements,
324
- attributes: {},
325
- "start-open": attrResult.attrs.folded === "no",
326
- "show-text": attrResult.attrs.show ?? null,
327
- "hide-text": attrResult.attrs.hide ?? null,
328
- "show-top": showTop,
329
- "show-bottom": showBottom,
330
- },
331
- },
332
- ...orphanedElements,
333
- ],
334
- consumed,
335
- };
336
- },
337
- };
@@ -1,270 +0,0 @@
1
- /**
2
- *
3
- * Block rule for Wikidot definition lists written with the `: key : value` syntax.
4
- *
5
- * Each item starts at the beginning of a line with a COLON, followed by
6
- * mandatory whitespace, the key (term), a second COLON, and then the value
7
- * (definition). Multiple consecutive items form a single `<dl>` block.
8
- *
9
- * ```
10
- * : Apple : A fruit that grows on trees.
11
- * : Banana : A yellow curved fruit.
12
- * ```
13
- *
14
- * Key parsing details:
15
- * - Whitespace after the first colon is required (`": key"` not `":key"`).
16
- * - The key portion supports inline markup (bold, links, etc.).
17
- * - The value continues until a double newline, a new definition entry, or
18
- * the end of the document.
19
- * - A single newline within the value does NOT break the entry -- parsing
20
- * continues on the next line.
21
- *
22
- * @module
23
- */
24
- import type { Element, DefinitionListItem } from "@wdprlib/ast";
25
- import type { BlockRule, ParseContext, RuleResult } from "../types";
26
- import { parseInlineUntil } from "../inline/utils";
27
-
28
- /**
29
- * Internal representation of one definition list item before conversion
30
- * to the AST's {@link DefinitionListItem} format.
31
- */
32
- interface ParsedDefinitionItem {
33
- /** Raw string of the key, used for `key_string` in the AST. */
34
- keyString: string;
35
- /** Parsed inline elements representing the key / term. */
36
- key: Element[];
37
- /** Parsed inline elements representing the value / definition. */
38
- value: Element[];
39
- }
40
-
41
- /**
42
- * Parses a single definition list entry of the form `: key : value`.
43
- *
44
- * The function expects `startPos` to point at a line-start COLON token.
45
- * It consumes the first colon, mandatory whitespace, key tokens up to
46
- * the second colon, then value tokens until one of the following:
47
- * - A double newline (paragraph break).
48
- * - A new entry (COLON at line start).
49
- * - End of input.
50
- *
51
- * The key is parsed for inline content using {@link parseInlineUntil}
52
- * (stopping at COLON), and the value uses the same utility (stopping at
53
- * NEWLINE).
54
- *
55
- * @param ctx - Parse context.
56
- * @param startPos - Token index of the expected line-start COLON.
57
- * @returns The parsed item and token count, or `null` on failure.
58
- */
59
- function parseDefinitionItem(
60
- ctx: ParseContext,
61
- startPos: number,
62
- ): { item: ParsedDefinitionItem; consumed: number } | null {
63
- let pos = startPos;
64
- let consumed = 0;
65
-
66
- // Expect COLON at line start
67
- const colonToken = ctx.tokens[pos];
68
- if (!colonToken || colonToken.type !== "COLON" || !colonToken.lineStart) {
69
- return null;
70
- }
71
- pos++;
72
- consumed++;
73
-
74
- // Wikidot requires whitespace after first colon: ": key : value"
75
- const whitespaceAfterColon = ctx.tokens[pos];
76
- if (!whitespaceAfterColon || whitespaceAfterColon.type !== "WHITESPACE") {
77
- return null;
78
- }
79
-
80
- // Skip whitespace after first colon
81
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
82
- pos++;
83
- consumed++;
84
- }
85
-
86
- // Collect key tokens until second COLON
87
- const keyTokens: string[] = [];
88
- const keyNodes: Element[] = [];
89
- let foundSecondColon = false;
90
-
91
- while (pos < ctx.tokens.length) {
92
- const token = ctx.tokens[pos];
93
- if (!token || token.type === "NEWLINE" || token.type === "EOF") {
94
- break;
95
- }
96
- if (token.type === "COLON") {
97
- foundSecondColon = true;
98
- pos++;
99
- consumed++;
100
- break;
101
- }
102
-
103
- // Parse inline content for key
104
- const inlineCtx: ParseContext = { ...ctx, pos };
105
- const result = parseInlineUntil(inlineCtx, "COLON");
106
- if (result.elements.length > 0) {
107
- keyNodes.push(...result.elements);
108
- // Collect raw key string
109
- for (let i = 0; i < result.consumed; i++) {
110
- const t = ctx.tokens[pos + i];
111
- if (t) keyTokens.push(t.value);
112
- }
113
- pos += result.consumed;
114
- consumed += result.consumed;
115
- } else {
116
- keyTokens.push(token.value);
117
- pos++;
118
- consumed++;
119
- }
120
- }
121
-
122
- if (!foundSecondColon) {
123
- return null;
124
- }
125
-
126
- // Skip whitespace after second colon
127
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
128
- pos++;
129
- consumed++;
130
- }
131
-
132
- // Parse value (rest of line, can continue with line breaks)
133
- const valueNodes: Element[] = [];
134
- while (pos < ctx.tokens.length) {
135
- const token = ctx.tokens[pos];
136
- if (!token || token.type === "EOF") {
137
- break;
138
- }
139
-
140
- // Check for end of definition (double newline or new definition)
141
- if (token.type === "NEWLINE") {
142
- const nextToken = ctx.tokens[pos + 1];
143
- // Look ahead for continuation with underscore line break
144
- if (nextToken?.type === "COLON" && nextToken.lineStart) {
145
- // New definition item starts
146
- pos++;
147
- consumed++;
148
- break;
149
- }
150
- if (nextToken?.type === "NEWLINE" || !nextToken || nextToken.type === "EOF") {
151
- // Double newline or end - stop
152
- pos++;
153
- consumed++;
154
- break;
155
- }
156
- // Single newline - continue parsing (becomes line break)
157
- }
158
-
159
- // Parse inline content
160
- const inlineCtx: ParseContext = { ...ctx, pos };
161
- const result = parseInlineUntil(inlineCtx, "NEWLINE");
162
- if (result.elements.length > 0) {
163
- valueNodes.push(...result.elements);
164
- pos += result.consumed;
165
- consumed += result.consumed;
166
- } else {
167
- pos++;
168
- consumed++;
169
- }
170
- }
171
-
172
- // Remove trailing whitespace from key
173
- const keyString = keyTokens.join("").trim();
174
-
175
- // Remove trailing whitespace nodes from key
176
- while (keyNodes.length > 0) {
177
- const lastNode = keyNodes[keyNodes.length - 1];
178
- if (
179
- lastNode &&
180
- lastNode.element === "text" &&
181
- typeof lastNode.data === "string" &&
182
- lastNode.data.trim() === ""
183
- ) {
184
- keyNodes.pop();
185
- } else {
186
- break;
187
- }
188
- }
189
-
190
- return {
191
- item: {
192
- keyString,
193
- key: keyNodes,
194
- value: valueNodes,
195
- },
196
- consumed,
197
- };
198
- }
199
-
200
- /**
201
- * Block rule for Wikidot definition lists (`: key : value`).
202
- *
203
- * Parsing strategy:
204
- * 1. Verify the first token is a line-start COLON.
205
- * 2. Repeatedly call `parseDefinitionItem()` to collect entries.
206
- * 3. Stop when the current token is no longer a line-start COLON (i.e.
207
- * the definition list block has ended).
208
- * 4. Convert internal items into the AST {@link DefinitionListItem} format.
209
- * 5. Emit a single `definition-list` element.
210
- */
211
- export const definitionListRule: BlockRule = {
212
- name: "definitionList",
213
- startTokens: ["COLON"],
214
- requiresLineStart: true,
215
-
216
- parse(ctx: ParseContext): RuleResult<Element> {
217
- const items: ParsedDefinitionItem[] = [];
218
- let pos = ctx.pos;
219
- let totalConsumed = 0;
220
-
221
- while (pos < ctx.tokens.length) {
222
- const token = ctx.tokens[pos];
223
- if (!token || token.type === "EOF") {
224
- break;
225
- }
226
-
227
- // Only parse lines starting with :
228
- if (token.type !== "COLON" || !token.lineStart) {
229
- break;
230
- }
231
-
232
- const result = parseDefinitionItem(ctx, pos);
233
- if (!result) {
234
- break;
235
- }
236
-
237
- items.push(result.item);
238
- pos += result.consumed;
239
- totalConsumed += result.consumed;
240
-
241
- // Skip any whitespace between items
242
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
243
- pos++;
244
- totalConsumed++;
245
- }
246
- }
247
-
248
- if (items.length === 0) {
249
- return { success: false };
250
- }
251
-
252
- // Convert items to DefinitionListItem format
253
- const definitionItems: DefinitionListItem[] = items.map((item) => ({
254
- key_string: item.keyString,
255
- key: item.key,
256
- value: item.value,
257
- }));
258
-
259
- return {
260
- success: true,
261
- elements: [
262
- {
263
- element: "definition-list",
264
- data: definitionItems,
265
- },
266
- ],
267
- consumed: totalConsumed,
268
- };
269
- },
270
- };