@latentic/live-markdown 0.3.1 → 0.4.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 (341) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +2 -2
  3. package/dist/chunk-V6TY7KAL.js +8 -0
  4. package/dist/chunk-V6TY7KAL.js.map +1 -0
  5. package/dist/codemirror/CodeMirrorMarkdownEditor.d.ts +106 -0
  6. package/dist/codemirror/CodeMirrorMarkdownEditor.js +482 -0
  7. package/dist/codemirror/CodeMirrorMarkdownEditor.js.map +1 -0
  8. package/dist/codemirror/byteOffset.d.ts +17 -0
  9. package/dist/codemirror/byteOffset.js +19 -0
  10. package/dist/codemirror/byteOffset.js.map +1 -0
  11. package/dist/codemirror/caretLayer.d.ts +19 -0
  12. package/dist/codemirror/caretLayer.js +44 -0
  13. package/dist/codemirror/caretLayer.js.map +1 -0
  14. package/dist/codemirror/clipboard/copyRich.d.ts +37 -0
  15. package/dist/codemirror/clipboard/copyRich.js +72 -0
  16. package/dist/codemirror/clipboard/copyRich.js.map +1 -0
  17. package/dist/codemirror/clipboard/htmlToMarkdown.d.ts +20 -0
  18. package/dist/codemirror/clipboard/htmlToMarkdown.js +91 -0
  19. package/dist/codemirror/clipboard/htmlToMarkdown.js.map +1 -0
  20. package/dist/codemirror/clipboard/pasteMarkdown.d.ts +18 -0
  21. package/dist/codemirror/clipboard/pasteMarkdown.js +41 -0
  22. package/dist/codemirror/clipboard/pasteMarkdown.js.map +1 -0
  23. package/dist/codemirror/code/codeHighlight.d.ts +13 -0
  24. package/dist/codemirror/code/codeHighlight.js +15 -0
  25. package/dist/codemirror/code/codeHighlight.js.map +1 -0
  26. package/dist/codemirror/code/codeLangAffordance.d.ts +17 -0
  27. package/dist/codemirror/code/codeLangAffordance.js +80 -0
  28. package/dist/codemirror/code/codeLangAffordance.js.map +1 -0
  29. package/dist/codemirror/code/codeLanguageMenu.d.ts +40 -0
  30. package/dist/codemirror/code/codeLanguageMenu.js +184 -0
  31. package/dist/codemirror/code/codeLanguageMenu.js.map +1 -0
  32. package/dist/codemirror/code/codePalette.d.ts +39 -0
  33. package/dist/codemirror/code/codePalette.js +53 -0
  34. package/dist/codemirror/code/codePalette.js.map +1 -0
  35. package/dist/codemirror/code/fenceAutoClose.d.ts +30 -0
  36. package/dist/codemirror/code/fenceAutoClose.js +171 -0
  37. package/dist/codemirror/code/fenceAutoClose.js.map +1 -0
  38. package/dist/codemirror/code/fenceCaretGuard.d.ts +28 -0
  39. package/dist/codemirror/code/fenceCaretGuard.js +66 -0
  40. package/dist/codemirror/code/fenceCaretGuard.js.map +1 -0
  41. package/dist/codemirror/code/fenceDeleteGuards.d.ts +22 -0
  42. package/dist/codemirror/code/fenceDeleteGuards.js +105 -0
  43. package/dist/codemirror/code/fenceDeleteGuards.js.map +1 -0
  44. package/dist/codemirror/code/fenceTabIndent.d.ts +8 -0
  45. package/dist/codemirror/code/fenceTabIndent.js +50 -0
  46. package/dist/codemirror/code/fenceTabIndent.js.map +1 -0
  47. package/dist/codemirror/code/highlightFence.d.ts +25 -0
  48. package/dist/codemirror/code/highlightFence.js +45 -0
  49. package/dist/codemirror/code/highlightFence.js.map +1 -0
  50. package/dist/codemirror/code/index.d.ts +9 -0
  51. package/dist/codemirror/code/index.js +8 -0
  52. package/dist/codemirror/code/index.js.map +1 -0
  53. package/dist/codemirror/core/codeContext.d.ts +32 -0
  54. package/dist/codemirror/core/codeContext.js +22 -0
  55. package/dist/codemirror/core/codeContext.js.map +1 -0
  56. package/dist/codemirror/core/editorTestHarness.d.ts +31 -0
  57. package/dist/codemirror/core/editorTestHarness.js +69 -0
  58. package/dist/codemirror/core/editorTestHarness.js.map +1 -0
  59. package/dist/codemirror/core/editorTheme.d.ts +39 -0
  60. package/dist/codemirror/core/editorTheme.js +498 -0
  61. package/dist/codemirror/core/editorTheme.js.map +1 -0
  62. package/dist/codemirror/core/hostFacets.d.ts +58 -0
  63. package/dist/codemirror/core/hostFacets.js +27 -0
  64. package/dist/codemirror/core/hostFacets.js.map +1 -0
  65. package/dist/codemirror/core/hrWidget.d.ts +22 -0
  66. package/dist/codemirror/core/hrWidget.js +22 -0
  67. package/dist/codemirror/core/hrWidget.js.map +1 -0
  68. package/dist/codemirror/core/htmlEscape.d.ts +6 -0
  69. package/dist/codemirror/core/htmlEscape.js +12 -0
  70. package/dist/codemirror/core/htmlEscape.js.map +1 -0
  71. package/dist/codemirror/core/index.d.ts +13 -0
  72. package/dist/codemirror/core/index.js +9 -0
  73. package/dist/codemirror/core/index.js.map +1 -0
  74. package/dist/codemirror/core/inlineScan.d.ts +49 -0
  75. package/dist/codemirror/core/inlineScan.js +31 -0
  76. package/dist/codemirror/core/inlineScan.js.map +1 -0
  77. package/dist/codemirror/core/lineStructure.d.ts +47 -0
  78. package/dist/codemirror/core/lineStructure.js +64 -0
  79. package/dist/codemirror/core/lineStructure.js.map +1 -0
  80. package/dist/codemirror/core/linkResolution.d.ts +36 -0
  81. package/dist/codemirror/core/linkResolution.js +58 -0
  82. package/dist/codemirror/core/linkResolution.js.map +1 -0
  83. package/dist/codemirror/core/paint.d.ts +118 -0
  84. package/dist/codemirror/core/paint.js +42 -0
  85. package/dist/codemirror/core/paint.js.map +1 -0
  86. package/dist/codemirror/core/parseToEnd.d.ts +24 -0
  87. package/dist/codemirror/core/parseToEnd.js +38 -0
  88. package/dist/codemirror/core/parseToEnd.js.map +1 -0
  89. package/dist/codemirror/core/plugin.d.ts +32 -0
  90. package/dist/codemirror/core/plugin.js +161 -0
  91. package/dist/codemirror/core/plugin.js.map +1 -0
  92. package/dist/codemirror/core/registry.d.ts +38 -0
  93. package/dist/codemirror/core/registry.js +133 -0
  94. package/dist/codemirror/core/registry.js.map +1 -0
  95. package/dist/codemirror/core/testKeys.d.ts +17 -0
  96. package/dist/codemirror/core/testKeys.js +11 -0
  97. package/dist/codemirror/core/testKeys.js.map +1 -0
  98. package/dist/codemirror/core/treeAt.d.ts +31 -0
  99. package/dist/codemirror/core/treeAt.js +10 -0
  100. package/dist/codemirror/core/treeAt.js.map +1 -0
  101. package/dist/codemirror/extensions/footnoteExtension.d.ts +9 -0
  102. package/dist/codemirror/extensions/footnoteExtension.js +14 -0
  103. package/dist/codemirror/extensions/footnoteExtension.js.map +1 -0
  104. package/dist/codemirror/extensions/highlightExtension.d.ts +9 -0
  105. package/dist/codemirror/extensions/highlightExtension.js +14 -0
  106. package/dist/codemirror/extensions/highlightExtension.js.map +1 -0
  107. package/dist/codemirror/extensions/index.d.ts +12 -0
  108. package/dist/codemirror/extensions/index.js +19 -0
  109. package/dist/codemirror/extensions/index.js.map +1 -0
  110. package/dist/codemirror/extensions/loader.d.ts +24 -0
  111. package/dist/codemirror/extensions/loader.js +33 -0
  112. package/dist/codemirror/extensions/loader.js.map +1 -0
  113. package/dist/codemirror/extensions/mathExtension.d.ts +9 -0
  114. package/dist/codemirror/extensions/mathExtension.js +14 -0
  115. package/dist/codemirror/extensions/mathExtension.js.map +1 -0
  116. package/dist/codemirror/extensions/mermaidExtension.d.ts +9 -0
  117. package/dist/codemirror/extensions/mermaidExtension.js +12 -0
  118. package/dist/codemirror/extensions/mermaidExtension.js.map +1 -0
  119. package/dist/codemirror/extensions/tableExtension.d.ts +13 -0
  120. package/dist/codemirror/extensions/tableExtension.js +39 -0
  121. package/dist/codemirror/extensions/tableExtension.js.map +1 -0
  122. package/dist/codemirror/extensions/types.d.ts +39 -0
  123. package/dist/codemirror/extensions/types.js +1 -0
  124. package/dist/codemirror/extensions/types.js.map +1 -0
  125. package/dist/codemirror/extensions/wikilinkExtension.d.ts +9 -0
  126. package/dist/codemirror/extensions/wikilinkExtension.js +14 -0
  127. package/dist/codemirror/extensions/wikilinkExtension.js.map +1 -0
  128. package/dist/codemirror/features/blockCommandSteps.d.ts +20 -0
  129. package/dist/codemirror/features/blockCommandSteps.js +83 -0
  130. package/dist/codemirror/features/blockCommandSteps.js.map +1 -0
  131. package/dist/codemirror/footnote/footnotePlugin.d.ts +10 -0
  132. package/dist/codemirror/footnote/footnotePlugin.js +78 -0
  133. package/dist/codemirror/footnote/footnotePlugin.js.map +1 -0
  134. package/dist/codemirror/footnote/footnoteScanRule.d.ts +9 -0
  135. package/dist/codemirror/footnote/footnoteScanRule.js +12 -0
  136. package/dist/codemirror/footnote/footnoteScanRule.js.map +1 -0
  137. package/dist/codemirror/footnote/index.d.ts +2 -0
  138. package/dist/codemirror/footnote/index.js +2 -0
  139. package/dist/codemirror/footnote/index.js.map +1 -0
  140. package/dist/codemirror/format/blockCommands.d.ts +17 -0
  141. package/dist/codemirror/format/blockCommands.js +176 -0
  142. package/dist/codemirror/format/blockCommands.js.map +1 -0
  143. package/dist/codemirror/format/formatCommands.d.ts +11 -0
  144. package/dist/codemirror/format/formatCommands.js +132 -0
  145. package/dist/codemirror/format/formatCommands.js.map +1 -0
  146. package/dist/codemirror/format/index.d.ts +4 -0
  147. package/dist/codemirror/format/index.js +3 -0
  148. package/dist/codemirror/format/index.js.map +1 -0
  149. package/dist/codemirror/highlight/highlightPlugin.d.ts +10 -0
  150. package/dist/codemirror/highlight/highlightPlugin.js +66 -0
  151. package/dist/codemirror/highlight/highlightPlugin.js.map +1 -0
  152. package/dist/codemirror/highlight/highlightScanRule.d.ts +8 -0
  153. package/dist/codemirror/highlight/highlightScanRule.js +12 -0
  154. package/dist/codemirror/highlight/highlightScanRule.js.map +1 -0
  155. package/dist/codemirror/highlight/index.d.ts +2 -0
  156. package/dist/codemirror/highlight/index.js +2 -0
  157. package/dist/codemirror/highlight/index.js.map +1 -0
  158. package/dist/codemirror/html/htmlWidget.d.ts +23 -0
  159. package/dist/codemirror/html/htmlWidget.js +67 -0
  160. package/dist/codemirror/html/htmlWidget.js.map +1 -0
  161. package/dist/codemirror/html/index.d.ts +4 -0
  162. package/dist/codemirror/html/index.js +2 -0
  163. package/dist/codemirror/html/index.js.map +1 -0
  164. package/dist/codemirror/image/imageActionMenu.d.ts +14 -0
  165. package/dist/codemirror/image/imageActionMenu.js +112 -0
  166. package/dist/codemirror/image/imageActionMenu.js.map +1 -0
  167. package/dist/codemirror/image/imageEditEvent.d.ts +20 -0
  168. package/dist/codemirror/image/imageEditEvent.js +6 -0
  169. package/dist/codemirror/image/imageEditEvent.js.map +1 -0
  170. package/dist/codemirror/image/imageInsertHandlers.d.ts +13 -0
  171. package/dist/codemirror/image/imageInsertHandlers.js +64 -0
  172. package/dist/codemirror/image/imageInsertHandlers.js.map +1 -0
  173. package/dist/codemirror/image/imageWidget.d.ts +49 -0
  174. package/dist/codemirror/image/imageWidget.js +83 -0
  175. package/dist/codemirror/image/imageWidget.js.map +1 -0
  176. package/dist/codemirror/image/index.d.ts +8 -0
  177. package/dist/codemirror/image/index.js +5 -0
  178. package/dist/codemirror/image/index.js.map +1 -0
  179. package/dist/codemirror/interaction/clickModel.d.ts +43 -0
  180. package/dist/codemirror/interaction/clickModel.js +99 -0
  181. package/dist/codemirror/interaction/clickModel.js.map +1 -0
  182. package/dist/codemirror/interaction/cursorModel.d.ts +10 -0
  183. package/dist/codemirror/interaction/cursorModel.js +58 -0
  184. package/dist/codemirror/interaction/cursorModel.js.map +1 -0
  185. package/dist/codemirror/interaction/deleteNormalizer.d.ts +18 -0
  186. package/dist/codemirror/interaction/deleteNormalizer.js +157 -0
  187. package/dist/codemirror/interaction/deleteNormalizer.js.map +1 -0
  188. package/dist/codemirror/interaction/flankingGuard.d.ts +20 -0
  189. package/dist/codemirror/interaction/flankingGuard.js +48 -0
  190. package/dist/codemirror/interaction/flankingGuard.js.map +1 -0
  191. package/dist/codemirror/interaction/index.d.ts +7 -0
  192. package/dist/codemirror/interaction/index.js +6 -0
  193. package/dist/codemirror/interaction/index.js.map +1 -0
  194. package/dist/codemirror/interaction/visiblePosition.d.ts +43 -0
  195. package/dist/codemirror/interaction/visiblePosition.js +98 -0
  196. package/dist/codemirror/interaction/visiblePosition.js.map +1 -0
  197. package/dist/codemirror/list/bulletWidget.d.ts +61 -0
  198. package/dist/codemirror/list/bulletWidget.js +84 -0
  199. package/dist/codemirror/list/bulletWidget.js.map +1 -0
  200. package/dist/codemirror/list/index.d.ts +4 -0
  201. package/dist/codemirror/list/index.js +3 -0
  202. package/dist/codemirror/list/index.js.map +1 -0
  203. package/dist/codemirror/list/listContinuation.d.ts +28 -0
  204. package/dist/codemirror/list/listContinuation.js +61 -0
  205. package/dist/codemirror/list/listContinuation.js.map +1 -0
  206. package/dist/codemirror/list/listIndent.d.ts +8 -0
  207. package/dist/codemirror/list/listIndent.js +95 -0
  208. package/dist/codemirror/list/listIndent.js.map +1 -0
  209. package/dist/codemirror/list/taskCheckboxWidget.d.ts +42 -0
  210. package/dist/codemirror/list/taskCheckboxWidget.js +47 -0
  211. package/dist/codemirror/list/taskCheckboxWidget.js.map +1 -0
  212. package/dist/codemirror/math/index.d.ts +3 -0
  213. package/dist/codemirror/math/index.js +2 -0
  214. package/dist/codemirror/math/index.js.map +1 -0
  215. package/dist/codemirror/math/mathPlugin.d.ts +10 -0
  216. package/dist/codemirror/math/mathPlugin.js +73 -0
  217. package/dist/codemirror/math/mathPlugin.js.map +1 -0
  218. package/dist/codemirror/math/mathScanRule.d.ts +16 -0
  219. package/dist/codemirror/math/mathScanRule.js +18 -0
  220. package/dist/codemirror/math/mathScanRule.js.map +1 -0
  221. package/dist/codemirror/math/mathWidget.d.ts +15 -0
  222. package/dist/codemirror/math/mathWidget.js +36 -0
  223. package/dist/codemirror/math/mathWidget.js.map +1 -0
  224. package/dist/codemirror/mermaid/index.d.ts +4 -0
  225. package/dist/codemirror/mermaid/index.js +3 -0
  226. package/dist/codemirror/mermaid/index.js.map +1 -0
  227. package/dist/codemirror/mermaid/mermaidPlugin.d.ts +25 -0
  228. package/dist/codemirror/mermaid/mermaidPlugin.js +78 -0
  229. package/dist/codemirror/mermaid/mermaidPlugin.js.map +1 -0
  230. package/dist/codemirror/mermaid/mermaidRender.d.ts +42 -0
  231. package/dist/codemirror/mermaid/mermaidRender.js +136 -0
  232. package/dist/codemirror/mermaid/mermaidRender.js.map +1 -0
  233. package/dist/codemirror/mermaid/mermaidWidget.d.ts +42 -0
  234. package/dist/codemirror/mermaid/mermaidWidget.js +142 -0
  235. package/dist/codemirror/mermaid/mermaidWidget.js.map +1 -0
  236. package/dist/codemirror/selectionLayer.d.ts +43 -0
  237. package/dist/codemirror/selectionLayer.js +135 -0
  238. package/dist/codemirror/selectionLayer.js.map +1 -0
  239. package/dist/codemirror/table/cellDividerWidget.d.ts +9 -0
  240. package/dist/codemirror/table/cellDividerWidget.js +19 -0
  241. package/dist/codemirror/table/cellDividerWidget.js.map +1 -0
  242. package/dist/codemirror/table/index.d.ts +5 -0
  243. package/dist/codemirror/table/index.js +4 -0
  244. package/dist/codemirror/table/index.js.map +1 -0
  245. package/dist/codemirror/table/tableArmed.d.ts +27 -0
  246. package/dist/codemirror/table/tableArmed.js +43 -0
  247. package/dist/codemirror/table/tableArmed.js.map +1 -0
  248. package/dist/codemirror/table/tableCell.d.ts +19 -0
  249. package/dist/codemirror/table/tableCell.js +15 -0
  250. package/dist/codemirror/table/tableCell.js.map +1 -0
  251. package/dist/codemirror/table/tableCellNav.d.ts +51 -0
  252. package/dist/codemirror/table/tableCellNav.js +47 -0
  253. package/dist/codemirror/table/tableCellNav.js.map +1 -0
  254. package/dist/codemirror/table/tableContextMenu.d.ts +22 -0
  255. package/dist/codemirror/table/tableContextMenu.js +139 -0
  256. package/dist/codemirror/table/tableContextMenu.js.map +1 -0
  257. package/dist/codemirror/table/tableEditCommands.d.ts +29 -0
  258. package/dist/codemirror/table/tableEditCommands.js +86 -0
  259. package/dist/codemirror/table/tableEditCommands.js.map +1 -0
  260. package/dist/codemirror/table/tableExcerpt.d.ts +29 -0
  261. package/dist/codemirror/table/tableExcerpt.js +34 -0
  262. package/dist/codemirror/table/tableExcerpt.js.map +1 -0
  263. package/dist/codemirror/table/tableField.d.ts +6 -0
  264. package/dist/codemirror/table/tableField.js +37 -0
  265. package/dist/codemirror/table/tableField.js.map +1 -0
  266. package/dist/codemirror/table/tableGeometry.d.ts +33 -0
  267. package/dist/codemirror/table/tableGeometry.js +28 -0
  268. package/dist/codemirror/table/tableGeometry.js.map +1 -0
  269. package/dist/codemirror/table/tableInline.d.ts +37 -0
  270. package/dist/codemirror/table/tableInline.js +105 -0
  271. package/dist/codemirror/table/tableInline.js.map +1 -0
  272. package/dist/codemirror/table/tableModel.d.ts +45 -0
  273. package/dist/codemirror/table/tableModel.js +98 -0
  274. package/dist/codemirror/table/tableModel.js.map +1 -0
  275. package/dist/codemirror/tablev2/bridgeRules.d.ts +48 -0
  276. package/dist/codemirror/tablev2/bridgeRules.js +42 -0
  277. package/dist/codemirror/tablev2/bridgeRules.js.map +1 -0
  278. package/dist/codemirror/tablev2/cellEditingSurface.d.ts +79 -0
  279. package/dist/codemirror/tablev2/cellEditingSurface.js +70 -0
  280. package/dist/codemirror/tablev2/cellEditingSurface.js.map +1 -0
  281. package/dist/codemirror/tablev2/cellText.d.ts +11 -0
  282. package/dist/codemirror/tablev2/cellText.js +12 -0
  283. package/dist/codemirror/tablev2/cellText.js.map +1 -0
  284. package/dist/codemirror/tablev2/inlineCellSurface.d.ts +38 -0
  285. package/dist/codemirror/tablev2/inlineCellSurface.js +162 -0
  286. package/dist/codemirror/tablev2/inlineCellSurface.js.map +1 -0
  287. package/dist/codemirror/tablev2/overlayCellSurface.d.ts +36 -0
  288. package/dist/codemirror/tablev2/overlayCellSurface.js +150 -0
  289. package/dist/codemirror/tablev2/overlayCellSurface.js.map +1 -0
  290. package/dist/codemirror/tablev2/tableEditingSteps.d.ts +12 -0
  291. package/dist/codemirror/tablev2/tableEditingSteps.js +518 -0
  292. package/dist/codemirror/tablev2/tableEditingSteps.js.map +1 -0
  293. package/dist/codemirror/tablev2/tableV2HoverControls.d.ts +23 -0
  294. package/dist/codemirror/tablev2/tableV2HoverControls.js +89 -0
  295. package/dist/codemirror/tablev2/tableV2HoverControls.js.map +1 -0
  296. package/dist/codemirror/tablev2/tableV2Interaction.d.ts +29 -0
  297. package/dist/codemirror/tablev2/tableV2Interaction.js +224 -0
  298. package/dist/codemirror/tablev2/tableV2Interaction.js.map +1 -0
  299. package/dist/codemirror/tablev2/tableV2Selection.d.ts +45 -0
  300. package/dist/codemirror/tablev2/tableV2Selection.js +81 -0
  301. package/dist/codemirror/tablev2/tableV2Selection.js.map +1 -0
  302. package/dist/codemirror/tablev2/tableV2Sync.d.ts +13 -0
  303. package/dist/codemirror/tablev2/tableV2Sync.js +13 -0
  304. package/dist/codemirror/tablev2/tableV2Sync.js.map +1 -0
  305. package/dist/codemirror/tablev2/tableWidgetV2.d.ts +46 -0
  306. package/dist/codemirror/tablev2/tableWidgetV2.js +139 -0
  307. package/dist/codemirror/tablev2/tableWidgetV2.js.map +1 -0
  308. package/dist/codemirror/updateBus.d.ts +29 -0
  309. package/dist/codemirror/updateBus.js +26 -0
  310. package/dist/codemirror/updateBus.js.map +1 -0
  311. package/dist/codemirror/wikilink/index.d.ts +3 -0
  312. package/dist/codemirror/wikilink/index.js +2 -0
  313. package/dist/codemirror/wikilink/index.js.map +1 -0
  314. package/dist/codemirror/wikilink/wikilinkPlugin.d.ts +40 -0
  315. package/dist/codemirror/wikilink/wikilinkPlugin.js +89 -0
  316. package/dist/codemirror/wikilink/wikilinkPlugin.js.map +1 -0
  317. package/dist/codemirror/wikilink/wikilinkScanRule.d.ts +9 -0
  318. package/dist/codemirror/wikilink/wikilinkScanRule.js +13 -0
  319. package/dist/codemirror/wikilink/wikilinkScanRule.js.map +1 -0
  320. package/dist/frontmatter.d.ts +79 -0
  321. package/dist/frontmatter.js +58 -0
  322. package/dist/frontmatter.js.map +1 -0
  323. package/dist/imageInsert.d.ts +66 -0
  324. package/dist/imageInsert.js +111 -0
  325. package/dist/imageInsert.js.map +1 -0
  326. package/dist/imageSrcResolver.d.ts +55 -0
  327. package/dist/imageSrcResolver.js +49 -0
  328. package/dist/imageSrcResolver.js.map +1 -0
  329. package/dist/index.d.ts +35 -880
  330. package/dist/index.js +128 -5996
  331. package/dist/index.js.map +1 -1
  332. package/dist/links/wikilink.d.ts +26 -0
  333. package/dist/links/wikilink.js +54 -0
  334. package/dist/links/wikilink.js.map +1 -0
  335. package/dist/links/workspaceLink.d.ts +34 -0
  336. package/dist/links/workspaceLink.js +60 -0
  337. package/dist/links/workspaceLink.js.map +1 -0
  338. package/dist/types.d.ts +20 -0
  339. package/dist/types.js +1 -0
  340. package/dist/types.js.map +1 -0
  341. package/package.json +7 -3
