@@ -15,8 +15,14 @@ import {easyMDEToolbarActions} from './EasyMDEToolbarActions.ts';
15
15
import { initTextExpander } from './TextExpander.ts' ;
16
16
import { showErrorToast } from '../../modules/toast.ts' ;
17
17
import { POST } from '../../modules/fetch.ts' ;
18
- import { EventEditorContentChanged , initTextareaMarkdown , triggerEditorContentChanged } from './EditorMarkdown.ts' ;
18
+ import {
19
+ EventEditorContentChanged ,
20
+ initTextareaMarkdown ,
21
+ textareaInsertText ,
22
+ triggerEditorContentChanged ,
23
+ } from './EditorMarkdown.ts' ;
19
24
import { DropzoneCustomEventReloadFiles , initDropzone } from '../dropzone.ts' ;
25
+ import { createTippy } from '../../modules/tippy.ts' ;
20
26
21
27
let elementIdCounter = 0 ;
22
28
@@ -122,8 +128,7 @@ export class ComboMarkdownEditor {
122
128
const monospaceText = monospaceButton . getAttribute ( monospaceEnabled ? 'data-disable-text' : 'data-enable-text' ) ;
123
129
monospaceButton . setAttribute ( 'data-tooltip-content' , monospaceText ) ;
124
130
monospaceButton . setAttribute ( 'aria-checked' , String ( monospaceEnabled ) ) ;
125
-
126
- monospaceButton ?. addEventListener ( 'click' , ( e ) => {
131
+ monospaceButton . addEventListener ( 'click' , ( e ) => {
127
132
e . preventDefault ( ) ;
128
133
const enabled = localStorage ?. getItem ( 'markdown-editor-monospace' ) !== 'true' ;
129
134
localStorage . setItem ( 'markdown-editor-monospace' , String ( enabled ) ) ;
@@ -134,12 +139,14 @@ export class ComboMarkdownEditor {
134
139
} ) ;
135
140
136
141
const easymdeButton = this . container . querySelector ( '.markdown-switch-easymde' ) ;
137
- easymdeButton ? .addEventListener ( 'click' , async ( e ) => {
142
+ easymdeButton . addEventListener ( 'click' , async ( e ) => {
138
143
e . preventDefault ( ) ;
139
144
this . userPreferredEditor = 'easymde' ;
140
145
await this . switchToEasyMDE ( ) ;
141
146
} ) ;
142
147
148
+ this . initMarkdownButtonTableAdd ( ) ;
149
+
143
150
initTextareaMarkdown ( this . textarea ) ;
144
151
initTextareaEvents ( this . textarea , this . dropzone ) ;
145
152
}
@@ -219,6 +226,42 @@ export class ComboMarkdownEditor {
219
226
} ) ;
220
227
}
221
228
229
+ generateMarkdownTable ( rows : number , cols : number ) : string {
230
+ const tableLines = [ ] ;
231
+ tableLines . push (
232
+ `| ${ 'Header ' . repeat ( cols ) . trim ( ) . split ( ' ' ) . join ( ' | ' ) } |` ,
233
+ `| ${ '--- ' . repeat ( cols ) . trim ( ) . split ( ' ' ) . join ( ' | ' ) } |` ,
234
+ ) ;
235
+ for ( let i = 0 ; i < rows ; i ++ ) {
236
+ tableLines . push ( `| ${ 'Cell ' . repeat ( cols ) . trim ( ) . split ( ' ' ) . join ( ' | ' ) } |` ) ;
237
+ }
238
+ return tableLines . join ( '\n' ) ;
239
+ }
240
+
241
+ initMarkdownButtonTableAdd ( ) {
242
+ const addTableButton = this . container . querySelector ( '.markdown-button-table-add' ) ;
243
+ const addTablePanel = this . container . querySelector ( '.markdown-add-table-panel' ) ;
244
+ // here the tippy can't attach to the button because the button already owns a tippy for tooltip
245
+ const addTablePanelTippy = createTippy ( addTablePanel , {
246
+ content : addTablePanel ,
247
+ trigger : 'manual' ,
248
+ placement : 'bottom' ,
249
+ hideOnClick : true ,
250
+ interactive : true ,
251
+ getReferenceClientRect : ( ) => addTableButton . getBoundingClientRect ( ) ,
252
+ } ) ;
253
+ addTableButton . addEventListener ( 'click' , ( ) => addTablePanelTippy . show ( ) ) ;
254
+
255
+ addTablePanel . querySelector ( '.ui.button.primary' ) . addEventListener ( 'click' , ( ) => {
256
+ let rows = parseInt ( addTablePanel . querySelector < HTMLInputElement > ( '[name=rows]' ) . value ) ;
257
+ let cols = parseInt ( addTablePanel . querySelector < HTMLInputElement > ( '[name=cols]' ) . value ) ;
258
+ rows = Math . max ( 1 , Math . min ( 100 , rows ) ) ;
259
+ cols = Math . max ( 1 , Math . min ( 100 , cols ) ) ;
260
+ textareaInsertText ( this . textarea , `\n${ this . generateMarkdownTable ( rows , cols ) } \n\n` ) ;
261
+ addTablePanelTippy . hide ( ) ;
262
+ } ) ;
263
+ }
264
+
222
265
switchTabToEditor ( ) {
223
266
this . tabEditor . click ( ) ;
224
267
}
0 commit comments