@wdprlib/parser 3.2.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/dist/index.cjs +10451 -8402
  2. package/dist/index.d.cts +313 -337
  3. package/dist/index.d.ts +313 -337
  4. package/dist/index.js +10438 -8389
  5. package/package.json +1 -1
  6. package/src/index.ts +7 -0
  7. package/src/lexer/anchor.ts +48 -0
  8. package/src/lexer/index.ts +3 -2
  9. package/src/lexer/lexer.ts +73 -559
  10. package/src/lexer/options.ts +19 -0
  11. package/src/lexer/punctuation.ts +70 -0
  12. package/src/lexer/quoted-string.ts +16 -0
  13. package/src/lexer/runs.ts +85 -0
  14. package/src/lexer/spacing-actions.ts +24 -0
  15. package/src/lexer/state.ts +103 -0
  16. package/src/lexer/syntax-actions.ts +80 -0
  17. package/src/lexer/text-actions.ts +41 -0
  18. package/src/lexer/token-actions.ts +136 -0
  19. package/src/lexer/token-factory.ts +62 -0
  20. package/src/lexer/tokenize.ts +18 -0
  21. package/src/parser/constants.ts +2 -0
  22. package/src/parser/depth/index.ts +111 -0
  23. package/src/parser/depth/stack.ts +82 -0
  24. package/src/parser/parse/block.ts +42 -0
  25. package/src/parser/parse/context.ts +26 -0
  26. package/src/parser/parse/footnotes.ts +25 -0
  27. package/src/parser/parse/index.ts +42 -0
  28. package/src/parser/parse/options.ts +34 -0
  29. package/src/parser/parse/parser.ts +79 -0
  30. package/src/parser/parse/plain-non-ascii.ts +129 -0
  31. package/src/parser/parse/result.ts +57 -0
  32. package/src/parser/parse/source.ts +11 -0
  33. package/src/parser/postprocess/divAdjacentParagraph.ts +1 -1
  34. package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
  35. package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
  36. package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
  37. package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
  38. package/src/parser/postprocess/spanStrip/factory.ts +23 -0
  39. package/src/parser/postprocess/spanStrip/index.ts +8 -0
  40. package/src/parser/postprocess/spanStrip/merge.ts +117 -0
  41. package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
  42. package/src/parser/postprocess/spanStrip/split.ts +67 -0
  43. package/src/parser/preprocess/expr/chars.ts +15 -0
  44. package/src/parser/preprocess/expr/evaluate.ts +22 -0
  45. package/src/parser/preprocess/expr/index.ts +45 -0
  46. package/src/parser/preprocess/expr/kind.ts +19 -0
  47. package/src/parser/preprocess/expr/parse.ts +103 -0
  48. package/src/parser/preprocess/expr/scan.ts +34 -0
  49. package/src/parser/preprocess/expr/types.ts +14 -0
  50. package/src/parser/preprocess/typography.ts +70 -5
  51. package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
  52. package/src/parser/preprocess/utils/index.ts +13 -0
  53. package/src/parser/preprocess/utils/raw-regions.ts +153 -0
  54. package/src/parser/preprocess/whitespace/detection.ts +39 -0
  55. package/src/parser/preprocess/whitespace/index.ts +79 -0
  56. package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
  57. package/src/parser/preprocess/whitespace/patterns.ts +23 -0
  58. package/src/parser/rules/block/align/body.ts +46 -0
  59. package/src/parser/rules/block/align/element.ts +13 -0
  60. package/src/parser/rules/block/align/index.ts +90 -0
  61. package/src/parser/rules/block/align/syntax.ts +113 -0
  62. package/src/parser/rules/block/bibliography/body.ts +81 -0
  63. package/src/parser/rules/block/bibliography/entries.ts +49 -0
  64. package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
  65. package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
  66. package/src/parser/rules/block/bibliography/index.ts +90 -0
  67. package/src/parser/rules/block/bibliography/open.ts +53 -0
  68. package/src/parser/rules/block/block-list/bare-content.ts +105 -0
  69. package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
  70. package/src/parser/rules/block/block-list/index.ts +51 -0
  71. package/src/parser/rules/block/block-list/item-content.ts +132 -0
  72. package/src/parser/rules/block/block-list/li-content.ts +107 -0
  73. package/src/parser/rules/block/block-list/li-item.ts +77 -0
  74. package/src/parser/rules/block/block-list/list-block.ts +100 -0
  75. package/src/parser/rules/block/block-list/open.ts +51 -0
  76. package/src/parser/rules/block/block-list/tags.ts +50 -0
  77. package/src/parser/rules/block/blockquote/build.ts +62 -0
  78. package/src/parser/rules/block/blockquote/index.ts +80 -0
  79. package/src/parser/rules/block/blockquote/line.ts +79 -0
  80. package/src/parser/rules/block/blockquote/lines.ts +39 -0
  81. package/src/parser/rules/block/{center.ts → center/index.ts} +7 -22
  82. package/src/parser/rules/block/center/open.ts +27 -0
  83. package/src/parser/rules/block/{clear-float.ts → clear-float/index.ts} +6 -30
  84. package/src/parser/rules/block/clear-float/syntax.ts +43 -0
  85. package/src/parser/rules/block/code/attributes.ts +30 -0
  86. package/src/parser/rules/block/code/content.ts +57 -0
  87. package/src/parser/rules/block/code/index.ts +100 -0
  88. package/src/parser/rules/block/collapsible/attributes.ts +95 -0
  89. package/src/parser/rules/block/collapsible/body.ts +69 -0
  90. package/src/parser/rules/block/collapsible/index.ts +117 -0
  91. package/src/parser/rules/block/collapsible/open.ts +51 -0
  92. package/src/parser/rules/block/collapsible/orphans.ts +31 -0
  93. package/src/parser/rules/block/collapsible/tags.ts +17 -0
  94. package/src/parser/rules/block/comment/consume.ts +37 -0
  95. package/src/parser/rules/block/{comment.ts → comment/index.ts} +12 -38
  96. package/src/parser/rules/block/{content-separator.ts → content-separator/index.ts} +5 -35
  97. package/src/parser/rules/block/content-separator/syntax.ts +33 -0
  98. package/src/parser/rules/block/definition-list/collect.ts +40 -0
  99. package/src/parser/rules/block/definition-list/index.ts +63 -0
  100. package/src/parser/rules/block/definition-list/item-key.ts +95 -0
  101. package/src/parser/rules/block/definition-list/item-value.ts +56 -0
  102. package/src/parser/rules/block/definition-list/items.ts +54 -0
  103. package/src/parser/rules/block/div/body.ts +41 -0
  104. package/src/parser/rules/block/div/close.ts +41 -0
  105. package/src/parser/rules/block/div/failed.ts +117 -0
  106. package/src/parser/rules/block/div/index.ts +112 -0
  107. package/src/parser/rules/block/div/nesting.ts +37 -0
  108. package/src/parser/rules/block/div/open.ts +59 -0
  109. package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
  110. package/src/parser/rules/block/embed-block/content.ts +53 -0
  111. package/src/parser/rules/block/embed-block/index.ts +91 -0
  112. package/src/parser/rules/block/embed-block/open.ts +52 -0
  113. package/src/parser/rules/block/embed-block/tags.ts +5 -0
  114. package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
  115. package/src/parser/rules/block/footnoteblock/index.ts +82 -0
  116. package/src/parser/rules/block/footnoteblock/open.ts +53 -0
  117. package/src/parser/rules/block/heading/index.ts +87 -0
  118. package/src/parser/rules/block/heading/open.ts +50 -0
  119. package/src/parser/rules/block/heading/toc-text.ts +26 -0
  120. package/src/parser/rules/block/{horizontal-rule.ts → horizontal-rule/index.ts} +4 -21
  121. package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
  122. package/src/parser/rules/block/html/body.ts +114 -0
  123. package/src/parser/rules/block/html/diagnostics.ts +11 -0
  124. package/src/parser/rules/block/html/index.ts +95 -0
  125. package/src/parser/rules/block/html/open.ts +36 -0
  126. package/src/parser/rules/block/iframe/attributes.ts +106 -0
  127. package/src/parser/rules/block/iframe/index.ts +73 -0
  128. package/src/parser/rules/block/iframe/open.ts +58 -0
  129. package/src/parser/rules/block/iframe/source.ts +24 -0
  130. package/src/parser/rules/block/iframe/url.ts +38 -0
  131. package/src/parser/rules/block/iftags/body.ts +48 -0
  132. package/src/parser/rules/block/iftags/condition.ts +24 -0
  133. package/src/parser/rules/block/{iftags.ts → iftags/index.ts} +16 -58
  134. package/src/parser/rules/block/include/arguments.ts +48 -0
  135. package/src/parser/rules/block/include/index.ts +75 -0
  136. package/src/parser/rules/block/include/location.ts +24 -0
  137. package/src/parser/rules/block/include/variables.ts +37 -0
  138. package/src/parser/rules/block/list/index.ts +73 -0
  139. package/src/parser/rules/block/list/line.ts +77 -0
  140. package/src/parser/rules/block/list/native.ts +89 -0
  141. package/src/parser/rules/block/math/content.ts +54 -0
  142. package/src/parser/rules/block/math/index.ts +106 -0
  143. package/src/parser/rules/block/math/name.ts +35 -0
  144. package/src/parser/rules/block/module/body.ts +92 -0
  145. package/src/parser/rules/block/module/element.ts +33 -0
  146. package/src/parser/rules/block/module/include/directive.ts +91 -0
  147. package/src/parser/rules/block/module/include/index.ts +11 -2
  148. package/src/parser/rules/block/module/include/references.ts +42 -0
  149. package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
  150. package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
  151. package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
  152. package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
  153. package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
  154. package/src/parser/rules/block/module/include/scanner.ts +121 -0
  155. package/src/parser/rules/block/module/index.ts +14 -2
  156. package/src/parser/rules/block/module/listpages/compiler.ts +12 -392
  157. package/src/parser/rules/block/module/listpages/extract.ts +25 -359
  158. package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
  159. package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
  160. package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
  161. package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
  162. package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
  163. package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
  164. package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
  165. package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
  166. package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
  167. package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
  168. package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
  169. package/src/parser/rules/block/module/listpages/normalize.ts +8 -324
  170. package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
  171. package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
  172. package/src/parser/rules/block/module/listpages/resolve.ts +5 -75
  173. package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
  174. package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
  175. package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
  176. package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
  177. package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
  178. package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
  179. package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
  180. package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
  181. package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
  182. package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
  183. package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
  184. package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
  185. package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
  186. package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
  187. package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
  188. package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
  189. package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
  190. package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
  191. package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
  192. package/src/parser/rules/block/module/listpages/url-resolution/params.ts +19 -0
  193. package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
  194. package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +53 -0
  195. package/src/parser/rules/block/module/listpages/url-resolution/value.ts +25 -0
  196. package/src/parser/rules/block/module/listpages/url-resolver.ts +3 -160
  197. package/src/parser/rules/block/module/listusers/compiler.ts +4 -25
  198. package/src/parser/rules/block/module/listusers/extract.ts +4 -9
  199. package/src/parser/rules/block/module/listusers/getters.ts +21 -0
  200. package/src/parser/rules/block/module/listusers/variables.ts +15 -0
  201. package/src/parser/rules/block/module/open.ts +57 -0
  202. package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
  203. package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
  204. package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
  205. package/src/parser/rules/block/module/resolution/styles.ts +53 -0
  206. package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
  207. package/src/parser/rules/block/module/resolve.ts +79 -292
  208. package/src/parser/rules/block/module/rule.ts +56 -0
  209. package/src/parser/rules/block/module/types-common.ts +11 -0
  210. package/src/parser/rules/block/module/walk/children.ts +35 -0
  211. package/src/parser/rules/block/module/walk/index.ts +9 -0
  212. package/src/parser/rules/block/module/walk/map/index.ts +2 -0
  213. package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
  214. package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
  215. package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
  216. package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
  217. package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
  218. package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
  219. package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
  220. package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
  221. package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
  222. package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
  223. package/src/parser/rules/block/module/walk/map/types.ts +6 -0
  224. package/src/parser/rules/block/module/walk/traverse.ts +65 -0
  225. package/src/parser/rules/block/orphan-li/content.ts +60 -0
  226. package/src/parser/rules/block/orphan-li/index.ts +75 -0
  227. package/src/parser/rules/block/orphan-li/open.ts +25 -0
  228. package/src/parser/rules/block/orphan-li/tags.ts +40 -0
  229. package/src/parser/rules/block/paragraph/content.ts +12 -0
  230. package/src/parser/rules/block/paragraph/index.ts +60 -0
  231. package/src/parser/rules/block/paragraph/normalize.ts +52 -0
  232. package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
  233. package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
  234. package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
  235. package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
  236. package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
  237. package/src/parser/rules/block/parsing/block-item.ts +29 -0
  238. package/src/parser/rules/block/parsing/content.ts +127 -0
  239. package/src/parser/rules/block/parsing/end-condition.ts +51 -0
  240. package/src/parser/rules/block/parsing/inline-content.ts +105 -0
  241. package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
  242. package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
  243. package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
  244. package/src/parser/rules/block/table/index.ts +80 -0
  245. package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
  246. package/src/parser/rules/block/table/pipe/cell.ts +106 -0
  247. package/src/parser/rules/block/table/pipe/index.ts +2 -0
  248. package/src/parser/rules/block/table/pipe/row.ts +88 -0
  249. package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
  250. package/src/parser/rules/block/table/pipe/trim.ts +50 -0
  251. package/src/parser/rules/block/table-block/body.ts +79 -0
  252. package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
  253. package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
  254. package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
  255. package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
  256. package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
  257. package/src/parser/rules/block/table-block/cell.ts +64 -0
  258. package/src/parser/rules/block/table-block/index.ts +113 -0
  259. package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
  260. package/src/parser/rules/block/table-block/structure.ts +80 -0
  261. package/src/parser/rules/block/tabview/body.ts +64 -0
  262. package/src/parser/rules/block/tabview/index.ts +90 -0
  263. package/src/parser/rules/block/tabview/open.ts +50 -0
  264. package/src/parser/rules/block/tabview/tab.ts +92 -0
  265. package/src/parser/rules/block/tabview/tags.ts +30 -0
  266. package/src/parser/rules/block/toc/element.ts +11 -0
  267. package/src/parser/rules/block/toc/index.ts +44 -0
  268. package/src/parser/rules/block/toc/open.ts +84 -0
  269. package/src/parser/rules/block/utils.ts +10 -610
  270. package/src/parser/rules/{utils.ts → common/attribute-safety.ts} +3 -49
  271. package/src/parser/rules/common/block-name.ts +33 -0
  272. package/src/parser/rules/common/index.ts +2 -0
  273. package/src/parser/rules/contracts/index.ts +3 -0
  274. package/src/parser/rules/contracts/parse-context.ts +38 -0
  275. package/src/parser/rules/contracts/rule.ts +43 -0
  276. package/src/parser/rules/contracts/scope.ts +31 -0
  277. package/src/parser/rules/inline/anchor/attributes.ts +54 -0
  278. package/src/parser/rules/inline/anchor/child.ts +26 -0
  279. package/src/parser/rules/inline/anchor/close.ts +34 -0
  280. package/src/parser/rules/inline/anchor/content.ts +59 -0
  281. package/src/parser/rules/inline/anchor/index.ts +103 -0
  282. package/src/parser/rules/inline/anchor/newline.ts +26 -0
  283. package/src/parser/rules/inline/anchor/open.ts +47 -0
  284. package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
  285. package/src/parser/rules/inline/anchor/syntax.ts +40 -0
  286. package/src/parser/rules/inline/anchor-name/index.ts +38 -0
  287. package/src/parser/rules/inline/anchor-name/name.ts +39 -0
  288. package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
  289. package/src/parser/rules/inline/bibcite/element.ts +14 -0
  290. package/src/parser/rules/inline/bibcite/index.ts +34 -0
  291. package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
  292. package/src/parser/rules/inline/bold.ts +2 -39
  293. package/src/parser/rules/inline/color/index.ts +35 -0
  294. package/src/parser/rules/inline/color/syntax.ts +69 -0
  295. package/src/parser/rules/inline/comment/consume.ts +31 -0
  296. package/src/parser/rules/inline/{comment.ts → comment/index.ts} +10 -36
  297. package/src/parser/rules/inline/equation-ref/element.ts +8 -0
  298. package/src/parser/rules/inline/equation-ref/index.ts +34 -0
  299. package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
  300. package/src/parser/rules/inline/expr/branch.ts +104 -0
  301. package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
  302. package/src/parser/rules/inline/expr/conditional.ts +80 -0
  303. package/src/parser/rules/inline/expr/depth.ts +25 -0
  304. package/src/parser/rules/inline/expr/elements.ts +39 -0
  305. package/src/parser/rules/inline/expr/index.ts +84 -0
  306. package/src/parser/rules/inline/expr/syntax.ts +45 -0
  307. package/src/parser/rules/inline/footnote/child.ts +22 -0
  308. package/src/parser/rules/inline/footnote/close.ts +33 -0
  309. package/src/parser/rules/inline/footnote/content.ts +54 -0
  310. package/src/parser/rules/inline/footnote/elements.ts +38 -0
  311. package/src/parser/rules/inline/footnote/index.ts +54 -0
  312. package/src/parser/rules/inline/footnote/newline.ts +27 -0
  313. package/src/parser/rules/inline/footnote/open.ts +38 -0
  314. package/src/parser/rules/inline/formatting/container.ts +50 -0
  315. package/src/parser/rules/inline/{guillemet.ts → guillemet/index.ts} +5 -13
  316. package/src/parser/rules/inline/guillemet/text.ts +11 -0
  317. package/src/parser/rules/inline/html/gate.ts +64 -0
  318. package/src/parser/rules/inline/{html.ts → html/index.ts} +9 -60
  319. package/src/parser/rules/inline/html/open.ts +37 -0
  320. package/src/parser/rules/inline/image/attributes.ts +22 -0
  321. package/src/parser/rules/inline/image/body.ts +36 -0
  322. package/src/parser/rules/inline/image/index.ts +89 -0
  323. package/src/parser/rules/inline/image/open.ts +56 -0
  324. package/src/parser/rules/inline/image/source.ts +62 -0
  325. package/src/parser/rules/inline/image/syntax.ts +76 -0
  326. package/src/parser/rules/inline/italic.ts +2 -30
  327. package/src/parser/rules/inline/line-break/backslash.ts +58 -0
  328. package/src/parser/rules/inline/line-break/elements.ts +9 -0
  329. package/src/parser/rules/inline/line-break/index.ts +3 -0
  330. package/src/parser/rules/inline/line-break/newline.ts +82 -0
  331. package/src/parser/rules/inline/line-break/underscore.ts +45 -0
  332. package/src/parser/rules/inline/link-anchor.ts +6 -81
  333. package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
  334. package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
  335. package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
  336. package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
  337. package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
  338. package/src/parser/rules/inline/link-single.ts +7 -98
  339. package/src/parser/rules/inline/link-star.ts +7 -69
  340. package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
  341. package/src/parser/rules/inline/link-triple/index.ts +62 -0
  342. package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
  343. package/src/parser/rules/inline/link-triple/label.ts +35 -0
  344. package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
  345. package/src/parser/rules/inline/link-triple/target.ts +36 -0
  346. package/src/parser/rules/inline/math-inline/index.ts +40 -0
  347. package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
  348. package/src/parser/rules/inline/monospace.ts +2 -30
  349. package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
  350. package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
  351. package/src/parser/rules/inline/parsing/collect.ts +23 -0
  352. package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
  353. package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
  354. package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
  355. package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
  356. package/src/parser/rules/inline/parsing/rules.ts +34 -0
  357. package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
  358. package/src/parser/rules/inline/raw/angle.ts +40 -0
  359. package/src/parser/rules/inline/raw/double-at.ts +78 -0
  360. package/src/parser/rules/inline/raw/index.ts +26 -0
  361. package/src/parser/rules/inline/raw/result.ts +26 -0
  362. package/src/parser/rules/inline/size/content.ts +65 -0
  363. package/src/parser/rules/inline/size/index.ts +55 -0
  364. package/src/parser/rules/inline/size/open.ts +43 -0
  365. package/src/parser/rules/inline/size/value.ts +45 -0
  366. package/src/parser/rules/inline/span/content.ts +97 -0
  367. package/src/parser/rules/inline/span/elements.ts +108 -0
  368. package/src/parser/rules/inline/span/index.ts +79 -0
  369. package/src/parser/rules/inline/span/newline.ts +50 -0
  370. package/src/parser/rules/inline/span/syntax.ts +70 -0
  371. package/src/parser/rules/inline/{strikethrough.ts → strikethrough/index.ts} +5 -60
  372. package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
  373. package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
  374. package/src/parser/rules/inline/subscript.ts +2 -39
  375. package/src/parser/rules/inline/superscript.ts +4 -39
  376. package/src/parser/rules/inline/text/element.ts +5 -0
  377. package/src/parser/rules/inline/{text.ts → text/index.ts} +5 -4
  378. package/src/parser/rules/inline/underline/child.ts +26 -0
  379. package/src/parser/rules/inline/underline/content.ts +29 -0
  380. package/src/parser/rules/inline/{underline.ts → underline/index.ts} +6 -49
  381. package/src/parser/rules/inline/user/element.ts +11 -0
  382. package/src/parser/rules/inline/user/index.ts +34 -0
  383. package/src/parser/rules/inline/user/syntax.ts +67 -0
  384. package/src/parser/rules/inline/utils.ts +4 -344
  385. package/src/parser/rules/tokens.ts +106 -0
  386. package/src/parser/rules/types.ts +9 -252
  387. package/src/parser/depth.ts +0 -251
  388. package/src/parser/parse.ts +0 -315
  389. package/src/parser/postprocess/spanStrip.ts +0 -697
  390. package/src/parser/preprocess/expr.ts +0 -265
  391. package/src/parser/preprocess/utils.ts +0 -250
  392. package/src/parser/preprocess/whitespace.ts +0 -111
  393. package/src/parser/rules/block/align.ts +0 -282
  394. package/src/parser/rules/block/bibliography.ts +0 -359
  395. package/src/parser/rules/block/block-list.ts +0 -689
  396. package/src/parser/rules/block/blockquote.ts +0 -238
  397. package/src/parser/rules/block/code.ts +0 -187
  398. package/src/parser/rules/block/collapsible.ts +0 -337
  399. package/src/parser/rules/block/definition-list.ts +0 -270
  400. package/src/parser/rules/block/div.ts +0 -400
  401. package/src/parser/rules/block/embed-block.ts +0 -153
  402. package/src/parser/rules/block/footnoteblock.ts +0 -200
  403. package/src/parser/rules/block/heading.ts +0 -142
  404. package/src/parser/rules/block/html.ts +0 -222
  405. package/src/parser/rules/block/iframe.ts +0 -239
  406. package/src/parser/rules/block/include.ts +0 -179
  407. package/src/parser/rules/block/list.ts +0 -244
  408. package/src/parser/rules/block/math.ts +0 -183
  409. package/src/parser/rules/block/module/include/resolve.ts +0 -556
  410. package/src/parser/rules/block/module/listpages/types.ts +0 -513
  411. package/src/parser/rules/block/module/walk.ts +0 -380
  412. package/src/parser/rules/block/module.ts +0 -164
  413. package/src/parser/rules/block/orphan-li.ts +0 -177
  414. package/src/parser/rules/block/paragraph.ts +0 -157
  415. package/src/parser/rules/block/table-block.ts +0 -726
  416. package/src/parser/rules/block/table.ts +0 -441
  417. package/src/parser/rules/block/tabview.ts +0 -331
  418. package/src/parser/rules/block/toc.ts +0 -129
  419. package/src/parser/rules/inline/anchor-name.ts +0 -154
  420. package/src/parser/rules/inline/anchor.ts +0 -327
  421. package/src/parser/rules/inline/bibcite.ts +0 -153
  422. package/src/parser/rules/inline/color.ts +0 -140
  423. package/src/parser/rules/inline/equation-ref.ts +0 -115
  424. package/src/parser/rules/inline/expr.ts +0 -526
  425. package/src/parser/rules/inline/footnote.ts +0 -223
  426. package/src/parser/rules/inline/image.ts +0 -328
  427. package/src/parser/rules/inline/line-break.ts +0 -326
  428. package/src/parser/rules/inline/link-triple.ts +0 -267
  429. package/src/parser/rules/inline/math-inline.ts +0 -126
  430. package/src/parser/rules/inline/raw.ts +0 -262
  431. package/src/parser/rules/inline/size.ts +0 -244
  432. package/src/parser/rules/inline/span.ts +0 -424
  433. package/src/parser/rules/inline/user.ts +0 -147