@@ -0,0 +1,10 @@
1
+ import { ViewPlugin, DecorationSet, ViewUpdate } from '@codemirror/view';
2
+
3
+ declare const FOOTNOTE_REF_RE: RegExp;
4
+ declare const footnotePlugin: ViewPlugin<{
5
+ decorations: DecorationSet;
6
+ atomic: DecorationSet;
7
+ update(update: ViewUpdate): void;
8
+ }, undefined>;
9
+
10
+ export { FOOTNOTE_REF_RE, footnotePlugin };
@@ -0,0 +1,78 @@
1
+ import {
2
+ __publicField
3
+ } from "../../chunk-V6TY7KAL.js";
4
+ import {
5
+ Decoration,
6
+ EditorView,
7
+ ViewPlugin
8
+ } from "@codemirror/view";
9
+ import { inCode, viewportTree } from "../core/codeContext.js";
10
+ const FOOTNOTE_REF_RE = /(?<!\])\[\^([^\]\s]+)\](?!:)/g;
11
+ const FOOTNOTE_DEF_LINE_RE = /^\[\^([^\]\s]+)\]:\s/;
12
+ const refLabelMark = Decoration.mark({ class: "cm-footnote-ref" });
13
+ const refHide = Decoration.replace({});
14
+ const defLineDeco = Decoration.line({ class: "cm-footnote-def" });
15
+ function buildDecorations(view) {
16
+ const lineDecs = [];
17
+ const markDecs = [];
18
+ const atomic = [];
19
+ const tree = viewportTree(view);
20
+ for (const { from, to } of view.visibleRanges) {
21
+ let lineNum = view.state.doc.lineAt(from).number;
22
+ const lastLineNum = view.state.doc.lineAt(to).number;
23
+ while (lineNum <= lastLineNum) {
24
+ const line = view.state.doc.line(lineNum);
25
+ if (FOOTNOTE_DEF_LINE_RE.test(line.text) && !inCode(tree, line.from)) {
26
+ lineDecs.push(defLineDeco.range(line.from));
27
+ } else {
28
+ FOOTNOTE_REF_RE.lastIndex = 0;
29
+ let m;
30
+ while ((m = FOOTNOTE_REF_RE.exec(line.text)) !== null) {
31
+ const matchStart = line.from + m.index;
32
+ const matchEnd = matchStart + m[0].length;
33
+ if (inCode(tree, matchStart) || inCode(tree, matchEnd - 1)) continue;
34
+ const labelStart = matchStart + 2;
35
+ const labelEnd = matchEnd - 1;
36
+ if (labelEnd <= labelStart) continue;
37
+ markDecs.push(refHide.range(matchStart, labelStart));
38
+ atomic.push(refHide.range(matchStart, labelStart));
39
+ markDecs.push(refLabelMark.range(labelStart, labelEnd));
40
+ markDecs.push(refHide.range(labelEnd, matchEnd));
41
+ atomic.push(refHide.range(labelEnd, matchEnd));
42
+ }
43
+ }
44
+ lineNum += 1;
45
+ }
46
+ }
47
+ return {
48
+ decorations: Decoration.set(lineDecs.concat(markDecs), true),
49
+ atomic: Decoration.set(atomic, true)
50
+ };
51
+ }
52
+ const footnotePlugin = ViewPlugin.fromClass(
53
+ class {
54
+ constructor(view) {
55
+ __publicField(this, "decorations");
56
+ __publicField(this, "atomic");
57
+ const built = buildDecorations(view);
58
+ this.decorations = built.decorations;
59
+ this.atomic = built.atomic;
60
+ }
61
+ update(update) {
62
+ if (update.docChanged || update.viewportChanged) {
63
+ const built = buildDecorations(update.view);
64
+ this.decorations = built.decorations;
65
+ this.atomic = built.atomic;
66
+ }
67
+ }
68
+ },
69
+ {
70
+ decorations: (v) => v.decorations,
71
+ provide: (plugin) => EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomic ?? Decoration.none)
72
+ }
73
+ );
74
+ export {
75
+ FOOTNOTE_REF_RE,
76
+ footnotePlugin
77
+ };
78
+ //# sourceMappingURL=footnotePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/footnote/footnotePlugin.ts"],"sourcesContent":["import { type Range } from \"@codemirror/state\";\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type PluginValue,\n type ViewUpdate,\n} from \"@codemirror/view\";\n\nimport { inCode, viewportTree } from \"../core/codeContext\";\n\nexport const FOOTNOTE_REF_RE = /(?<!\\])\\[\\^([^\\]\\s]+)\\](?!:)/g;\nconst FOOTNOTE_DEF_LINE_RE = /^\\[\\^([^\\]\\s]+)\\]:\\s/;\n\nconst refLabelMark = Decoration.mark({ class: \"cm-footnote-ref\" });\nconst refHide = Decoration.replace({});\nconst defLineDeco = Decoration.line({ class: \"cm-footnote-def\" });\n\nfunction buildDecorations(view: EditorView): { decorations: DecorationSet; atomic: DecorationSet } {\n const lineDecs: Range<Decoration>[] = [];\n const markDecs: Range<Decoration>[] = [];\n const atomic: Range<Decoration>[] = [];\n const tree = viewportTree(view);\n\n for (const { from, to } of view.visibleRanges) {\n let lineNum = view.state.doc.lineAt(from).number;\n const lastLineNum = view.state.doc.lineAt(to).number;\n while (lineNum <= lastLineNum) {\n const line = view.state.doc.line(lineNum);\n\n if (FOOTNOTE_DEF_LINE_RE.test(line.text) && !inCode(tree, line.from)) {\n lineDecs.push(defLineDeco.range(line.from));\n } else {\n FOOTNOTE_REF_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = FOOTNOTE_REF_RE.exec(line.text)) !== null) {\n const matchStart = line.from + m.index;\n const matchEnd = matchStart + m[0].length;\n if (inCode(tree, matchStart) || inCode(tree, matchEnd - 1)) continue;\n const labelStart = matchStart + 2;\n const labelEnd = matchEnd - 1;\n if (labelEnd <= labelStart) continue;\n\n markDecs.push(refHide.range(matchStart, labelStart));\n atomic.push(refHide.range(matchStart, labelStart));\n markDecs.push(refLabelMark.range(labelStart, labelEnd));\n markDecs.push(refHide.range(labelEnd, matchEnd));\n atomic.push(refHide.range(labelEnd, matchEnd));\n }\n }\n\n lineNum += 1;\n }\n }\n\n return {\n decorations: Decoration.set(lineDecs.concat(markDecs), true),\n atomic: Decoration.set(atomic, true),\n };\n}\n\nexport const footnotePlugin = ViewPlugin.fromClass(\n class implements PluginValue {\n decorations: DecorationSet;\n atomic: DecorationSet;\n constructor(view: EditorView) {\n const built = buildDecorations(view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n const built = buildDecorations(update.view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n }\n },\n {\n decorations: (v) => v.decorations,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomic ?? Decoration.none),\n },\n);\n"],"mappings":";;;AACA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OAGK;AAEP,SAAS,QAAQ,oBAAoB;AAE9B,MAAM,kBAAkB;AAC/B,MAAM,uBAAuB;AAE7B,MAAM,eAAe,WAAW,KAAK,EAAE,OAAO,kBAAkB,CAAC;AACjE,MAAM,UAAU,WAAW,QAAQ,CAAC,CAAC;AACrC,MAAM,cAAc,WAAW,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAEhE,SAAS,iBAAiB,MAAyE;AACjG,QAAM,WAAgC,CAAC;AACvC,QAAM,WAAgC,CAAC;AACvC,QAAM,SAA8B,CAAC;AACrC,QAAM,OAAO,aAAa,IAAI;AAE9B,aAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,QAAI,UAAU,KAAK,MAAM,IAAI,OAAO,IAAI,EAAE;AAC1C,UAAM,cAAc,KAAK,MAAM,IAAI,OAAO,EAAE,EAAE;AAC9C,WAAO,WAAW,aAAa;AAC7B,YAAM,OAAO,KAAK,MAAM,IAAI,KAAK,OAAO;AAExC,UAAI,qBAAqB,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,MAAM,KAAK,IAAI,GAAG;AACpE,iBAAS,KAAK,YAAY,MAAM,KAAK,IAAI,CAAC;AAAA,MAC5C,OAAO;AACL,wBAAgB,YAAY;AAC5B,YAAI;AACJ,gBAAQ,IAAI,gBAAgB,KAAK,KAAK,IAAI,OAAO,MAAM;AACrD,gBAAM,aAAa,KAAK,OAAO,EAAE;AACjC,gBAAM,WAAW,aAAa,EAAE,CAAC,EAAE;AACnC,cAAI,OAAO,MAAM,UAAU,KAAK,OAAO,MAAM,WAAW,CAAC,EAAG;AAC5D,gBAAM,aAAa,aAAa;AAChC,gBAAM,WAAW,WAAW;AAC5B,cAAI,YAAY,WAAY;AAE5B,mBAAS,KAAK,QAAQ,MAAM,YAAY,UAAU,CAAC;AACnD,iBAAO,KAAK,QAAQ,MAAM,YAAY,UAAU,CAAC;AACjD,mBAAS,KAAK,aAAa,MAAM,YAAY,QAAQ,CAAC;AACtD,mBAAS,KAAK,QAAQ,MAAM,UAAU,QAAQ,CAAC;AAC/C,iBAAO,KAAK,QAAQ,MAAM,UAAU,QAAQ,CAAC;AAAA,QAC/C;AAAA,MACF;AAEA,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,WAAW,IAAI,SAAS,OAAO,QAAQ,GAAG,IAAI;AAAA,IAC3D,QAAQ,WAAW,IAAI,QAAQ,IAAI;AAAA,EACrC;AACF;AAEO,MAAM,iBAAiB,WAAW;AAAA,EACvC,MAA6B;AAAA,IAG3B,YAAY,MAAkB;AAF9B;AACA;AAEE,YAAM,QAAQ,iBAAiB,IAAI;AACnC,WAAK,cAAc,MAAM;AACzB,WAAK,SAAS,MAAM;AAAA,IACtB;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,cAAM,QAAQ,iBAAiB,OAAO,IAAI;AAC1C,aAAK,cAAc,MAAM;AACzB,aAAK,SAAS,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,CAAC,MAAM,EAAE;AAAA,IACtB,SAAS,CAAC,WACR,WAAW,aAAa,GAAG,CAAC,SAAS,KAAK,OAAO,MAAM,GAAG,UAAU,WAAW,IAAI;AAAA,EACvF;AACF;","names":[]}
@@ -0,0 +1,9 @@
1
+ import { InlineScanRule } from '../core/inlineScan.js';
2
+ import '@codemirror/state';
3
+
4
+ /** `[^1]` for the string renderers — the marker without its brackets, as the
5
+ * editor draws it. */
6
+
7
+ declare const footnoteScanRule: InlineScanRule;
8
+
9
+ export { footnoteScanRule };
@@ -0,0 +1,12 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { escapeText } from "../core/htmlEscape.js";
3
+ import { FOOTNOTE_REF_RE } from "./footnotePlugin.js";
4
+ const footnoteScanRule = {
5
+ name: "footnote",
6
+ pattern: FOOTNOTE_REF_RE,
7
+ render: (match) => `<span class="cm-footnote-ref">${escapeText(match[1] ?? "")}</span>`
8
+ };
9
+ export {
10
+ footnoteScanRule
11
+ };
12
+ //# sourceMappingURL=footnoteScanRule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/footnote/footnoteScanRule.ts"],"sourcesContent":["/** `[^1]` for the string renderers — the marker without its brackets, as the\n * editor draws it. */\n\nimport { escapeText } from \"../core/htmlEscape\";\nimport { type InlineScanRule } from \"../core/inlineScan\";\nimport { FOOTNOTE_REF_RE } from \"./footnotePlugin\";\n\nexport const footnoteScanRule: InlineScanRule = {\n name: \"footnote\",\n pattern: FOOTNOTE_REF_RE,\n render: (match) => `<span class=\"cm-footnote-ref\">${escapeText(match[1] ?? \"\")}</span>`,\n};\n"],"mappings":";AAGA,SAAS,kBAAkB;AAE3B,SAAS,uBAAuB;AAEzB,MAAM,mBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ,CAAC,UAAU,iCAAiC,WAAW,MAAM,CAAC,KAAK,EAAE,CAAC;AAChF;","names":[]}
@@ -0,0 +1,2 @@
1
+ export { FOOTNOTE_REF_RE, footnotePlugin } from './footnotePlugin.js';
2
+ import '@codemirror/view';
@@ -0,0 +1,2 @@
1
+ export * from "./footnotePlugin.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/footnote/index.ts"],"sourcesContent":["/** Footnotes: `[^ref]` references and definition blocks. */\nexport * from \"./footnotePlugin\";\n"],"mappings":"AACA,cAAc;","names":[]}
@@ -0,0 +1,17 @@
1
+ import * as _codemirror_state from '@codemirror/state';
2
+ import { Command } from '@codemirror/view';
3
+
4
+ declare const blockCommands: {
5
+ toggleHeading1: Command;
6
+ toggleHeading2: Command;
7
+ toggleHeading3: Command;
8
+ toggleBulletList: Command;
9
+ toggleOrderedList: Command;
10
+ toggleTaskList: Command;
11
+ toggleBlockquote: Command;
12
+ toggleCodeBlock: Command;
13
+ insertTable: Command;
14
+ };
15
+ declare const blockCommandsKeymap: _codemirror_state.Extension;
16
+
17
+ export { blockCommands, blockCommandsKeymap };
@@ -0,0 +1,176 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { EditorSelection, Prec } from "@codemirror/state";
3
+ import { keymap } from "@codemirror/view";
4
+ import { lineStructure } from "../core/lineStructure.js";
5
+ function eachLineInSelection(view) {
6
+ const lines = [];
7
+ const seen = /* @__PURE__ */ new Set();
8
+ for (const range of view.state.selection.ranges) {
9
+ let pos = range.from;
10
+ while (pos <= range.to) {
11
+ const line = view.state.doc.lineAt(pos);
12
+ if (!seen.has(line.number)) {
13
+ seen.add(line.number);
14
+ lines.push(line);
15
+ }
16
+ if (line.to >= range.to) break;
17
+ pos = line.to + 1;
18
+ }
19
+ }
20
+ return lines;
21
+ }
22
+ function dispatchLineChanges(view, changes, userEvent) {
23
+ if (changes.length === 0) return true;
24
+ const changeSet = view.state.changes(changes);
25
+ view.dispatch({ changes: changeSet, selection: view.state.selection.map(changeSet, 1), userEvent });
26
+ return true;
27
+ }
28
+ function structuredLines(view) {
29
+ return eachLineInSelection(view).map((line) => ({ line, info: lineStructure(view.state, line) })).filter(({ info }) => !info.inCode);
30
+ }
31
+ function swapLineMarker({ info }, marker) {
32
+ const existing = info.heading ?? info.list;
33
+ return existing ? { from: existing.markFrom, to: existing.markTo, insert: marker } : { from: info.contentFrom, insert: marker };
34
+ }
35
+ function makeToggleHeading(level) {
36
+ const marker = `${"#".repeat(level)} `;
37
+ return (view) => {
38
+ const changes = [];
39
+ for (const entry of structuredLines(view)) {
40
+ const { info } = entry;
41
+ if (info.heading && info.heading.level === level) {
42
+ changes.push({ from: info.heading.markFrom, to: info.heading.markTo, insert: "" });
43
+ } else {
44
+ changes.push(swapLineMarker(entry, marker));
45
+ }
46
+ }
47
+ return dispatchLineChanges(view, changes, "input.format.heading");
48
+ };
49
+ }
50
+ const toggleBulletList = (view) => {
51
+ const entries = structuredLines(view);
52
+ const allBullets = entries.length > 0 && entries.every(({ info }) => info.list?.kind === "bullet");
53
+ const changes = [];
54
+ for (const entry of entries) {
55
+ const { info } = entry;
56
+ if (allBullets) {
57
+ changes.push({ from: info.list.markFrom, to: info.list.markTo, insert: "" });
58
+ } else if (info.list?.kind !== "bullet") {
59
+ changes.push(swapLineMarker(entry, "- "));
60
+ }
61
+ }
62
+ return dispatchLineChanges(view, changes, "input.format.list");
63
+ };
64
+ const toggleOrderedList = (view) => {
65
+ const entries = structuredLines(view);
66
+ const allOrdered = entries.length > 0 && entries.every(({ info }) => info.list?.kind === "ordered");
67
+ const changes = [];
68
+ let counter = 0;
69
+ for (const entry of entries) {
70
+ const { info } = entry;
71
+ if (allOrdered) {
72
+ changes.push({ from: info.list.markFrom, to: info.list.markTo, insert: "" });
73
+ } else {
74
+ counter += 1;
75
+ changes.push(swapLineMarker(entry, `${counter}. `));
76
+ }
77
+ }
78
+ return dispatchLineChanges(view, changes, "input.format.list");
79
+ };
80
+ const toggleTaskList = (view) => {
81
+ const entries = structuredLines(view);
82
+ const allTasks = entries.length > 0 && entries.every(({ info }) => info.list?.task);
83
+ const changes = [];
84
+ for (const entry of entries) {
85
+ const { info } = entry;
86
+ if (allTasks) {
87
+ changes.push({ from: info.list.markFrom, to: info.list.markTo, insert: "" });
88
+ } else if (!info.list?.task) {
89
+ changes.push(swapLineMarker(entry, "- [ ] "));
90
+ }
91
+ }
92
+ return dispatchLineChanges(view, changes, "input.format.task");
93
+ };
94
+ const toggleBlockquote = (view) => {
95
+ const changes = [];
96
+ for (const { info } of structuredLines(view)) {
97
+ changes.push(
98
+ info.quote ? { from: info.quote.markFrom, to: info.quote.markTo, insert: "" } : { from: info.contentFrom, insert: "> " }
99
+ );
100
+ }
101
+ return dispatchLineChanges(view, changes, "input.format.blockquote");
102
+ };
103
+ const toggleCodeBlock = (view) => {
104
+ const sel = view.state.selection.main;
105
+ const firstLine = view.state.doc.lineAt(sel.from);
106
+ const lastLine = view.state.doc.lineAt(sel.to);
107
+ const above = firstLine.number > 1 ? view.state.doc.line(firstLine.number - 1) : null;
108
+ const below = lastLine.number < view.state.doc.lines ? view.state.doc.line(lastLine.number + 1) : null;
109
+ if (above && /^```/.test(above.text) && below && /^```/.test(below.text)) {
110
+ view.dispatch({
111
+ changes: [
112
+ { from: above.from, to: above.to + 1, insert: "" },
113
+ { from: below.from - 1, to: below.to, insert: "" }
114
+ ],
115
+ userEvent: "input.format.code-block"
116
+ });
117
+ return true;
118
+ }
119
+ const inner = view.state.sliceDoc(firstLine.from, lastLine.to);
120
+ const longestRun = (inner.match(/`+/g) ?? []).reduce((max, run) => Math.max(max, run.length), 0);
121
+ const fence = "`".repeat(Math.max(3, longestRun + 1));
122
+ view.dispatch({
123
+ changes: [
124
+ { from: firstLine.from, insert: `${fence}
125
+ ` },
126
+ { from: lastLine.to, insert: `
127
+ ${fence}` }
128
+ ],
129
+ selection: EditorSelection.cursor(firstLine.from + fence.length + 1),
130
+ userEvent: "input.format.code-block"
131
+ });
132
+ return true;
133
+ };
134
+ const TABLE_SKELETON = "| Header | Header |\n| --- | --- |\n| Cell | Cell |";
135
+ const FIRST_CELL_OFFSET = 2;
136
+ const insertTable = (view) => {
137
+ const sel = view.state.selection.main;
138
+ const line = view.state.doc.lineAt(sel.from);
139
+ const onBlankLine = line.text.trim().length === 0;
140
+ const prefix = onBlankLine ? "" : "\n\n";
141
+ const from = onBlankLine ? line.from : line.to;
142
+ const to = line.to;
143
+ const caret = from + prefix.length + FIRST_CELL_OFFSET;
144
+ view.dispatch({
145
+ changes: { from, to, insert: `${prefix}${TABLE_SKELETON}` },
146
+ selection: EditorSelection.range(caret, caret + "Header".length),
147
+ userEvent: "input.format.table"
148
+ });
149
+ return true;
150
+ };
151
+ const blockCommands = {
152
+ toggleHeading1: makeToggleHeading(1),
153
+ toggleHeading2: makeToggleHeading(2),
154
+ toggleHeading3: makeToggleHeading(3),
155
+ toggleBulletList,
156
+ toggleOrderedList,
157
+ toggleTaskList,
158
+ toggleBlockquote,
159
+ toggleCodeBlock,
160
+ insertTable
161
+ };
162
+ const blockCommandsKeymap = Prec.high(
163
+ keymap.of([
164
+ { key: "Mod-1", run: blockCommands.toggleHeading1 },
165
+ { key: "Mod-2", run: blockCommands.toggleHeading2 },
166
+ { key: "Mod-3", run: blockCommands.toggleHeading3 },
167
+ { key: "Mod-Shift-7", run: blockCommands.toggleOrderedList },
168
+ { key: "Mod-Shift-8", run: blockCommands.toggleBulletList },
169
+ { key: "Mod-Shift-9", run: blockCommands.toggleBlockquote }
170
+ ])
171
+ );
172
+ export {
173
+ blockCommands,
174
+ blockCommandsKeymap
175
+ };
176
+ //# sourceMappingURL=blockCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/format/blockCommands.ts"],"sourcesContent":["/**\n * Block-level commands — heading levels, bullet/ordered list, blockquote.\n *\n * Each command operates on the current line at the caret. Toggle\n * semantics: applying H2 to a line that's already H2 removes the\n * heading; applying H2 to a line that's H1 swaps the marker.\n *\n * These commands edit the **markdown source** at the line start.\n * Lezer reparses, decorations recompute, the heading / list / quote\n * appears rendered. No special rendering pipeline — the markers go\n * through the same hide-always treatment as user-typed markdown.\n *\n * Selection-aware: if a non-empty selection spans multiple lines,\n * the operation applies to every line. (Useful for bullet/quote.)\n */\n\nimport { EditorSelection, type ChangeSpec, type Line, Prec } from \"@codemirror/state\";\nimport { type Command, EditorView, keymap } from \"@codemirror/view\";\n\nimport { lineStructure, type LineStructure } from \"../core/lineStructure\";\n\nfunction eachLineInSelection(view: EditorView): Line[] {\n const lines: Line[] = [];\n const seen = new Set<number>();\n for (const range of view.state.selection.ranges) {\n let pos = range.from;\n while (pos <= range.to) {\n const line = view.state.doc.lineAt(pos);\n if (!seen.has(line.number)) {\n seen.add(line.number);\n lines.push(line);\n }\n if (line.to >= range.to) break;\n pos = line.to + 1;\n }\n }\n return lines;\n}\n\nfunction dispatchLineChanges(view: EditorView, changes: ChangeSpec[], userEvent: string): boolean {\n if (changes.length === 0) return true;\n const changeSet = view.state.changes(changes);\n // Map the selection with assoc +1 so the caret rides forward over a prepended\n // marker, staying with the user's text rather than stranding before it.\n view.dispatch({ changes: changeSet, selection: view.state.selection.map(changeSet, 1), userEvent });\n return true;\n}\n\n// Heading, bullet, and ordered are mutually-exclusive line types: setting one\n// replaces any other already on the line (so `- x` → heading is `## x`, not\n// `## - x`). Blockquote and code are containers — they compose — so they're not\n// part of this set. Line classification comes from the SYNTAX TREE\n// (lineStructure, #61): a `- x` inside a code fence is code, not a bullet, and\n// a nested ` - x` is a bullet even though its marker isn't at column 0.\n\n/** The selected lines the structure commands may touch, each with what the\n * grammar says it is. Code lines are excluded wholesale — a formatting toolbar\n * must never rewrite code. */\nfunction structuredLines(view: EditorView): { line: Line; info: LineStructure }[] {\n return eachLineInSelection(view)\n .map((line) => ({ line, info: lineStructure(view.state, line) }))\n .filter(({ info }) => !info.inCode);\n}\n\n/** Replace this line's current type marker (heading or list, whichever the\n * tree found) with `marker`, or insert `marker` at the content start — so\n * nested/indented lines keep their indentation. */\nfunction swapLineMarker({ info }: { info: LineStructure }, marker: string): ChangeSpec {\n const existing = info.heading ?? info.list;\n return existing\n ? { from: existing.markFrom, to: existing.markTo, insert: marker }\n : { from: info.contentFrom, insert: marker };\n}\n\n/* -------- Heading -------- */\n\nfunction makeToggleHeading(level: 1 | 2 | 3 | 4 | 5 | 6): Command {\n const marker = `${\"#\".repeat(level)} `;\n return (view) => {\n const changes: ChangeSpec[] = [];\n for (const entry of structuredLines(view)) {\n const { info } = entry;\n if (info.heading && info.heading.level === level) {\n // Already this level → back to a paragraph.\n changes.push({ from: info.heading.markFrom, to: info.heading.markTo, insert: \"\" });\n } else {\n changes.push(swapLineMarker(entry, marker));\n }\n }\n return dispatchLineChanges(view, changes, \"input.format.heading\");\n };\n}\n\n/* -------- Bullet list -------- */\n\n// All-or-nothing toggle: strip the list only when *every* selected line is\n// already a bullet, otherwise make them all bullets (converting ordered items\n// and leaving existing bullets be). A per-line toggle would make a mixed\n// selection more inconsistent — un-bulleting some lines while bulleting others.\nconst toggleBulletList: Command = (view) => {\n const entries = structuredLines(view);\n const allBullets =\n entries.length > 0 && entries.every(({ info }) => info.list?.kind === \"bullet\");\n const changes: ChangeSpec[] = [];\n for (const entry of entries) {\n const { info } = entry;\n if (allBullets) {\n changes.push({ from: info.list!.markFrom, to: info.list!.markTo, insert: \"\" });\n } else if (info.list?.kind !== \"bullet\") {\n changes.push(swapLineMarker(entry, \"- \"));\n }\n }\n return dispatchLineChanges(view, changes, \"input.format.list\");\n};\n\n/* -------- Ordered list -------- */\n\n// All-or-nothing toggle (see bullets). When making the selection ordered, every\n// line is (re)numbered from 1 so a mixed or mis-numbered selection comes out\n// sequential.\nconst toggleOrderedList: Command = (view) => {\n const entries = structuredLines(view);\n const allOrdered =\n entries.length > 0 && entries.every(({ info }) => info.list?.kind === \"ordered\");\n const changes: ChangeSpec[] = [];\n let counter = 0;\n for (const entry of entries) {\n const { info } = entry;\n if (allOrdered) {\n changes.push({ from: info.list!.markFrom, to: info.list!.markTo, insert: \"\" });\n } else {\n counter += 1;\n changes.push(swapLineMarker(entry, `${counter}. `));\n }\n }\n return dispatchLineChanges(view, changes, \"input.format.list\");\n};\n\n/* -------- Task list -------- */\n\n// All-or-nothing toggle: strip the checkbox prefix only when every selected line\n// is already a task, otherwise make them all tasks (replacing any other line\n// marker; a plain line or other list item gains a `- [ ] `).\nconst toggleTaskList: Command = (view) => {\n const entries = structuredLines(view);\n const allTasks = entries.length > 0 && entries.every(({ info }) => info.list?.task);\n const changes: ChangeSpec[] = [];\n for (const entry of entries) {\n const { info } = entry;\n if (allTasks) {\n changes.push({ from: info.list!.markFrom, to: info.list!.markTo, insert: \"\" });\n } else if (!info.list?.task) {\n changes.push(swapLineMarker(entry, \"- [ ] \"));\n }\n }\n return dispatchLineChanges(view, changes, \"input.format.task\");\n};\n\n/* -------- Blockquote -------- */\n\n// Per-line (not all-or-nothing): quotes are containers, so each line\n// independently gains a level or sheds its outermost one.\nconst toggleBlockquote: Command = (view) => {\n const changes: ChangeSpec[] = [];\n for (const { info } of structuredLines(view)) {\n changes.push(\n info.quote\n ? { from: info.quote.markFrom, to: info.quote.markTo, insert: \"\" }\n : { from: info.contentFrom, insert: \"> \" },\n );\n }\n return dispatchLineChanges(view, changes, \"input.format.blockquote\");\n};\n\n/* -------- Code block (toggle fenced block around selection) -------- */\n\nconst toggleCodeBlock: Command = (view) => {\n const sel = view.state.selection.main;\n // Toggle a fence around the current/selection lines.\n const firstLine = view.state.doc.lineAt(sel.from);\n const lastLine = view.state.doc.lineAt(sel.to);\n // Detect if both fences already exist (line before firstLine starts\n // with ``` and line after lastLine starts with ```).\n const above = firstLine.number > 1 ? view.state.doc.line(firstLine.number - 1) : null;\n const below = lastLine.number < view.state.doc.lines ? view.state.doc.line(lastLine.number + 1) : null;\n if (above && /^```/.test(above.text) && below && /^```/.test(below.text)) {\n // Strip both fences\n view.dispatch({\n changes: [\n { from: above.from, to: above.to + 1, insert: \"\" },\n { from: below.from - 1, to: below.to, insert: \"\" },\n ],\n userEvent: \"input.format.code-block\",\n });\n return true;\n }\n // Wrap selection in fences. The fence must be LONGER than any backtick run\n // inside the wrapped content — wrapping text that itself contains ``` with a\n // ``` fence would close the block early and spill the rest as prose.\n const inner = view.state.sliceDoc(firstLine.from, lastLine.to);\n const longestRun = (inner.match(/`+/g) ?? []).reduce((max, run) => Math.max(max, run.length), 0);\n const fence = \"`\".repeat(Math.max(3, longestRun + 1));\n view.dispatch({\n changes: [\n { from: firstLine.from, insert: `${fence}\\n` },\n { from: lastLine.to, insert: `\\n${fence}` },\n ],\n selection: EditorSelection.cursor(firstLine.from + fence.length + 1),\n userEvent: \"input.format.code-block\",\n });\n return true;\n};\n\n/* -------- Insert table (GFM 2×2 skeleton) -------- */\n\nconst TABLE_SKELETON = \"| Header | Header |\\n| --- | --- |\\n| Cell | Cell |\";\n// Offset from the table's start to the first header cell's content, so the\n// caret lands ready to type the first column header (\"| \" → 2 chars in).\nconst FIRST_CELL_OFFSET = 2;\n\n// GFM requires a blank line before a table for it to parse as one. Insert the\n// skeleton on its own block: in place when the caret sits on a blank line,\n// otherwise pushed below the current line with a separating blank line.\nconst insertTable: Command = (view) => {\n const sel = view.state.selection.main;\n const line = view.state.doc.lineAt(sel.from);\n const onBlankLine = line.text.trim().length === 0;\n\n const prefix = onBlankLine ? \"\" : \"\\n\\n\";\n const from = onBlankLine ? line.from : line.to;\n const to = line.to;\n const caret = from + prefix.length + FIRST_CELL_OFFSET;\n\n view.dispatch({\n changes: { from, to, insert: `${prefix}${TABLE_SKELETON}` },\n selection: EditorSelection.range(caret, caret + \"Header\".length),\n userEvent: \"input.format.table\",\n });\n return true;\n};\n\nexport const blockCommands = {\n toggleHeading1: makeToggleHeading(1),\n toggleHeading2: makeToggleHeading(2),\n toggleHeading3: makeToggleHeading(3),\n toggleBulletList,\n toggleOrderedList,\n toggleTaskList,\n toggleBlockquote,\n toggleCodeBlock,\n insertTable,\n};\n\nexport const blockCommandsKeymap = Prec.high(\n keymap.of([\n { key: \"Mod-1\", run: blockCommands.toggleHeading1 },\n { key: \"Mod-2\", run: blockCommands.toggleHeading2 },\n { key: \"Mod-3\", run: blockCommands.toggleHeading3 },\n { key: \"Mod-Shift-7\", run: blockCommands.toggleOrderedList },\n { key: \"Mod-Shift-8\", run: blockCommands.toggleBulletList },\n { key: \"Mod-Shift-9\", run: blockCommands.toggleBlockquote },\n ]),\n);\n"],"mappings":"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","names":[]}
@@ -0,0 +1,11 @@
1
+ import * as _codemirror_state from '@codemirror/state';
2
+ import { Command } from '@codemirror/view';
3
+
4
+ declare const formatCommands: {
5
+ toggleBold: Command;
6
+ toggleItalic: Command;
7
+ toggleInlineCode: Command;
8
+ };
9
+ declare const formatCommandsKeymap: _codemirror_state.Extension;
10
+
11
+ export { formatCommands, formatCommandsKeymap };
@@ -0,0 +1,132 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { EditorSelection, Prec } from "@codemirror/state";
3
+ import { keymap } from "@codemirror/view";
4
+ import { treeAt } from "../core/treeAt.js";
5
+ const FORMAT_BOLD = {
6
+ markName: "StrongEmphasis",
7
+ opener: "**",
8
+ closer: "**",
9
+ keepEdgeWhitespaceOutside: true
10
+ };
11
+ const FORMAT_ITALIC = {
12
+ markName: "Emphasis",
13
+ opener: "*",
14
+ closer: "*",
15
+ keepEdgeWhitespaceOutside: true
16
+ };
17
+ const FORMAT_CODE = {
18
+ markName: "InlineCode",
19
+ opener: "`",
20
+ closer: "`",
21
+ keepEdgeWhitespaceOutside: false
22
+ };
23
+ function nearestAncestor(view, pos, name) {
24
+ let node = treeAt(view.state, pos).resolveInner(
25
+ pos,
26
+ 1
27
+ );
28
+ while (node) {
29
+ if (node.name === name) return { from: node.from, to: node.to };
30
+ node = node.parent;
31
+ }
32
+ return null;
33
+ }
34
+ function codeSpanWrap(core) {
35
+ const runs = core.match(/`+/g) ?? [];
36
+ const longest = runs.reduce((max, run) => Math.max(max, run.length), 0);
37
+ const fence = "`".repeat(longest + 1);
38
+ const pad = core.startsWith("`") || core.endsWith("`") ? " " : "";
39
+ return { fence, content: pad + core + pad };
40
+ }
41
+ function codeSpanUnwrap(text) {
42
+ const fence = /^`+/.exec(text)?.[0];
43
+ if (!fence || !text.endsWith(fence) || text.length < fence.length * 2) return null;
44
+ let content = text.slice(fence.length, text.length - fence.length);
45
+ if (content.startsWith(" ") && content.endsWith(" ") && content.trim() !== "") {
46
+ content = content.slice(1, -1);
47
+ }
48
+ return content;
49
+ }
50
+ function makeToggleCommand(spec) {
51
+ return (view) => {
52
+ const sel = view.state.selection.main;
53
+ const existing = nearestAncestor(view, sel.head, spec.markName);
54
+ if (existing) {
55
+ const { from, to } = existing;
56
+ const text = view.state.sliceDoc(from, to);
57
+ if (spec.markName === "InlineCode") {
58
+ const content2 = codeSpanUnwrap(text);
59
+ if (content2 !== null) {
60
+ view.dispatch({
61
+ changes: { from, to, insert: content2 },
62
+ selection: sel.empty ? EditorSelection.cursor(
63
+ Math.min(Math.max(from, sel.head - 1), from + content2.length)
64
+ ) : EditorSelection.range(from, from + content2.length),
65
+ userEvent: "input.format.unwrap"
66
+ });
67
+ return true;
68
+ }
69
+ }
70
+ if (text.startsWith(spec.opener) && text.endsWith(spec.closer)) {
71
+ const content2 = text.slice(spec.opener.length, text.length - spec.closer.length);
72
+ const newSelFrom = from;
73
+ const newSelTo = from + content2.length;
74
+ view.dispatch({
75
+ changes: { from, to, insert: content2 },
76
+ selection: sel.empty ? EditorSelection.cursor(Math.max(newSelFrom, sel.head - spec.opener.length)) : EditorSelection.range(newSelFrom, newSelTo),
77
+ userEvent: "input.format.unwrap"
78
+ });
79
+ return true;
80
+ }
81
+ }
82
+ if (sel.empty) {
83
+ const insert = spec.opener + spec.closer;
84
+ view.dispatch({
85
+ changes: { from: sel.head, insert },
86
+ selection: EditorSelection.cursor(sel.head + spec.opener.length),
87
+ userEvent: "input.format.wrap"
88
+ });
89
+ return true;
90
+ }
91
+ const content = view.state.sliceDoc(sel.from, sel.to);
92
+ const leading = spec.keepEdgeWhitespaceOutside ? content.length - content.trimStart().length : 0;
93
+ const trailing = spec.keepEdgeWhitespaceOutside ? content.length - content.trimEnd().length : 0;
94
+ const core = content.slice(leading, content.length - trailing);
95
+ if (!core) {
96
+ return true;
97
+ }
98
+ const wrapFrom = sel.from + leading;
99
+ const wrapTo = sel.to - trailing;
100
+ const { opener, inner } = spec.markName === "InlineCode" ? (() => {
101
+ const { fence, content: padded } = codeSpanWrap(core);
102
+ return { opener: fence, inner: padded };
103
+ })() : { opener: spec.opener, inner: core };
104
+ const wrapped = opener + inner + opener;
105
+ view.dispatch({
106
+ changes: { from: wrapFrom, to: wrapTo, insert: wrapped },
107
+ selection: EditorSelection.range(
108
+ wrapFrom + opener.length,
109
+ wrapFrom + opener.length + inner.length
110
+ ),
111
+ userEvent: "input.format.wrap"
112
+ });
113
+ return true;
114
+ };
115
+ }
116
+ const formatCommands = {
117
+ toggleBold: makeToggleCommand(FORMAT_BOLD),
118
+ toggleItalic: makeToggleCommand(FORMAT_ITALIC),
119
+ toggleInlineCode: makeToggleCommand(FORMAT_CODE)
120
+ };
121
+ const formatCommandsKeymap = Prec.high(
122
+ keymap.of([
123
+ { key: "Mod-b", run: formatCommands.toggleBold },
124
+ { key: "Mod-i", run: formatCommands.toggleItalic },
125
+ { key: "Mod-e", run: formatCommands.toggleInlineCode }
126
+ ])
127
+ );
128
+ export {
129
+ formatCommands,
130
+ formatCommandsKeymap
131
+ };
132
+ //# sourceMappingURL=formatCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/format/formatCommands.ts"],"sourcesContent":["/**\n * Formatting commands — spec section 9.\n *\n * Cmd/Ctrl + B → toggle bold (`**…**`)\n * Cmd/Ctrl + I → toggle italic (`*…*`)\n * Cmd/Ctrl + E → toggle inline code (`` `…` ``)\n *\n * Toggle, not insert: pressing Cmd+B with the caret already inside a\n * `StrongEmphasis` removes the bold, mirroring Tiptap / Pages / Word.\n *\n * Cmd+K (link popover) is Phase 2.8 — it needs a UI affordance and\n * is intentionally not bound here.\n *\n * These commands work uniformly on collapsed selections (where they\n * just insert the markers and place the caret between them) and on\n * non-collapsed selections (where they wrap the visible content).\n */\n\nimport { EditorSelection, Prec } from \"@codemirror/state\";\nimport { type Command, EditorView, keymap } from \"@codemirror/view\";\nimport { treeAt } from \"../core/treeAt\";\n\ntype SyntaxNodeLike = {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly parent: SyntaxNodeLike | null;\n};\n\ninterface FormatSpec {\n readonly markName: string; // Lezer node name for the wrapping construct\n readonly opener: string;\n readonly closer: string;\n /** CommonMark's flanking rules make emphasis delimiters literal when the\n * opener is followed — or the closer preceded — by whitespace: `**compose **`\n * is plain text, not bold. Specs with this flag wrap only the selection's\n * non-whitespace core, leaving edge spaces outside the markers (Word /\n * Pages / Obsidian behavior). Code spans have no flanking rule and may\n * meaningfully contain edge spaces, so they wrap verbatim. */\n readonly keepEdgeWhitespaceOutside: boolean;\n}\n\nconst FORMAT_BOLD: FormatSpec = {\n markName: \"StrongEmphasis\",\n opener: \"**\",\n closer: \"**\",\n keepEdgeWhitespaceOutside: true,\n};\nconst FORMAT_ITALIC: FormatSpec = {\n markName: \"Emphasis\",\n opener: \"*\",\n closer: \"*\",\n keepEdgeWhitespaceOutside: true,\n};\nconst FORMAT_CODE: FormatSpec = {\n markName: \"InlineCode\",\n opener: \"`\",\n closer: \"`\",\n keepEdgeWhitespaceOutside: false,\n};\n\nfunction nearestAncestor(\n view: EditorView,\n pos: number,\n name: string,\n): { from: number; to: number } | null {\n let node: SyntaxNodeLike | null = treeAt(view.state, pos).resolveInner(\n pos,\n 1,\n ) as unknown as SyntaxNodeLike;\n while (node) {\n if (node.name === name) return { from: node.from, to: node.to };\n node = node.parent;\n }\n return null;\n}\n\n/**\n * Delimiters + content for a code span, per CommonMark: the backtick fence\n * must be LONGER than any backtick run inside the content (`` `a`b` `` is\n * broken source), and content that starts or ends with a backtick needs one\n * space of padding — the renderer strips exactly one space from each side.\n */\nfunction codeSpanWrap(core: string): { fence: string; content: string } {\n const runs = core.match(/`+/g) ?? [];\n const longest = runs.reduce((max, run) => Math.max(max, run.length), 0);\n const fence = \"`\".repeat(longest + 1);\n const pad = core.startsWith(\"`\") || core.endsWith(\"`\") ? \" \" : \"\";\n return { fence, content: pad + core + pad };\n}\n\n/** Undo {@link codeSpanWrap}: measure the actual fence off the source (any\n * run length), then strip the one-space padding pair the grammar treats as\n * invisible. Null when the text isn't a well-formed span. */\nfunction codeSpanUnwrap(text: string): string | null {\n const fence = /^`+/.exec(text)?.[0];\n if (!fence || !text.endsWith(fence) || text.length < fence.length * 2) return null;\n let content = text.slice(fence.length, text.length - fence.length);\n if (content.startsWith(\" \") && content.endsWith(\" \") && content.trim() !== \"\") {\n content = content.slice(1, -1);\n }\n return content;\n}\n\nfunction makeToggleCommand(spec: FormatSpec): Command {\n return (view) => {\n const sel = view.state.selection.main;\n\n // Case 1: caret/selection sits inside an existing instance of this\n // construct → strip the markers (toggle off).\n const existing = nearestAncestor(view, sel.head, spec.markName);\n if (existing) {\n const { from, to } = existing;\n const text = view.state.sliceDoc(from, to);\n if (spec.markName === \"InlineCode\") {\n // Code spans carry variable-length fences + optional padding — undo\n // them off the actual source, not the spec's one-backtick default.\n const content = codeSpanUnwrap(text);\n if (content !== null) {\n view.dispatch({\n changes: { from, to, insert: content },\n selection: sel.empty\n ? EditorSelection.cursor(\n Math.min(Math.max(from, sel.head - 1), from + content.length),\n )\n : EditorSelection.range(from, from + content.length),\n userEvent: \"input.format.unwrap\",\n });\n return true;\n }\n }\n if (text.startsWith(spec.opener) && text.endsWith(spec.closer)) {\n const content = text.slice(spec.opener.length, text.length - spec.closer.length);\n const newSelFrom = from;\n const newSelTo = from + content.length;\n view.dispatch({\n changes: { from, to, insert: content },\n selection: sel.empty\n ? EditorSelection.cursor(Math.max(newSelFrom, sel.head - spec.opener.length))\n : EditorSelection.range(newSelFrom, newSelTo),\n userEvent: \"input.format.unwrap\",\n });\n return true;\n }\n }\n\n // Case 2: wrap. Collapsed selection inserts markers + places caret\n // between them; ranged selection wraps the content.\n if (sel.empty) {\n const insert = spec.opener + spec.closer;\n view.dispatch({\n changes: { from: sel.head, insert },\n selection: EditorSelection.cursor(sel.head + spec.opener.length),\n userEvent: \"input.format.wrap\",\n });\n return true;\n }\n const content = view.state.sliceDoc(sel.from, sel.to);\n // Shrink the wrap to the selection's non-whitespace core where the grammar\n // demands it — wrapping edge spaces would emit markdown the parser is\n // REQUIRED to treat as literal text (see keepEdgeWhitespaceOutside).\n const leading = spec.keepEdgeWhitespaceOutside\n ? content.length - content.trimStart().length\n : 0;\n const trailing = spec.keepEdgeWhitespaceOutside\n ? content.length - content.trimEnd().length\n : 0;\n const core = content.slice(leading, content.length - trailing);\n if (!core) {\n // Nothing but whitespace selected — no formatting to apply.\n return true;\n }\n const wrapFrom = sel.from + leading;\n const wrapTo = sel.to - trailing;\n // Code spans size their fence to the content (backticks inside need a\n // longer fence) — the other constructs use the spec's fixed markers.\n const { opener, inner } =\n spec.markName === \"InlineCode\"\n ? (() => {\n const { fence, content: padded } = codeSpanWrap(core);\n return { opener: fence, inner: padded };\n })()\n : { opener: spec.opener, inner: core };\n const wrapped = opener + inner + opener;\n view.dispatch({\n changes: { from: wrapFrom, to: wrapTo, insert: wrapped },\n selection: EditorSelection.range(\n wrapFrom + opener.length,\n wrapFrom + opener.length + inner.length,\n ),\n userEvent: \"input.format.wrap\",\n });\n return true;\n };\n}\n\nexport const formatCommands = {\n toggleBold: makeToggleCommand(FORMAT_BOLD),\n toggleItalic: makeToggleCommand(FORMAT_ITALIC),\n toggleInlineCode: makeToggleCommand(FORMAT_CODE),\n};\n\nexport const formatCommandsKeymap = Prec.high(\n keymap.of([\n { key: \"Mod-b\", run: formatCommands.toggleBold },\n { key: \"Mod-i\", run: formatCommands.toggleItalic },\n { key: \"Mod-e\", run: formatCommands.toggleInlineCode },\n ]),\n);\n"],"mappings":"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","names":["content"]}
@@ -0,0 +1,4 @@
1
+ export { formatCommands, formatCommandsKeymap } from './formatCommands.js';
2
+ export { blockCommands, blockCommandsKeymap } from './blockCommands.js';
3
+ import '@codemirror/state';
4
+ import '@codemirror/view';
@@ -0,0 +1,3 @@
1
+ export * from "./formatCommands.js";
2
+ export * from "./blockCommands.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/format/index.ts"],"sourcesContent":["/**\n * Formatting commands behind the toolbar and keymaps: inline marks\n * (bold/italic/strikethrough/code) and block shapes (headings, quotes,\n * lists, fences).\n */\nexport * from \"./formatCommands\";\nexport * from \"./blockCommands\";\n"],"mappings":"AAKA,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,10 @@
1
+ import { ViewPlugin, DecorationSet, ViewUpdate } from '@codemirror/view';
2
+
3
+ declare const HIGHLIGHT_RE: RegExp;
4
+ declare const highlightPlugin: ViewPlugin<{
5
+ decorations: DecorationSet;
6
+ atomic: DecorationSet;
7
+ update(update: ViewUpdate): void;
8
+ }, undefined>;
9
+
10
+ export { HIGHLIGHT_RE, highlightPlugin };
@@ -0,0 +1,66 @@
1
+ import {
2
+ __publicField
3
+ } from "../../chunk-V6TY7KAL.js";
4
+ import {
5
+ Decoration,
6
+ EditorView,
7
+ ViewPlugin
8
+ } from "@codemirror/view";
9
+ import { inCode, viewportTree } from "../core/codeContext.js";
10
+ const HIGHLIGHT_RE = /==([^=\n]+?)==/g;
11
+ const HIDE = Decoration.replace({});
12
+ const highlightMark = Decoration.mark({ class: "cm-highlight" });
13
+ function buildDecorations(view) {
14
+ const marks = [];
15
+ const atomic = [];
16
+ const tree = viewportTree(view);
17
+ for (const { from, to } of view.visibleRanges) {
18
+ const text = view.state.sliceDoc(from, to);
19
+ HIGHLIGHT_RE.lastIndex = 0;
20
+ let match;
21
+ while ((match = HIGHLIGHT_RE.exec(text)) !== null) {
22
+ const matchStart = from + match.index;
23
+ const matchEnd = matchStart + match[0].length;
24
+ if (inCode(tree, matchStart) || inCode(tree, matchEnd - 2)) continue;
25
+ const innerStart = matchStart + 2;
26
+ const innerEnd = matchEnd - 2;
27
+ if (innerEnd <= innerStart) continue;
28
+ marks.push(HIDE.range(matchStart, innerStart));
29
+ atomic.push(HIDE.range(matchStart, innerStart));
30
+ marks.push(highlightMark.range(innerStart, innerEnd));
31
+ marks.push(HIDE.range(innerEnd, matchEnd));
32
+ atomic.push(HIDE.range(innerEnd, matchEnd));
33
+ }
34
+ }
35
+ return {
36
+ decorations: Decoration.set(marks, true),
37
+ atomic: Decoration.set(atomic, true)
38
+ };
39
+ }
40
+ const highlightPlugin = ViewPlugin.fromClass(
41
+ class {
42
+ constructor(view) {
43
+ __publicField(this, "decorations");
44
+ __publicField(this, "atomic");
45
+ const built = buildDecorations(view);
46
+ this.decorations = built.decorations;
47
+ this.atomic = built.atomic;
48
+ }
49
+ update(update) {
50
+ if (update.docChanged || update.viewportChanged) {
51
+ const built = buildDecorations(update.view);
52
+ this.decorations = built.decorations;
53
+ this.atomic = built.atomic;
54
+ }
55
+ }
56
+ },
57
+ {
58
+ decorations: (v) => v.decorations,
59
+ provide: (plugin) => EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomic ?? Decoration.none)
60
+ }
61
+ );
62
+ export {
63
+ HIGHLIGHT_RE,
64
+ highlightPlugin
65
+ };
66
+ //# sourceMappingURL=highlightPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/highlight/highlightPlugin.ts"],"sourcesContent":["import { type Range } from \"@codemirror/state\";\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type PluginValue,\n type ViewUpdate,\n} from \"@codemirror/view\";\n\nimport { inCode, viewportTree } from \"../core/codeContext\";\n\nexport const HIGHLIGHT_RE = /==([^=\\n]+?)==/g;\nconst HIDE = Decoration.replace({});\nconst highlightMark = Decoration.mark({ class: \"cm-highlight\" });\n\nfunction buildDecorations(view: EditorView): { decorations: DecorationSet; atomic: DecorationSet } {\n const marks: Range<Decoration>[] = [];\n const atomic: Range<Decoration>[] = [];\n const tree = viewportTree(view);\n\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.sliceDoc(from, to);\n HIGHLIGHT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = HIGHLIGHT_RE.exec(text)) !== null) {\n const matchStart = from + match.index;\n const matchEnd = matchStart + match[0].length;\n if (inCode(tree, matchStart) || inCode(tree, matchEnd - 2)) continue;\n const innerStart = matchStart + 2;\n const innerEnd = matchEnd - 2;\n if (innerEnd <= innerStart) continue;\n\n marks.push(HIDE.range(matchStart, innerStart));\n atomic.push(HIDE.range(matchStart, innerStart));\n marks.push(highlightMark.range(innerStart, innerEnd));\n marks.push(HIDE.range(innerEnd, matchEnd));\n atomic.push(HIDE.range(innerEnd, matchEnd));\n }\n }\n\n return {\n decorations: Decoration.set(marks, true),\n atomic: Decoration.set(atomic, true),\n };\n}\n\nexport const highlightPlugin = ViewPlugin.fromClass(\n class implements PluginValue {\n decorations: DecorationSet;\n atomic: DecorationSet;\n constructor(view: EditorView) {\n const built = buildDecorations(view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n const built = buildDecorations(update.view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n }\n },\n {\n decorations: (v) => v.decorations,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomic ?? Decoration.none),\n },\n);\n"],"mappings":";;;AACA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OAGK;AAEP,SAAS,QAAQ,oBAAoB;AAE9B,MAAM,eAAe;AAC5B,MAAM,OAAO,WAAW,QAAQ,CAAC,CAAC;AAClC,MAAM,gBAAgB,WAAW,KAAK,EAAE,OAAO,eAAe,CAAC;AAE/D,SAAS,iBAAiB,MAAyE;AACjG,QAAM,QAA6B,CAAC;AACpC,QAAM,SAA8B,CAAC;AACrC,QAAM,OAAO,aAAa,IAAI;AAE9B,aAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,UAAM,OAAO,KAAK,MAAM,SAAS,MAAM,EAAE;AACzC,iBAAa,YAAY;AACzB,QAAI;AACJ,YAAQ,QAAQ,aAAa,KAAK,IAAI,OAAO,MAAM;AACjD,YAAM,aAAa,OAAO,MAAM;AAChC,YAAM,WAAW,aAAa,MAAM,CAAC,EAAE;AACvC,UAAI,OAAO,MAAM,UAAU,KAAK,OAAO,MAAM,WAAW,CAAC,EAAG;AAC5D,YAAM,aAAa,aAAa;AAChC,YAAM,WAAW,WAAW;AAC5B,UAAI,YAAY,WAAY;AAE5B,YAAM,KAAK,KAAK,MAAM,YAAY,UAAU,CAAC;AAC7C,aAAO,KAAK,KAAK,MAAM,YAAY,UAAU,CAAC;AAC9C,YAAM,KAAK,cAAc,MAAM,YAAY,QAAQ,CAAC;AACpD,YAAM,KAAK,KAAK,MAAM,UAAU,QAAQ,CAAC;AACzC,aAAO,KAAK,KAAK,MAAM,UAAU,QAAQ,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,WAAW,IAAI,OAAO,IAAI;AAAA,IACvC,QAAQ,WAAW,IAAI,QAAQ,IAAI;AAAA,EACrC;AACF;AAEO,MAAM,kBAAkB,WAAW;AAAA,EACxC,MAA6B;AAAA,IAG3B,YAAY,MAAkB;AAF9B;AACA;AAEE,YAAM,QAAQ,iBAAiB,IAAI;AACnC,WAAK,cAAc,MAAM;AACzB,WAAK,SAAS,MAAM;AAAA,IACtB;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,cAAM,QAAQ,iBAAiB,OAAO,IAAI;AAC1C,aAAK,cAAc,MAAM;AACzB,aAAK,SAAS,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,CAAC,MAAM,EAAE;AAAA,IACtB,SAAS,CAAC,WACR,WAAW,aAAa,GAAG,CAAC,SAAS,KAAK,OAAO,MAAM,GAAG,UAAU,WAAW,IAAI;AAAA,EACvF;AACF;","names":[]}