@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,252 +1,9 @@
1
- import type { Token, TokenType } from "../../lexer";
2
- import type { Version, WikitextSettings, Diagnostic } from "@wdprlib/ast";
3
- import type { Element, CodeBlockData, TocEntry } from "@wdprlib/ast";
4
-
5
- /**
6
- * Per-scope state propagated by spread + override semantics.
7
- *
8
- * Every field is `readonly` so a rule cannot accidentally mutate the
9
- * parent scope by writing through a shared reference. Updates must be
10
- * expressed as a replacement: `ctx.scope = { ...ctx.scope, X: ... }`
11
- * (or, more commonly, by constructing a new child context with the
12
- * desired scope override).
13
- *
14
- * The motivation is to keep speculative parse rollback safe: when a
15
- * block rule fails, any scope it built up is discarded with the failed
16
- * context. A shared-state design that mutates fields in place does not
17
- * survive rollback — grouping per-scope fields here and forbidding
18
- * nested mutation makes the semantics explicit at the type level.
19
- */
20
- export interface ScopeContext {
21
- /**
22
- * Close condition for the current block. The paragraph parser calls
23
- * it to decide when to stop collecting inline content.
24
- */
25
- readonly blockCloseCondition?: (ctx: ParseContext) => boolean;
26
- /**
27
- * Block names excluded from paragraph-boundary detection. When a
28
- * BLOCK_OPEN/BLOCK_END_OPEN for an excluded name appears at line
29
- * start, the inline parser does NOT treat it as a paragraph break.
30
- * Used by `[[collapsible]]` to prevent nested `[[collapsible]]` from
31
- * splitting paragraphs.
32
- */
33
- readonly excludedBlockNames?: ReadonlySet<string>;
34
- /**
35
- * Budget for div nesting: tracks how many more nested divs can open.
36
- * When 0, the div rule fails (innermost excess opens become text).
37
- * `undefined` means "not yet calculated" (top-level or non-div context).
38
- */
39
- readonly divClosesBudget?: number;
40
- /**
41
- * Used by the footnote-block rule to reject duplicate occurrences.
42
- *
43
- * **Scope is per spread copy of `ParseContext`, not document-global.**
44
- * `parseBlocksUntil` creates a fresh `{ ...ctx, pos, ... }` on every
45
- * iteration, so the flag does not propagate between sibling rules in
46
- * a body, between sibling bodies, or up to the top-level parser.
47
- *
48
- * Practical effect today:
49
- * - Two `[[footnoteblock]]` at the top level: the second one fails
50
- * (the top-level dispatch hands the parser's own `ctx` to rules,
51
- * so mutations are visible to the next top-level iteration).
52
- * - Two `[[footnoteblock]]` inside the same body, or across nested
53
- * bodies: both currently succeed, even though Wikidot's
54
- * "first-only" rule should reject the duplicate.
55
- *
56
- * Fixing the cross-scope case requires either an AST-level dedup pass
57
- * after parsing (similar to the auto-append walk) or a shared-state
58
- * design with proper rollback for speculative parses. Tracked
59
- * separately; this flag intentionally keeps the original primitive
60
- * semantics to avoid regressing the top-level duplicate-rejection
61
- * test fixtures.
62
- *
63
- * The auto-append decision in `Parser.parse` deliberately ignores
64
- * this flag and walks the final AST instead — see `containsFootnoteBlock`.
65
- */
66
- readonly footnoteBlockParsed: boolean;
67
- }
68
-
69
- /**
70
- * Parser context passed to rules.
71
- *
72
- * Fields are grouped by lifecycle:
73
- * - Static config (`tokens`, `version`, `trackPositions`, `settings`,
74
- * rule arrays): constructor-fixed.
75
- * - `pos`: per-scope cursor; kept top-level for ergonomics because
76
- * every rule spread overrides it.
77
- * - Accumulators (`footnotes`, `tocEntries`, …, `diagnostics`):
78
- * reference-shared via array identity across spreads.
79
- * - `scope`: per-scope state explicitly grouped; see {@link ScopeContext}.
80
- */
81
- export interface ParseContext {
82
- tokens: Token[];
83
- pos: number;
84
- version: Version;
85
- trackPositions: boolean;
86
- settings: WikitextSettings;
87
- // Collections for SyntaxTree output
88
- footnotes: Element[][];
89
- tocEntries: TocEntry[];
90
- codeBlocks: CodeBlockData[];
91
- htmlBlocks: string[];
92
- // Bibliography citation labels collected during parsing
93
- bibcites: string[];
94
- // Rules (injected to avoid circular dependency)
95
- blockRules: BlockRule[];
96
- blockFallbackRule: BlockRule;
97
- inlineRules: InlineRule[];
98
- // Diagnostics collected during parsing
99
- diagnostics: Diagnostic[];
100
- // Per-scope state (readonly fields, immutable-replace semantics).
101
- scope: ScopeContext;
102
- }
103
-
104
- /**
105
- * Result of a rule attempt
106
- * Returns elements array None/Single/Multiple
107
- *
108
- * During migration: T can be either internal AST node or Element
109
- */
110
- export type RuleResult<T> = { success: true; elements: T[]; consumed: number } | { success: false };
111
-
112
- /**
113
- * Block rule interface
114
- */
115
- export interface BlockRule {
116
- /** Rule name for debugging */
117
- name: string;
118
- /** Token types that can start this rule */
119
- startTokens: TokenType[];
120
- /** Whether this rule requires line start */
121
- requiresLineStart: boolean;
122
- /** Try to parse this block */
123
- parse(ctx: ParseContext): RuleResult<Element>;
124
- /**
125
- * Check if tokens at the given position match this rule's start pattern.
126
- * Used by inline parser to determine behavior before a block boundary
127
- * (e.g. whether to generate a trailing line-break).
128
- */
129
- isStartPattern?(ctx: ParseContext, pos: number): boolean;
130
- /**
131
- * When true, a single newline before this block becomes a line-break.
132
- * Wikidot's Divalign expands content inline, so \n before nested blocks
133
- * becomes <br />. Other blocks (Code, Div, etc.) suppress this.
134
- */
135
- preservesPrecedingLineBreak?: boolean;
136
- }
137
-
138
- /**
139
- * Inline rule interface
140
- */
141
- export interface InlineRule {
142
- /** Rule name for debugging */
143
- name: string;
144
- /** Token types that can start this rule */
145
- startTokens: TokenType[];
146
- /** Try to parse this inline element */
147
- parse(ctx: ParseContext): RuleResult<Element>;
148
- }
149
-
150
- /**
151
- * Helper to get current token
152
- */
153
- export function currentToken(ctx: ParseContext): Token {
154
- return ctx.tokens[ctx.pos] ?? eofToken();
155
- }
156
-
157
- /**
158
- * Helper to peek ahead
159
- */
160
- export function peekToken(ctx: ParseContext, n = 1): Token {
161
- return ctx.tokens[ctx.pos + n] ?? eofToken();
162
- }
163
-
164
- /**
165
- * Helper to check token type
166
- */
167
- export function checkToken(ctx: ParseContext, type: TokenType): boolean {
168
- return currentToken(ctx).type === type;
169
- }
170
-
171
- /**
172
- * Helper to check if at end
173
- */
174
- export function isAtEnd(ctx: ParseContext): boolean {
175
- return ctx.pos >= ctx.tokens.length || currentToken(ctx).type === "EOF";
176
- }
177
-
178
- /**
179
- * Create EOF token
180
- */
181
- function eofToken(): Token {
182
- return {
183
- type: "EOF",
184
- value: "",
185
- position: { start: { line: 0, column: 0, offset: 0 }, end: { line: 0, column: 0, offset: 0 } },
186
- lineStart: false,
187
- };
188
- }
189
-
190
- /**
191
- * Check if closing marker exists before newline
192
- * If markerValue is provided, also check that the token value matches
193
- */
194
- export function hasClosingMarkerBeforeNewline(
195
- ctx: ParseContext,
196
- markerType: TokenType,
197
- markerValue?: string,
198
- ): boolean {
199
- let pos = ctx.pos;
200
- while (pos < ctx.tokens.length) {
201
- const token = ctx.tokens[pos];
202
- if (!token || token.type === "NEWLINE" || token.type === "EOF") {
203
- return false;
204
- }
205
- if (token.type === markerType) {
206
- if (markerValue === undefined || token.value === markerValue) {
207
- return true;
208
- }
209
- }
210
- pos++;
211
- }
212
- return false;
213
- }
214
-
215
- /**
216
- * Check if closing marker exists before paragraph break (double newline)
217
- * Allows inline formatting to span multiple lines within a paragraph
218
- */
219
- export function hasClosingMarkerBeforeParagraphBreak(
220
- ctx: ParseContext,
221
- markerType: TokenType,
222
- markerValue?: string,
223
- ): boolean {
224
- let pos = ctx.pos;
225
- while (pos < ctx.tokens.length) {
226
- const token = ctx.tokens[pos];
227
- if (!token || token.type === "EOF") {
228
- return false;
229
- }
230
- // Check for paragraph break (NEWLINE followed by NEWLINE after optional whitespace)
231
- if (token.type === "NEWLINE") {
232
- let lookAhead = 1;
233
- while (ctx.tokens[pos + lookAhead]?.type === "WHITESPACE") {
234
- lookAhead++;
235
- }
236
- if (
237
- ctx.tokens[pos + lookAhead]?.type === "NEWLINE" ||
238
- ctx.tokens[pos + lookAhead]?.type === "EOF" ||
239
- !ctx.tokens[pos + lookAhead]
240
- ) {
241
- return false; // Paragraph break - stop
242
- }
243
- }
244
- if (token.type === markerType) {
245
- if (markerValue === undefined || token.value === markerValue) {
246
- return true;
247
- }
248
- }
249
- pos++;
250
- }
251
- return false;
252
- }
1
+ export type { BlockRule, InlineRule, ParseContext, RuleResult, ScopeContext } from "./contracts";
2
+ export {
3
+ checkToken,
4
+ currentToken,
5
+ hasClosingMarkerBeforeNewline,
6
+ hasClosingMarkerBeforeParagraphBreak,
7
+ isAtEnd,
8
+ peekToken,
9
+ } from "./tokens";
@@ -1,251 +0,0 @@
1
- /**
2
- *
3
- * Depth processing module for converting flat lists into nested tree structures.
4
- *
5
- * This is a TypeScript port of Wikidot's `depth.rs`. It handles the conversion
6
- * of flat depth-annotated items (such as bullet/numbered list entries at various
7
- * indentation levels) into properly nested tree structures. The algorithm uses an
8
- * internal stack to track open nesting levels and collapses them as depth decreases.
9
- *
10
- * Used primarily by the list parser and the table-of-contents builder to transform
11
- * flat sequences of items with depth annotations into hierarchical AST structures.
12
- *
13
- * @module
14
- */
15
-
16
- /**
17
- * Represents a single node in a depth tree.
18
- *
19
- * A node is either a leaf item containing a value, or a nested list containing
20
- * children. This recursive type allows arbitrarily deep nesting.
21
- *
22
- * @typeParam L - The list type discriminator (e.g., "bullet" vs "number" for lists,
23
- * or `null` when list type distinction is not needed)
24
- * @typeParam T - The type of leaf item values
25
- */
26
- export type DepthItem<L, T> =
27
- | { kind: "item"; value: T }
28
- | { kind: "list"; ltype: L; children: DepthList<L, T> };
29
-
30
- /**
31
- * An ordered collection of depth tree nodes at the same level.
32
- *
33
- * @typeParam L - The list type discriminator
34
- * @typeParam T - The type of leaf item values
35
- */
36
- export type DepthList<L, T> = DepthItem<L, T>[];
37
-
38
- /**
39
- * Internal stack-based builder for constructing depth trees incrementally.
40
- *
41
- * The stack tracks open nesting levels. As items are added at increasing depths,
42
- * new levels are pushed. When depth decreases, levels are popped and collapsed
43
- * into their parent as nested list nodes. When the list type changes at the same
44
- * depth, the current list is finalized and a new one begins.
45
- *
46
- * @typeParam L - The list type discriminator
47
- * @typeParam T - The type of leaf item values
48
- */
49
- class DepthStack<L, T> {
50
- private finished: Array<{ ltype: L; list: DepthList<L, T> }> = [];
51
- private stack: Array<{ ltype: L; items: DepthItem<L, T>[] }>;
52
-
53
- /**
54
- * @param topLtype - The list type for the initial (top-level) nesting layer
55
- */
56
- constructor(topLtype: L) {
57
- this.stack = [{ ltype: topLtype, items: [] }];
58
- }
59
-
60
- /** Returns the topmost (deepest nesting) layer on the stack. */
61
- private get last(): { ltype: L; items: DepthItem<L, T>[] } {
62
- return this.stack[this.stack.length - 1]!;
63
- }
64
-
65
- /** Returns the bottommost (root) layer on the stack. */
66
- private get first(): { ltype: L; items: DepthItem<L, T>[] } {
67
- return this.stack[0]!;
68
- }
69
-
70
- /** Returns true if only the root layer remains on the stack. */
71
- private isSingle(): boolean {
72
- return this.stack.length === 1;
73
- }
74
-
75
- /**
76
- * Push a new nesting level onto the stack.
77
- * @param ltype - The list type for the new level
78
- */
79
- increaseDepth(ltype: L): void {
80
- this.stack.push({ ltype, items: [] });
81
- }
82
-
83
- /**
84
- * Pop the topmost nesting level and collapse it into a list node on its parent.
85
- * @throws Error if there is no level to pop (stack is empty)
86
- */
87
- decreaseDepth(): void {
88
- const popped = this.stack.pop();
89
- if (!popped) {
90
- throw new Error("No depth to pop off!");
91
- }
92
- this.push({ kind: "list", ltype: popped.ltype, children: popped.items });
93
- }
94
-
95
- /**
96
- * Start a new list at the current depth with a different list type.
97
- *
98
- * When the list type changes (e.g., from bullet to numbered) at the same depth,
99
- * this method finalizes the current list and begins a new one. At the root layer
100
- * the entire tree is finalized; at deeper layers a pop/push cycle suffices.
101
- *
102
- * @param ltype - The list type for the new list
103
- */
104
- newList(ltype: L): void {
105
- if (this.isSingle()) {
106
- // This is the last layer, so the pop/push trick doesn't work.
107
- // Instead, output this entire thing as a finished list tree,
108
- // then create a new one for the process to continue.
109
- this.finishDepthList(ltype);
110
- } else {
111
- // We can just decrease and increase to make a new list
112
- this.decreaseDepth();
113
- this.increaseDepth(ltype);
114
- }
115
- }
116
-
117
- /** Append a depth item to the current (topmost) layer. */
118
- private push(item: DepthItem<L, T>): void {
119
- this.last.items.push(item);
120
- }
121
-
122
- /**
123
- * Add a leaf item to the current nesting level.
124
- * @param item - The value to wrap in a leaf node
125
- */
126
- pushItem(item: T): void {
127
- this.push({ kind: "item", value: item });
128
- }
129
-
130
- /** Returns the list type of the topmost nesting level. */
131
- lastType(): L {
132
- return this.last.ltype;
133
- }
134
-
135
- /**
136
- * Finalize the current tree by collapsing all open layers into a single
137
- * finished tree, then reset the stack for continued processing.
138
- *
139
- * @param newLtype - The list type for the next tree, or null to reuse the current type.
140
- * Null is used by {@link intoTrees} since no further items will be added.
141
- */
142
- private finishDepthList(newLtype: L | null): void {
143
- // Wrap all opened layers
144
- // Start at 1 since we always have at least one layer
145
- while (this.stack.length > 1) {
146
- this.decreaseDepth();
147
- }
148
-
149
- // Return top-level layer
150
- const first = this.first;
151
- const ltype = first.ltype;
152
- const list = first.items;
153
-
154
- // For intoTrees(), we don't care what the new ltype is,
155
- // so we just reuse the last one.
156
- // But for newList() we do, we want a new list layer.
157
- const actualNewLtype = newLtype ?? ltype;
158
-
159
- // Reset the first layer
160
- first.ltype = actualNewLtype;
161
- first.items = [];
162
-
163
- // Only push if the list has elements
164
- if (list.length > 0) {
165
- this.finished.push({ ltype, list });
166
- }
167
- }
168
-
169
- /**
170
- * Finalize all remaining layers and return the completed trees.
171
- * @returns Array of finished trees, each with its list type and items
172
- */
173
- intoTrees(): Array<{ ltype: L; list: DepthList<L, T> }> {
174
- this.finishDepthList(null);
175
- return this.finished;
176
- }
177
- }
178
-
179
- /**
180
- * Process a flat list of depth-annotated items into nested tree structures.
181
- *
182
- * This is the main entry point for the depth module. It takes a sequence of items,
183
- * each annotated with a nesting depth and a list type, and produces one or more
184
- * nested trees. Multiple trees are produced when the list type changes at the
185
- * root level (depth 0).
186
- *
187
- * The algorithm iterates through items sequentially, using a stack to track
188
- * open nesting levels. When depth increases, new levels are pushed; when depth
189
- * decreases, levels are popped and collapsed into their parent. When the list
190
- * type changes at the same depth, the current list is finalized and a new one begins.
191
- *
192
- * @typeParam L - The list type discriminator
193
- * @typeParam T - The type of leaf item values
194
- * @param topLtype - The default list type for the root level
195
- * @param items - Flat sequence of depth-annotated items, where each item has:
196
- * - `depth`: the 0-based nesting level
197
- * - `ltype`: the list type for grouping (e.g., "bullet" vs "number")
198
- * - `value`: the actual item content
199
- * @param ltypeEquals - Equality comparator for list types (defaults to `===`)
200
- * @returns Array of finished trees, each with an `ltype` and a `list` of nested items.
201
- * Multiple trees are returned when the list type changes at depth 0.
202
- */
203
- export function processDepths<L, T>(
204
- topLtype: L,
205
- items: Array<{ depth: number; ltype: L; value: T }>,
206
- ltypeEquals: (a: L, b: L) => boolean = (a, b) => a === b,
207
- ): Array<{ ltype: L; list: DepthList<L, T> }> {
208
- const stack = new DepthStack<L, T>(topLtype);
209
-
210
- // The depth value for the previous item
211
- let previous = 0;
212
-
213
- // Iterate through each of the items
214
- for (const { depth, ltype, value } of items) {
215
- // Add or remove new depth levels as appropriate,
216
- // based on what our new depth value is compared
217
- // to the value in the previous iteration.
218
- //
219
- // If previous == depth, then neither of these for loops will run
220
- // If previous < depth, then only the first will run
221
- // If previous > depth, then only the second will run
222
-
223
- // Open new levels
224
- for (let i = previous; i < depth; i++) {
225
- stack.increaseDepth(ltype);
226
- }
227
-
228
- // Close existing levels
229
- for (let i = depth; i < previous; i++) {
230
- stack.decreaseDepth();
231
- }
232
-
233
- // Create new level if the type doesn't match
234
- //
235
- // Here we decrease and increase the depth to close
236
- // the current layer, then make a new one with the
237
- // type this item has.
238
- //
239
- // We'll keep appending to this remade layer until
240
- // we hit a different depth or a different type.
241
- if (!ltypeEquals(stack.lastType(), ltype)) {
242
- stack.newList(ltype);
243
- }
244
-
245
- // Push element and update state
246
- stack.pushItem(value);
247
- previous = depth;
248
- }
249
-
250
- return stack.intoTrees();
251
- }