@wdprlib/parser 3.2.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/dist/index.cjs +10471 -8406
  2. package/dist/index.d.cts +313 -337
  3. package/dist/index.d.ts +313 -337
  4. package/dist/index.js +10457 -8392
  5. package/package.json +1 -1
  6. package/src/index.ts +7 -0
  7. package/src/lexer/anchor.ts +48 -0
  8. package/src/lexer/index.ts +3 -2
  9. package/src/lexer/lexer.ts +73 -559
  10. package/src/lexer/options.ts +19 -0
  11. package/src/lexer/punctuation.ts +70 -0
  12. package/src/lexer/quoted-string.ts +16 -0
  13. package/src/lexer/runs.ts +85 -0
  14. package/src/lexer/spacing-actions.ts +24 -0
  15. package/src/lexer/state.ts +103 -0
  16. package/src/lexer/syntax-actions.ts +80 -0
  17. package/src/lexer/text-actions.ts +41 -0
  18. package/src/lexer/token-actions.ts +136 -0
  19. package/src/lexer/token-factory.ts +62 -0
  20. package/src/lexer/tokenize.ts +18 -0
  21. package/src/parser/constants.ts +2 -0
  22. package/src/parser/depth/index.ts +111 -0
  23. package/src/parser/depth/stack.ts +82 -0
  24. package/src/parser/parse/block.ts +42 -0
  25. package/src/parser/parse/context.ts +26 -0
  26. package/src/parser/parse/footnotes.ts +25 -0
  27. package/src/parser/parse/index.ts +42 -0
  28. package/src/parser/parse/options.ts +34 -0
  29. package/src/parser/parse/parser.ts +79 -0
  30. package/src/parser/parse/plain-non-ascii.ts +129 -0
  31. package/src/parser/parse/result.ts +57 -0
  32. package/src/parser/parse/source.ts +11 -0
  33. package/src/parser/postprocess/divAdjacentParagraph.ts +1 -1
  34. package/src/parser/postprocess/spanStrip/clean-element.ts +168 -0
  35. package/src/parser/postprocess/spanStrip/cleanup.ts +25 -0
  36. package/src/parser/postprocess/spanStrip/empty-spans.ts +36 -0
  37. package/src/parser/postprocess/spanStrip/escaped.ts +78 -0
  38. package/src/parser/postprocess/spanStrip/factory.ts +23 -0
  39. package/src/parser/postprocess/spanStrip/index.ts +8 -0
  40. package/src/parser/postprocess/spanStrip/merge.ts +117 -0
  41. package/src/parser/postprocess/spanStrip/predicates.ts +59 -0
  42. package/src/parser/postprocess/spanStrip/split.ts +67 -0
  43. package/src/parser/preprocess/expr/chars.ts +15 -0
  44. package/src/parser/preprocess/expr/evaluate.ts +22 -0
  45. package/src/parser/preprocess/expr/index.ts +45 -0
  46. package/src/parser/preprocess/expr/kind.ts +19 -0
  47. package/src/parser/preprocess/expr/parse.ts +103 -0
  48. package/src/parser/preprocess/expr/scan.ts +34 -0
  49. package/src/parser/preprocess/expr/types.ts +14 -0
  50. package/src/parser/preprocess/typography.ts +70 -5
  51. package/src/parser/preprocess/utils/bracket-depths.ts +98 -0
  52. package/src/parser/preprocess/utils/index.ts +13 -0
  53. package/src/parser/preprocess/utils/raw-regions.ts +153 -0
  54. package/src/parser/preprocess/whitespace/detection.ts +39 -0
  55. package/src/parser/preprocess/whitespace/index.ts +79 -0
  56. package/src/parser/preprocess/whitespace/leading-spaces.ts +11 -0
  57. package/src/parser/preprocess/whitespace/patterns.ts +23 -0
  58. package/src/parser/rules/block/align/body.ts +46 -0
  59. package/src/parser/rules/block/align/element.ts +13 -0
  60. package/src/parser/rules/block/align/index.ts +90 -0
  61. package/src/parser/rules/block/align/syntax.ts +113 -0
  62. package/src/parser/rules/block/bibliography/body.ts +81 -0
  63. package/src/parser/rules/block/bibliography/entries.ts +49 -0
  64. package/src/parser/rules/block/bibliography/entry-content.ts +73 -0
  65. package/src/parser/rules/block/bibliography/entry-key.ts +83 -0
  66. package/src/parser/rules/block/bibliography/index.ts +90 -0
  67. package/src/parser/rules/block/bibliography/open.ts +53 -0
  68. package/src/parser/rules/block/block-list/bare-content.ts +105 -0
  69. package/src/parser/rules/block/block-list/bare-paragraph.ts +60 -0
  70. package/src/parser/rules/block/block-list/index.ts +51 -0
  71. package/src/parser/rules/block/block-list/item-content.ts +132 -0
  72. package/src/parser/rules/block/block-list/li-content.ts +107 -0
  73. package/src/parser/rules/block/block-list/li-item.ts +77 -0
  74. package/src/parser/rules/block/block-list/list-block.ts +100 -0
  75. package/src/parser/rules/block/block-list/open.ts +51 -0
  76. package/src/parser/rules/block/block-list/tags.ts +50 -0
  77. package/src/parser/rules/block/blockquote/build.ts +62 -0
  78. package/src/parser/rules/block/blockquote/index.ts +80 -0
  79. package/src/parser/rules/block/blockquote/line.ts +79 -0
  80. package/src/parser/rules/block/blockquote/lines.ts +39 -0
  81. package/src/parser/rules/block/{center.ts → center/index.ts} +7 -22
  82. package/src/parser/rules/block/center/open.ts +27 -0
  83. package/src/parser/rules/block/{clear-float.ts → clear-float/index.ts} +6 -30
  84. package/src/parser/rules/block/clear-float/syntax.ts +43 -0
  85. package/src/parser/rules/block/code/attributes.ts +30 -0
  86. package/src/parser/rules/block/code/content.ts +57 -0
  87. package/src/parser/rules/block/code/index.ts +100 -0
  88. package/src/parser/rules/block/collapsible/attributes.ts +95 -0
  89. package/src/parser/rules/block/collapsible/body.ts +69 -0
  90. package/src/parser/rules/block/collapsible/index.ts +117 -0
  91. package/src/parser/rules/block/collapsible/open.ts +51 -0
  92. package/src/parser/rules/block/collapsible/orphans.ts +31 -0
  93. package/src/parser/rules/block/collapsible/tags.ts +17 -0
  94. package/src/parser/rules/block/comment/consume.ts +37 -0
  95. package/src/parser/rules/block/{comment.ts → comment/index.ts} +12 -38
  96. package/src/parser/rules/block/{content-separator.ts → content-separator/index.ts} +5 -35
  97. package/src/parser/rules/block/content-separator/syntax.ts +33 -0
  98. package/src/parser/rules/block/definition-list/collect.ts +40 -0
  99. package/src/parser/rules/block/definition-list/index.ts +63 -0
  100. package/src/parser/rules/block/definition-list/item-key.ts +95 -0
  101. package/src/parser/rules/block/definition-list/item-value.ts +56 -0
  102. package/src/parser/rules/block/definition-list/items.ts +54 -0
  103. package/src/parser/rules/block/div/body.ts +41 -0
  104. package/src/parser/rules/block/div/close.ts +41 -0
  105. package/src/parser/rules/block/div/failed.ts +117 -0
  106. package/src/parser/rules/block/div/index.ts +112 -0
  107. package/src/parser/rules/block/div/nesting.ts +37 -0
  108. package/src/parser/rules/block/div/open.ts +59 -0
  109. package/src/parser/rules/block/div/paragraph-strip.ts +44 -0
  110. package/src/parser/rules/block/embed-block/content.ts +53 -0
  111. package/src/parser/rules/block/embed-block/index.ts +91 -0
  112. package/src/parser/rules/block/embed-block/open.ts +52 -0
  113. package/src/parser/rules/block/embed-block/tags.ts +5 -0
  114. package/src/parser/rules/block/footnoteblock/attributes.ts +73 -0
  115. package/src/parser/rules/block/footnoteblock/index.ts +82 -0
  116. package/src/parser/rules/block/footnoteblock/open.ts +53 -0
  117. package/src/parser/rules/block/heading/index.ts +87 -0
  118. package/src/parser/rules/block/heading/open.ts +50 -0
  119. package/src/parser/rules/block/heading/toc-text.ts +26 -0
  120. package/src/parser/rules/block/{horizontal-rule.ts → horizontal-rule/index.ts} +4 -21
  121. package/src/parser/rules/block/horizontal-rule/syntax.ts +21 -0
  122. package/src/parser/rules/block/html/body.ts +114 -0
  123. package/src/parser/rules/block/html/diagnostics.ts +11 -0
  124. package/src/parser/rules/block/html/index.ts +95 -0
  125. package/src/parser/rules/block/html/open.ts +36 -0
  126. package/src/parser/rules/block/iframe/attributes.ts +106 -0
  127. package/src/parser/rules/block/iframe/index.ts +73 -0
  128. package/src/parser/rules/block/iframe/open.ts +58 -0
  129. package/src/parser/rules/block/iframe/source.ts +24 -0
  130. package/src/parser/rules/block/iframe/url.ts +38 -0
  131. package/src/parser/rules/block/iftags/body.ts +48 -0
  132. package/src/parser/rules/block/iftags/condition.ts +24 -0
  133. package/src/parser/rules/block/{iftags.ts → iftags/index.ts} +16 -58
  134. package/src/parser/rules/block/include/arguments.ts +48 -0
  135. package/src/parser/rules/block/include/index.ts +75 -0
  136. package/src/parser/rules/block/include/location.ts +24 -0
  137. package/src/parser/rules/block/include/variables.ts +37 -0
  138. package/src/parser/rules/block/list/index.ts +73 -0
  139. package/src/parser/rules/block/list/line.ts +77 -0
  140. package/src/parser/rules/block/list/native.ts +89 -0
  141. package/src/parser/rules/block/math/content.ts +54 -0
  142. package/src/parser/rules/block/math/index.ts +106 -0
  143. package/src/parser/rules/block/math/name.ts +35 -0
  144. package/src/parser/rules/block/module/body.ts +92 -0
  145. package/src/parser/rules/block/module/element.ts +33 -0
  146. package/src/parser/rules/block/module/include/directive.ts +91 -0
  147. package/src/parser/rules/block/module/include/index.ts +11 -2
  148. package/src/parser/rules/block/module/include/references.ts +42 -0
  149. package/src/parser/rules/block/module/include/resolve/cache.ts +44 -0
  150. package/src/parser/rules/block/module/include/resolve/index.ts +106 -0
  151. package/src/parser/rules/block/module/include/resolve/iterate.ts +202 -0
  152. package/src/parser/rules/block/module/include/resolve/replace.ts +31 -0
  153. package/src/parser/rules/block/module/include/resolve/types.ts +105 -0
  154. package/src/parser/rules/block/module/include/scanner.ts +121 -0
  155. package/src/parser/rules/block/module/index.ts +14 -2
  156. package/src/parser/rules/block/module/listpages/compiler.ts +12 -392
  157. package/src/parser/rules/block/module/listpages/extract.ts +25 -359
  158. package/src/parser/rules/block/module/listpages/extraction/listpages.ts +42 -0
  159. package/src/parser/rules/block/module/listpages/extraction/listusers.ts +30 -0
  160. package/src/parser/rules/block/module/listpages/extraction/query.ts +51 -0
  161. package/src/parser/rules/block/module/listpages/extraction/result.ts +18 -0
  162. package/src/parser/rules/block/module/listpages/extraction/template.ts +96 -0
  163. package/src/parser/rules/block/module/listpages/extraction/variables.ts +58 -0
  164. package/src/parser/rules/block/module/listpages/normalization/date-selector.ts +53 -0
  165. package/src/parser/rules/block/module/listpages/normalization/numeric-selector.ts +32 -0
  166. package/src/parser/rules/block/module/listpages/normalization/order-parent.ts +82 -0
  167. package/src/parser/rules/block/module/listpages/normalization/selectors.ts +2 -0
  168. package/src/parser/rules/block/module/listpages/normalization/tags-category.ts +86 -0
  169. package/src/parser/rules/block/module/listpages/normalize.ts +8 -324
  170. package/src/parser/rules/block/module/listpages/resolution/items.ts +43 -0
  171. package/src/parser/rules/block/module/listpages/resolution/wrapper.ts +42 -0
  172. package/src/parser/rules/block/module/listpages/resolve.ts +5 -75
  173. package/src/parser/rules/block/module/listpages/template/format/content.ts +41 -0
  174. package/src/parser/rules/block/module/listpages/template/format/date.ts +116 -0
  175. package/src/parser/rules/block/module/listpages/template/format/index.ts +4 -0
  176. package/src/parser/rules/block/module/listpages/template/format/tags.ts +7 -0
  177. package/src/parser/rules/block/module/listpages/template/format/user.ts +9 -0
  178. package/src/parser/rules/block/module/listpages/template/getters/index.ts +36 -0
  179. package/src/parser/rules/block/module/listpages/template/getters/parameterized.ts +60 -0
  180. package/src/parser/rules/block/module/listpages/template/getters/simple.ts +65 -0
  181. package/src/parser/rules/block/module/listpages/template/getters/types.ts +3 -0
  182. package/src/parser/rules/block/module/listpages/template/syntax.ts +97 -0
  183. package/src/parser/rules/block/module/listpages/types/data-fetcher.ts +15 -0
  184. package/src/parser/rules/block/module/listpages/types/data-requirements.ts +52 -0
  185. package/src/parser/rules/block/module/listpages/types/external-data.ts +77 -0
  186. package/src/parser/rules/block/module/listpages/types/index.ts +17 -0
  187. package/src/parser/rules/block/module/listpages/types/normalized-query.ts +120 -0
  188. package/src/parser/rules/block/module/listpages/types/query.ts +67 -0
  189. package/src/parser/rules/block/module/listpages/types/template.ts +17 -0
  190. package/src/parser/rules/block/module/listpages/types/variables.ts +69 -0
  191. package/src/parser/rules/block/module/listpages/url-resolution/fields.ts +48 -0
  192. package/src/parser/rules/block/module/listpages/url-resolution/params.ts +30 -0
  193. package/src/parser/rules/block/module/listpages/url-resolution/query.ts +24 -0
  194. package/src/parser/rules/block/module/listpages/url-resolution/resolve.ts +62 -0
  195. package/src/parser/rules/block/module/listpages/url-resolution/value.ts +34 -0
  196. package/src/parser/rules/block/module/listpages/url-resolver.ts +3 -160
  197. package/src/parser/rules/block/module/listusers/compiler.ts +4 -25
  198. package/src/parser/rules/block/module/listusers/extract.ts +4 -9
  199. package/src/parser/rules/block/module/listusers/getters.ts +21 -0
  200. package/src/parser/rules/block/module/listusers/variables.ts +15 -0
  201. package/src/parser/rules/block/module/open.ts +57 -0
  202. package/src/parser/rules/block/module/resolution/contexts.ts +78 -0
  203. package/src/parser/rules/block/module/resolution/data-maps.ts +39 -0
  204. package/src/parser/rules/block/module/resolution/dynamic-modules.ts +93 -0
  205. package/src/parser/rules/block/module/resolution/styles.ts +53 -0
  206. package/src/parser/rules/block/module/resolution/walk-resolve.ts +107 -0
  207. package/src/parser/rules/block/module/resolve.ts +79 -292
  208. package/src/parser/rules/block/module/rule.ts +56 -0
  209. package/src/parser/rules/block/module/types-common.ts +11 -0
  210. package/src/parser/rules/block/module/walk/children.ts +35 -0
  211. package/src/parser/rules/block/module/walk/index.ts +9 -0
  212. package/src/parser/rules/block/module/walk/map/index.ts +2 -0
  213. package/src/parser/rules/block/module/walk/map/stateful-definition-list.ts +25 -0
  214. package/src/parser/rules/block/module/walk/map/stateful-list.ts +40 -0
  215. package/src/parser/rules/block/module/walk/map/stateful-table.ts +23 -0
  216. package/src/parser/rules/block/module/walk/map/stateful-tabs.ts +19 -0
  217. package/src/parser/rules/block/module/walk/map/stateful.ts +71 -0
  218. package/src/parser/rules/block/module/walk/map/stateless-definition-list.ts +12 -0
  219. package/src/parser/rules/block/module/walk/map/stateless-list.ts +29 -0
  220. package/src/parser/rules/block/module/walk/map/stateless-table.ts +11 -0
  221. package/src/parser/rules/block/module/walk/map/stateless-tabs.ts +5 -0
  222. package/src/parser/rules/block/module/walk/map/stateless.ts +51 -0
  223. package/src/parser/rules/block/module/walk/map/types.ts +6 -0
  224. package/src/parser/rules/block/module/walk/traverse.ts +65 -0
  225. package/src/parser/rules/block/orphan-li/content.ts +60 -0
  226. package/src/parser/rules/block/orphan-li/index.ts +75 -0
  227. package/src/parser/rules/block/orphan-li/open.ts +25 -0
  228. package/src/parser/rules/block/orphan-li/tags.ts +40 -0
  229. package/src/parser/rules/block/paragraph/content.ts +12 -0
  230. package/src/parser/rules/block/paragraph/index.ts +60 -0
  231. package/src/parser/rules/block/paragraph/normalize.ts +52 -0
  232. package/src/parser/rules/block/paragraph/span-markers.ts +52 -0
  233. package/src/parser/rules/block/parsing/attributes/index.ts +32 -0
  234. package/src/parser/rules/block/parsing/attributes/names.ts +93 -0
  235. package/src/parser/rules/block/parsing/attributes/scanner.ts +75 -0
  236. package/src/parser/rules/block/parsing/attributes/values.ts +26 -0
  237. package/src/parser/rules/block/parsing/block-item.ts +29 -0
  238. package/src/parser/rules/block/parsing/content.ts +127 -0
  239. package/src/parser/rules/block/parsing/end-condition.ts +51 -0
  240. package/src/parser/rules/block/parsing/inline-content.ts +105 -0
  241. package/src/parser/rules/block/parsing/inline-newline.ts +41 -0
  242. package/src/parser/rules/block/parsing/non-boundary.ts +24 -0
  243. package/src/parser/rules/block/parsing/rule-dispatch.ts +44 -0
  244. package/src/parser/rules/block/table/index.ts +80 -0
  245. package/src/parser/rules/block/table/pipe/cell-start.ts +69 -0
  246. package/src/parser/rules/block/table/pipe/cell.ts +106 -0
  247. package/src/parser/rules/block/table/pipe/index.ts +2 -0
  248. package/src/parser/rules/block/table/pipe/row.ts +88 -0
  249. package/src/parser/rules/block/table/pipe/tokens.ts +14 -0
  250. package/src/parser/rules/block/table/pipe/trim.ts +50 -0
  251. package/src/parser/rules/block/table-block/body.ts +79 -0
  252. package/src/parser/rules/block/table-block/cell-attributes.ts +33 -0
  253. package/src/parser/rules/block/table-block/cell-boundary.ts +99 -0
  254. package/src/parser/rules/block/table-block/cell-content/index.ts +88 -0
  255. package/src/parser/rules/block/table-block/cell-content/segments.ts +134 -0
  256. package/src/parser/rules/block/table-block/cell-newline.ts +47 -0
  257. package/src/parser/rules/block/table-block/cell.ts +64 -0
  258. package/src/parser/rules/block/table-block/index.ts +113 -0
  259. package/src/parser/rules/block/table-block/row-boundary.ts +75 -0
  260. package/src/parser/rules/block/table-block/structure.ts +80 -0
  261. package/src/parser/rules/block/tabview/body.ts +64 -0
  262. package/src/parser/rules/block/tabview/index.ts +90 -0
  263. package/src/parser/rules/block/tabview/open.ts +50 -0
  264. package/src/parser/rules/block/tabview/tab.ts +92 -0
  265. package/src/parser/rules/block/tabview/tags.ts +30 -0
  266. package/src/parser/rules/block/toc/element.ts +11 -0
  267. package/src/parser/rules/block/toc/index.ts +44 -0
  268. package/src/parser/rules/block/toc/open.ts +84 -0
  269. package/src/parser/rules/block/utils.ts +10 -610
  270. package/src/parser/rules/{utils.ts → common/attribute-safety.ts} +3 -49
  271. package/src/parser/rules/common/block-name.ts +33 -0
  272. package/src/parser/rules/common/index.ts +2 -0
  273. package/src/parser/rules/contracts/index.ts +3 -0
  274. package/src/parser/rules/contracts/parse-context.ts +38 -0
  275. package/src/parser/rules/contracts/rule.ts +43 -0
  276. package/src/parser/rules/contracts/scope.ts +31 -0
  277. package/src/parser/rules/inline/anchor/attributes.ts +54 -0
  278. package/src/parser/rules/inline/anchor/child.ts +26 -0
  279. package/src/parser/rules/inline/anchor/close.ts +34 -0
  280. package/src/parser/rules/inline/anchor/content.ts +59 -0
  281. package/src/parser/rules/inline/anchor/index.ts +103 -0
  282. package/src/parser/rules/inline/anchor/newline.ts +26 -0
  283. package/src/parser/rules/inline/anchor/open.ts +47 -0
  284. package/src/parser/rules/inline/anchor/paragraph-strip.ts +14 -0
  285. package/src/parser/rules/inline/anchor/syntax.ts +40 -0
  286. package/src/parser/rules/inline/anchor-name/index.ts +38 -0
  287. package/src/parser/rules/inline/anchor-name/name.ts +39 -0
  288. package/src/parser/rules/inline/anchor-name/syntax.ts +46 -0
  289. package/src/parser/rules/inline/bibcite/element.ts +14 -0
  290. package/src/parser/rules/inline/bibcite/index.ts +34 -0
  291. package/src/parser/rules/inline/bibcite/syntax.ts +64 -0
  292. package/src/parser/rules/inline/bold.ts +2 -39
  293. package/src/parser/rules/inline/color/index.ts +35 -0
  294. package/src/parser/rules/inline/color/syntax.ts +69 -0
  295. package/src/parser/rules/inline/comment/consume.ts +31 -0
  296. package/src/parser/rules/inline/{comment.ts → comment/index.ts} +10 -36
  297. package/src/parser/rules/inline/equation-ref/element.ts +8 -0
  298. package/src/parser/rules/inline/equation-ref/index.ts +34 -0
  299. package/src/parser/rules/inline/equation-ref/syntax.ts +45 -0
  300. package/src/parser/rules/inline/expr/branch.ts +104 -0
  301. package/src/parser/rules/inline/expr/conditional-branch.ts +27 -0
  302. package/src/parser/rules/inline/expr/conditional.ts +80 -0
  303. package/src/parser/rules/inline/expr/depth.ts +25 -0
  304. package/src/parser/rules/inline/expr/elements.ts +39 -0
  305. package/src/parser/rules/inline/expr/index.ts +84 -0
  306. package/src/parser/rules/inline/expr/syntax.ts +45 -0
  307. package/src/parser/rules/inline/footnote/child.ts +22 -0
  308. package/src/parser/rules/inline/footnote/close.ts +33 -0
  309. package/src/parser/rules/inline/footnote/content.ts +54 -0
  310. package/src/parser/rules/inline/footnote/elements.ts +38 -0
  311. package/src/parser/rules/inline/footnote/index.ts +54 -0
  312. package/src/parser/rules/inline/footnote/newline.ts +27 -0
  313. package/src/parser/rules/inline/footnote/open.ts +38 -0
  314. package/src/parser/rules/inline/formatting/container.ts +50 -0
  315. package/src/parser/rules/inline/{guillemet.ts → guillemet/index.ts} +5 -13
  316. package/src/parser/rules/inline/guillemet/text.ts +11 -0
  317. package/src/parser/rules/inline/html/gate.ts +64 -0
  318. package/src/parser/rules/inline/{html.ts → html/index.ts} +9 -60
  319. package/src/parser/rules/inline/html/open.ts +37 -0
  320. package/src/parser/rules/inline/image/attributes.ts +22 -0
  321. package/src/parser/rules/inline/image/body.ts +36 -0
  322. package/src/parser/rules/inline/image/index.ts +89 -0
  323. package/src/parser/rules/inline/image/open.ts +56 -0
  324. package/src/parser/rules/inline/image/source.ts +62 -0
  325. package/src/parser/rules/inline/image/syntax.ts +76 -0
  326. package/src/parser/rules/inline/italic.ts +2 -30
  327. package/src/parser/rules/inline/line-break/backslash.ts +58 -0
  328. package/src/parser/rules/inline/line-break/elements.ts +9 -0
  329. package/src/parser/rules/inline/line-break/index.ts +3 -0
  330. package/src/parser/rules/inline/line-break/newline.ts +82 -0
  331. package/src/parser/rules/inline/line-break/underscore.ts +45 -0
  332. package/src/parser/rules/inline/link-anchor.ts +6 -81
  333. package/src/parser/rules/inline/link-bracket/anchor.ts +3 -0
  334. package/src/parser/rules/inline/link-bracket/direct-url.ts +5 -0
  335. package/src/parser/rules/inline/link-bracket/parsed.ts +81 -0
  336. package/src/parser/rules/inline/link-bracket/parts.ts +64 -0
  337. package/src/parser/rules/inline/link-bracket/prefix.ts +15 -0
  338. package/src/parser/rules/inline/link-single.ts +7 -98
  339. package/src/parser/rules/inline/link-star.ts +7 -69
  340. package/src/parser/rules/inline/link-triple/fallback.ts +10 -0
  341. package/src/parser/rules/inline/link-triple/index.ts +62 -0
  342. package/src/parser/rules/inline/link-triple/interwiki.ts +11 -0
  343. package/src/parser/rules/inline/link-triple/label.ts +35 -0
  344. package/src/parser/rules/inline/link-triple/syntax.ts +72 -0
  345. package/src/parser/rules/inline/link-triple/target.ts +36 -0
  346. package/src/parser/rules/inline/math-inline/index.ts +40 -0
  347. package/src/parser/rules/inline/math-inline/syntax.ts +55 -0
  348. package/src/parser/rules/inline/monospace.ts +2 -30
  349. package/src/parser/rules/inline/parsing/block-boundary.ts +42 -0
  350. package/src/parser/rules/inline/parsing/block-start-predicates.ts +117 -0
  351. package/src/parser/rules/inline/parsing/collect.ts +23 -0
  352. package/src/parser/rules/inline/parsing/inline-content.ts +115 -0
  353. package/src/parser/rules/inline/parsing/paragraph-boundary.ts +47 -0
  354. package/src/parser/rules/inline/parsing/plain-text.ts +69 -0
  355. package/src/parser/rules/inline/parsing/preserved-line-break.ts +11 -0
  356. package/src/parser/rules/inline/parsing/rules.ts +34 -0
  357. package/src/parser/rules/inline/parsing/simple-token.ts +26 -0
  358. package/src/parser/rules/inline/raw/angle.ts +40 -0
  359. package/src/parser/rules/inline/raw/double-at.ts +78 -0
  360. package/src/parser/rules/inline/raw/index.ts +26 -0
  361. package/src/parser/rules/inline/raw/result.ts +26 -0
  362. package/src/parser/rules/inline/size/content.ts +65 -0
  363. package/src/parser/rules/inline/size/index.ts +55 -0
  364. package/src/parser/rules/inline/size/open.ts +43 -0
  365. package/src/parser/rules/inline/size/value.ts +45 -0
  366. package/src/parser/rules/inline/span/content.ts +97 -0
  367. package/src/parser/rules/inline/span/elements.ts +108 -0
  368. package/src/parser/rules/inline/span/index.ts +79 -0
  369. package/src/parser/rules/inline/span/newline.ts +50 -0
  370. package/src/parser/rules/inline/span/syntax.ts +70 -0
  371. package/src/parser/rules/inline/{strikethrough.ts → strikethrough/index.ts} +5 -60
  372. package/src/parser/rules/inline/strikethrough/parse.ts +14 -0
  373. package/src/parser/rules/inline/strikethrough/syntax.ts +24 -0
  374. package/src/parser/rules/inline/subscript.ts +2 -39
  375. package/src/parser/rules/inline/superscript.ts +4 -39
  376. package/src/parser/rules/inline/text/element.ts +5 -0
  377. package/src/parser/rules/inline/{text.ts → text/index.ts} +5 -4
  378. package/src/parser/rules/inline/underline/child.ts +26 -0
  379. package/src/parser/rules/inline/underline/content.ts +29 -0
  380. package/src/parser/rules/inline/{underline.ts → underline/index.ts} +6 -49
  381. package/src/parser/rules/inline/user/element.ts +11 -0
  382. package/src/parser/rules/inline/user/index.ts +34 -0
  383. package/src/parser/rules/inline/user/syntax.ts +67 -0
  384. package/src/parser/rules/inline/utils.ts +4 -344
  385. package/src/parser/rules/tokens.ts +106 -0
  386. package/src/parser/rules/types.ts +9 -252
  387. package/src/parser/depth.ts +0 -251
  388. package/src/parser/parse.ts +0 -315
  389. package/src/parser/postprocess/spanStrip.ts +0 -697
  390. package/src/parser/preprocess/expr.ts +0 -265
  391. package/src/parser/preprocess/utils.ts +0 -250
  392. package/src/parser/preprocess/whitespace.ts +0 -111
  393. package/src/parser/rules/block/align.ts +0 -282
  394. package/src/parser/rules/block/bibliography.ts +0 -359
  395. package/src/parser/rules/block/block-list.ts +0 -689
  396. package/src/parser/rules/block/blockquote.ts +0 -238
  397. package/src/parser/rules/block/code.ts +0 -187
  398. package/src/parser/rules/block/collapsible.ts +0 -337
  399. package/src/parser/rules/block/definition-list.ts +0 -270
  400. package/src/parser/rules/block/div.ts +0 -400
  401. package/src/parser/rules/block/embed-block.ts +0 -153
  402. package/src/parser/rules/block/footnoteblock.ts +0 -200
  403. package/src/parser/rules/block/heading.ts +0 -142
  404. package/src/parser/rules/block/html.ts +0 -222
  405. package/src/parser/rules/block/iframe.ts +0 -239
  406. package/src/parser/rules/block/include.ts +0 -179
  407. package/src/parser/rules/block/list.ts +0 -244
  408. package/src/parser/rules/block/math.ts +0 -183
  409. package/src/parser/rules/block/module/include/resolve.ts +0 -556
  410. package/src/parser/rules/block/module/listpages/types.ts +0 -513
  411. package/src/parser/rules/block/module/walk.ts +0 -380
  412. package/src/parser/rules/block/module.ts +0 -164
  413. package/src/parser/rules/block/orphan-li.ts +0 -177
  414. package/src/parser/rules/block/paragraph.ts +0 -157
  415. package/src/parser/rules/block/table-block.ts +0 -726
  416. package/src/parser/rules/block/table.ts +0 -441
  417. package/src/parser/rules/block/tabview.ts +0 -331
  418. package/src/parser/rules/block/toc.ts +0 -129
  419. package/src/parser/rules/inline/anchor-name.ts +0 -154
  420. package/src/parser/rules/inline/anchor.ts +0 -327
  421. package/src/parser/rules/inline/bibcite.ts +0 -153
  422. package/src/parser/rules/inline/color.ts +0 -140
  423. package/src/parser/rules/inline/equation-ref.ts +0 -115
  424. package/src/parser/rules/inline/expr.ts +0 -526
  425. package/src/parser/rules/inline/footnote.ts +0 -223
  426. package/src/parser/rules/inline/image.ts +0 -328
  427. package/src/parser/rules/inline/line-break.ts +0 -326
  428. package/src/parser/rules/inline/link-triple.ts +0 -267
  429. package/src/parser/rules/inline/math-inline.ts +0 -126
  430. package/src/parser/rules/inline/raw.ts +0 -262
  431. package/src/parser/rules/inline/size.ts +0 -244
  432. package/src/parser/rules/inline/span.ts +0 -424
  433. package/src/parser/rules/inline/user.ts +0 -147
