@wdprlib/parser 3.1.2 → 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 (419) hide show
  1. package/dist/index.cjs +10456 -8230
  2. package/dist/index.d.cts +313 -337
  3. package/dist/index.d.ts +313 -337
  4. package/dist/index.js +10460 -8234
  5. package/package.json +5 -3
  6. package/src/index.ts +170 -0
  7. package/src/lexer/anchor.ts +48 -0
  8. package/src/lexer/index.ts +21 -0
  9. package/src/lexer/lexer.ts +201 -0
  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/lexer/tokens.ts +141 -0
  22. package/src/parser/constants.ts +175 -0
  23. package/src/parser/depth/index.ts +111 -0
  24. package/src/parser/depth/stack.ts +82 -0
  25. package/src/parser/index.ts +18 -0
  26. package/src/parser/parse/block.ts +42 -0
  27. package/src/parser/parse/context.ts +26 -0
  28. package/src/parser/parse/footnotes.ts +25 -0
  29. package/src/parser/parse/index.ts +42 -0
  30. package/src/parser/parse/options.ts +34 -0
  31. package/src/parser/parse/parser.ts +79 -0
  32. package/src/parser/parse/plain-non-ascii.ts +129 -0
  33. package/src/parser/parse/result.ts +57 -0
  34. package/src/parser/parse/source.ts +11 -0
  35. package/src/parser/postprocess/divAdjacentParagraph.ts +76 -0
  36. package/src/parser/postprocess/index.ts +15 -0
  37. package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
  38. package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
  39. package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
  40. package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
  41. package/src/parser/postprocess/spanStrip/factory.ts +23 -0
  42. package/src/parser/postprocess/spanStrip/index.ts +8 -0
  43. package/src/parser/postprocess/spanStrip/merge.ts +117 -0
  44. package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
  45. package/src/parser/postprocess/spanStrip/split.ts +67 -0
  46. package/src/parser/preprocess/expr/chars.ts +15 -0
  47. package/src/parser/preprocess/expr/evaluate.ts +22 -0
  48. package/src/parser/preprocess/expr/index.ts +45 -0
  49. package/src/parser/preprocess/expr/kind.ts +19 -0
  50. package/src/parser/preprocess/expr/parse.ts +103 -0
  51. package/src/parser/preprocess/expr/scan.ts +34 -0
  52. package/src/parser/preprocess/expr/types.ts +14 -0
  53. package/src/parser/preprocess/index.ts +38 -0
  54. package/src/parser/preprocess/typography.ts +132 -0
  55. package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
  56. package/src/parser/preprocess/utils/index.ts +13 -0
  57. package/src/parser/preprocess/utils/raw-regions.ts +153 -0
  58. package/src/parser/preprocess/whitespace/detection.ts +39 -0
  59. package/src/parser/preprocess/whitespace/index.ts +79 -0
  60. package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
  61. package/src/parser/preprocess/whitespace/patterns.ts +23 -0
  62. package/src/parser/rules/block/align/body.ts +46 -0
  63. package/src/parser/rules/block/align/element.ts +13 -0
  64. package/src/parser/rules/block/align/index.ts +90 -0
  65. package/src/parser/rules/block/align/syntax.ts +113 -0
  66. package/src/parser/rules/block/bibliography/body.ts +81 -0
  67. package/src/parser/rules/block/bibliography/entries.ts +49 -0
  68. package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
  69. package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
  70. package/src/parser/rules/block/bibliography/index.ts +90 -0
  71. package/src/parser/rules/block/bibliography/open.ts +53 -0
  72. package/src/parser/rules/block/block-list/bare-content.ts +105 -0
  73. package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
  74. package/src/parser/rules/block/block-list/index.ts +51 -0
  75. package/src/parser/rules/block/block-list/item-content.ts +132 -0
  76. package/src/parser/rules/block/block-list/li-content.ts +107 -0
  77. package/src/parser/rules/block/block-list/li-item.ts +77 -0
  78. package/src/parser/rules/block/block-list/list-block.ts +100 -0
  79. package/src/parser/rules/block/block-list/open.ts +51 -0
  80. package/src/parser/rules/block/block-list/tags.ts +50 -0
  81. package/src/parser/rules/block/blockquote/build.ts +62 -0
  82. package/src/parser/rules/block/blockquote/index.ts +80 -0
  83. package/src/parser/rules/block/blockquote/line.ts +79 -0
  84. package/src/parser/rules/block/blockquote/lines.ts +39 -0
  85. package/src/parser/rules/block/center/index.ts +72 -0
  86. package/src/parser/rules/block/center/open.ts +27 -0
  87. package/src/parser/rules/block/clear-float/index.ts +51 -0
  88. package/src/parser/rules/block/clear-float/syntax.ts +43 -0
  89. package/src/parser/rules/block/code/attributes.ts +30 -0
  90. package/src/parser/rules/block/code/content.ts +57 -0
  91. package/src/parser/rules/block/code/index.ts +100 -0
  92. package/src/parser/rules/block/collapsible/attributes.ts +95 -0
  93. package/src/parser/rules/block/collapsible/body.ts +69 -0
  94. package/src/parser/rules/block/collapsible/index.ts +117 -0
  95. package/src/parser/rules/block/collapsible/open.ts +51 -0
  96. package/src/parser/rules/block/collapsible/orphans.ts +31 -0
  97. package/src/parser/rules/block/collapsible/tags.ts +17 -0
  98. package/src/parser/rules/block/comment/consume.ts +37 -0
  99. package/src/parser/rules/block/comment/index.ts +47 -0
  100. package/src/parser/rules/block/content-separator/index.ts +49 -0
  101. package/src/parser/rules/block/content-separator/syntax.ts +33 -0
  102. package/src/parser/rules/block/definition-list/collect.ts +40 -0
  103. package/src/parser/rules/block/definition-list/index.ts +63 -0
  104. package/src/parser/rules/block/definition-list/item-key.ts +95 -0
  105. package/src/parser/rules/block/definition-list/item-value.ts +56 -0
  106. package/src/parser/rules/block/definition-list/items.ts +54 -0
  107. package/src/parser/rules/block/div/body.ts +41 -0
  108. package/src/parser/rules/block/div/close.ts +41 -0
  109. package/src/parser/rules/block/div/failed.ts +117 -0
  110. package/src/parser/rules/block/div/index.ts +112 -0
  111. package/src/parser/rules/block/div/nesting.ts +37 -0
  112. package/src/parser/rules/block/div/open.ts +59 -0
  113. package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
  114. package/src/parser/rules/block/embed-block/content.ts +53 -0
  115. package/src/parser/rules/block/embed-block/index.ts +91 -0
  116. package/src/parser/rules/block/embed-block/open.ts +52 -0
  117. package/src/parser/rules/block/embed-block/tags.ts +5 -0
  118. package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
  119. package/src/parser/rules/block/footnoteblock/index.ts +82 -0
  120. package/src/parser/rules/block/footnoteblock/open.ts +53 -0
  121. package/src/parser/rules/block/heading/index.ts +87 -0
  122. package/src/parser/rules/block/heading/open.ts +50 -0
  123. package/src/parser/rules/block/heading/toc-text.ts +26 -0
  124. package/src/parser/rules/block/horizontal-rule/index.ts +44 -0
  125. package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
  126. package/src/parser/rules/block/html/body.ts +114 -0
  127. package/src/parser/rules/block/html/diagnostics.ts +11 -0
  128. package/src/parser/rules/block/html/index.ts +95 -0
  129. package/src/parser/rules/block/html/open.ts +36 -0
  130. package/src/parser/rules/block/iframe/attributes.ts +106 -0
  131. package/src/parser/rules/block/iframe/index.ts +73 -0
  132. package/src/parser/rules/block/iframe/open.ts +58 -0
  133. package/src/parser/rules/block/iframe/source.ts +24 -0
  134. package/src/parser/rules/block/iframe/url.ts +38 -0
  135. package/src/parser/rules/block/iftags/body.ts +48 -0
  136. package/src/parser/rules/block/iftags/condition.ts +24 -0
  137. package/src/parser/rules/block/iftags/index.ts +108 -0
  138. package/src/parser/rules/block/include/arguments.ts +48 -0
  139. package/src/parser/rules/block/include/index.ts +75 -0
  140. package/src/parser/rules/block/include/location.ts +24 -0
  141. package/src/parser/rules/block/include/variables.ts +37 -0
  142. package/src/parser/rules/block/index.ts +127 -0
  143. package/src/parser/rules/block/list/index.ts +73 -0
  144. package/src/parser/rules/block/list/line.ts +77 -0
  145. package/src/parser/rules/block/list/native.ts +89 -0
  146. package/src/parser/rules/block/math/content.ts +54 -0
  147. package/src/parser/rules/block/math/index.ts +106 -0
  148. package/src/parser/rules/block/math/name.ts +35 -0
  149. package/src/parser/rules/block/module/backlinks/index.ts +31 -0
  150. package/src/parser/rules/block/module/backlinks/types.ts +21 -0
  151. package/src/parser/rules/block/module/body.ts +92 -0
  152. package/src/parser/rules/block/module/categories/index.ts +34 -0
  153. package/src/parser/rules/block/module/categories/types.ts +21 -0
  154. package/src/parser/rules/block/module/css/index.ts +37 -0
  155. package/src/parser/rules/block/module/element.ts +33 -0
  156. package/src/parser/rules/block/module/iftags/condition.ts +109 -0
  157. package/src/parser/rules/block/module/iftags/index.ts +26 -0
  158. package/src/parser/rules/block/module/iftags/preprocess.ts +140 -0
  159. package/src/parser/rules/block/module/iftags/resolve.ts +73 -0
  160. package/src/parser/rules/block/module/iftags/types.ts +63 -0
  161. package/src/parser/rules/block/module/include/directive.ts +91 -0
  162. package/src/parser/rules/block/module/include/index.ts +29 -0
  163. package/src/parser/rules/block/module/include/references.ts +42 -0
  164. package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
  165. package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
  166. package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
  167. package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
  168. package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
  169. package/src/parser/rules/block/module/include/scanner.ts +121 -0
  170. package/src/parser/rules/block/module/index.ts +134 -0
  171. package/src/parser/rules/block/module/join/index.ts +34 -0
  172. package/src/parser/rules/block/module/join/types.ts +23 -0
  173. package/src/parser/rules/block/module/listpages/compiler.ts +73 -0
  174. package/src/parser/rules/block/module/listpages/extract.ts +76 -0
  175. package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
  176. package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
  177. package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
  178. package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
  179. package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
  180. package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
  181. package/src/parser/rules/block/module/listpages/index.ts +83 -0
  182. package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
  183. package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
  184. package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
  185. package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
  186. package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
  187. package/src/parser/rules/block/module/listpages/normalize.ts +74 -0
  188. package/src/parser/rules/block/module/listpages/parser.ts +106 -0
  189. package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
  190. package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
  191. package/src/parser/rules/block/module/listpages/resolve.ts +60 -0
  192. package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
  193. package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
  194. package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
  195. package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
  196. package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
  197. package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
  198. package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
  199. package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
  200. package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
  201. package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
  202. package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
  203. package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
  204. package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
  205. package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
  206. package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
  207. package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
  208. package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
  209. package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
  210. package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
  211. package/src/parser/rules/block/module/listpages/url-resolution/params.ts +19 -0
  212. package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
  213. package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +53 -0
  214. package/src/parser/rules/block/module/listpages/url-resolution/value.ts +25 -0
  215. package/src/parser/rules/block/module/listpages/url-resolver.ts +29 -0
  216. package/src/parser/rules/block/module/listusers/compiler.ts +56 -0
  217. package/src/parser/rules/block/module/listusers/extract.ts +40 -0
  218. package/src/parser/rules/block/module/listusers/getters.ts +21 -0
  219. package/src/parser/rules/block/module/listusers/index.ts +36 -0
  220. package/src/parser/rules/block/module/listusers/parser.ts +54 -0
  221. package/src/parser/rules/block/module/listusers/resolve.ts +58 -0
  222. package/src/parser/rules/block/module/listusers/types.ts +93 -0
  223. package/src/parser/rules/block/module/listusers/variables.ts +15 -0
  224. package/src/parser/rules/block/module/mapping.ts +61 -0
  225. package/src/parser/rules/block/module/open.ts +57 -0
  226. package/src/parser/rules/block/module/page-tree/index.ts +38 -0
  227. package/src/parser/rules/block/module/page-tree/types.ts +29 -0
  228. package/src/parser/rules/block/module/rate/index.ts +28 -0
  229. package/src/parser/rules/block/module/rate/types.ts +19 -0
  230. package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
  231. package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
  232. package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
  233. package/src/parser/rules/block/module/resolution/styles.ts +53 -0
  234. package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
  235. package/src/parser/rules/block/module/resolve.ts +198 -0
  236. package/src/parser/rules/block/module/rule.ts +56 -0
  237. package/src/parser/rules/block/module/types-common.ts +70 -0
  238. package/src/parser/rules/block/module/types.ts +61 -0
  239. package/src/parser/rules/block/module/utils.ts +43 -0
  240. package/src/parser/rules/block/module/walk/children.ts +35 -0
  241. package/src/parser/rules/block/module/walk/index.ts +9 -0
  242. package/src/parser/rules/block/module/walk/map/index.ts +2 -0
  243. package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
  244. package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
  245. package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
  246. package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
  247. package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
  248. package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
  249. package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
  250. package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
  251. package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
  252. package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
  253. package/src/parser/rules/block/module/walk/map/types.ts +6 -0
  254. package/src/parser/rules/block/module/walk/traverse.ts +65 -0
  255. package/src/parser/rules/block/orphan-li/content.ts +60 -0
  256. package/src/parser/rules/block/orphan-li/index.ts +75 -0
  257. package/src/parser/rules/block/orphan-li/open.ts +25 -0
  258. package/src/parser/rules/block/orphan-li/tags.ts +40 -0
  259. package/src/parser/rules/block/paragraph/content.ts +12 -0
  260. package/src/parser/rules/block/paragraph/index.ts +60 -0
  261. package/src/parser/rules/block/paragraph/normalize.ts +52 -0
  262. package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
  263. package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
  264. package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
  265. package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
  266. package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
  267. package/src/parser/rules/block/parsing/block-item.ts +29 -0
  268. package/src/parser/rules/block/parsing/content.ts +127 -0
  269. package/src/parser/rules/block/parsing/end-condition.ts +51 -0
  270. package/src/parser/rules/block/parsing/inline-content.ts +105 -0
  271. package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
  272. package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
  273. package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
  274. package/src/parser/rules/block/table/index.ts +80 -0
  275. package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
  276. package/src/parser/rules/block/table/pipe/cell.ts +106 -0
  277. package/src/parser/rules/block/table/pipe/index.ts +2 -0
  278. package/src/parser/rules/block/table/pipe/row.ts +88 -0
  279. package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
  280. package/src/parser/rules/block/table/pipe/trim.ts +50 -0
  281. package/src/parser/rules/block/table-block/body.ts +79 -0
  282. package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
  283. package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
  284. package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
  285. package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
  286. package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
  287. package/src/parser/rules/block/table-block/cell.ts +64 -0
  288. package/src/parser/rules/block/table-block/index.ts +113 -0
  289. package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
  290. package/src/parser/rules/block/table-block/structure.ts +80 -0
  291. package/src/parser/rules/block/tabview/body.ts +64 -0
  292. package/src/parser/rules/block/tabview/index.ts +90 -0
  293. package/src/parser/rules/block/tabview/open.ts +50 -0
  294. package/src/parser/rules/block/tabview/tab.ts +92 -0
  295. package/src/parser/rules/block/tabview/tags.ts +30 -0
  296. package/src/parser/rules/block/toc/element.ts +11 -0
  297. package/src/parser/rules/block/toc/index.ts +44 -0
  298. package/src/parser/rules/block/toc/open.ts +84 -0
  299. package/src/parser/rules/block/utils.ts +15 -0
  300. package/src/parser/rules/common/attribute-safety.ts +109 -0
  301. package/src/parser/rules/common/block-name.ts +33 -0
  302. package/src/parser/rules/common/index.ts +2 -0
  303. package/src/parser/rules/contracts/index.ts +3 -0
  304. package/src/parser/rules/contracts/parse-context.ts +38 -0
  305. package/src/parser/rules/contracts/rule.ts +43 -0
  306. package/src/parser/rules/contracts/scope.ts +31 -0
  307. package/src/parser/rules/index.ts +49 -0
  308. package/src/parser/rules/inline/anchor/attributes.ts +54 -0
  309. package/src/parser/rules/inline/anchor/child.ts +26 -0
  310. package/src/parser/rules/inline/anchor/close.ts +34 -0
  311. package/src/parser/rules/inline/anchor/content.ts +59 -0
  312. package/src/parser/rules/inline/anchor/index.ts +103 -0
  313. package/src/parser/rules/inline/anchor/newline.ts +26 -0
  314. package/src/parser/rules/inline/anchor/open.ts +47 -0
  315. package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
  316. package/src/parser/rules/inline/anchor/syntax.ts +40 -0
  317. package/src/parser/rules/inline/anchor-name/index.ts +38 -0
  318. package/src/parser/rules/inline/anchor-name/name.ts +39 -0
  319. package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
  320. package/src/parser/rules/inline/bibcite/element.ts +14 -0
  321. package/src/parser/rules/inline/bibcite/index.ts +34 -0
  322. package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
  323. package/src/parser/rules/inline/bold.ts +49 -0
  324. package/src/parser/rules/inline/color/index.ts +35 -0
  325. package/src/parser/rules/inline/color/syntax.ts +69 -0
  326. package/src/parser/rules/inline/comment/consume.ts +31 -0
  327. package/src/parser/rules/inline/comment/index.ts +64 -0
  328. package/src/parser/rules/inline/equation-ref/element.ts +8 -0
  329. package/src/parser/rules/inline/equation-ref/index.ts +34 -0
  330. package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
  331. package/src/parser/rules/inline/expr/branch.ts +104 -0
  332. package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
  333. package/src/parser/rules/inline/expr/conditional.ts +80 -0
  334. package/src/parser/rules/inline/expr/depth.ts +25 -0
  335. package/src/parser/rules/inline/expr/elements.ts +39 -0
  336. package/src/parser/rules/inline/expr/index.ts +84 -0
  337. package/src/parser/rules/inline/expr/syntax.ts +45 -0
  338. package/src/parser/rules/inline/footnote/child.ts +22 -0
  339. package/src/parser/rules/inline/footnote/close.ts +33 -0
  340. package/src/parser/rules/inline/footnote/content.ts +54 -0
  341. package/src/parser/rules/inline/footnote/elements.ts +38 -0
  342. package/src/parser/rules/inline/footnote/index.ts +54 -0
  343. package/src/parser/rules/inline/footnote/newline.ts +27 -0
  344. package/src/parser/rules/inline/footnote/open.ts +38 -0
  345. package/src/parser/rules/inline/formatting/container.ts +50 -0
  346. package/src/parser/rules/inline/guillemet/index.ts +56 -0
  347. package/src/parser/rules/inline/guillemet/text.ts +11 -0
  348. package/src/parser/rules/inline/html/gate.ts +64 -0
  349. package/src/parser/rules/inline/html/index.ts +81 -0
  350. package/src/parser/rules/inline/html/open.ts +37 -0
  351. package/src/parser/rules/inline/image/attributes.ts +22 -0
  352. package/src/parser/rules/inline/image/body.ts +36 -0
  353. package/src/parser/rules/inline/image/index.ts +89 -0
  354. package/src/parser/rules/inline/image/open.ts +56 -0
  355. package/src/parser/rules/inline/image/source.ts +62 -0
  356. package/src/parser/rules/inline/image/syntax.ts +76 -0
  357. package/src/parser/rules/inline/index.ts +150 -0
  358. package/src/parser/rules/inline/italic.ts +46 -0
  359. package/src/parser/rules/inline/line-break/backslash.ts +58 -0
  360. package/src/parser/rules/inline/line-break/elements.ts +9 -0
  361. package/src/parser/rules/inline/line-break/index.ts +3 -0
  362. package/src/parser/rules/inline/line-break/newline.ts +82 -0
  363. package/src/parser/rules/inline/line-break/underscore.ts +45 -0
  364. package/src/parser/rules/inline/link-anchor.ts +72 -0
  365. package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
  366. package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
  367. package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
  368. package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
  369. package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
  370. package/src/parser/rules/inline/link-single.ts +73 -0
  371. package/src/parser/rules/inline/link-star.ts +72 -0
  372. package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
  373. package/src/parser/rules/inline/link-triple/index.ts +62 -0
  374. package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
  375. package/src/parser/rules/inline/link-triple/label.ts +35 -0
  376. package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
  377. package/src/parser/rules/inline/link-triple/target.ts +36 -0
  378. package/src/parser/rules/inline/math-inline/index.ts +40 -0
  379. package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
  380. package/src/parser/rules/inline/monospace.ts +50 -0
  381. package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
  382. package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
  383. package/src/parser/rules/inline/parsing/collect.ts +23 -0
  384. package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
  385. package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
  386. package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
  387. package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
  388. package/src/parser/rules/inline/parsing/rules.ts +34 -0
  389. package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
  390. package/src/parser/rules/inline/raw/angle.ts +40 -0
  391. package/src/parser/rules/inline/raw/double-at.ts +78 -0
  392. package/src/parser/rules/inline/raw/index.ts +26 -0
  393. package/src/parser/rules/inline/raw/result.ts +26 -0
  394. package/src/parser/rules/inline/size/content.ts +65 -0
  395. package/src/parser/rules/inline/size/index.ts +55 -0
  396. package/src/parser/rules/inline/size/open.ts +43 -0
  397. package/src/parser/rules/inline/size/value.ts +45 -0
  398. package/src/parser/rules/inline/span/content.ts +97 -0
  399. package/src/parser/rules/inline/span/elements.ts +108 -0
  400. package/src/parser/rules/inline/span/index.ts +79 -0
  401. package/src/parser/rules/inline/span/newline.ts +50 -0
  402. package/src/parser/rules/inline/span/syntax.ts +70 -0
  403. package/src/parser/rules/inline/strikethrough/index.ts +60 -0
  404. package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
  405. package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
  406. package/src/parser/rules/inline/subscript.ts +47 -0
  407. package/src/parser/rules/inline/superscript.ts +49 -0
  408. package/src/parser/rules/inline/text/element.ts +5 -0
  409. package/src/parser/rules/inline/text/index.ts +85 -0
  410. package/src/parser/rules/inline/underline/child.ts +26 -0
  411. package/src/parser/rules/inline/underline/content.ts +29 -0
  412. package/src/parser/rules/inline/underline/index.ts +84 -0
  413. package/src/parser/rules/inline/user/element.ts +11 -0
  414. package/src/parser/rules/inline/user/index.ts +34 -0
  415. package/src/parser/rules/inline/user/syntax.ts +67 -0
  416. package/src/parser/rules/inline/utils.ts +4 -0
  417. package/src/parser/rules/tokens.ts +106 -0
  418. package/src/parser/rules/types.ts +9 -0
  419. package/src/parser/toc.ts +130 -0