@@ -0,0 +1,64 @@
1
+ import type { ParseContext } from "../../types";
2
+ import { parseBlockName } from "../../common";
3
+ import { lookaheadHasHtmlClose } from "../../block/html";
4
+
5
+ export interface DisabledHtmlBody {
6
+ consumed: number;
7
+ foundClose: boolean;
8
+ }
9
+
10
+ export function consumeDisabledHtmlBody(ctx: ParseContext, startPos: number): DisabledHtmlBody {
11
+ const hasCloseAhead = lookaheadHasHtmlClose(ctx, startPos);
12
+ let pos = startPos;
13
+ let consumed = 0;
14
+
15
+ while (pos < ctx.tokens.length) {
16
+ const token = ctx.tokens[pos];
17
+ if (!token || token.type === "EOF") {
18
+ break;
19
+ }
20
+
21
+ if (!hasCloseAhead && token.type === "NEWLINE" && ctx.tokens[pos + 1]?.type === "NEWLINE") {
22
+ break;
23
+ }
24
+
25
+ const closeResult = tryConsumeHtmlClose(ctx, pos);
26
+ if (closeResult) {
27
+ return {
28
+ consumed: consumed + closeResult.consumed,
29
+ foundClose: true,
30
+ };
31
+ }
32
+
33
+ pos++;
34
+ consumed++;
35
+ }
36
+
37
+ return { consumed, foundClose: false };
38
+ }
39
+
40
+ function tryConsumeHtmlClose(ctx: ParseContext, pos: number): { consumed: number } | null {
41
+ if (ctx.tokens[pos]?.type !== "BLOCK_END_OPEN") {
42
+ return null;
43
+ }
44
+
45
+ const closeNameResult = parseBlockName(ctx, pos + 1);
46
+ if (closeNameResult?.name.toLowerCase() !== "html") {
47
+ return null;
48
+ }
49
+
50
+ let checkPos = pos + 1 + closeNameResult.consumed;
51
+ while (ctx.tokens[checkPos]?.type === "WHITESPACE") {
52
+ checkPos++;
53
+ }
54
+ if (ctx.tokens[checkPos]?.type !== "BLOCK_CLOSE") {
55
+ return null;
56
+ }
57
+
58
+ let consumed = checkPos - pos + 1;
59
+ if (ctx.tokens[checkPos + 1]?.type === "NEWLINE") {
60
+ consumed++;
61
+ }
62
+
63
+ return { consumed };
64
+ }
@@ -27,10 +27,10 @@
27
27
  */