@@ -1,200 +0,0 @@
1
- /**
2
- *
3
- * Block rule for the Wikidot footnote block: `[[footnoteblock]]`.
4
- *
5
- * This self-closing block tag marks the location in the page where all
6
- * collected footnotes (from `[[footnote]]...[[/footnote]]` inline markers)
7
- * should be rendered. It is analogous to a "footnotes section" placeholder.
8
- *
9
- * Optional attributes:
10
- * - `title` -- custom heading text for the footnotes section.
11
- * - `hide` -- when `"true"` or `"yes"`, suppresses footnote rendering.
12
- *
13
- * Wikidot only honours the FIRST `[[footnoteblock]]` in a document;
14
- * subsequent occurrences are treated as plain text. The parser tracks
15
- * this via `ctx.scope.footnoteBlockParsed`, but note: that flag is per
16
- * spread copy of `ParseContext` (see {@link ScopeContext.footnoteBlockParsed}).
17
- * In practice the duplicate-rejection only fires for two top-level
18
- * `[[footnoteblock]]` tokens; siblings inside the same body or across
19
- * nested bodies both succeed today. The auto-append decision in
20
- * `Parser.parse` uses a post-parse AST walk, so it is unaffected.
21
- *
22
- * @module
23
- */
24
- import type { Element } from "@wdprlib/ast";
25
- import type { BlockRule, ParseContext, RuleResult } from "../types";
26
- import { currentToken } from "../types";
27
-
28
- /**
29
- * Parses key/value attributes from tokens (e.g. `title="Custom title"`).
30
- *
31
- * This is a local attribute parser specific to the footnoteblock rule.
32
- * It handles TEXT or IDENTIFIER names, optional `=` with quoted or
33
- * unquoted values, and boolean attributes (name without value).
34
- *
35
- * @param ctx - Parse context.
36
- * @param startPos - Token index to start scanning.
37
- * @returns Parsed attribute map and the number of tokens consumed.
38
- */
39
- function parseAttributes(
40
- ctx: ParseContext,
41
- startPos: number,
42
- ): { attrs: Record<string, string>; consumed: number } {
43
- const attrs: Record<string, string> = {};
44
- let pos = startPos;
45
- let consumed = 0;
46
-
47
- while (pos < ctx.tokens.length) {
48
- const token = ctx.tokens[pos];
49
- if (
50
- !token ||
51
- token.type === "BLOCK_CLOSE" ||
52
- token.type === "NEWLINE" ||
53
- token.type === "EOF"
54
- ) {
55
- break;
56
- }
57
-
58
- // Skip whitespace
59
- if (token.type === "WHITESPACE") {
60
- pos++;
61
- consumed++;
62
- continue;
63
- }
64
-
65
- // Attribute name (TEXT or IDENTIFIER token)
66
- if (token.type === "TEXT" || token.type === "IDENTIFIER") {
67
- const name = token.value.toLowerCase();
68
- pos++;
69
- consumed++;
70
-
71
- // Check for =
72
- const eqToken = ctx.tokens[pos];
73
- if (eqToken?.type === "EQUALS") {
74
- pos++;
75
- consumed++;
76
-
77
- // Get value (quoted string or text)
78
- const valueToken = ctx.tokens[pos];
79
- if (valueToken?.type === "QUOTED_STRING") {
80
- // Remove quotes
81
- let value = valueToken.value;
82
- if (value.startsWith('"') && value.endsWith('"')) {
83
- value = value.slice(1, -1);
84
- }
85
- attrs[name] = value;
86
- pos++;
87
- consumed++;
88
- } else if (valueToken?.type === "TEXT" || valueToken?.type === "IDENTIFIER") {
89
- attrs[name] = valueToken.value;
90
- pos++;
91
- consumed++;
92
- }
93
- } else {
94
- // Boolean attribute
95
- attrs[name] = "true";
96
- }
97
- } else {
98
- // Unknown token, skip
99
- pos++;
100
- consumed++;
101
- }
102
- }
103
-
104
- return { attrs, consumed };
105
- }
106
-
107
- /**
108
- * Block rule for `[[footnoteblock]]`.
109
- *
110
- * Parsing strategy:
111
- * 1. Match BLOCK_OPEN + name "footnoteblock" (case-insensitive).
112
- * 2. Parse optional attributes (`title`, `hide`).
113
- * 3. Consume closing `]]`.
114
- * 4. If `ctx.scope.footnoteBlockParsed` is already `true` on the current
115
- * `ParseContext` copy, fail. Because `parseBlocksUntil` spreads a
116
- * fresh `ctx` per sibling rule, this only rejects a second
117
- * `[[footnoteblock]]` that arrives via the parser's top-level
118
- * dispatch loop in practice. See {@link ScopeContext.footnoteBlockParsed}.
119
- * 5. Replace `ctx.scope` with the flag set to `true` and emit a `footnote-block`
120
- * element.
121
- */
122
- export const footnoteBlockRule: BlockRule = {
123
- name: "footnoteBlock",
124
- startTokens: ["BLOCK_OPEN"],
125
- requiresLineStart: true,
126
-
127
- parse(ctx: ParseContext): RuleResult<Element> {
128
- const openToken = currentToken(ctx);
129
- if (openToken.type !== "BLOCK_OPEN") {
130
- return { success: false };
131
- }
132
-
133
- let pos = ctx.pos + 1;
134
- let consumed = 1;
135
-
136
- // Skip whitespace
137
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
138
- pos++;
139
- consumed++;
140
- }
141
-
142
- // Check for block name
143
- const nameToken = ctx.tokens[pos];
144
- if (!nameToken || (nameToken.type !== "TEXT" && nameToken.type !== "IDENTIFIER")) {
145
- return { success: false };
146
- }
147
-
148
- const blockName = nameToken.value.toLowerCase();
149
- if (blockName !== "footnoteblock") {
150
- return { success: false };
151
- }
152
- pos++;
153
- consumed++;
154
-
155
- // Parse optional attributes (title="...")
156
- const { attrs, consumed: attrConsumed } = parseAttributes(ctx, pos);
157
- pos += attrConsumed;
158
- consumed += attrConsumed;
159
-
160
- // Expect ]]
161
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
162
- pos++;
163
- consumed++;
164
- }
165
- if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
166
- return { success: false };
167
- }
168
- pos++;
169
- consumed++;
170
-
171
- // Reject a second `[[footnoteblock]]` that arrives on the same
172
- // `ParseContext` copy (in practice: at the top level — siblings
173
- // inside `parseBlocksUntil` each get a fresh spread). The flag
174
- // lives in the immutable `scope` group, so the mutation is
175
- // expressed as a scope replacement. The cross-scope duplicate-
176
- // rejection is a separate, known limitation.
177
- if (ctx.scope.footnoteBlockParsed) {
178
- return { success: false };
179
- }
180
- ctx.scope = { ...ctx.scope, footnoteBlockParsed: true };
181
-
182
- // Extract title and hide from attributes
183
- const title = attrs.title !== undefined ? attrs.title : null;
184
- const hide = attrs.hide === "true" || attrs.hide === "yes";
185
-
186
- return {
187
- success: true,
188
- elements: [
189
- {
190
- element: "footnote-block",
191
- data: {
192
- title,
193
- hide,
194
- },
195
- },
196
- ],
197
- consumed,
198
- };
199
- },
200
- };
@@ -1,142 +0,0 @@
1
- /**
2
- *
3
- * Block rule for Wikidot headings: `+ Heading` through `++++++ Heading`.
4
- *
5
- * Headings are written with one to six `+` characters at the start of a
6
- * line, followed by mandatory whitespace and then inline content:
7
- *
8
- * ```
9
- * + H1 heading
10
- * ++ H2 heading
11
- * +++ H3 heading
12
- * ```
13
- *
14
- * An optional `*` immediately after the `+` markers hides the heading
15
- * from the table of contents:
16
- *
17
- * ```
18
- * +* Hidden H1
19
- * ```
20
- *
21
- * Seven or more `+` characters are NOT valid headings in Wikidot and
22
- * the rule will fail, letting them fall through to paragraph parsing.
23
- *
24
- * Non-hidden headings are registered in `ctx.tocEntries` for later use
25
- * by the table-of-contents module.
26
- *
27
- * @module
28
- */
29
- import type { Element, HeadingLevel } from "@wdprlib/ast";
30
- import type { BlockRule, ParseContext, RuleResult } from "../types";
31
- import { currentToken } from "../types";
32
- import { parseInlineUntil } from "../inline/utils";
33
-
34
- /**
35
- * Block rule for Wikidot headings (`+ ` through `++++++ `).
36
- *
37
- * Produces a container element with `type: { header: { level, "has-toc" } }`.
38
- * The heading text is parsed for inline markup (bold, links, etc.).
39
- */
40
- export const headingRule: BlockRule = {
41
- name: "heading",
42
- startTokens: ["HEADING_MARKER"],
43
- requiresLineStart: true,
44
-
45
- parse(ctx: ParseContext): RuleResult<Element> {
46
- const marker = currentToken(ctx);
47
-
48
- if (!marker.lineStart) {
49
- return { success: false };
50
- }
51
-
52
- // Wikidot requires whitespace after heading marker
53
- // Check format: + (space)content OR +* (space)content
54
- let pos = ctx.pos + 1;
55
- let consumed = 1;
56
- let hidden = false;
57
-
58
- // Check for hidden marker (*) - must come immediately after + markers
59
- if (ctx.tokens[pos]?.type === "STAR") {
60
- hidden = true;
61
- pos++;
62
- consumed++;
63
- }
64
-
65
- // Whitespace is required after + or +*
66
- if (ctx.tokens[pos]?.type !== "WHITESPACE") {
67
- return { success: false };
68
- }
69
-
70
- // Wikidot only supports h1-h6 (1-6 plus signs). 7+ is not a heading.
71
- if (marker.value.length > 6) {
72
- return { success: false };
73
- }
74
- const depth = marker.value.length as 1 | 2 | 3 | 4 | 5 | 6;
75
-
76
- // Skip whitespace
77
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
78
- pos++;
79
- consumed++;
80
- }
81
-
82
- // Parse inline content until newline
83
- const inlineCtx: ParseContext = { ...ctx, pos };
84
- const inlineResult = parseInlineUntil(inlineCtx, "NEWLINE");
85
- const children: Element[] = inlineResult.elements;
86
- consumed += inlineResult.consumed;
87
- pos += inlineResult.consumed;
88
-
89
- // Consume newline
90
- if (ctx.tokens[pos]?.type === "NEWLINE") {
91
- consumed++;
92
- }
93
-
94
- // Store TOC entry (only non-hidden headings)
95
- if (!hidden) {
96
- const headingText = extractText(children);
97
- ctx.tocEntries.push({ level: depth, text: headingText });
98
- }
99
-
100
- return {
101
- success: true,
102
- elements: [
103
- {
104
- element: "container",
105
- data: {
106
- type: { header: { level: depth as HeadingLevel, "has-toc": !hidden } },
107
- attributes: {},
108
- elements: children,
109
- },
110
- },
111
- ],
112
- consumed,
113
- };
114
- },
115
- };
116
-
117
- /**
118
- * Recursively extracts the plain-text content from a tree of elements.
119
- *
120
- * Used to build the `text` field for table-of-contents entries. Only
121
- * `text` elements and containers with nested `elements` are traversed;
122
- * other element types (images, etc.) are ignored.
123
- *
124
- * @param elements - The heading's inline child elements.
125
- * @returns Concatenated plain text.
126
- */
127
- function extractText(elements: Element[]): string {
128
- let text = "";
129
- for (const el of elements) {
130
- if (el.element === "text" && typeof el.data === "string") {
131
- text += el.data;
132
- } else if (
133
- el.element === "container" &&
134
- el.data &&
135
- typeof el.data === "object" &&
136
- "elements" in el.data
137
- ) {
138
- text += extractText(el.data.elements as Element[]);
139
- }
140
- }
141
- return text;
142
- }
@@ -1,222 +0,0 @@
1
- /**
2
- *
3
- * Block rule for the Wikidot HTML block: `[[html]]...[[/html]]`.
4
- *
5
- * An HTML block embeds raw HTML that Wikidot renders inside a sandboxed
6
- * `<iframe>`. The content between the tags is captured verbatim (no inline
7
- * parsing) and stored as an `html` element in the AST.
8
- *
9
- * Supported attributes on the opening tag:
10
- * - `style` -- applied to the containing iframe. Other attributes are
11
- * parsed but only `style` is used by Wikidot's renderer.
12
- *
13
- * The raw content is also pushed into `ctx.htmlBlocks` for document-level
14
- * enumeration.
15
- *
16
- * If no `[[/html]]` closing tag is found, the rule fails and the opening
17
- * tag falls through to text rendering (matching Wikidot behaviour).
18
- *
19
- * @module
20
- */
21
- import type { Element } from "@wdprlib/ast";
22
- import type { BlockRule, ParseContext, RuleResult } from "../types";
23
- import { currentToken } from "../types";
24
- import { parseBlockName, parseAttributesRaw } from "./utils";
25
-
26
- /**
27
- * Scan forward from `from` to see whether a real `[[/html]]` close tag
28
- * exists later in the token stream. Used by the disabled path to decide
29
- * whether the blank-line stop should fire.
30
- *
31
- * Recognises whitespace between the name and the closing `]]` so the
32
- * answer matches what the main consume loop would actually accept.
33
- */
34
- export function lookaheadHasHtmlClose(ctx: ParseContext, from: number): boolean {
35
- for (let i = from; i < ctx.tokens.length; i++) {
36
- const t = ctx.tokens[i];
37
- if (!t || t.type === "EOF") return false;
38
- if (t.type !== "BLOCK_END_OPEN") continue;
39
- const closeName = parseBlockName(ctx, i + 1);
40
- if (closeName?.name.toLowerCase() !== "html") continue;
41
- let cp = i + 1 + closeName.consumed;
42
- while (ctx.tokens[cp]?.type === "WHITESPACE") cp++;
43
- if (ctx.tokens[cp]?.type === "BLOCK_CLOSE") return true;
44
- }
45
- return false;
46
- }
47
-
48
- /**
49
- * Block rule for `[[html]]...[[/html]]`.
50
- *
51
- * Body content is stored as raw text. The optional `style` attribute is
52
- * passed through to the AST element for iframe styling.
53
- */
54
- export const htmlBlockRule: BlockRule = {
55
- name: "html",
56
- startTokens: ["BLOCK_OPEN"],
57
- requiresLineStart: 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
- let pos = ctx.pos + 1;
66
- let consumed = 1;
67
-
68
- // Parse block name
69
- const nameResult = parseBlockName(ctx, pos);
70
- if (!nameResult || nameResult.name.toLowerCase() !== "html") {
71
- return { success: false };
72
- }
73
- pos += nameResult.consumed;
74
- consumed += nameResult.consumed;
75
-
76
- // Parse attributes (type="css", style="...", etc.)
77
- // Only style attribute is used by Wikidot (applied to iframe)
78
- const attrResult = parseAttributesRaw(ctx, pos);
79
- pos += attrResult.consumed;
80
- consumed += attrResult.consumed;
81
- const style = attrResult.attrs.style;
82
-
83
- // Expect ]]
84
- if (ctx.tokens[pos]?.type !== "BLOCK_CLOSE") {
85
- return { success: false };
86
- }
87
- pos++;
88
- consumed++;
89
-
90
- // Settings-level gate: when `[[html]]` is disabled, still consume the
91
- // entire block so the raw body cannot leak as text, but produce no
92
- // AST element and skip the `ctx.htmlBlocks` push. The malformed
93
- // opener path above (missing `]]`) is intentionally not affected —
94
- // it falls through to text rendering as before.
95
- const disabled = ctx.settings.allowHtmlBlocks === false;
96
-
97
- // When disabled, the blank-line stop must only kick in if no real
98
- // `[[/html]]` exists later in the stream. A closed block legitimately
99
- // contains blank lines between paragraphs.
100
- const hasCloseAhead = disabled && lookaheadHasHtmlClose(ctx, pos);
101
-
102
- // Collect HTML content until [[/html]]. When disabled, the body is
103
- // discarded so accumulation is skipped entirely to avoid building a
104
- // large string only to drop it.
105
- let contents = "";
106
- let foundClose = false;
107
-
108
- while (pos < ctx.tokens.length) {
109
- const token = ctx.tokens[pos];
110
- if (!token || token.type === "EOF") break;
111
-
112
- // When disabled with no close ahead, stop at a blank line so the
113
- // rule does not swallow subsequent paragraphs.
114
- if (
115
- disabled &&
116
- !hasCloseAhead &&
117
- token.type === "NEWLINE" &&
118
- ctx.tokens[pos + 1]?.type === "NEWLINE"
119
- ) {
120
- break;
121
- }
122
-
123
- // Check for closing [[/html]] — require the trailing `]]` so a
124
- // malformed `[[/html` without its close does not falsely terminate
125
- // the body and leak the rest as text.
126
- if (token.type === "BLOCK_END_OPEN") {
127
- const closeNameResult = parseBlockName(ctx, pos + 1);
128
- if (closeNameResult?.name.toLowerCase() === "html") {
129
- let checkPos = pos + 1 + closeNameResult.consumed;
130
- while (ctx.tokens[checkPos]?.type === "WHITESPACE") checkPos++;
131
- if (ctx.tokens[checkPos]?.type === "BLOCK_CLOSE") {
132
- foundClose = true;
133
- break;
134
- }
135
- }
136
- }
137
-
138
- if (!disabled) {
139
- contents += token.value;
140
- }
141
- pos++;
142
- consumed++;
143
- }
144
-
145
- // If no closing tag found:
146
- // - enabled: fail (matches Wikidot fallback to text)
147
- // - disabled: still consume to EOF so the body cannot leak, but emit
148
- // both the unclosed warning and the disabled-info diagnostics.
149
- if (!foundClose) {
150
- ctx.diagnostics.push({
151
- severity: "warning",
152
- code: "unclosed-block",
153
- message: "Missing closing tag [[/html]] for [[html]]",
154
- position: openToken.position,
155
- });
156
- if (!disabled) {
157
- return { success: false };
158
- }
159
- ctx.diagnostics.push({
160
- severity: "info",
161
- code: "html-block-disabled",
162
- message: "[[html]] block ignored: disabled by settings",
163
- position: openToken.position,
164
- });
165
- return { success: true, elements: [], consumed };
166
- }
167
-
168
- // Consume [[/html]] (skipping any whitespace between name and `]]`
169
- // to match the close-detection above).
170
- if (ctx.tokens[pos]?.type === "BLOCK_END_OPEN") {
171
- pos++;
172
- consumed++;
173
- const closeNameResult = parseBlockName(ctx, pos);
174
- if (closeNameResult) {
175
- pos += closeNameResult.consumed;
176
- consumed += closeNameResult.consumed;
177
- }
178
- while (ctx.tokens[pos]?.type === "WHITESPACE") {
179
- pos++;
180
- consumed++;
181
- }
182
- if (ctx.tokens[pos]?.type === "BLOCK_CLOSE") {
183
- pos++;
184
- consumed++;
185
- }
186
- if (ctx.tokens[pos]?.type === "NEWLINE") {
187
- pos++;
188
- consumed++;
189
- }
190
- }
191
-
192
- if (disabled) {
193
- ctx.diagnostics.push({
194
- severity: "info",
195
- code: "html-block-disabled",
196
- message: "[[html]] block ignored: disabled by settings",
197
- position: openToken.position,
198
- });
199
- return { success: true, elements: [], consumed };
200
- }
201
-
202
- // Trim the contents
203
- contents = contents.trim();
204
-
205
- // Store html block in context
206
- ctx.htmlBlocks.push(contents);
207
-
208
- return {
209
- success: true,
210
- elements: [
211
- {
212
- element: "html",
213
- data: {
214
- contents,
215
- ...(style && { style }),
216
- },
217
- },
218
- ],
219
- consumed,
220
- };
221
- },
222
- };