@@ -0,0 +1,45 @@
1
+ import type { ParseContext } from "../../types";
2
+
3
+ const VALID_SIZE_UNITS = ["px", "em", "rem", "ex", "%", "cm", "mm", "in", "pc"];
4
+
5
+ export function parseSizeValue(
6
+ ctx: ParseContext,
7
+ startPos: number,
8
+ ): { size: string; consumed: number } | null {
9
+ let pos = startPos;
10
+ let consumed = 0;
11
+
12
+ while (ctx.tokens[pos]?.type === "WHITESPACE") {
13
+ pos++;
14
+ consumed++;
15
+ }
16
+
17
+ const parts: string[] = [];
18
+ while (pos < ctx.tokens.length) {
19
+ const token = ctx.tokens[pos];
20
+ if (
21
+ !token ||
22
+ token.type === "BLOCK_CLOSE" ||
23
+ token.type === "NEWLINE" ||
24
+ token.type === "EOF" ||
25
+ token.type === "WHITESPACE"
26
+ ) {
27
+ break;
28
+ }
29
+ parts.push(token.value);
30
+ pos++;
31
+ consumed++;
32
+ }
33
+
34
+ if (parts.length === 0) {
35
+ return null;
36
+ }
37
+
38
+ const size = parts.join("");
39
+ return isValidSizeValue(size) ? { size, consumed } : null;
40
+ }
41
+
42
+ function isValidSizeValue(size: string): boolean {
43
+ const unitPattern = VALID_SIZE_UNITS.join("|");
44
+ return new RegExp(`^(\\d+(?:\\.\\d+)?)(${unitPattern})$`, "i").test(size);
45
+ }
@@ -0,0 +1,97 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import type { ParseContext } from "../../types";
3
+ import { inlineRules } from "../../index";
4
+ import { getCandidateInlineRules } from "../utils";
5
+ import { consumeSpanNewline } from "./newline";
6
+ import { parseCloseSpan } from "./syntax";
7
+ import type { SpanBlockName } from "./syntax";
8
+
9
+ export interface SpanContent {
10
+ children: Element[];
11
+ escapedChildren: Element[];
12
+ splitSpans: Element[][];
13
+ consumed: number;
14
+ foundClose: boolean;
15
+ }
16
+
17
+ export function parseSpanContent(
18
+ ctx: ParseContext,
19
+ startPos: number,
20
+ blockName: SpanBlockName,
21
+ ): SpanContent {
22
+ const paragraphStrip = blockName === "span_";
23
+ const children: Element[] = [];
24
+ const escapedChildren: Element[] = [];
25
+ const splitSpans: Element[][] = [];
26
+ let foundClose = false;
27
+ let afterBlankLine = false;
28
+ let consumed = 0;
29
+ let pos = startPos;
30
+
31
+ while (pos < ctx.tokens.length) {
32
+ const token = ctx.tokens[pos];
33
+ if (!token || token.type === "EOF") {
34
+ break;
35
+ }
36
+
37
+ const close = parseCloseSpan(ctx, pos);
38
+ if (close.success) {
39
+ pos += close.consumed;
40
+ consumed += close.consumed;
41
+ foundClose = true;
42
+ break;
43
+ }
44
+
45
+ if (token.type === "NEWLINE") {
46
+ const newline = consumeSpanNewline(
47
+ ctx,
48
+ pos,
49
+ paragraphStrip,
50
+ afterBlankLine,
51
+ children,
52
+ escapedChildren,
53
+ splitSpans,
54
+ );
55
+ pos += newline.consumed;
56
+ consumed += newline.consumed;
57
+ afterBlankLine = afterBlankLine || newline.afterBlankLine;
58
+ continue;
59
+ }
60
+
61
+ if (token.type === "WHITESPACE" && token.lineStart) {
62
+ pos++;
63
+ consumed++;
64
+ continue;
65
+ }
66
+
67
+ const targetChildren = afterBlankLine ? escapedChildren : children;
68
+ const parsed = parseOneSpanChild(ctx, pos, targetChildren);
69
+ pos += parsed.consumed;
70
+ consumed += parsed.consumed;
71
+ }
72
+
73
+ return { children, escapedChildren, splitSpans, consumed, foundClose };
74
+ }
75
+
76
+ function parseOneSpanChild(
77
+ ctx: ParseContext,
78
+ pos: number,
79
+ targetChildren: Element[],
80
+ ): { consumed: number } {
81
+ const token = ctx.tokens[pos];
82
+ if (!token) {
83
+ return { consumed: 0 };
84
+ }
85
+
86
+ const inlineCtx: ParseContext = { ...ctx, pos };
87
+ for (const rule of getCandidateInlineRules(inlineRules, token.type)) {
88
+ const result = rule.parse(inlineCtx);
89
+ if (result.success) {
90
+ targetChildren.push(...result.elements);
91
+ return { consumed: result.consumed };
92
+ }
93
+ }
94
+
95
+ targetChildren.push({ element: "text", data: token.value });
96
+ return { consumed: 1 };
97
+ }
@@ -0,0 +1,108 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import type { SpanContent } from "./content";
3
+ import type { SpanBlockName } from "./syntax";
4
+
5
+ export function buildSpanElements(
6
+ blockName: SpanBlockName,
7
+ attributes: Record<string, string>,
8
+ content: SpanContent,
9
+ ): Element[] {
10
+ if (blockName === "span_") {
11
+ return buildParagraphStripSpans(attributes, content.children, content.escapedChildren);
12
+ }
13
+
14
+ if (content.splitSpans.length > 0) {
15
+ return buildSplitSpans(attributes, content.children, content.splitSpans);
16
+ }
17
+
18
+ return [
19
+ {
20
+ element: "container",
21
+ data: {
22
+ type: "span",
23
+ attributes,
24
+ elements: content.children,
25
+ },
26
+ },
27
+ ];
28
+ }
29
+
30
+ function buildParagraphStripSpans(
31
+ attributes: Record<string, string>,
32
+ children: Element[],
33
+ escapedChildren: Element[],
34
+ ): Element[] {
35
+ trimEdgeLineBreaks(children);
36
+ trimEdgeLineBreaks(escapedChildren);
37
+
38
+ const elements: Element[] = [];
39
+
40
+ if (children.length > 0) {
41
+ elements.push({
42
+ element: "container",
43
+ data: {
44
+ type: "span",
45
+ attributes,
46
+ elements: children,
47
+ _paragraphStrip: true,
48
+ },
49
+ });
50
+ }
51
+
52
+ if (escapedChildren.length > 0) {
53
+ elements.push({
54
+ element: "container",
55
+ data: {
56
+ type: "span",
57
+ attributes: {},
58
+ elements: escapedChildren,
59
+ _escapedFromParagraph: true,
60
+ },
61
+ });
62
+ }
63
+
64
+ if (elements.length === 0) {
65
+ return [
66
+ {
67
+ element: "container",
68
+ data: {
69
+ type: "span",
70
+ attributes: {},
71
+ elements: [],
72
+ _emptyParagraphStrip: true,
73
+ },
74
+ },
75
+ ];
76
+ }
77
+
78
+ return elements;
79
+ }
80
+
81
+ function buildSplitSpans(
82
+ attributes: Record<string, string>,
83
+ children: Element[],
84
+ splitSpans: Element[][],
85
+ ): Element[] {
86
+ if (children.length > 0) {
87
+ splitSpans.push(children);
88
+ }
89
+
90
+ return splitSpans.map((segment, index) => ({
91
+ element: "container" as const,
92
+ data: {
93
+ type: "span" as const,
94
+ attributes: index === 0 ? attributes : {},
95
+ elements: segment,
96
+ _splitByBlankLine: index > 0,
97
+ },
98
+ }));
99
+ }
100
+
101
+ function trimEdgeLineBreaks(elements: Element[]): void {
102
+ while (elements.length > 0 && elements[0]?.element === "line-break") {
103
+ elements.shift();
104
+ }
105
+ while (elements.length > 0 && elements[elements.length - 1]?.element === "line-break") {
106
+ elements.pop();
107
+ }
108
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Inline rules for `[[span]]` and orphaned `[[/span]]`.
3
+ *
4
+ * @module
5
+ */
6
+
7
+ import type { Element } from "@wdprlib/ast";
8
+ import type { InlineRule, ParseContext, RuleResult } from "../../types";
9
+ import { currentToken } from "../../types";
10
+ import { buildSpanElements } from "./elements";
11
+ import { parseCloseSpan, parseSpanOpener } from "./syntax";
12
+ import { parseSpanContent } from "./content";
13
+
14
+ export const spanRule: InlineRule = {
15
+ name: "span",
16
+ startTokens: ["BLOCK_OPEN"],
17
+
18
+ parse(ctx: ParseContext): RuleResult<Element> {
19
+ const openToken = currentToken(ctx);
20
+ if (openToken.type !== "BLOCK_OPEN") {
21
+ return { success: false };
22
+ }
23
+
24
+ const opener = parseSpanOpener(ctx);
25
+ if (!opener.success) {
26
+ return { success: false };
27
+ }
28
+
29
+ const content = parseSpanContent(ctx, opener.pos, opener.blockName);
30
+ if (!content.foundClose) {
31
+ ctx.diagnostics.push({
32
+ severity: "warning",
33
+ code: "unclosed-block",
34
+ message: `Missing closing tag [[/span]] for [[${opener.blockName}]]`,
35
+ position: openToken.position,
36
+ });
37
+ return { success: false };
38
+ }
39
+
40
+ return {
41
+ success: true,
42
+ elements: buildSpanElements(opener.blockName, opener.attributes, content),
43
+ consumed: opener.consumed + content.consumed,
44
+ };
45
+ },
46
+ };
47
+
48
+ export const closeSpanRule: InlineRule = {
49
+ name: "closeSpan",
50
+ startTokens: ["BLOCK_END_OPEN"],
51
+
52
+ parse(ctx: ParseContext): RuleResult<Element> {
53
+ const token = currentToken(ctx);
54
+ if (token.type !== "BLOCK_END_OPEN") {
55
+ return { success: false };
56
+ }
57
+
58
+ const close = parseCloseSpan(ctx, ctx.pos);
59
+ if (!close.success) {
60
+ return { success: false };
61
+ }
62
+
63
+ return {
64
+ success: true,
65
+ elements: [
66
+ {
67
+ element: "container",
68
+ data: {
69
+ type: "span",
70
+ attributes: {},
71
+ elements: [],
72
+ _closeSpan: true,
73
+ },
74
+ },
75
+ ],
76
+ consumed: close.consumed,
77
+ };
78
+ },
79
+ };
@@ -0,0 +1,50 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import type { ParseContext } from "../../types";
3
+
4
+ export interface SpanNewlineResult {
5
+ consumed: number;
6
+ afterBlankLine: boolean;
7
+ }
8
+
9
+ export function consumeSpanNewline(
10
+ ctx: ParseContext,
11
+ pos: number,
12
+ paragraphStrip: boolean,
13
+ afterBlankLine: boolean,
14
+ children: Element[],
15
+ escapedChildren: Element[],
16
+ splitSpans: Element[][],
17
+ ): SpanNewlineResult {
18
+ let lookAhead = 1;
19
+ while (ctx.tokens[pos + lookAhead]?.type === "WHITESPACE") {
20
+ lookAhead++;
21
+ }
22
+ const nextToken = ctx.tokens[pos + lookAhead];
23
+
24
+ if (nextToken?.type === "NEWLINE") {
25
+ if (!paragraphStrip && children.length > 0) {
26
+ splitSpans.push([...children]);
27
+ children.length = 0;
28
+ }
29
+
30
+ let consumed = 1;
31
+ let nextPos = pos + 1;
32
+ while (ctx.tokens[nextPos]?.type === "WHITESPACE" || ctx.tokens[nextPos]?.type === "NEWLINE") {
33
+ nextPos++;
34
+ consumed++;
35
+ }
36
+
37
+ return { consumed, afterBlankLine: paragraphStrip };
38
+ }
39
+
40
+ const targetChildren = paragraphStrip && afterBlankLine ? escapedChildren : children;
41
+ targetChildren.push({ element: "line-break" });
42
+ let consumed = 1;
43
+ let nextPos = pos + 1;
44
+ while (ctx.tokens[nextPos]?.type === "WHITESPACE" && ctx.tokens[nextPos]?.lineStart) {
45
+ nextPos++;
46
+ consumed++;
47
+ }
48
+
49
+ return { consumed, afterBlankLine: false };
50
+ }
@@ -0,0 +1,70 @@
1
+ import type { ParseContext } from "../../types";
2
+ import { parseBlockName } from "../../common";
3
+ import { parseAttributes } from "../../block/utils";
4
+
5
+ export type SpanBlockName = "span" | "span_";
6
+
7
+ export type SpanOpenerResult =
8
+ | {
9
+ success: true;
10
+ blockName: SpanBlockName;
11
+ attributes: Record<string, string>;
12
+ pos: number;
13
+ consumed: number;
14
+ }
15
+ | { success: false };
16
+
17
+ export type CloseSpanResult = { success: true; consumed: number } | { success: false };
18
+
19
+ export function parseSpanOpener(ctx: ParseContext): SpanOpenerResult {
20
+ let pos = ctx.pos + 1;
21
+ let consumed = 1;
22
+
23
+ const nameResult = parseBlockName(ctx, pos);
24
+ if (!nameResult || (nameResult.name !== "span" && nameResult.name !== "span_")) {
25
+ return { success: false };
26
+ }
27
+
28
+ const blockName = nameResult.name;
29
+ pos += nameResult.consumed;
30
+ consumed += nameResult.consumed;
31
+
32
+ const attrResult = parseAttributes(ctx, pos);
33
+ pos += attrResult.consumed;
34
+ consumed += attrResult.consumed;
35
+
36
+ if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
37
+ return { success: false };
38
+ }
39
+ pos++;
40
+ consumed++;
41
+
42
+ return {
43
+ success: true,
44
+ blockName,
45
+ attributes: attrResult.attrs,
46
+ pos,
47
+ consumed,
48
+ };
49
+ }
50
+
51
+ export function parseCloseSpan(ctx: ParseContext, startPos: number): CloseSpanResult {
52
+ const token = ctx.tokens[startPos];
53
+ if (token?.type !== "BLOCK_END_OPEN") {
54
+ return { success: false };
55
+ }
56
+
57
+ const nameResult = parseBlockName(ctx, startPos + 1);
58
+ if (!nameResult || nameResult.name !== "span") {
59
+ return { success: false };
60
+ }
61
+
62
+ let pos = startPos + 1 + nameResult.consumed;
63
+ let consumed = 1 + nameResult.consumed;
64
+
65
+ if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
66
+ consumed++;
67
+ }
68
+
69
+ return { success: true, consumed };
70
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ *
3
+ * Parses the Wikidot strikethrough formatting syntax: `--text--`.
4
+ *
5
+ * Strikethrough text is delimited by double hyphens. However, the `--`
6
+ * token has dual meaning in Wikidot: it can be either a strikethrough
7
+ * marker or an em-dash. The disambiguation rule is:
8
+ *
9
+ * - If a matching closing `--` is found on the same line AND the closing
10
+ * marker is NOT preceded by whitespace, it is treated as strikethrough.
11
+ * - Otherwise, the `--` is converted to an em-dash character (U+2014).
12
+ *
13
+ * This means `--word--` produces strikethrough, but `-- word --` produces
14
+ * two em-dashes with "word" between them.
15
+ *
16
+ * Produces a `"container"` AST element with `type: "strikethrough"`,
17
+ * or a `"text"` element containing the em-dash character.
18
+ *
19
+ * @module
20
+ */
21
+ import type { Element } from "@wdprlib/ast";
22
+ import type { InlineRule, ParseContext, RuleResult } from "../../types";
23
+ import { parseStrikethroughContent } from "./parse";
24
+ import { hasValidStrikethroughClose } from "./syntax";
25
+
26
+ /**
27
+ * Inline rule for parsing `--strikethrough--` formatting or converting
28
+ * `--` to an em-dash.
29
+ *
30
+ * Triggered by a `STRIKE_MARKER` token (`--`). First validates whether
31
+ * a proper strikethrough pair exists. If yes, parses the content
32
+ * between markers as strikethrough. If no, converts the `--` to an
33
+ * em-dash character (U+2014).
34
+ */
35
+ export const strikethroughRule: InlineRule = {
36
+ name: "strikethrough",
37
+ startTokens: ["STRIKE_MARKER"],
38
+
39
+ /**
40
+ * Attempts to parse strikethrough formatting or produce an em-dash.
41
+ *
42
+ * @param ctx - Parse context with token stream and current position
43
+ * @returns A successful result with either a `"container"` element of
44
+ * type `"strikethrough"`, or a `"text"` element containing
45
+ * the em-dash character
46
+ */
47
+ parse(ctx: ParseContext): RuleResult<Element> {
48
+ // Check if valid strikethrough (no whitespace before closing --)
49
+ if (!hasValidStrikethroughClose(ctx)) {
50
+ // Not valid strikethrough, convert to em-dash
51
+ return {
52
+ success: true,
53
+ elements: [{ element: "text", data: "\u2014" }], // em-dash
54
+ consumed: 1,
55
+ };
56
+ }
57
+
58
+ return parseStrikethroughContent(ctx);
59
+ },
60
+ };
@@ -0,0 +1,14 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+ import type { ParseContext, RuleResult } from "../../types";
3
+ import { createInlineContainer } from "../formatting/container";
4
+ import { parseInlineUntil } from "../utils";
5
+
6
+ export function parseStrikethroughContent(ctx: ParseContext): RuleResult<Element> {
7
+ const result = parseInlineUntil({ ...ctx, pos: ctx.pos + 1 }, "STRIKE_MARKER");
8
+
9
+ return {
10
+ success: true,
11
+ elements: [createInlineContainer("strikethrough", result.elements)],
12
+ consumed: 1 + result.consumed + 1,
13
+ };
14
+ }
@@ -0,0 +1,24 @@
1
+ import type { ParseContext } from "../../types";
2
+
3
+ /**
4
+ * Returns true when the current `--` can be parsed as strikethrough.
5
+ */
6
+ export function hasValidStrikethroughClose(ctx: ParseContext): boolean {
7
+ let pos = ctx.pos + 1;
8
+ let prevWasWhitespace = false;
9
+
10
+ while (pos < ctx.tokens.length) {
11
+ const token = ctx.tokens[pos];
12
+ if (!token || token.type === "NEWLINE" || token.type === "EOF") {
13
+ return false;
14
+ }
15
+
16
+ if (token.type === "STRIKE_MARKER") {
17
+ return !prevWasWhitespace;
18
+ }
19
+
20
+ prevWasWhitespace = token.type === "WHITESPACE";
21
+ pos++;
22
+ }
23
+ return false;
24
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ *
3
+ * Parses the Wikidot subscript formatting syntax: `,,text,,`.
4
+ *
5
+ * Subscript text is delimited by double commas. The opening and closing
6
+ * markers must appear on the same line. If no closing `,,` is found
7
+ * before a newline, the opening marker is emitted as literal text.
8
+ *
9
+ * Empty subscript (`,,,,`) is silently discarded by Wikidot (produces
10
+ * no output), matching the behavior of bold and superscript.
11
+ *
12
+ * Renders as a `<sub>` element in HTML.
13
+ *
14
+ * Produces a `"container"` AST element with `type: "subscript"`.
15
+ *
16
+ * @module
17
+ */
18
+ import type { Element } from "@wdprlib/ast";
19
+ import type { InlineRule, ParseContext, RuleResult } from "../types";
20
+ import { parseSameLineDelimitedContainer } from "./formatting/container";
21
+
22
+ /**
23
+ * Inline rule for parsing `,,subscript,,` formatting.
24
+ *
25
+ * Triggered by a `SUB_MARKER` token (`,,`). Checks for a matching
26
+ * closing marker on the same line, then recursively parses inline
27
+ * content between the markers.
28
+ *
29
+ * When no closing marker is found, the opening `,,` is treated as
30
+ * literal text.
31
+ */
32
+ export const subscriptRule: InlineRule = {
33
+ name: "subscript",
34
+ startTokens: ["SUB_MARKER"],
35
+
36
+ /**
37
+ * Attempts to parse subscript formatting at the current position.
38
+ *
39
+ * @param ctx - Parse context with token stream and current position
40
+ * @returns A successful result containing either a `"container"` element
41
+ * with `type: "subscript"`, an empty array (for `,,,,`), or a
42
+ * text fallback for unmatched markers
43
+ */
44
+ parse(ctx: ParseContext): RuleResult<Element> {
45
+ return parseSameLineDelimitedContainer(ctx, "SUB_MARKER", "subscript", { discardEmpty: true });
46
+ },
47
+ };
@@ -0,0 +1,49 @@
1
+ /**
2
+ *
3
+ * Parses the Wikidot superscript formatting syntax: `^^text^^`.
4
+ *
5
+ * Superscript text is delimited by double carets. The opening and
6
+ * closing markers must appear on the same line. If no closing `^^`
7
+ * is found before a newline, the opening marker is emitted as literal text.
8
+ *
9
+ * Empty superscript (`^^^^`) is silently discarded by Wikidot (produces
10
+ * no output), matching the behavior of bold and subscript.
11
+ *
12
+ * Renders as a `<sup>` element in HTML.
13
+ *
14
+ * Produces a `"container"` AST element with `type: "superscript"`.
15
+ *
16
+ * @module
17
+ */
18
+ import type { Element } from "@wdprlib/ast";
19
+ import type { InlineRule, ParseContext, RuleResult } from "../types";
20
+ import { parseSameLineDelimitedContainer } from "./formatting/container";
21
+
22
+ /**
23
+ * Inline rule for parsing `^^superscript^^` formatting.
24
+ *
25
+ * Triggered by a `SUPER_MARKER` token (`^^`). Checks for a matching
26
+ * closing marker on the same line, then recursively parses inline
27
+ * content between the markers.
28
+ *
29
+ * When no closing marker is found, the opening `^^` is treated as
30
+ * literal text.
31
+ */
32
+ export const superscriptRule: InlineRule = {
33
+ name: "superscript",
34
+ startTokens: ["SUPER_MARKER"],
35
+
36
+ /**
37
+ * Attempts to parse superscript formatting at the current position.
38
+ *
39
+ * @param ctx - Parse context with token stream and current position
40
+ * @returns A successful result containing either a `"container"` element
41
+ * with `type: "superscript"`, an empty array (for `^^^^`), or a
42
+ * text fallback for unmatched markers
43
+ */
44
+ parse(ctx: ParseContext): RuleResult<Element> {
45
+ return parseSameLineDelimitedContainer(ctx, "SUPER_MARKER", "superscript", {
46
+ discardEmpty: true,
47
+ });
48
+ },
49
+ };
@@ -0,0 +1,5 @@
1
+ import type { Element } from "@wdprlib/ast";
2
+
3
+ export function textElement(data: string): Element {
4
+ return { element: "text", data };
5
+ }