28
28
 
29
29
  import type { Element } from "@wdprlib/ast";
30
- import type { InlineRule, ParseContext, RuleResult } from "../types";
31
- import { currentToken } from "../types";
32
- import { parseBlockName, parseAttributesRaw } from "../block/utils";
33
- import { lookaheadHasHtmlClose } from "../block/html";
30
+ import type { InlineRule, ParseContext, RuleResult } from "../../types";
31
+ import { currentToken } from "../../types";
32
+ import { consumeDisabledHtmlBody } from "./gate";
33
+ import { parseHtmlInlineOpen } from "./open";
34
34
 
35
35
  /**
36
36
  * Inline rule that gates `[[html]]` when the setting disallows it.
@@ -45,25 +45,10 @@ export const htmlInlineRule: InlineRule = {
45
45
  return { success: false };
46
46
  }
47
47
 
48
- let pos = ctx.pos + 1;
49
- let consumed = 1;
50
-
51
- const nameResult = parseBlockName(ctx, pos);
52
- if (!nameResult || nameResult.name.toLowerCase() !== "html") {
53
- return { success: false };
54
- }
55
- pos += nameResult.consumed;
56
- consumed += nameResult.consumed;
57
-
58
- const attrResult = parseAttributesRaw(ctx, pos);
59
- pos += attrResult.consumed;
60
- consumed += attrResult.consumed;
61
-
62
- if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
48
+ const openResult = parseHtmlInlineOpen(ctx);
49
+ if (!openResult) {
63
50
  return { success: false };
64
51
  }
65
- pos++;
66
- consumed++;
67
52
 
68
53
  // Enabled: leave inline `[[html]]` alone — it falls through to text
69
54
  // rendering, matching the historical behaviour for stray block-named
@@ -72,46 +57,10 @@ export const htmlInlineRule: InlineRule = {
72
57
  return { success: false };
73
58
  }
74
59
 
75
- // Disabled path: consume the body until a real `[[/html]]` (BLOCK_END_OPEN
76
- // + name + BLOCK_CLOSE, allowing whitespace inside the close tag).
77
- // Only allow the blank-line stop when no real close exists ahead, so
78
- // a closed body that spans paragraphs is still consumed correctly.
79
- const hasCloseAhead = lookaheadHasHtmlClose(ctx, pos);
80
- let foundClose = false;
81
- while (pos < ctx.tokens.length) {
82
- const token = ctx.tokens[pos];
83
- if (!token || token.type === "EOF") break;
84
-
85
- // Stop at a blank line so an unclosed inline `[[html]]` does not
86
- // swallow subsequent paragraphs.
87
- if (!hasCloseAhead && token.type === "NEWLINE" && ctx.tokens[pos + 1]?.type === "NEWLINE") {
88
- break;
89
- }
90
-
91
- if (token.type === "BLOCK_END_OPEN") {
92
- const closeNameResult = parseBlockName(ctx, pos + 1);
93
- if (closeNameResult?.name.toLowerCase() === "html") {
94
- let checkPos = pos + 1 + closeNameResult.consumed;
95
- while (ctx.tokens[checkPos]?.type === "WHITESPACE") checkPos++;
96
- if (ctx.tokens[checkPos]?.type === "BLOCK_CLOSE") {
97
- foundClose = true;
98
- // Consume `[[/html]]` (and optional trailing newline) too.
99
- consumed += checkPos - pos + 1;
100
- pos = checkPos + 1;
101
- if (ctx.tokens[pos]?.type === "NEWLINE") {
102
- pos++;
103
- consumed++;
104
- }
105
- break;
106
- }
107
- }
108
- }
109
-
110
- pos++;
111
- consumed++;
112
- }
60
+ const bodyResult = consumeDisabledHtmlBody(ctx, openResult.bodyStart);
61
+ const consumed = openResult.consumed + bodyResult.consumed;
113
62
 
114
- if (!foundClose) {
63
+ if (!bodyResult.foundClose) {
115
64
  ctx.diagnostics.push({
116
65
  severity: "warning",
117
66
  code: "unclosed-block",
@@ -0,0 +1,37 @@
1
+ import type { ParseContext } from "../../types";
2
+ import { parseAttributesRaw, parseBlockName } from "../../block/utils";
3
+
4
+ export interface HtmlInlineOpenResult {
5
+ bodyStart: number;
6
+ consumed: number;
7
+ }
8
+
9
+ export function parseHtmlInlineOpen(ctx: ParseContext): HtmlInlineOpenResult | null {
10
+ if (ctx.tokens[ctx.pos]?.type !== "BLOCK_OPEN") {
11
+ return null;
12
+ }
13
+
14
+ let pos = ctx.pos + 1;
15
+ let consumed = 1;
16
+
17
+ const nameResult = parseBlockName(ctx, pos);
18
+ if (!nameResult || nameResult.name.toLowerCase() !== "html") {
19
+ return null;
20
+ }
21
+
22
+ pos += nameResult.consumed;
23
+ consumed += nameResult.consumed;
24
+
25
+ const attrResult = parseAttributesRaw(ctx, pos);
26
+ pos += attrResult.consumed;
27
+ consumed += attrResult.consumed;
28
+
29
+ if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
30
+ return null;
31
+ }
32
+
33
+ pos++;
34
+ consumed++;
35
+
36
+ return { bodyStart: pos, consumed };
37
+ }
@@ -0,0 +1,22 @@
1
+ import type { AttributeMap } from "@wdprlib/ast";
2
+ import type { ParseContext } from "../../types";
3
+ import { parseAttributesRaw } from "../../block/utils";
4
+ import { filterUnsafeAttributes } from "../../common";
5
+
6
+ export interface ImageAttributes {
7
+ attributes: AttributeMap;
8
+ link: string | null;
9
+ consumed: number;
10
+ }
11
+
12
+ export function parseImageAttributes(ctx: ParseContext, startPos: number): ImageAttributes {
13
+ const result = parseAttributesRaw(ctx, startPos, false);
14
+ const link = result.attrs.link ?? null;
15
+ const { link: _link, ...htmlAttributes } = result.attrs;
16
+
17
+ return {
18
+ attributes: filterUnsafeAttributes(htmlAttributes),
19
+ link,
20
+ consumed: result.consumed,
21
+ };
22
+ }
@@ -0,0 +1,36 @@
1
+ import type { ParseContext } from "../../types";
2
+
3
+ export interface ImageSourceText {
4
+ sourceText: string;
5
+ consumed: number;
6
+ }
7
+
8
+ export function parseImageSourceText(ctx: ParseContext, startPos: number): ImageSourceText {
9
+ let pos = startPos;
10
+ let consumed = 0;
11
+
12
+ while (ctx.tokens[pos]?.type === "WHITESPACE") {
13
+ pos++;
14
+ consumed++;
15
+ }
16
+
17
+ let sourceText = "";
18
+ while (pos < ctx.tokens.length) {
19
+ const token = ctx.tokens[pos];
20
+ if (
21
+ !token ||
22
+ token.type === "WHITESPACE" ||
23
+ token.type === "BLOCK_CLOSE" ||
24
+ token.type === "NEWLINE" ||
25
+ token.type === "EOF"
26
+ ) {
27
+ break;
28
+ }
29
+
30
+ sourceText += token.value;
31
+ pos++;
32
+ consumed++;
33
+ }
34
+
35
+ return { sourceText, consumed };
36
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ *
3
+ * Parses the Wikidot image block syntax: `[[image source attributes]]`.
4
+ *
5
+ * Images support several alignment/float prefixes that modify how the
6
+ * image is positioned on the page:
7
+ * - `[[image src]]` -- default (no alignment)
8
+ * - `[[=image src]]` -- centered
9
+ * - `[[<image src]]` -- left-aligned
10
+ * - `[[>image src]]` -- right-aligned
11
+ * - `[[f<image src]]` -- float left
12
+ * - `[[f>image src]]` -- float right
13
+ * - `[[f=image src]]` -- float center
14
+ *
15
+ * Image sources can be:
16
+ * - Full URLs (`http://...`, `https://...`, `/path`)
17
+ * - Local file references in three formats:
18
+ * - `file.ext` (file on current page, type `file1`)
19
+ * - `page/file.ext` (file on another page, type `file2`)
20
+ * - `site:page/file.ext` or `site/page/file.ext` (cross-site file, type `file3`)
21
+ *
22
+ * Optional attributes follow the source (e.g. `alt`, `title`, `width`,
23
+ * `height`, `style`, `class`, `link`). The `link` attribute is treated
24
+ * specially: it wraps the image in a hyperlink rather than being applied
25
+ * as an HTML attribute. Unsafe attributes are filtered out.
26
+ *
27
+ * Produces an `"image"` AST element with source, alignment, link, and
28
+ * attribute data.
29
+ *
30
+ * @module
31
+ */
32
+ import type { Element } from "@wdprlib/ast";
33
+ import type { InlineRule, ParseContext, RuleResult } from "../../types";
34
+ import { currentToken } from "../../types";
35
+ import { parseImageOpen } from "./open";
36
+ import { parseAlignment, parseImageSource } from "./source";
37
+
38
+ /**
39
+ * Inline rule for parsing `[[image source attributes]]` and its alignment variants.
40
+ *
41
+ * Triggered by a `BLOCK_OPEN` (`[[`) token. The rule identifies the image
42
+ * block name (with optional alignment prefix), extracts the image source,
43
+ * parses remaining attributes, filters unsafe attributes, and extracts the
44
+ * `link` attribute for special handling.
45
+ *
46
+ * Fails if the block name is not an image variant, if no source is provided,
47
+ * or if `]]` is not found.
48
+ */
49
+ export const imageRule: InlineRule = {
50
+ name: "image",
51
+ startTokens: ["BLOCK_OPEN"],
52
+
53
+ /**
54
+ * Attempts to parse an image block at the current position.
55
+ *
56
+ * @param ctx - Parse context with token stream and current position
57
+ * @returns A successful result with an `"image"` element, or `{ success: false }`
58
+ */
59
+ parse(ctx: ParseContext): RuleResult<Element> {
60
+ const openToken = currentToken(ctx);
61
+ if (openToken.type !== "BLOCK_OPEN") {
62
+ return { success: false };
63
+ }
64
+
65
+ const openResult = parseImageOpen(ctx);
66
+ if (!openResult) {
67
+ return { success: false };
68
+ }
69
+
70
+ const source = parseImageSource(openResult.sourceText);
71
+ const alignment = parseAlignment(openResult.blockName);
72
+
73
+ return {
74
+ success: true,
75
+ elements: [
76
+ {
77
+ element: "image",
78
+ data: {
79
+ source,
80
+ link: openResult.link,
81
+ alignment,
82
+ attributes: openResult.attributes,
83
+ },
84
+ },
85
+ ],
86
+ consumed: openResult.consumed,
87
+ };
88
+ },
89
+ };
@@ -0,0 +1,56 @@
1
+ import type { ParseContext } from "../../types";
2
+ import { parseImageAttributes } from "./attributes";
3
+ import { parseImageSourceText } from "./body";
4
+ import { isImageBlockName, parseImageBlockName } from "./syntax";
5
+
6
+ export interface ImageOpenResult {
7
+ blockName: string;
8
+ sourceText: string;
9
+ link: string | null;
10
+ attributes: Record<string, string>;
11
+ consumed: number;
12
+ }
13
+
14
+ export function parseImageOpen(ctx: ParseContext): ImageOpenResult | null {
15
+ if (ctx.tokens[ctx.pos]?.type !== "BLOCK_OPEN") {
16
+ return null;
17
+ }
18
+
19
+ let pos = ctx.pos + 1;
20
+ let consumed = 1;
21
+
22
+ const nameResult = parseImageBlockName(ctx, pos);
23
+ if (!nameResult || !isImageBlockName(nameResult.name)) {
24
+ return null;
25
+ }
26
+
27
+ pos += nameResult.consumed;
28
+ consumed += nameResult.consumed;
29
+
30
+ const sourceText = parseImageSourceText(ctx, pos);
31
+ pos += sourceText.consumed;
32
+ consumed += sourceText.consumed;
33
+
34
+ const attrs = parseImageAttributes(ctx, pos);
35
+ pos += attrs.consumed;
36
+ consumed += attrs.consumed;
37
+
38
+ if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
39
+ return null;
40
+ }
41
+
42
+ pos++;
43
+ consumed++;
44
+
45
+ if (!sourceText.sourceText) {
46
+ return null;
47
+ }
48
+
49
+ return {
50
+ blockName: nameResult.name,
51
+ sourceText: sourceText.sourceText,
52
+ link: attrs.link,
53
+ attributes: attrs.attributes,
54
+ consumed,
55
+ };
56
+ }
@@ -0,0 +1,62 @@
1
+ import type { Alignment, FloatAlignment, ImageSource } from "@wdprlib/ast";
2
+
3
+ export function parseImageSource(src: string): ImageSource {
4
+ if (src.startsWith("http://") || src.startsWith("https://") || src.startsWith("/")) {
5
+ return { type: "url", data: src };
6
+ }
7
+
8
+ const colonIdx = src.indexOf(":");
9
+ const slashIdx = src.indexOf("/");
10
+
11
+ if (colonIdx > 0 && slashIdx > colonIdx) {
12
+ const site = src.substring(0, colonIdx);
13
+ const rest = src.substring(colonIdx + 1);
14
+ const lastSlash = rest.lastIndexOf("/");
15
+ const page = rest.substring(0, lastSlash);
16
+ const file = rest.substring(lastSlash + 1);
17
+ return { type: "file3", data: { site, page, file } };
18
+ }
19
+
20
+ const slashes = src.split("/").length - 1;
21
+ if (slashes >= 2) {
22
+ const firstSlash = src.indexOf("/");
23
+ const lastSlash = src.lastIndexOf("/");
24
+ const site = src.substring(0, firstSlash);
25
+ const page = src.substring(firstSlash + 1, lastSlash);
26
+ const file = src.substring(lastSlash + 1);
27
+ return { type: "file3", data: { site, page, file } };
28
+ }
29
+ if (slashIdx > 0) {
30
+ const page = src.substring(0, slashIdx);
31
+ const file = src.substring(slashIdx + 1);
32
+ return { type: "file2", data: { page, file } };
33
+ }
34
+
35
+ return { type: "file1", data: { file: src } };
36
+ }
37
+
38
+ export function parseAlignment(blockName: string): FloatAlignment | null {
39
+ let align: Alignment = "left";
40
+ let float = false;
41
+
42
+ if (blockName === "=image") {
43
+ align = "center";
44
+ } else if (blockName === "<image") {
45
+ align = "left";
46
+ } else if (blockName === ">image") {
47
+ align = "right";
48
+ } else if (blockName === "f<image") {
49
+ align = "left";
50
+ float = true;
51
+ } else if (blockName === "f>image") {
52
+ align = "right";
53
+ float = true;
54
+ } else if (blockName === "f=image") {
55
+ align = "center";
56
+ float = true;
57
+ } else if (blockName === "image") {
58
+ return null;
59
+ }
60
+
61
+ return { align, float };
62
+ }
@@ -0,0 +1,76 @@
1
+ import type { ParseContext } from "../../types";
2
+
3
+ const IMAGE_BLOCK_NAMES = new Set([
4
+ "image",
5
+ "=image",
6
+ "<image",
7
+ ">image",
8
+ "f<image",
9
+ "f>image",
10
+ "f=image",
11
+ ]);
12
+
13
+ export interface ImageBlockName {
14
+ name: string;
15
+ consumed: number;
16
+ }
17
+
18
+ export function parseImageBlockName(ctx: ParseContext, startPos: number): ImageBlockName | null {
19
+ let pos = startPos;
20
+ let consumed = 0;
21
+
22
+ while (ctx.tokens[pos]?.type === "WHITESPACE") {
23
+ pos++;
24
+ consumed++;
25
+ }
26
+
27
+ const prefixResult = parseImagePrefix(ctx, pos);
28
+ const prefix = prefixResult.prefix;
29
+ pos += prefixResult.consumed;
30
+ consumed += prefixResult.consumed;
31
+
32
+ const nameToken = ctx.tokens[pos];
33
+ if (!nameToken || (nameToken.type !== "TEXT" && nameToken.type !== "IDENTIFIER")) {
34
+ return null;
35
+ }
36
+
37
+ return { name: prefix + nameToken.value.toLowerCase(), consumed: consumed + 1 };
38
+ }
39
+
40
+ export function isImageBlockName(blockName: string): boolean {
41
+ return IMAGE_BLOCK_NAMES.has(blockName);
42
+ }
43
+
44
+ function parseImagePrefix(ctx: ParseContext, pos: number): { prefix: string; consumed: number } {
45
+ const token = ctx.tokens[pos];
46
+
47
+ if (token?.type === "EQUALS") {
48
+ return { prefix: "=", consumed: 1 };
49
+ }
50
+ if (token?.type === "TEXT" && token.value === "<") {
51
+ return { prefix: "<", consumed: 1 };
52
+ }
53
+ if ((token?.type === "TEXT" || token?.type === "BLOCKQUOTE_MARKER") && token.value === ">") {
54
+ return { prefix: ">", consumed: 1 };
55
+ }
56
+ if (token?.type === "IDENTIFIER" && token.value.toLowerCase() === "f") {
57
+ return parseFloatPrefix(ctx, pos + 1);
58
+ }
59
+
60
+ return { prefix: "", consumed: 0 };
61
+ }
62
+
63
+ function parseFloatPrefix(ctx: ParseContext, pos: number): { prefix: string; consumed: number } {
64
+ const token = ctx.tokens[pos];
65
+ if (token?.type === "TEXT" && token.value === "<") {
66
+ return { prefix: "f<", consumed: 2 };
67
+ }
68
+ if ((token?.type === "TEXT" || token?.type === "BLOCKQUOTE_MARKER") && token.value === ">") {
69
+ return { prefix: "f>", consumed: 2 };
70
+ }
71
+ if (token?.type === "EQUALS") {
72
+ return { prefix: "f=", consumed: 2 };
73
+ }
74
+
75
+ return { prefix: "", consumed: 0 };
76
+ }
@@ -18,8 +18,7 @@
18
18
  */
