@pinkpixel/marzipan 1.0.5 → 1.0.7

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 (220) hide show
  1. package/dist/_basePickBy-BXyyc71p.js +152 -0
  2. package/dist/_basePickBy-BXyyc71p.js.map +1 -0
  3. package/dist/_baseUniq-Dde5pUWM.js +615 -0
  4. package/dist/_baseUniq-Dde5pUWM.js.map +1 -0
  5. package/dist/actions/core/detection.d.ts +11 -0
  6. package/dist/actions/core/detection.d.ts.map +1 -0
  7. package/dist/actions/core/detection.js +142 -0
  8. package/dist/actions/core/detection.js.map +1 -0
  9. package/dist/actions/core/formats.d.ts +5 -0
  10. package/dist/actions/core/formats.d.ts.map +1 -0
  11. package/dist/actions/core/formats.js +75 -0
  12. package/dist/actions/core/formats.js.map +1 -0
  13. package/dist/actions/core/insertion.d.ts +5 -0
  14. package/dist/actions/core/insertion.d.ts.map +1 -0
  15. package/dist/actions/core/insertion.js +116 -0
  16. package/dist/actions/core/insertion.js.map +1 -0
  17. package/dist/actions/core/selection.d.ts +13 -0
  18. package/dist/actions/core/selection.d.ts.map +1 -0
  19. package/dist/actions/core/selection.js +137 -0
  20. package/dist/actions/core/selection.js.map +1 -0
  21. package/dist/actions/debug.d.ts +10 -0
  22. package/dist/actions/debug.d.ts.map +1 -0
  23. package/dist/actions/debug.js +39 -0
  24. package/dist/actions/debug.js.map +1 -0
  25. package/dist/actions/index.d.ts +48 -0
  26. package/dist/actions/index.d.ts.map +1 -0
  27. package/dist/actions/index.js +237 -0
  28. package/dist/actions/index.js.map +1 -0
  29. package/dist/actions/operations/block.d.ts +5 -0
  30. package/dist/actions/operations/block.d.ts.map +1 -0
  31. package/dist/actions/operations/block.js +120 -0
  32. package/dist/actions/operations/block.js.map +1 -0
  33. package/dist/actions/operations/list.d.ts +4 -0
  34. package/dist/actions/operations/list.d.ts.map +1 -0
  35. package/dist/actions/operations/list.js +151 -0
  36. package/dist/actions/operations/list.js.map +1 -0
  37. package/dist/actions/types.d.ts +43 -0
  38. package/dist/actions/types.d.ts.map +1 -0
  39. package/dist/actions/types.js +2 -0
  40. package/dist/actions/types.js.map +1 -0
  41. package/dist/arc-CfMWIGxd.js +84 -0
  42. package/dist/arc-CfMWIGxd.js.map +1 -0
  43. package/dist/architectureDiagram-VXUJARFQ-Bb4i7x-6.js +4663 -0
  44. package/dist/architectureDiagram-VXUJARFQ-Bb4i7x-6.js.map +1 -0
  45. package/dist/blockDiagram-VD42YOAC-ldSoJhgA.js +2262 -0
  46. package/dist/blockDiagram-VD42YOAC-ldSoJhgA.js.map +1 -0
  47. package/dist/c4Diagram-YG6GDRKO-D-ENeA7h.js +1581 -0
  48. package/dist/c4Diagram-YG6GDRKO-D-ENeA7h.js.map +1 -0
  49. package/dist/channel-BCTxewZI.js +6 -0
  50. package/dist/channel-BCTxewZI.js.map +1 -0
  51. package/dist/chunk-4BX2VUAB-Cfh_4i4X.js +9 -0
  52. package/dist/chunk-4BX2VUAB-Cfh_4i4X.js.map +1 -0
  53. package/dist/chunk-55IACEB6-DNOIVRvW.js +9 -0
  54. package/dist/chunk-55IACEB6-DNOIVRvW.js.map +1 -0
  55. package/dist/chunk-B4BG7PRW-C_qWbbk6.js +1376 -0
  56. package/dist/chunk-B4BG7PRW-C_qWbbk6.js.map +1 -0
  57. package/dist/chunk-DI55MBZ5-D_yXJA03.js +1371 -0
  58. package/dist/chunk-DI55MBZ5-D_yXJA03.js.map +1 -0
  59. package/dist/chunk-FMBD7UC4-B9NJjOBf.js +20 -0
  60. package/dist/chunk-FMBD7UC4-B9NJjOBf.js.map +1 -0
  61. package/dist/chunk-QN33PNHL-CVrLUVsI.js +20 -0
  62. package/dist/chunk-QN33PNHL-CVrLUVsI.js.map +1 -0
  63. package/dist/chunk-QZHKN3VN-FvAf_VJR.js +16 -0
  64. package/dist/chunk-QZHKN3VN-FvAf_VJR.js.map +1 -0
  65. package/dist/chunk-TZMSLE5B-DxYTPD3t.js +65 -0
  66. package/dist/chunk-TZMSLE5B-DxYTPD3t.js.map +1 -0
  67. package/dist/classDiagram-2ON5EDUG-Cg641kit.js +17 -0
  68. package/dist/classDiagram-2ON5EDUG-Cg641kit.js.map +1 -0
  69. package/dist/classDiagram-v2-WZHVMYZB-Cg641kit.js +17 -0
  70. package/dist/classDiagram-v2-WZHVMYZB-Cg641kit.js.map +1 -0
  71. package/dist/clone-D062_nJ-.js +9 -0
  72. package/dist/clone-D062_nJ-.js.map +1 -0
  73. package/dist/cose-bilkent-S5V4N54A-DIb5rck_.js +2609 -0
  74. package/dist/cose-bilkent-S5V4N54A-DIb5rck_.js.map +1 -0
  75. package/dist/cytoscape.esm-DfdJODL8.js +18736 -0
  76. package/dist/cytoscape.esm-DfdJODL8.js.map +1 -0
  77. package/dist/dagre-6UL2VRFP-CZKadRq9.js +445 -0
  78. package/dist/dagre-6UL2VRFP-CZKadRq9.js.map +1 -0
  79. package/dist/defaultLocale-D7EN2tov.js +172 -0
  80. package/dist/defaultLocale-D7EN2tov.js.map +1 -0
  81. package/dist/diagram-PSM6KHXK-VDtnZynV.js +532 -0
  82. package/dist/diagram-PSM6KHXK-VDtnZynV.js.map +1 -0
  83. package/dist/diagram-QEK2KX5R-DxjNZqZ_.js +218 -0
  84. package/dist/diagram-QEK2KX5R-DxjNZqZ_.js.map +1 -0
  85. package/dist/diagram-S2PKOQOG-CCX3j4vi.js +143 -0
  86. package/dist/diagram-S2PKOQOG-CCX3j4vi.js.map +1 -0
  87. package/dist/erDiagram-Q2GNP2WA-nwmrf6lJ.js +842 -0
  88. package/dist/erDiagram-Q2GNP2WA-nwmrf6lJ.js.map +1 -0
  89. package/dist/flowDiagram-NV44I4VS-DQEdMlRX.js +1621 -0
  90. package/dist/flowDiagram-NV44I4VS-DQEdMlRX.js.map +1 -0
  91. package/dist/ganttDiagram-LVOFAZNH-WMiy-Gep.js +2506 -0
  92. package/dist/ganttDiagram-LVOFAZNH-WMiy-Gep.js.map +1 -0
  93. package/dist/gitGraphDiagram-NY62KEGX-BgmbSTgN.js +700 -0
  94. package/dist/gitGraphDiagram-NY62KEGX-BgmbSTgN.js.map +1 -0
  95. package/dist/graph-CSVEP8oS.js +248 -0
  96. package/dist/graph-CSVEP8oS.js.map +1 -0
  97. package/dist/icons.d.ts +17 -0
  98. package/dist/icons.d.ts.map +1 -0
  99. package/dist/icons.js +67 -0
  100. package/dist/icons.js.map +1 -0
  101. package/dist/index.d.ts +143 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +1 -1
  104. package/dist/index.js.map +1 -1
  105. package/dist/infoDiagram-F6ZHWCRC-BzTgHHGF.js +25 -0
  106. package/dist/infoDiagram-F6ZHWCRC-BzTgHHGF.js.map +1 -0
  107. package/dist/init-DjUOC4st.js +17 -0
  108. package/dist/init-DjUOC4st.js.map +1 -0
  109. package/dist/journeyDiagram-XKPGCS4Q-B5P7hkT-.js +835 -0
  110. package/dist/journeyDiagram-XKPGCS4Q-B5P7hkT-.js.map +1 -0
  111. package/dist/kanban-definition-3W4ZIXB7-CLtnd0xR.js +720 -0
  112. package/dist/kanban-definition-3W4ZIXB7-CLtnd0xR.js.map +1 -0
  113. package/dist/katex-CmGeg_OO.js +11693 -0
  114. package/dist/katex-CmGeg_OO.js.map +1 -0
  115. package/dist/layout-CdTiJocX.js +1325 -0
  116. package/dist/layout-CdTiJocX.js.map +1 -0
  117. package/dist/linear-BhblBDrV.js +260 -0
  118. package/dist/linear-BhblBDrV.js.map +1 -0
  119. package/dist/link-tooltip.d.ts +27 -0
  120. package/dist/link-tooltip.d.ts.map +1 -0
  121. package/dist/link-tooltip.js +224 -0
  122. package/dist/link-tooltip.js.map +1 -0
  123. package/dist/marzipan.d.ts +472 -0
  124. package/dist/marzipan.d.ts.map +1 -0
  125. package/dist/marzipan.js +1185 -0
  126. package/dist/marzipan.js.map +1 -0
  127. package/dist/mermaid.core-DENutRS8.js +15249 -0
  128. package/dist/mermaid.core-DENutRS8.js.map +1 -0
  129. package/dist/mindmap-definition-VGOIOE7T-BXBE9eta.js +785 -0
  130. package/dist/mindmap-definition-VGOIOE7T-BXBE9eta.js.map +1 -0
  131. package/dist/ordinal-DfAQgscy.js +62 -0
  132. package/dist/ordinal-DfAQgscy.js.map +1 -0
  133. package/dist/parser.d.ts +234 -0
  134. package/dist/parser.d.ts.map +1 -0
  135. package/dist/parser.js +886 -0
  136. package/dist/parser.js.map +1 -0
  137. package/dist/pieDiagram-ADFJNKIX-BND3UUQ-.js +162 -0
  138. package/dist/pieDiagram-ADFJNKIX-BND3UUQ-.js.map +1 -0
  139. package/dist/plugins/accentSwatchPlugin.d.ts +15 -0
  140. package/dist/plugins/accentSwatchPlugin.d.ts.map +1 -0
  141. package/dist/plugins/accentSwatchPlugin.js +142 -0
  142. package/dist/plugins/accentSwatchPlugin.js.map +1 -0
  143. package/dist/plugins/imageManagerPlugin.d.ts +16 -0
  144. package/dist/plugins/imageManagerPlugin.d.ts.map +1 -0
  145. package/dist/plugins/imageManagerPlugin.js +161 -0
  146. package/dist/plugins/imageManagerPlugin.js.map +1 -0
  147. package/dist/plugins/imagePicker.d.ts +7 -0
  148. package/dist/plugins/imagePicker.d.ts.map +1 -0
  149. package/dist/plugins/imagePicker.js +33 -0
  150. package/dist/plugins/imagePicker.js.map +1 -0
  151. package/dist/plugins/imagePickerPlugin.d.ts +3 -0
  152. package/dist/plugins/imagePickerPlugin.d.ts.map +1 -0
  153. package/dist/plugins/imagePickerPlugin.js +12 -0
  154. package/dist/plugins/imagePickerPlugin.js.map +1 -0
  155. package/dist/plugins/mermaidExternal.d.ts +2 -0
  156. package/dist/plugins/mermaidExternal.d.ts.map +1 -0
  157. package/dist/plugins/mermaidExternal.js +44 -0
  158. package/dist/plugins/mermaidExternal.js.map +1 -0
  159. package/dist/plugins/mermaidPlugin.d.ts +2 -0
  160. package/dist/plugins/mermaidPlugin.d.ts.map +1 -0
  161. package/dist/plugins/mermaidPlugin.js +25 -0
  162. package/dist/plugins/mermaidPlugin.js.map +1 -0
  163. package/dist/plugins/tableGenerator.d.ts +2 -0
  164. package/dist/plugins/tableGenerator.d.ts.map +1 -0
  165. package/dist/plugins/tableGenerator.js +24 -0
  166. package/dist/plugins/tableGenerator.js.map +1 -0
  167. package/dist/plugins/tableGridPlugin.d.ts +14 -0
  168. package/dist/plugins/tableGridPlugin.d.ts.map +1 -0
  169. package/dist/plugins/tableGridPlugin.js +77 -0
  170. package/dist/plugins/tableGridPlugin.js.map +1 -0
  171. package/dist/plugins/tablePlugin.d.ts +2 -0
  172. package/dist/plugins/tablePlugin.d.ts.map +1 -0
  173. package/dist/plugins/tablePlugin.js +26 -0
  174. package/dist/plugins/tablePlugin.js.map +1 -0
  175. package/dist/plugins/tinyHighlight.d.ts +10 -0
  176. package/dist/plugins/tinyHighlight.d.ts.map +1 -0
  177. package/dist/plugins/tinyHighlight.js +109 -0
  178. package/dist/plugins/tinyHighlight.js.map +1 -0
  179. package/dist/plugins/utils/table.d.ts +3 -0
  180. package/dist/plugins/utils/table.d.ts.map +1 -0
  181. package/dist/plugins/utils/table.js +25 -0
  182. package/dist/plugins/utils/table.js.map +1 -0
  183. package/dist/quadrantDiagram-AYHSOK5B-CnLHbrEF.js +1023 -0
  184. package/dist/quadrantDiagram-AYHSOK5B-CnLHbrEF.js.map +1 -0
  185. package/dist/requirementDiagram-UZGBJVZJ-caC7K17a.js +851 -0
  186. package/dist/requirementDiagram-UZGBJVZJ-caC7K17a.js.map +1 -0
  187. package/dist/sankeyDiagram-TZEHDZUN-CV5-bwv8.js +811 -0
  188. package/dist/sankeyDiagram-TZEHDZUN-CV5-bwv8.js.map +1 -0
  189. package/dist/sequenceDiagram-WL72ISMW-Cq1otbHU.js +2512 -0
  190. package/dist/sequenceDiagram-WL72ISMW-Cq1otbHU.js.map +1 -0
  191. package/dist/shortcuts.d.ts +15 -0
  192. package/dist/shortcuts.d.ts.map +1 -0
  193. package/dist/shortcuts.js +78 -0
  194. package/dist/shortcuts.js.map +1 -0
  195. package/dist/stateDiagram-FKZM4ZOC-BJ5UwskL.js +264 -0
  196. package/dist/stateDiagram-FKZM4ZOC-BJ5UwskL.js.map +1 -0
  197. package/dist/stateDiagram-v2-4FDKWEC3-H1gqsSsO.js +17 -0
  198. package/dist/stateDiagram-v2-4FDKWEC3-H1gqsSsO.js.map +1 -0
  199. package/dist/styles.d.ts +11 -0
  200. package/dist/styles.d.ts.map +1 -0
  201. package/dist/styles.js +854 -0
  202. package/dist/styles.js.map +1 -0
  203. package/dist/table-DMIy93NJ.js +25 -0
  204. package/dist/table-DMIy93NJ.js.map +1 -0
  205. package/dist/themes.d.ts +197 -0
  206. package/dist/themes.d.ts.map +1 -0
  207. package/dist/themes.js +120 -0
  208. package/dist/themes.js.map +1 -0
  209. package/dist/timeline-definition-IT6M3QCI-CqPEUsh4.js +796 -0
  210. package/dist/timeline-definition-IT6M3QCI-CqPEUsh4.js.map +1 -0
  211. package/dist/toolbar.d.ts +37 -0
  212. package/dist/toolbar.d.ts.map +1 -0
  213. package/dist/toolbar.js +283 -0
  214. package/dist/toolbar.js.map +1 -0
  215. package/dist/treemap-75Q7IDZK-DmPg5GN7.js +12988 -0
  216. package/dist/treemap-75Q7IDZK-DmPg5GN7.js.map +1 -0
  217. package/dist/xychartDiagram-PRI3JC2R-C3_IO4Rm.js +1341 -0
  218. package/dist/xychartDiagram-PRI3JC2R-C3_IO4Rm.js.map +1 -0
  219. package/docs/types.d.ts +1 -1
  220. package/package.json +15 -11
