@@ -15,8 +15,14 @@ import {easyMDEToolbarActions} from './EasyMDEToolbarActions.ts';
1515import { initTextExpander } from './TextExpander.ts' ;
1616import { showErrorToast } from '../../modules/toast.ts' ;
1717import { 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' ;
1924import { DropzoneCustomEventReloadFiles , initDropzone } from '../dropzone.ts' ;
25+ import { createTippy } from '../../modules/tippy.ts' ;
2026
2127let elementIdCounter = 0 ;
2228
@@ -122,8 +128,7 @@ export class ComboMarkdownEditor {
122128 const monospaceText = monospaceButton . getAttribute ( monospaceEnabled ? 'data-disable-text' : 'data-enable-text' ) ;
123129 monospaceButton . setAttribute ( 'data-tooltip-content' , monospaceText ) ;
124130 monospaceButton . setAttribute ( 'aria-checked' , String ( monospaceEnabled ) ) ;
125-
126- monospaceButton ?. addEventListener ( 'click' , ( e ) => {
131+ monospaceButton . addEventListener ( 'click' , ( e ) => {
127132 e . preventDefault ( ) ;
128133 const enabled = localStorage ?. getItem ( 'markdown-editor-monospace' ) !== 'true' ;
129134 localStorage . setItem ( 'markdown-editor-monospace' , String ( enabled ) ) ;
@@ -134,12 +139,14 @@ export class ComboMarkdownEditor {
134139 } ) ;
135140
136141 const easymdeButton = this . container . querySelector ( '.markdown-switch-easymde' ) ;
137- easymdeButton ? .addEventListener ( 'click' , async ( e ) => {
142+ easymdeButton . addEventListener ( 'click' , async ( e ) => {
138143 e . preventDefault ( ) ;
139144 this . userPreferredEditor = 'easymde' ;
140145 await this . switchToEasyMDE ( ) ;
141146 } ) ;
142147
148+ this . initMarkdownButtonTableAdd ( ) ;
149+
143150 initTextareaMarkdown ( this . textarea ) ;
144151 initTextareaEvents ( this . textarea , this . dropzone ) ;
145152 }
@@ -219,6 +226,42 @@ export class ComboMarkdownEditor {
219226 } ) ;
220227 }
221228
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+
222265 switchTabToEditor ( ) {
223266 this . tabEditor . click ( ) ;
224267 }
0 commit comments