package Ġcom . devel ange l . mark w olf . action . markdown Ċ Ċ import Ġcom . devel ange l . mark w olf . domain . O wl Document Ċ import Ġcom . devel ange l . mark w olf . util . count Extended Ċ import Ġcom . devel ange l . mark w olf . util . width For Ċ import Ġcom . intellij . openapi . action System . An Action Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . action System . Common Data Keys Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġkotlin . math . max Ċ Ċ const Ġval ĠMIN _ WIDTH Ġ= Ġ 5 Ċ const Ġval ĠMIN _ DASH ES Ġ= Ġ 3 Ċ Ċ fun Ġtrim Border ( line : ĠString ): ĠString Ġ{ ĊĠ Ġvar Ġs Ġ= Ġ 0 ; ĊĠ Ġvar Ġe Ġ= Ġline . length ; ĊĠ Ġif Ġ( line [ 0 ] Ġ== Ġ'| ') Ġs ++; ĊĠ Ġif Ġ( e Ġ> Ġs Ġ&& Ġline [ e Ġ- Ġ 1 ] Ġ== Ġ'| ') Ġe --; ĊĠ Ġreturn Ġline . substring ( s , Ġe ); Ċ } Ċ Ċ fun Ġis Bar ( value : ĠString ): ĠBoolean Ġ{ ĊĠ Ġvar Ġvs Ġ= Ġvalue . trim (': ') ĊĠ Ġif Ġ( value . length Ġ< ĠMIN _ DASH ES ) Ġreturn Ġfalse ĊĠ Ġreturn Ġvs Ġ== Ġ"- ". repeat ( vs . length ) Ġ|| Ġvs Ġ== Ġ" =". repeat ( vs . length ) Ċ } Ċ Ċ class ĠCell ( content : ĠString , Ġprivate Ġval Ġreal : ĠCell ? Ġ= Ġnull , Ġvar Ġcol : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠ Ġprivate Ġval Ġcontent Ġ= Ġcontent . trim () ĊĠ Ġprivate Ġvar Ġreserved Width : ĠInt Ġ= Ġwidth For ( content ) ĊĠ Ġprivate Ġvar Ġchildren Width : ĠInt Ġ= Ġ 0 ĊĠ Ġval Ġis Bar : ĠBoolean Ġ= Ġif Ġ( real Ġ!= Ġnull ) Ġ{ Ġfalse Ġ} Ġelse Ġ{ Ġis Bar ( content . trim ()) Ġ} ĊĠ Ġvar Ġwidth : ĠInt ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġif Ġ( this . real Ġ!= Ġnull Ġ|| Ġis Bar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMIN _ WIDTH ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġsw Ġ= Ġmax ( width For ( content ) Ġ+ 2 , Ġreserved Width ) ĊĠĠĠĠĠ Ġreturn Ġmax ( sw Ġ- Ġthis . children Width , ĠMIN _ WIDTH ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( this . real Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . real . children Width Ġ+= Ġvalue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġthis . reserved Width Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmake Content (): ĠString Ġ{ ĊĠĠĠ Ġval Ġwidth Ġ= Ġreserved Width Ġ+ Ġchildren Width Ġ- Ġ 2 Ġ- Ġcount Extended ( content ) ĊĠĠĠ Ġreturn Ġ" Ġ% -${ width } s Ġ". format ( content ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmake Bar (): ĠString Ġ{ ĊĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( content . startsWith (" :" )) Ġ":" Ġelse Ġ"-" ĊĠĠĠ Ġval Ġsuffix Ġ= Ġif Ġ( content . endsWith (" :" )) Ġ":" Ġelse Ġ"-" ĊĠĠĠ Ġvar Ġvs Ġ= Ġcontent . trim (': '). substring ( 0 , Ġ 1 ) ĊĠĠĠ Ġreturn Ġprefix Ġ+ Ġ( vs . repeat ( reserved Width - 2 )) Ġ+ Ġsuffix ĊĠ Ġ} ĊĊĠ Ġval Ġalign : ĠString ? ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġif Ġ( is Bar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( content . endsWith (" :" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( content . startsWith (" :" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" center " ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" right " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠ Ġval Ġtext : ĠString ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġcol Ġ!= Ġ 1 Ġ-> Ġ"" ĊĠĠĠĠĠĠĠ Ġis Bar Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . make Bar () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreal Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreal . make Content () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . make Content () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġget HTML ( tag : ĠString , Ġalign : ĠString ?): ĠString Ġ{ ĊĠĠĠ Ġif Ġ( this . real Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġparams Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġif Ġ( col > 1 ) Ġ{ ĊĠĠĠĠĠ Ġparams . add (" col span =\" ${ col }\" ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( align != null ) Ġ{ ĊĠĠĠĠĠ Ġparams . add (" align =\" ${ align }\" ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġparam Ġ= Ġif Ġ( params . size > 0 ) Ġ" Ġ${ params . join ToString (" Ġ") }" Ġelse Ġ"" ĊĠĠĠ Ġreturn Ġ"< ${ tag }${ param }> ${ content }</ ${ tag }> " ĊĠ Ġ} Ċ } Ċ Ċ fun Ġline To Cells ( line : ĠString , Ġtrim : ĠBoolean ): ĠList < Cell > Ġ{ ĊĠ Ġval Ġwords Ġ= Ġtrim Border ( line ). split ("| ") ĊĠĠĠ Ġ. map Ġ{ Ġif Ġ( it . isEmpty ()) Ġnull Ġelse Ġif Ġ( trim ) Ġit . trim () Ġelse Ġit Ġ} ĊĠ Ġval Ġcells Ġ= Ġmutable ListOf < Cell >() ĊĠ Ġfor Ġ(( idx , Ġword ) Ġin Ġwords . with Index ()) Ġ{ ĊĠĠĠ Ġif Ġ( word Ġ== Ġnull Ġ&& Ġidx Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġreal Ġ= Ġcells [ idx Ġ- Ġ 1 ] ĊĠĠĠĠĠ Ġval Ġcell Ġ= ĠCell ("", Ġreal , Ġreal . col ) ĊĠĠĠĠĠ Ġcells [ idx - 1 ] Ġ= Ġcell ; ĊĠĠĠĠĠ Ġreal . col Ġ+= Ġ 1 ĊĠĠĠĠĠ Ġcells . add ( real ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġcells . add ( Cell ( word . or Empty ())) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġreturn Ġcells . toList () Ċ } Ċ Ċ fun Ġto Cells ( table Str : ĠString , Ġtrim : ĠBoolean ): ĠList < List < Cell >> Ġ{ ĊĠ Ġreturn Ġtable Str . split ("\ n "). map Ġ{ Ġline To Cells ( it , Ġtrim ) Ġ} Ċ } Ċ Ċ fun Ġinverse Cells ( rows : ĠList < List < Cell >> ): ĠList < List < Cell >> Ġ{ ĊĠ Ġval Ġcol Size Ġ= Ġrows . map Ġ{ Ġit . size Ġ}. max () Ġ?: Ġ 0 ĊĠ Ġval Ġcolumns Ġ= ĠMutable List < Mutable List < Cell >>( col Size ) Ġ{ Ġmutable ListOf < Cell >() Ġ} ĊĠ Ġfor Ġ( row Ġin Ġrows ) Ġ{ ĊĠĠĠ Ġfor Ġ(( col Index , Ġcell ) Ġin Ġrow . with Index ()) Ġ{ ĊĠĠĠĠĠ Ġcolumns [ col Index ]. add ( cell ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġreturn Ġcolumns Ċ } Ċ Ċ fun Ġformat Table ( table Str : ĠString , Ġtrim : ĠBoolean ): ĠString Ġ{ ĊĠ Ġval Ġrows Ġ= Ġto Cells ( table Str , Ġtrim ) ĊĠ Ġval Ġcolumns Ġ= Ġinverse Cells ( rows ) ĊĠ Ġfor Ġ( Ġcol Ġin Ġcolumns Ġ) Ġ{ ĊĠĠĠ Ġval ĠmaxWidth Ġ= Ġcol . map Ġ{ Ġcell Ġ-> Ġcell . width Ġ}. max () Ġ?: ĠMIN _ WIDTH ĊĠĠĠ Ġfor Ġ( Ġv Ġin Ġcol Ġ) Ġv . width Ġ= ĠmaxWidth ĊĠ Ġ} ĊĠ Ġreturn Ġrows . join ToString ("\ n ") Ġ{ Ġrow Ġ-> Ġ"| ${ row . join ToString ("| ") Ġ{ Ġit . text Ġ}} |" Ġ} Ċ } Ċ Ċ fun Ġconvert Table ( table Str : ĠString ): ĠString Ġ{ ĊĠ Ġval Ġrows Ġ= Ġto Cells ( table Str , Ġtrue ) ĊĠ Ġvar Ġtag Ġ= Ġ" th " ĊĠ Ġval Ġalign s Ġ= Ġrows . find Ġ{ Ġit . first (). is Bar Ġ} ?. map Ġ{ Ġit . align Ġ} ĊĠ Ġreturn Ġ"< table >\ n " Ġ+ Ġrows . map NotNull Ġ{ Ġcells Ġ-> ĊĠĠĠ Ġif Ġ( cells . first (). is Bar ) Ġ{ ĊĠĠĠĠĠ Ġtag Ġ= Ġ" td " ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ"< tr >" Ġ+ Ġcells . map Indexed Ġ{ Ġidx , Ġcell Ġ-> ĊĠĠĠĠĠĠĠ Ġcell . get HTML ( tag , Ġalign s ?. get ( idx )) ĊĠĠĠĠĠ Ġ}. join ToString ("") Ġ+ Ġ"</ tr >" ĊĠĠĠ Ġ} ĊĠ Ġ}. join ToString ("\ n ") Ġ+ Ġ"\ n </ table >" Ċ } Ċ Ċ fun Ġget Range As Table ( doc : ĠO wl Document ): ĠText Range Ġ{ ĊĠ Ġvar Ġcurrent Line Ġ= Ġdoc . current Caret . caret Model . logical Position . line ĊĠ Ġval Ġstart Table Line Ġ= Ġ( current Line Ġdown To Ġ 0 ) ĊĠĠĠ Ġ. find Ġ{ Ġdoc . getText By Line ( it ). isEmpty () Ġ} ?. plus ( 1 ) Ġ?: Ġ 0 ĊĠ Ġval Ġend Table Line Ġ= Ġ( current Line .. doc . last Line ) ĊĠĠĠ Ġ. find Ġ{ Ġdoc . getText By Line ( it ). isEmpty () Ġ} ?. minus ( 1 ) Ġ?: Ġdoc . last Line ĊĊĠ Ġreturn ĠText Range ( doc . getLine Start Offset ( start Table Line ), Ġdoc . getLine End Offset ( end Table Line )) Ċ } Ċ Ċ class ĠFormat Table Action Ġ: ĠAn Action () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġupdate ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . presentation . isEnabled And Visible Ġ= Ġe . project Ġ!= Ġnull Ġ&& Ġe . getData ( Common Data Keys . EDITOR ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠO wl Document ( e ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtable Range Ġ= Ġget Range As Table ( doc ) ĊĠĠĠĠĠĠĠ Ġdoc . safe Replace ( table Range , Ġformat Table ( doc . getText By Range ( table Range ), Ġfalse )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠRe format Table Action Ġ: ĠAn Action () Ġ{ ĊĠ Ġoverride Ġfun Ġupdate ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠ Ġe . presentation . isEnabled And Visible Ġ= Ġe . project Ġ!= Ġnull Ġ&& Ġe . getData ( Common Data Keys . EDITOR ) Ġ!= Ġnull ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠ Ġval Ġdoc Ġ= ĠO wl Document ( e ) ĊĊĠĠĠ Ġval Ġtable Range Ġ= Ġget Range As Table ( doc ) ĊĠĠĠ Ġdoc . safe Replace ( table Range , Ġformat Table ( doc . getText By Range ( table Range ), Ġtrue )) ĊĠ Ġ} Ċ } Ċ Ċ class ĠConvert Table Action Ġ: ĠAn Action () Ġ{ ĊĠ Ġoverride Ġfun Ġupdate ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠ Ġe . presentation . isEnabled And Visible Ġ= Ġe . project Ġ!= Ġnull Ġ&& Ġe . getData ( Common Data Keys . EDITOR ) Ġ!= Ġnull ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠ Ġval Ġdoc Ġ= ĠO wl Document ( e ) ĊĊĠĠĠ Ġval Ġtable Range Ġ= Ġget Range As Table ( doc ) ĊĠĠĠ Ġdoc . safe Replace ( table Range , Ġconvert Table ( doc . getText By Range ( table Range ))) ĊĠ Ġ} Ċ } Ċ