19
19
  import type { Element } from "@wdprlib/ast";
20
20
  import type { InlineRule, ParseContext, RuleResult } from "../types";
21
- import { currentToken, hasClosingMarkerBeforeNewline } from "../types";
22
- import { parseInlineUntil } from "./utils";
21
+ import { parseSameLineDelimitedContainer } from "./formatting/container";
23
22
 
24
23
  /**
25
24
  * Inline rule for parsing `//italic//` formatting.
@@ -42,33 +41,6 @@ export const italicRule: InlineRule = {
42
41
  * with `type: "italics"`, or a text fallback for unmatched markers
43
42
  */
44
43
  parse(ctx: ParseContext): RuleResult<Element> {
45
- const startToken = currentToken(ctx);
46
-
47
- // Check if closing marker exists
48
- if (!hasClosingMarkerBeforeNewline({ ...ctx, pos: ctx.pos + 1 }, "ITALIC_MARKER")) {
49
- return {
50
- success: true,
51
- elements: [{ element: "text", data: startToken.value }],
52
- consumed: 1,
53
- };
54
- }
55
-
56
- // Parse content between markers
57
- const result = parseInlineUntil({ ...ctx, pos: ctx.pos + 1 }, "ITALIC_MARKER");
58
-
59
- return {
60
- success: true,
61
- elements: [
62
- {
63
- element: "container",
64
- data: {
65
- type: "italics",
66
- attributes: {},
67
- elements: result.elements,
68
- },
69
- },
70
- ],
71
- consumed: 1 + result.consumed + 1, // open + content + close
72
- };
44
+ return parseSameLineDelimitedContainer(ctx, "ITALIC_MARKER", "italics");
73
45
  },