@@ -0,0 +1,116 @@
1
+ import { getDebugMode } from '../debug';
2
+ let canInsertText = null;
3
+ export function insertText(textarea, result) {
4
+ const debugMode = getDebugMode();
5
+ if (debugMode) {
6
+ console.group('🔧 insertText');
7
+ console.log('Current selection:', `${textarea.selectionStart}-${textarea.selectionEnd}`);
8
+ console.log('Text to insert:', JSON.stringify(result.text));
9
+ console.log('New selection to set:', result.selectionStart, '-', result.selectionEnd);
10
+ }
11
+ textarea.focus();
12
+ const originalSelectionStart = textarea.selectionStart;
13
+ const originalSelectionEnd = textarea.selectionEnd;
14
+ const before = textarea.value.slice(0, originalSelectionStart);
15
+ const after = textarea.value.slice(originalSelectionEnd);
16
+ if (debugMode) {
17
+ console.log('Before text (last 20):', JSON.stringify(before.slice(-20)));
18
+ console.log('After text (first 20):', JSON.stringify(after.slice(0, 20)));
19
+ console.log('Selected text being replaced:', JSON.stringify(textarea.value.slice(originalSelectionStart, originalSelectionEnd)));
20
+ }
21
+ const originalValue = textarea.value;
22
+ if (canInsertText === null || canInsertText === true) {
23
+ textarea.contentEditable = 'true';
24
+ try {
25
+ canInsertText = document.execCommand('insertText', false, result.text);
26
+ if (debugMode) {
27
+ console.log('execCommand returned:', canInsertText, 'for text with', result.text.split('\n').length, 'lines');
28
+ }
29
+ }
30
+ catch (error) {
31
+ canInsertText = false;
32
+ if (debugMode)
33
+ console.log('execCommand threw error:', error);
34
+ }
35
+ textarea.contentEditable = 'false';
36
+ }
37
+ if (debugMode) {
38
+ console.log('canInsertText before:', canInsertText);
39
+ console.log('execCommand result:', canInsertText);
40
+ }
41
+ if (canInsertText) {
42
+ const expectedValue = before + result.text + after;
43
+ const actualValue = textarea.value;
44
+ if (debugMode) {
45
+ console.log('Expected length:', expectedValue.length);
46
+ console.log('Actual length:', actualValue.length);
47
+ }
48
+ if (actualValue !== expectedValue) {
49
+ if (debugMode) {
50
+ console.log('execCommand changed the value but not as expected');
51
+ console.log('Expected:', JSON.stringify(expectedValue.slice(0, 100)));
52
+ console.log('Actual:', JSON.stringify(actualValue.slice(0, 100)));
53
+ }
54
+ // execCommand succeeded, so do not attempt manual insertion
55
+ }
56
+ }
57
+ if (!canInsertText) {
58
+ if (debugMode)
59
+ console.log('Using manual insertion');
60
+ if (textarea.value === originalValue) {
61
+ if (debugMode)
62
+ console.log('Value unchanged, doing manual replacement');
63
+ try {
64
+ document.execCommand('ms-beginUndoUnit');
65
+ }
66
+ catch {
67
+ // Ignore browser-specific command failures
68
+ }
69
+ textarea.value = before + result.text + after;
70
+ try {
71
+ document.execCommand('ms-endUndoUnit');
72
+ }
73
+ catch {
74
+ // Ignore browser-specific command failures
75
+ }
76
+ textarea.dispatchEvent(new CustomEvent('input', { bubbles: true, cancelable: true }));
77
+ }
78
+ else if (debugMode) {
79
+ console.log('Value was changed by execCommand, skipping manual insertion');
80
+ }
81
+ }
82
+ if (debugMode)
83
+ console.log('Setting selection range:', result.selectionStart, result.selectionEnd);
84
+ if (result.selectionStart != null && result.selectionEnd != null) {
85
+ textarea.setSelectionRange(result.selectionStart, result.selectionEnd);
86
+ }
87
+ else {
88
+ textarea.setSelectionRange(originalSelectionStart, textarea.selectionEnd);
89
+ }
90
+ if (debugMode) {
91
+ console.log('Final value length:', textarea.value.length);
92
+ console.groupEnd();
93
+ }
94
+ }
95
+ export function setUndoMethod(method) {
96
+ switch (method) {
97
+ case 'native':
98
+ canInsertText = true;
99
+ break;
100
+ case 'manual':
101
+ canInsertText = false;
102
+ break;
103
+ case 'auto':
104
+ default:
105
+ canInsertText = null;
106
+ break;
107
+ }
108
+ }
109
+ export function getUndoMethod() {
110
+ if (canInsertText === true)
111
+ return 'native';
112
+ if (canInsertText === false)
113
+ return 'manual';
114
+ return 'auto';
115
+ }
116
+ //# sourceMappingURL=insertion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertion.js","sourceRoot":"","sources":["../../../src/actions/core/insertion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { LineOperationOptions, TextTransformResult } from '../types';
2
+ export declare function isMultipleLines(text: string): boolean;
3
+ export declare function wordSelectionStart(text: string, index: number): number;
4
+ export declare function wordSelectionEnd(text: string, index: number, multiline: boolean): number;
5
+ export declare function expandSelectionToLine(textarea: HTMLTextAreaElement): void;
6
+ export declare function expandSelectedText(textarea: HTMLTextAreaElement, prefixToUse: string, suffixToUse: string, multiline?: boolean): string;
7
+ export declare function newlinesToSurroundSelectedText(textarea: HTMLTextAreaElement): {
8
+ newlinesToAppend: string;
9
+ newlinesToPrepend: string;
10
+ };
11
+ export declare function preserveSelection(textarea: HTMLTextAreaElement, callback: () => void): void;
12
+ export declare function applyLineOperation(textarea: HTMLTextAreaElement, operation: (textarea: HTMLTextAreaElement) => TextTransformResult, options?: LineOperationOptions): TextTransformResult;
13
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/actions/core/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAA2B,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEnG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAOxF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAiBzE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,mBAAmB,EAC7B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,UAAQ,GAChB,MAAM,CAeR;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,mBAAmB,GAAG;IAC7E,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAqBA;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAU3F;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,mBAAmB,EACjE,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAgErB"}
@@ -0,0 +1,137 @@
1
+ export function isMultipleLines(text) {
2
+ return text.trim().split('\n').length > 1;
3
+ }
4
+ export function wordSelectionStart(text, index) {
5
+ let cursor = index;
6
+ while (text[cursor] && text[cursor - 1] != null && !/\s/.test(text[cursor - 1])) {
7
+ cursor -= 1;
8
+ }
9
+ return cursor;
10
+ }
11
+ export function wordSelectionEnd(text, index, multiline) {
12
+ let cursor = index;
13
+ const breakpoint = multiline ? /\n/ : /\s/;
14
+ while (text[cursor] && !breakpoint.test(text[cursor])) {
15
+ cursor += 1;
16
+ }
17
+ return cursor;
18
+ }
19
+ export function expandSelectionToLine(textarea) {
20
+ const lines = textarea.value.split('\n');
21
+ let counter = 0;
22
+ for (let index = 0; index < lines.length; index += 1) {
23
+ const lineLength = lines[index].length + 1;
24
+ if (textarea.selectionStart >= counter && textarea.selectionStart < counter + lineLength) {
25
+ textarea.selectionStart = counter;
26
+ }
27
+ if (textarea.selectionEnd >= counter && textarea.selectionEnd < counter + lineLength) {
28
+ if (index === lines.length - 1) {
29
+ textarea.selectionEnd = Math.min(counter + lines[index].length, textarea.value.length);
30
+ }
31
+ else {
32
+ textarea.selectionEnd = counter + lineLength - 1;
33
+ }
34
+ }
35
+ counter += lineLength;
36
+ }
37
+ }
38
+ export function expandSelectedText(textarea, prefixToUse, suffixToUse, multiline = false) {
39
+ if (textarea.selectionStart === textarea.selectionEnd) {
40
+ textarea.selectionStart = wordSelectionStart(textarea.value, textarea.selectionStart);
41
+ textarea.selectionEnd = wordSelectionEnd(textarea.value, textarea.selectionEnd, multiline);
42
+ }
43
+ else {
44
+ const expandedSelectionStart = textarea.selectionStart - prefixToUse.length;
45
+ const expandedSelectionEnd = textarea.selectionEnd + suffixToUse.length;
46
+ const beginsWithPrefix = textarea.value.slice(expandedSelectionStart, textarea.selectionStart) === prefixToUse;
47
+ const endsWithSuffix = textarea.value.slice(textarea.selectionEnd, expandedSelectionEnd) === suffixToUse;
48
+ if (beginsWithPrefix && endsWithSuffix) {
49
+ textarea.selectionStart = expandedSelectionStart;
50
+ textarea.selectionEnd = expandedSelectionEnd;
51
+ }
52
+ }
53
+ return textarea.value.slice(textarea.selectionStart, textarea.selectionEnd);
54
+ }
55
+ export function newlinesToSurroundSelectedText(textarea) {
56
+ const beforeSelection = textarea.value.slice(0, textarea.selectionStart);
57
+ const afterSelection = textarea.value.slice(textarea.selectionEnd);
58
+ const breaksBefore = beforeSelection.match(/\n*$/);
59
+ const breaksAfter = afterSelection.match(/^\n*/);
60
+ const newlinesBeforeSelection = breaksBefore ? breaksBefore[0].length : 0;
61
+ const newlinesAfterSelection = breaksAfter ? breaksAfter[0].length : 0;
62
+ let newlinesToAppend = '';
63
+ let newlinesToPrepend = '';
64
+ if (/\S/.test(beforeSelection) && newlinesBeforeSelection < 2) {
65
+ newlinesToAppend = '\n'.repeat(2 - newlinesBeforeSelection);
66
+ }
67
+ if (/\S/.test(afterSelection) && newlinesAfterSelection < 2) {
68
+ newlinesToPrepend = '\n'.repeat(2 - newlinesAfterSelection);
69
+ }
70
+ return { newlinesToAppend, newlinesToPrepend };
71
+ }
72
+ export function preserveSelection(textarea, callback) {
73
+ const start = textarea.selectionStart;
74
+ const end = textarea.selectionEnd;
75
+ const scrollTop = textarea.scrollTop;
76
+ callback();
77
+ textarea.selectionStart = start;
78
+ textarea.selectionEnd = end;
79
+ textarea.scrollTop = scrollTop;
80
+ }
81
+ export function applyLineOperation(textarea, operation, options = {}) {
82
+ const originalStart = textarea.selectionStart;
83
+ const originalEnd = textarea.selectionEnd;
84
+ const noInitialSelection = originalStart === originalEnd;
85
+ const value = textarea.value;
86
+ let lineStart = originalStart;
87
+ while (lineStart > 0 && value[lineStart - 1] !== '\n') {
88
+ lineStart -= 1;
89
+ }
90
+ if (noInitialSelection) {
91
+ let lineEnd = originalStart;
92
+ while (lineEnd < value.length && value[lineEnd] !== '\n') {
93
+ lineEnd += 1;
94
+ }
95
+ textarea.selectionStart = lineStart;
96
+ textarea.selectionEnd = lineEnd;
97
+ }
98
+ else {
99
+ expandSelectionToLine(textarea);
100
+ }
101
+ const result = operation(textarea);
102
+ if (options.adjustSelection) {
103
+ const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd);
104
+ const prefix = options.prefix ?? '';
105
+ const isRemoving = prefix.length > 0 && selectedText.startsWith(prefix);
106
+ const adjusted = options.adjustSelection(isRemoving, originalStart, originalEnd, lineStart);
107
+ result.selectionStart = adjusted.start;
108
+ result.selectionEnd = adjusted.end;
109
+ return result;
110
+ }
111
+ if (options.prefix) {
112
+ const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd);
113
+ const isRemoving = selectedText.startsWith(options.prefix);
114
+ if (noInitialSelection) {
115
+ if (isRemoving) {
116
+ const position = Math.max(originalStart - options.prefix.length, lineStart);
117
+ result.selectionStart = position;
118
+ result.selectionEnd = position;
119
+ }
120
+ else {
121
+ const position = originalStart + options.prefix.length;
122
+ result.selectionStart = position;
123
+ result.selectionEnd = position;
124
+ }
125
+ }
126
+ else if (isRemoving) {
127
+ result.selectionStart = Math.max(originalStart - options.prefix.length, lineStart);
128
+ result.selectionEnd = Math.max(originalEnd - options.prefix.length, lineStart);
129
+ }
130
+ else {
131
+ result.selectionStart = originalStart + options.prefix.length;
132
+ result.selectionEnd = originalEnd + options.prefix.length;
133
+ }
134
+ }
135
+ return result;
136
+ }
137
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../src/actions/core/selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function setDebugMode(enabled: boolean): void;
2
+ export declare function getDebugMode(): boolean;
3
+ export declare function debugLog(functionName: string, message: string, data?: unknown): void;
4
+ export declare function debugSelection(textarea: HTMLTextAreaElement, label: string): void;
5
+ export declare function debugResult(result: {
6
+ text: string;
7
+ selectionStart: number;
8
+ selectionEnd: number;
9
+ }): void;
10
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/actions/debug.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEnD;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CASpF;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAajF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOxG"}
@@ -0,0 +1,39 @@
1
+ let debugMode = false;
2
+ export function setDebugMode(enabled) {
3
+ debugMode = enabled;
4
+ }
5
+ export function getDebugMode() {
6
+ return debugMode;
7
+ }
8
+ export function debugLog(functionName, message, data) {
9
+ if (!debugMode)
10
+ return;
11
+ console.group(`🔍 ${functionName}`);
12
+ console.log(message);
13
+ if (data !== undefined) {
14
+ console.log('Data:', data);
15
+ }
16
+ console.groupEnd();
17
+ }
18
+ export function debugSelection(textarea, label) {
19
+ if (!debugMode)
20
+ return;
21
+ const selected = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd);
22
+ console.group(`📍 Selection: ${label}`);
23
+ console.log('Position:', `${textarea.selectionStart}-${textarea.selectionEnd}`);
24
+ console.log('Selected text:', JSON.stringify(selected));
25
+ console.log('Length:', selected.length);
26
+ const before = textarea.value.slice(Math.max(0, textarea.selectionStart - 10), textarea.selectionStart);
27
+ const after = textarea.value.slice(textarea.selectionEnd, Math.min(textarea.value.length, textarea.selectionEnd + 10));
28
+ console.log('Context:', `${JSON.stringify(before)}[SELECTION]${JSON.stringify(after)}`);
29
+ console.groupEnd();
30
+ }
31
+ export function debugResult(result) {
32
+ if (!debugMode)
33
+ return;
34
+ console.group('📝 Result');
35
+ console.log('Text to insert:', JSON.stringify(result.text));
36
+ console.log('New selection:', `${result.selectionStart}-${result.selectionEnd}`);
37
+ console.groupEnd();
38
+ }
39
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/actions/debug.ts"],"names":[],"mappings":"AAAA,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,SAAS,GAAG,OAAO,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,YAAoB,EAAE,OAAe,EAAE,IAAc;IAC5E,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,OAAO,CAAC,KAAK,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,QAAQ,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAA6B,EAAE,KAAa;IACzE,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtF,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,cAAc,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACxG,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC;IACvH,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxF,OAAO,CAAC,QAAQ,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAsE;IAChG,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,QAAQ,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { setUndoMethod, getUndoMethod } from './core/insertion';
2
+ import { preserveSelection } from './core/selection';
3
+ import { expandSelection, getActiveFormats, hasFormat } from './core/detection';
4
+ import { getDebugMode, setDebugMode } from './debug';
5
+ import type { FormatStyleOptions } from './types';
6
+ export interface LinkOptions {
7
+ url?: string;
8
+ text?: string;
9
+ }
10
+ export declare function toggleBold(textarea: HTMLTextAreaElement | null): void;
11
+ export declare function toggleItalic(textarea: HTMLTextAreaElement | null): void;
12
+ export declare function toggleCode(textarea: HTMLTextAreaElement | null): void;
13
+ export declare function insertLink(textarea: HTMLTextAreaElement | null, options?: LinkOptions): void;
14
+ export declare function toggleBulletList(textarea: HTMLTextAreaElement | null): void;
15
+ export declare function toggleNumberedList(textarea: HTMLTextAreaElement | null): void;
16
+ export declare function toggleQuote(textarea: HTMLTextAreaElement | null): void;
17
+ export declare function toggleTaskList(textarea: HTMLTextAreaElement | null): void;
18
+ export declare function insertHeader(textarea: HTMLTextAreaElement | null, level?: number, toggle?: boolean): void;
19
+ export declare function toggleH1(textarea: HTMLTextAreaElement | null): void;
20
+ export declare function toggleH2(textarea: HTMLTextAreaElement | null): void;
21
+ export declare function toggleH3(textarea: HTMLTextAreaElement | null): void;
22
+ export { getActiveFormats, hasFormat, expandSelection, preserveSelection, setDebugMode, getDebugMode, setUndoMethod, getUndoMethod };
23
+ export declare function applyCustomFormat(textarea: HTMLTextAreaElement | null, format: FormatStyleOptions): void;
24
+ export declare const actions: {
25
+ toggleBold: typeof toggleBold;
26
+ toggleItalic: typeof toggleItalic;
27
+ toggleCode: typeof toggleCode;
28
+ insertLink: typeof insertLink;
29
+ toggleBulletList: typeof toggleBulletList;
30
+ toggleNumberedList: typeof toggleNumberedList;
31
+ toggleQuote: typeof toggleQuote;
32
+ toggleTaskList: typeof toggleTaskList;
33
+ insertHeader: typeof insertHeader;
34
+ toggleH1: typeof toggleH1;
35
+ toggleH2: typeof toggleH2;
36
+ toggleH3: typeof toggleH3;
37
+ getActiveFormats: typeof getActiveFormats;
38
+ hasFormat: typeof hasFormat;
39
+ expandSelection: typeof expandSelection;
40
+ applyCustomFormat: typeof applyCustomFormat;
41
+ preserveSelection: typeof preserveSelection;
42
+ setUndoMethod: typeof setUndoMethod;
43
+ setDebugMode: typeof setDebugMode;
44
+ getDebugMode: typeof getDebugMode;
45
+ };
46
+ export type MarkdownActions = typeof actions;
47
+ export default actions;
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAuC,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1F,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAIL,YAAY,EACZ,YAAY,EACb,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,kBAAkB,EAA4C,MAAM,SAAS,CAAC;AAE5F,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAYrE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAKvE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAMrE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EAAE,OAAO,GAAE,WAAgB,GAAG,IAAI,CA+BhG;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAI3E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAI7E;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAiBtE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAYzE;AAgBD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EACpC,KAAK,GAAE,MAAU,EACjB,MAAM,UAAQ,GACb,IAAI,CAiGN;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAEnE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAEnE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAEnE;AAED,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AAErI,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAkBxG;AAED,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;CAqBnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,OAAO,OAAO,CAAC;AAE7C,eAAe,OAAO,CAAC"}
@@ -0,0 +1,237 @@
1
+ import { FORMATS, mergeWithDefaults } from './core/formats';
2
+ import { insertText, setUndoMethod, getUndoMethod } from './core/insertion';
3
+ import { applyLineOperation, isMultipleLines, preserveSelection } from './core/selection';
4
+ import { blockStyle, multilineStyle } from './operations/block';
5
+ import { applyListStyle } from './operations/list';
6
+ import { expandSelection, getActiveFormats, hasFormat } from './core/detection';
7
+ import { debugLog, debugResult, debugSelection, getDebugMode, setDebugMode, } from './debug';
8
+ function ensureEditable(textarea) {
9
+ return !!textarea && !textarea.disabled && !textarea.readOnly;
10
+ }
11
+ export function toggleBold(textarea) {
12
+ if (!ensureEditable(textarea))
13
+ return;
14
+ debugLog('toggleBold', 'Starting');
15
+ debugSelection(textarea, 'Before');
16
+ const style = mergeWithDefaults(FORMATS.bold);
17
+ const result = blockStyle(textarea, style);
18
+ debugResult(result);
19
+ insertText(textarea, result);
20
+ debugSelection(textarea, 'After');
21
+ }
22
+ export function toggleItalic(textarea) {
23
+ if (!ensureEditable(textarea))
24
+ return;
25
+ const style = mergeWithDefaults(FORMATS.italic);
26
+ const result = blockStyle(textarea, style);
27
+ insertText(textarea, result);
28
+ }
29
+ export function toggleCode(textarea) {
30
+ if (!ensureEditable(textarea))
31
+ return;
32
+ const style = mergeWithDefaults(FORMATS.code);
33
+ const result = blockStyle(textarea, style);
34
+ insertText(textarea, result);
35
+ }
36
+ export function insertLink(textarea, options = {}) {
37
+ if (!ensureEditable(textarea))
38
+ return;
39
+ const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd);
40
+ let style = mergeWithDefaults(FORMATS.link);
41
+ const isURL = selectedText && /^https?:\/\//.test(selectedText);
42
+ if (isURL && !options.url) {
43
+ style = {
44
+ ...style,
45
+ suffix: `](${selectedText})`,
46
+ replaceNext: '',
47
+ };
48
+ }
49
+ else if (options.url) {
50
+ style = {
51
+ ...style,
52
+ suffix: `](${options.url})`,
53
+ replaceNext: '',
54
+ };
55
+ }
56
+ if (options.text && !selectedText) {
57
+ const pos = textarea.selectionStart;
58
+ textarea.value = textarea.value.slice(0, pos) + options.text + textarea.value.slice(pos);
59
+ textarea.selectionStart = pos;
60
+ textarea.selectionEnd = pos + options.text.length;
61
+ }
62
+ const result = blockStyle(textarea, style);
63
+ insertText(textarea, result);
64
+ }
65
+ export function toggleBulletList(textarea) {
66
+ if (!ensureEditable(textarea))
67
+ return;
68
+ const style = mergeWithDefaults(FORMATS.bulletList);
69
+ applyListStyle(textarea, style);
70
+ }
71
+ export function toggleNumberedList(textarea) {
72
+ if (!ensureEditable(textarea))
73
+ return;
74
+ const style = mergeWithDefaults(FORMATS.numberedList);
75
+ applyListStyle(textarea, style);
76
+ }
77
+ export function toggleQuote(textarea) {
78
+ if (!ensureEditable(textarea))
79
+ return;
80
+ debugLog('toggleQuote', 'Starting');
81
+ debugSelection(textarea, 'Initial');
82
+ const style = mergeWithDefaults(FORMATS.quote);
83
+ const result = applyLineOperation(textarea, (ta) => multilineStyle(ta, style), { prefix: style.prefix });
84
+ debugResult(result);
85
+ insertText(textarea, result);
86
+ debugSelection(textarea, 'Final');
87
+ }
88
+ export function toggleTaskList(textarea) {
89
+ if (!ensureEditable(textarea))
90
+ return;
91
+ const style = mergeWithDefaults(FORMATS.taskList);
92
+ const result = applyLineOperation(textarea, (ta) => multilineStyle(ta, style), { prefix: style.prefix });
93
+ insertText(textarea, result);
94
+ }
95
+ function findLineBoundaries(value, start, end) {
96
+ let lineStart = start;
97
+ while (lineStart > 0 && value[lineStart - 1] !== '\n') {
98
+ lineStart -= 1;
99
+ }
100
+ let lineEnd = end;
101
+ while (lineEnd < value.length && value[lineEnd] !== '\n') {
102
+ lineEnd += 1;
103
+ }
104
+ return { lineStart, lineEnd };
105
+ }
106
+ export function insertHeader(textarea, level = 1, toggle = false) {
107
+ if (!ensureEditable(textarea))
108
+ return;
109
+ if (level < 1 || level > 6)
110
+ level = 1;
111
+ debugLog('insertHeader', '============ START ============');
112
+ debugLog('insertHeader', `Level: ${level}, Toggle: ${toggle}`);
113
+ debugLog('insertHeader', `Initial cursor: ${textarea.selectionStart}-${textarea.selectionEnd}`);
114
+ const headerKey = `header${level === 1 ? '1' : level}`;
115
+ const style = mergeWithDefaults(FORMATS[headerKey] || FORMATS.header1);
116
+ debugLog('insertHeader', `Style prefix: "${style.prefix}"`);
117
+ const value = textarea.value;
118
+ const originalStart = textarea.selectionStart;
119
+ const originalEnd = textarea.selectionEnd;
120
+ const { lineStart, lineEnd } = findLineBoundaries(value, originalStart, originalEnd);
121
+ const currentLineContent = value.slice(lineStart, lineEnd);
122
+ debugLog('insertHeader', `Current line (before): "${currentLineContent}"`);
123
+ const existingHeaderMatch = currentLineContent.match(/^(#{1,6})\s*/);
124
+ const existingLevel = existingHeaderMatch ? existingHeaderMatch[1].length : 0;
125
+ const existingPrefixLength = existingHeaderMatch ? existingHeaderMatch[0].length : 0;
126
+ debugLog('insertHeader', `Existing header match: ${existingHeaderMatch ? existingHeaderMatch[0] : 'none'}`);
127
+ debugLog('insertHeader', `Existing level: ${existingLevel}`);
128
+ debugLog('insertHeader', `Target level: ${level}`);
129
+ const shouldToggleOff = toggle && existingLevel === level;
130
+ debugLog('insertHeader', `Should toggle OFF: ${shouldToggleOff}`);
131
+ const result = applyLineOperation(textarea, (ta) => {
132
+ const currentLine = ta.value.slice(ta.selectionStart, ta.selectionEnd);
133
+ debugLog('insertHeader', `Line in operation: "${currentLine}"`);
134
+ const cleanedLine = currentLine.replace(/^#{1,6}\s*/, '');
135
+ debugLog('insertHeader', `Cleaned line: "${cleanedLine}"`);
136
+ let newLine;
137
+ if (shouldToggleOff) {
138
+ debugLog('insertHeader', 'ACTION: Toggling OFF - removing header');
139
+ newLine = cleanedLine;
140
+ }
141
+ else if (existingLevel > 0) {
142
+ debugLog('insertHeader', `ACTION: Replacing H${existingLevel} with H${level}`);
143
+ newLine = style.prefix + cleanedLine;
144
+ }
145
+ else {
146
+ debugLog('insertHeader', 'ACTION: Adding new header');
147
+ newLine = style.prefix + cleanedLine;
148
+ }
149
+ debugLog('insertHeader', `New line: "${newLine}"`);
150
+ return {
151
+ text: newLine,
152
+ selectionStart: ta.selectionStart,
153
+ selectionEnd: ta.selectionEnd,
154
+ };
155
+ }, {
156
+ prefix: style.prefix,
157
+ adjustSelection: (_isRemoving, selStart, selEnd) => {
158
+ debugLog('insertHeader', `Adjusting selection with existing prefix length ${existingPrefixLength}`);
159
+ if (shouldToggleOff) {
160
+ const adjustment = Math.max(selStart - existingPrefixLength, lineStart);
161
+ return {
162
+ start: adjustment,
163
+ end: selStart === selEnd
164
+ ? adjustment
165
+ : Math.max(selEnd - existingPrefixLength, lineStart),
166
+ };
167
+ }
168
+ if (existingPrefixLength > 0) {
169
+ const prefixDiff = style.prefix.length - existingPrefixLength;
170
+ return {
171
+ start: selStart + prefixDiff,
172
+ end: selEnd + prefixDiff,
173
+ };
174
+ }
175
+ return {
176
+ start: selStart + style.prefix.length,
177
+ end: selEnd + style.prefix.length,
178
+ };
179
+ },
180
+ });
181
+ debugResult(result);
182
+ debugLog('insertHeader', `============ END ============`);
183
+ insertText(textarea, result);
184
+ }
185
+ export function toggleH1(textarea) {
186
+ insertHeader(textarea, 1, true);
187
+ }
188
+ export function toggleH2(textarea) {
189
+ insertHeader(textarea, 2, true);
190
+ }
191
+ export function toggleH3(textarea) {
192
+ insertHeader(textarea, 3, true);
193
+ }
194
+ export { getActiveFormats, hasFormat, expandSelection, preserveSelection, setDebugMode, getDebugMode, setUndoMethod, getUndoMethod };
195
+ export function applyCustomFormat(textarea, format) {
196
+ if (!ensureEditable(textarea))
197
+ return;
198
+ const style = mergeWithDefaults(format);
199
+ let result;
200
+ if (style.multiline) {
201
+ const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd);
202
+ if (isMultipleLines(selectedText)) {
203
+ result = multilineStyle(textarea, style);
204
+ }
205
+ else {
206
+ result = blockStyle(textarea, style);
207
+ }
208
+ }
209
+ else {
210
+ result = blockStyle(textarea, style);
211
+ }
212
+ insertText(textarea, result);
213
+ }
214
+ export const actions = {
215
+ toggleBold,
216
+ toggleItalic,
217
+ toggleCode,
218
+ insertLink,
219
+ toggleBulletList,
220
+ toggleNumberedList,
221
+ toggleQuote,
222
+ toggleTaskList,
223
+ insertHeader,
224
+ toggleH1,
225
+ toggleH2,
226
+ toggleH3,
227
+ getActiveFormats,
228
+ hasFormat,
229
+ expandSelection,
230
+ applyCustomFormat,
231
+ preserveSelection,
232
+ setUndoMethod,
233
+ setDebugMode,
234
+ getDebugMode,
235
+ };
236
+ export default actions;
237
+ //# sourceMappingURL=index.js.map