@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,424 +0,0 @@
1
- /**
2
- *
3
- * Parses the Wikidot span block syntax: `[[span attributes]]content[[/span]]`
4
- * and its paragraph-strip variant `[[span_]]`.
5
- *
6
- * A span wraps inline content in an HTML `<span>` element with arbitrary
7
- * attributes (class, style, id, etc.). It supports multiline content
8
- * where single newlines become `<br />` elements.
9
- *
10
- * Blank lines (double newlines) within spans trigger special behavior:
11
- *
12
- * Regular span (`[[span]]`):
13
- * - Blank lines split the content into separate spans, each placed in
14
- * its own paragraph. Segments after the first are marked with
15
- * `_splitByBlankLine: true` for postprocessing.
16
- *
17
- * Paragraph-strip span (`[[span_]]`):
18
- * - Content before a blank line gets `_paragraphStrip: true`, indicating
19
- * it should merge with the surrounding paragraph.
20
- * - Content after a blank line gets `_escapedFromParagraph: true`,
21
- * indicating it should appear outside any paragraph wrapper.
22
- * - An empty `[[span_]][[/span]]` produces a marker with
23
- * `_emptyParagraphStrip: true` that absorbs adjacent line breaks.
24
- *
25
- * Spans support nesting -- a `[[span]]` inside another `[[span]]` will
26
- * correctly find its own `[[/span]]` closing tag.
27
- *
28
- * The `closeSpanRule` handles orphaned `[[/span]]` tags that result
29
- * from paragraph-break splitting. These wrap preceding inline content
30
- * into a span, matching Wikidot's behavior.
31
- *
32
- * @module
33
- */
34
- import type { Element } from "@wdprlib/ast";
35
- import type { InlineRule, ParseContext, RuleResult } from "../types";
36
- import { currentToken } from "../types";
37
- import { inlineRules } from "../index";
38
- import { parseBlockName } from "../utils";
39
- import { parseAttributes } from "../block/utils";
40
- import { canApplyInlineRule } from "./utils";
41
-
42
- /**
43
- * Inline rule for parsing `[[span attributes]]content[[/span]]`.
44
- *
45
- * Triggered by a `BLOCK_OPEN` (`[[`) token. Recognizes both `span`
46
- * and `span_` block names. Parses HTML attributes after the block name,
47
- * then recursively parses inline content (including nested spans) until
48
- * the matching `[[/span]]` closing tag.
49
- *
50
- * Fails if:
51
- * - The block name is not `span` or `span_`
52
- * - No `]]` follows the attributes
53
- * - No matching `[[/span]]` closing tag is found
54
- */
55
- export const spanRule: InlineRule = {
56
- name: "span",
57
- startTokens: ["BLOCK_OPEN"],
58
-
59
- /**
60
- * Attempts to parse a span block at the current position.
61
- *
62
- * @param ctx - Parse context with token stream and current position
63
- * @returns A successful result with one or more `"container"` elements
64
- * of type `"span"`, or `{ success: false }`
65
- */
66
- parse(ctx: ParseContext): RuleResult<Element> {
67
- const openToken = currentToken(ctx);
68
- if (openToken.type !== "BLOCK_OPEN") {
69
- return { success: false };
70
- }
71
-
72
- let pos = ctx.pos + 1;
73
- let consumed = 1;
74
-
75
- // Parse block name
76
- const nameResult = parseBlockName(ctx, pos);
77
- if (!nameResult) {
78
- return { success: false };
79
- }
80
-
81
- const blockName = nameResult.name;
82
- // Handle both span and span_ (paragraph strip mode)
83
- if (blockName !== "span" && blockName !== "span_") {
84
- return { success: false };
85
- }
86
-
87
- const paragraphStrip = blockName === "span_";
88
-
89
- pos += nameResult.consumed;
90
- consumed += nameResult.consumed;
91
-
92
- // Parse attributes
93
- const attrResult = parseAttributes(ctx, pos);
94
- pos += attrResult.consumed;
95
- consumed += attrResult.consumed;
96
-
97
- // Expect ]]
98
- if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
99
- return { success: false };
100
- }
101
- pos++;
102
- consumed++;
103
-
104
- // Parse inline content until [[/span]]
105
- // Span supports multi-line content - newlines become line-breaks
106
- // For regular span: blank lines split into separate paragraphs with spans
107
- const children: Element[] = [];
108
- const escapedChildren: Element[] = []; // For span_: content after blank line
109
- const splitSpans: Element[][] = []; // For regular span: content segments split by blank lines
110
- let foundClose = false;
111
- let afterBlankLine = false; // For span_: tracks if we're after a blank line
112
-
113
- while (pos < ctx.tokens.length) {
114
- const token = ctx.tokens[pos];
115
- if (!token || token.type === "EOF") {
116
- break;
117
- }
118
-
119
- // Check for [[/span]]
120
- if (token.type === "BLOCK_END_OPEN") {
121
- const closeNameResult = parseBlockName(ctx, pos + 1);
122
- if (closeNameResult && closeNameResult.name === "span") {
123
- // Skip [[/span]]
124
- pos++; // [[/
125
- consumed++;
126
- pos += closeNameResult.consumed; // span
127
- consumed += closeNameResult.consumed;
128
- // Skip ]]
129
- if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
130
- pos++;
131
- consumed++;
132
- }
133
- foundClose = true;
134
- break;
135
- }
136
- }
137
-
138
- // Handle NEWLINE
139
- if (token.type === "NEWLINE") {
140
- // Check for paragraph break (blank line = double newline)
141
- // Skip whitespace to find next meaningful token
142
- let lookAhead = 1;
143
- while (ctx.tokens[pos + lookAhead]?.type === "WHITESPACE") {
144
- lookAhead++;
145
- }
146
- const nextToken = ctx.tokens[pos + lookAhead];
147
-
148
- // If next token is another NEWLINE, this is a paragraph break
149
- if (nextToken?.type === "NEWLINE") {
150
- if (paragraphStrip) {
151
- // For span_: blank lines split the span, content after goes outside paragraph
152
- // Consume the blank lines and continue parsing
153
- pos++; // First newline
154
- consumed++;
155
- while (ctx.tokens[pos]?.type === "WHITESPACE" || ctx.tokens[pos]?.type === "NEWLINE") {
156
- pos++;
157
- consumed++;
158
- }
159
- // Mark that we're now parsing escaped content (outside paragraph)
160
- afterBlankLine = true;
161
- continue;
162
- }
163
- // For regular span: blank lines split into separate spans in separate paragraphs
164
- // Save current content and start a new segment
165
- if (children.length > 0) {
166
- splitSpans.push([...children]);
167
- children.length = 0;
168
- }
169
- pos++; // First newline
170
- consumed++;
171
- // Skip whitespace and additional newlines
172
- while (ctx.tokens[pos]?.type === "WHITESPACE" || ctx.tokens[pos]?.type === "NEWLINE") {
173
- pos++;
174
- consumed++;
175
- }
176
- continue;
177
- }
178
-
179
- // Single newline - convert to line-break
180
- const targetChildren = afterBlankLine ? escapedChildren : children;
181
- targetChildren.push({ element: "line-break" });
182
- pos++;
183
- consumed++;
184
- // Skip leading whitespace after newline
185
- while (ctx.tokens[pos]?.type === "WHITESPACE" && ctx.tokens[pos]?.lineStart) {
186
- pos++;
187
- consumed++;
188
- }
189
- continue;
190
- }
191
-
192
- // Skip whitespace at beginning of content (after ]] or after newline)
193
- // But don't skip whitespace between words
194
- if (token.type === "WHITESPACE" && token.lineStart) {
195
- pos++;
196
- consumed++;
197
- continue;
198
- }
199
-
200
- // Determine which array to add content to
201
- const targetChildren = afterBlankLine ? escapedChildren : children;
202
-
203
- // Try each inline rule
204
- let matched = false;
205
- const inlineCtx: ParseContext = { ...ctx, pos };
206
-
207
- for (const rule of inlineRules) {
208
- // Allow nested spans - each nested span will find its own [[/span]] closing tag
209
- // No infinite recursion because each span consumes its own opening and closing tags
210
- if (canApplyInlineRule(rule, token)) {
211
- const result = rule.parse(inlineCtx);
212
- if (result.success) {
213
- targetChildren.push(...result.elements);
214
- pos += result.consumed;
215
- consumed += result.consumed;
216
- matched = true;
217
- break;
218
- }
219
- }
220
- }
221
-
222
- if (!matched) {
223
- // Fallback: just add as text
224
- targetChildren.push({ element: "text", data: token.value });
225
- pos++;
226
- consumed++;
227
- }
228
- }
229
-
230
- // If we didn't find [[/span]], this is not a valid span
231
- if (!foundClose) {
232
- ctx.diagnostics.push({
233
- severity: "warning",
234
- code: "unclosed-block",
235
- message: `Missing closing tag [[/span]] for [[${blockName}]]`,
236
- position: openToken.position,
237
- });
238
- return { success: false };
239
- }
240
-
241
- // For span_ (paragraph strip mode):
242
- // - Empty span_ produces no output
243
- // - Non-empty span_ gets a _paragraphStrip marker for paragraph merging
244
- // - Content after blank line gets _escapedFromParagraph marker
245
- if (paragraphStrip) {
246
- // Remove leading/trailing line-breaks from both arrays
247
- while (children.length > 0 && children[0]?.element === "line-break") {
248
- children.shift();
249
- }
250
- while (children.length > 0 && children[children.length - 1]?.element === "line-break") {
251
- children.pop();
252
- }
253
- while (escapedChildren.length > 0 && escapedChildren[0]?.element === "line-break") {
254
- escapedChildren.shift();
255
- }
256
- while (
257
- escapedChildren.length > 0 &&
258
- escapedChildren[escapedChildren.length - 1]?.element === "line-break"
259
- ) {
260
- escapedChildren.pop();
261
- }
262
-
263
- const elements: Element[] = [];
264
-
265
- // Main span (before blank line) - gets _paragraphStrip
266
- if (children.length > 0) {
267
- elements.push({
268
- element: "container",
269
- data: {
270
- type: "span",
271
- attributes: attrResult.attrs,
272
- elements: children,
273
- _paragraphStrip: true,
274
- },
275
- });
276
- }
277
-
278
- // Escaped spans (after blank line) - get _escapedFromParagraph
279
- if (escapedChildren.length > 0) {
280
- elements.push({
281
- element: "container",
282
- data: {
283
- type: "span",
284
- attributes: {},
285
- elements: escapedChildren,
286
- _escapedFromParagraph: true,
287
- },
288
- });
289
- }
290
-
291
- // Empty span_ - return a marker that will absorb adjacent line-breaks
292
- if (elements.length === 0) {
293
- return {
294
- success: true,
295
- elements: [
296
- {
297
- element: "container",
298
- data: {
299
- type: "span",
300
- attributes: {},
301
- elements: [],
302
- _emptyParagraphStrip: true,
303
- },
304
- },
305
- ],
306
- consumed,
307
- };
308
- }
309
-
310
- return {
311
- success: true,
312
- elements,
313
- consumed,
314
- };
315
- }
316
-
317
- // For regular span with blank lines: return multiple spans with _splitByBlankLine marker
318
- // These will be processed by postprocess to create separate paragraphs
319
- if (splitSpans.length > 0) {
320
- // Add remaining children as last segment
321
- if (children.length > 0) {
322
- splitSpans.push(children);
323
- }
324
-
325
- const elements: Element[] = splitSpans.map((segment, index) => ({
326
- element: "container" as const,
327
- data: {
328
- type: "span" as const,
329
- attributes: index === 0 ? attrResult.attrs : {},
330
- elements: segment,
331
- _splitByBlankLine: index > 0, // Mark segments after first for paragraph splitting
332
- },
333
- }));
334
-
335
- return {
336
- success: true,
337
- elements,
338
- consumed,
339
- };
340
- }
341
-
342
- return {
343
- success: true,
344
- elements: [
345
- {
346
- element: "container",
347
- data: {
348
- type: "span",
349
- attributes: attrResult.attrs,
350
- elements: children,
351
- },
352
- },
353
- ],
354
- consumed,
355
- };
356
- },
357
- };
358
-
359
- /**
360
- * Inline rule for handling orphaned `[[/span]]` closing tags.
361
- *
362
- * When a span is split across paragraphs by a blank line, the closing
363
- * `[[/span]]` tag appears without a matching opening tag in the current
364
- * inline context. This rule detects such orphaned closing tags and
365
- * produces a special marker element with `_closeSpan: true`.
366
- *
367
- * The paragraph parser uses this marker to retroactively wrap all
368
- * preceding inline content in the current paragraph into a span,
369
- * replicating Wikidot's behavior for paragraph-split spans.
370
- *
371
- * Triggered by a `BLOCK_END_OPEN` (`[[/`) token, and only matches
372
- * when the block name is `span`.
373
- */
374
- export const closeSpanRule: InlineRule = {
375
- name: "closeSpan",
376
- startTokens: ["BLOCK_END_OPEN"],
377
-
378
- /**
379
- * Attempts to parse an orphaned `[[/span]]` tag at the current position.
380
- *
381
- * @param ctx - Parse context with token stream and current position
382
- * @returns A successful result with a span marker element (with `_closeSpan: true`),
383
- * or `{ success: false }` if this is not a `[[/span]]` tag
384
- */
385
- parse(ctx: ParseContext): RuleResult<Element> {
386
- const token = currentToken(ctx);
387
- if (token.type !== "BLOCK_END_OPEN") {
388
- return { success: false };
389
- }
390
-
391
- // Check if this is [[/span]]
392
- const nameResult = parseBlockName(ctx, ctx.pos + 1);
393
- if (!nameResult || nameResult.name !== "span") {
394
- return { success: false };
395
- }
396
-
397
- let pos = ctx.pos + 1 + nameResult.consumed;
398
- let consumed = 1 + nameResult.consumed;
399
-
400
- // Skip ]]
401
- if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
402
- pos++;
403
- consumed++;
404
- }
405
-
406
- // Return a special marker that indicates "wrap preceding content in span"
407
- // The paragraph parser will handle this
408
- return {
409
- success: true,
410
- elements: [
411
- {
412
- element: "container",
413
- data: {
414
- type: "span",
415
- attributes: {},
416
- elements: [],
417
- _closeSpan: true,
418
- },
419
- },
420
- ],
421
- consumed,
422
- };
423
- },
424
- };
@@ -1,147 +0,0 @@
1
- /**
2
- *
3
- * Parses the Wikidot user reference syntax: `[[user name]]` and
4
- * `[[*user name]]`.
5
- *
6
- * A user reference displays a linked username (typically linking to
7
- * the user's profile page). The variant with a star prefix (`[[*user]]`)
8
- * also displays the user's avatar alongside the username.
9
- *
10
- * Wikidot syntax:
11
- * - `[[user some-user]]` -- displays username as a link
12
- * - `[[*user some-user]]` -- displays avatar and username
13
- *
14
- * Note: Wikidot requires no whitespace immediately after `[[`. This
15
- * means `[[ user name]]` is invalid, but `[[user name]]` and
16
- * `[[*user name]]` are valid.
17
- *
18
- * The username may contain any characters except `]]` and newlines.
19
- * Leading/trailing whitespace around the username is trimmed.
20
- *
21
- * Produces a `"user"` AST element with `data.name` (the username)
22
- * and `data["show-avatar"]` (boolean).
23
- *
24
- * @module
25
- */
26
- import type { Element } from "@wdprlib/ast";
27
- import type { InlineRule, ParseContext, RuleResult } from "../types";
28
- import { currentToken } from "../types";
29
-
30
- /**
31
- * Inline rule for parsing `[[user name]]` and `[[*user name]]` references.
32
- *
33
- * Triggered by a `BLOCK_OPEN` (`[[`) token. Optionally detects a `*`
34
- * prefix for avatar display, then verifies the keyword `user`, and
35
- * collects the username until `]]`.
36
- *
37
- * Fails if:
38
- * - Whitespace immediately follows `[[` (Wikidot requires no leading space)
39
- * - The keyword is not `user`
40
- * - The username is empty
41
- * - No closing `]]` is found
42
- */
43
- export const userRule: InlineRule = {
44
- name: "user",
45
- startTokens: ["BLOCK_OPEN"],
46
-
47
- /**
48
- * Attempts to parse a user reference at the current position.
49
- *
50
- * @param ctx - Parse context with token stream and current position
51
- * @returns A successful result with a `"user"` element, or `{ success: false }`
52
- */
53
- parse(ctx: ParseContext): RuleResult<Element> {
54
- const openToken = currentToken(ctx);
55
- if (openToken.type !== "BLOCK_OPEN") {
56
- return { success: false };
57
- }
58
-
59
- let pos = ctx.pos + 1;
60
- let consumed = 1;
61
-
62
- // Wikidot requires no whitespace immediately after [[
63
- // [[ user]] is invalid, [[user]] is valid
64
- if (ctx.tokens[pos]?.type === "WHITESPACE") {
65
- return { success: false };
66
- }
67
-
68
- // Check for star (avatar flag)
69
- let showAvatar = false;
70
- if (ctx.tokens[pos]?.type === "STAR") {
71
- showAvatar = true;
72
- pos++;
73
- consumed++;
74
- }
75
-
76
- // Skip whitespace after star
77
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
78
- pos++;
79
- consumed++;
80
- }
81
-
82
- // Parse block name
83
- const nameToken = ctx.tokens[pos];
84
- if (!nameToken || (nameToken.type !== "TEXT" && nameToken.type !== "IDENTIFIER")) {
85
- return { success: false };
86
- }
87
-
88
- const blockName = nameToken.value.toLowerCase();
89
- if (blockName !== "user") {
90
- return { success: false };
91
- }
92
- pos++;
93
- consumed++;
94
-
95
- // Skip whitespace
96
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
97
- pos++;
98
- consumed++;
99
- }
100
-
101
- // Parse username - collect all tokens until ]]
102
- let username = "";
103
- while (pos < ctx.tokens.length) {
104
- const token = ctx.tokens[pos];
105
- if (
106
- !token ||
107
- token.type === "BLOCK_CLOSE" ||
108
- token.type === "NEWLINE" ||
109
- token.type === "EOF"
110
- ) {
111
- break;
112
- }
113
- username += token.value;
114
- pos++;
115
- consumed++;
116
- }
117
-
118
- // Trim whitespace from username
119
- username = username.trim();
120
-
121
- // Username is required
122
- if (!username) {
123
- return { success: false };
124
- }
125
-
126
- // Expect ]]
127
- if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
128
- return { success: false };
129
- }
130
- pos++;
131
- consumed++;
132
-
133
- return {
134
- success: true,
135
- elements: [
136
- {
137
- element: "user",
138
- data: {
139
- name: username,
140
- "show-avatar": showAvatar,
141
- },
142
- },
143
- ],
144
- consumed,
145
- };
146
- },
147
- };