74
46
  };
@@ -0,0 +1,58 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import type { InlineRule, ParseContext, RuleResult } from "../../types";
3
+ import { createPreservedLineBreak } from "./elements";
4
+
5
+ export const backslashLineBreakRule: InlineRule = {
6
+ name: "backslashLineBreak",
7
+ startTokens: ["WHITESPACE", "BACKSLASH_BREAK"],
8
+
9
+ parse(ctx: ParseContext): RuleResult<Element> {
10
+ const currentTok = ctx.tokens[ctx.pos];
11
+ if (!currentTok) {
12
+ return { success: false };
13
+ }
14
+
15
+ if (currentTok.type === "WHITESPACE") {
16
+ const nextTok = ctx.tokens[ctx.pos + 1];
17
+ if (nextTok?.type !== "BACKSLASH_BREAK") {
18
+ return { success: false };
19
+ }
20
+
21
+ if (isFollowedByUnderscoreBreak(ctx, ctx.pos + 2)) {
22
+ return {
23
+ success: true,
24
+ elements: [createPreservedLineBreak()],
25
+ consumed: 2,
26
+ };
27
+ }
28
+
29
+ return {
30
+ success: true,
31
+ elements: [createPreservedLineBreak(), { element: "text", data: " " }],
32
+ consumed: 2,
33
+ };
34
+ }
35
+
36
+ if (currentTok.type === "BACKSLASH_BREAK") {
37
+ return {
38
+ success: true,
39
+ elements: [createPreservedLineBreak()],
40
+ consumed: 1,
41
+ };
42
+ }
43
+
44
+ return { success: false };
45
+ },
46
+ };
47
+
48
+ function isFollowedByUnderscoreBreak(ctx: ParseContext, startPos: number): boolean {
49
+ const afterBreak = ctx.tokens[startPos];
50
+ const afterAfter = ctx.tokens[startPos + 1];
51
+ const afterAfterAfter = ctx.tokens[startPos + 2];
52
+
53
+ return (
54
+ afterBreak?.type === "WHITESPACE" &&
55
+ afterAfter?.type === "UNDERSCORE" &&
56
+ (afterAfterAfter?.type === "NEWLINE" || afterAfterAfter?.type === "EOF")
57
+ );
58
+ }
@@ -0,0 +1,9 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+
3
+ export type PreservedLineBreak = Extract<Element, { element: "line-break" }> & {
4
+ _preservedTrailingBreak?: boolean;
5
+ };
6
+
7
+ export function createPreservedLineBreak(): PreservedLineBreak {
8
+ return { element: "line-break", _preservedTrailingBreak: true };
9
+ }
@@ -0,0 +1,3 @@
1
+ export { newlineLineBreakRule } from "./newline";
2
+ export { backslashLineBreakRule } from "./backslash";
3
+ export { underscoreLineBreakRule } from "./underscore";