// ĠCopyright Ġ( c ) Ġ 2 0 1 5 - 2 0 2 0 ĠV lad im ir ĠSch ne ider Ġ< vl ad im ir . sch ne ider @ gmail . com > ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ċ package Ġcom . vl ad sch . md . nav . actions . handlers . util Ċ Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . editor . Logical Position Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . vl ad sch . flex mark . util . sequence . Repeated Sequence Ċ import Ġcom . vl ad sch . md . nav . actions . api . Md Element Context Info Provider Ċ import Ġcom . vl ad sch . md . nav . psi . element .* Ċ import Ġcom . vl ad sch . md . nav . psi . util . Block Prefixes Ċ import Ġcom . vl ad sch . md . nav . psi . util . Md Psi Impl Util Ċ import Ġcom . vl ad sch . md . nav . psi . util . Md Psi Impl Util . is Whitespace Or Blank Line Ċ import Ġcom . vl ad sch . md . nav . psi . util . Md Token Sets Ċ import Ġcom . vl ad sch . md . nav . psi . util . Md Types Ċ import Ġcom . vl ad sch . md . nav . settings . List Indent ation Type Ċ import Ġcom . vl ad sch . md . nav . settings . Md Rendering Profile Manager Ċ import Ġcom . vl ad sch . md . nav . util . format . Md Formatter Ċ import Ġcom . vl ad sch . plugin . util . max Limit Ċ import Ġcom . vl ad sch . plugin . util . min Limit Ċ import Ġcom . vl ad sch . plugin . util . psi . is Type In Ċ import Ġcom . vl ad sch . plugin . util . psi . is TypeOf Ċ import Ġcom . vl ad sch . plugin . util . to Based Ċ import Ġjava . util .* Ċ Ċ open Ġclass ĠListItem Context ( ĊĠĠĠ Ġval Ġcontext : ĠCare t Context Info , ĊĠĠĠ Ġval Ġlist Element : ĠMd List Impl , ĊĠĠĠ Ġval Ġlist Item Element : ĠMd ListItem Impl , ĊĠĠĠ Ġval Ġline Offset : ĠInt , ĊĠĠĠ Ġval ĠisEmpty Item : ĠBoolean , ĊĠĠĠ Ġval Ġis Task Item : ĠBoolean , ĊĠĠĠ Ġval Ġis Item Done : ĠBoolean , ĊĠĠĠ Ġval Ġwrapping Context : ĠWr apping Context Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġcan Indent Item (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Non First ListItem ()) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// Ġsee Ġif Ġit Ġprece ded Ġby Ġa Ġlist Ġitem ĊĠĠĠĠĠĠĠ Ġval Ġlist Element Ġ= Ġlist Element ĊĠĠĠĠĠĠĠ Ġval Ġlist Level Ġ= ĠgetList Level ( list Element ) ĊĠĠĠĠĠĠĠ Ġvar Ġprev Sibling Ġ= Ġlist Element . prev Sibling ĊĠĠĠĠĠĠĠ Ġwhile Ġ( prev Sibling Ġ!= Ġnull Ġ&& Ġis Whitespace Or Blank Line ( prev Sibling . node . elementType )) Ġprev Sibling Ġ= Ġprev Sibling . prev Sibling ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( prev Sibling Ġ!= Ġnull Ġ&& Ġprev Sibling Ġ! is ĠPsi File Ġ&& Ġprev Sibling . node . elementType Ġ! in ĠlistOf ( Md Types . B UL LET _ LIST , ĠMd Types . ORDER ED _ LIST )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Sibling Ġ= Ġprev Sibling . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( prev Sibling Ġ== Ġnull Ġ|| Ġprev Sibling Ġis ĠPsi File ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( prev Sibling . java Class Ġ!= Ġlist Element . java Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġif Ġcommon Ġmark Ġwhere Ġlist Ġtypes Ġmust Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Ġ= ĠMd Rendering Profile Manager . get Profile ( list Element . containing File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( profile . parser Settings . parser List Indent ation Type Ġ== ĠList Indent ation Type . COMMON MARK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprev List Level Ġ= ĠgetList Level ( prev Sibling ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprev List Level Ġ>= Ġlist Level ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcan Un Indent Item (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Non First Level List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Non First Level List (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġelement Ġ= Ġlist Element . parent Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġwhile Ġ(!( element Ġis ĠMd List )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠPsi File Ġ|| Ġelement . node Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġelement . parent Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġelement . is TypeOf ( Md Token Sets . LIST _ ELEMENT _ TYPES ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Non First ListItem (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Item Element Ġ= Ġlist Item Element ĊĠĠĠĠĠĠĠ Ġval Ġlist Element Ġ= Ġlist Element ĊĠĠĠĠĠĠĠ Ġreturn Ġlist Element . firstChild Ġ!== Ġlist Item Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġindent Item ( adjust Caret : ĠBoolean , Ġonly Empty Item Line : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Indent Item ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġtake Ġall Ġits Ġcontents Ġand Ġindent ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġlist Element ĊĠĠĠĠĠĠĠ Ġval Ġlist Item Ġ= Ġlist Item Element ĊĠĠĠĠĠĠĠ Ġval Ġprefixes Ġ= ĠMd Psi Impl Util . getBlock Prefixes ( list , Ġnull , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġval Ġcaret Line In Item Ġ= Ġcontext . caret Line Ġ- Ġwrapping Context . first Line ĊĊĠĠĠĠĠĠĠ Ġ// Ġindent Ġthis Ġitem Ġby Ġinserting Ġ 4 Ġspaces Ġfor Ġit Ġand Ġall Ġits Ġelements Ġand Ġchanging Ġits Ġnumber Ġto Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġitem Lines Ġ= ĠMd Psi Impl Util . lines For Wr apping ( list Item , Ġtrue , Ġtrue , Ġtrue , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġvar Ġcaret Delta Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġlines Added Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// Ġsee Ġif Ġwe Ġneed Ġto Ġinsert Ġa Ġblank Ġline Ġbefore , Ġif Ġthe Ġprevious Ġitem 's Ġlast Ġchild Ġis Ġnot Ġthe Ġfirst Ġindent ing Ġand Ġnot Ġblank Ġline ĊĠĠĠĠĠĠĠ Ġval Ġprev Sibling Ġ= Ġcontext . findElement At ( context . offset Line Start ( list Item . node . start Offset ) !! Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( prev Sibling Ġ!= Ġnull Ġ&& Ġ! Md Psi Impl Util . is Pre ce ded By Blank Line ( list Item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġblock Element Ġ= ĠMd Psi Impl Util . getBlock Element ( list Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Element Ġ!= Ġnull Ġ&& Ġblock Element . node . elementType Ġ== ĠMd Types . PAR AG R APH _ BLOCK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Element Ġ== ĠMd Psi Impl Util . find Child TextBlock ( block Element . parent )?. parent ) Ġblock Element Ġ= Ġblock Element . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Element Ġ! is ĠMd ListItem Impl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġa Ġblank Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Element Ġ== Ġnull Ġ|| Ġ! Md Psi Impl Util . is Follow edBy Blank Line ( block Element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Lines . insert Line ( 0 , Ġitem Lines [ 0 ]. prefix , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines Added ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprev ListItem Ġ= Ġprev ListItem ( list , Ġlist Item ) Ġ?: Ġlist Item ĊĠĠĠĠĠĠĠ Ġval Ġlist Item Prefixes Ġ= Ġ( prev ListItem Ġas ĠMd ListItem Impl ). item Prefixes ( prefixes , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġval Ġprefixed Lines Ġ= Ġitem Lines . copy Append able () ĊĠĠĠĠĠĠĠ ĠMd Psi Impl Util . add Line Prefix ( prefix ed Lines , Ġlist Item Prefixes . child Prefix , Ġlist Item Prefixes . child Cont Prefix ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadjust Ġfor Ġprefix Ġchange ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġ 1 Ġchar Ġfor Ġevery Ġ\ n Ġadded , Ġplus Ġone Ġprefix Ġfor Ġevery Ġline Ġadded Ġplus Ġone Ġprefix Ġchange Ġfor Ġevery Ġadditional Ġline Ġcaret Ġis Ġoffset Ġfrom Ġthe Ġfirst Ġline ĊĠĠĠĠĠĠĠ Ġval Ġprefix Change Ġ= Ġprefixed Lines [ 0 ]. prefix Length Ġ- Ġitem Lines [ 0 ]. prefix Length ĊĠĠĠĠĠĠĠ Ġcaret Delta Ġ+= Ġlines Added Ġ+ Ġ( lines Added Ġ* Ġlist Item Prefixes . child Prefix . length ) Ġ+ Ġprefix Change Ġ* Ġ( caret Line In Item Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġadjust Ġthe Ġreplaced Ġend Ġto Ġinclude Ġthe ĠE OL , Ġif Ġnot Ġdone Ġfor Ġempty Ġtask Ġitems Ġthis Ġcauses Ġan Ġextra Ġ\ n Ġto Ġbe Ġleft Ġin Ġthe Ġdocument ĊĠĠĠĠĠĠĠ Ġval Ġpost Edit Node End Ġ= Ġcontext . post Edit Node End ( list Item . node ) ĊĠĠĠĠĠĠĠ Ġval Ġvirtual Spaces Ġ= Ġcontext . editor . caret Model . logical Position . column Ġ- Ġ( context . caret Offset Ġ- Ġcontext . document . getLine Start Offset ( context . document . get LineNumber ( context . caret Offset ))) ĊĠĠĠĠĠĠĠ Ġvar Ġend Delta Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( post Edit Node End Ġ+ Ġend Delta Ġ< Ġcontext . document . text Length Ġ&& Ġ! context . document . chars Sequence . sub Sequence ( context . offset Line Start ( context . post Edit Node Start ( list Item . node )) !! , Ġpost Edit Node End Ġ+ Ġend Delta ). endsWith ("\ n ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Delta ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġinsert Ġtrailing Ġspaces Ġafter Ġan Ġempty Ġlist Ġitem ĊĠĠĠĠĠĠĠ Ġif Ġ( isEmpty Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrailing Spaces Ġ= Ġcontext . before Caret Chars . to Based (). count Trailing Space Tab () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( trailing Spaces Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefixed Lines . set Line ( 0 , Ġprefixed Lines [ 0 ]. prefix , Ġprefixed Lines [ 0 ]. text . append ( Repeated Sequence . of Spaces ( trailing Spaces ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext . document . replace String ( context . offset Line Start ( context . post Edit Node Start ( list Item . node )) !! , Ġpost Edit Node End Ġ+ Ġend Delta , Ġprefixed Lines . toString ( 1 , Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġcaret Offset Ġ= Ġcontext . adjusted Document Position (( context . caret Offset Ġ+ Ġcaret Delta ). max Limit ( context . char Sequence . length )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( adjust Caret ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Delta Ġ> Ġ 0 Ġ|| Ġvirtual Spaces Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadjust Ġfor Ġany Ġtrailing Ġspaces Ġafter Ġthe Ġmarker Ġthat Ġwere Ġremoved Ġfor Ġan Ġempty Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġcontext . editor . offset To Logical Position ( caret Offset . adjusted Offset Ġ- Ġ( end Delta Ġ- Ġ 1 ). min Limit ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . editor . caret Model . moveTo Logical Position ( Logical Position ( pos . line , Ġpos . column Ġ+ Ġ( end Delta Ġ- Ġ 1 ). min Limit ( 0 ) Ġ+ Ġvirtual Spaces )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println (" Adjust ing : Ġchange Ġ$ prefix Change , Ġline Ġ$ caret Line In Item , Ġcaret Delta Ġ$ caret Delta ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . editor . caret Model . moveTo Offset ( caret Offset . adjusted Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġthis Ġwill Ġmake Ġthis Ġitem Ġthe Ġnext Ġafter Ġthe Ġparent Ġlist Ġitem ĊĠĠĠ Ġopen Ġfun Ġun Indent Item ( adjust Caret : ĠBoolean , Ġonly Empty Item Line : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Un Indent Item ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġlist Element ĊĠĠĠĠĠĠĠ Ġval Ġlist Item Ġ= Ġlist Item Element ĊĠĠĠĠĠĠĠ Ġval Ġparent ListItem Ġ= ĠgetParent ListItem Element ( list ) ĊĠĠĠĠĠĠĠ Ġval Ġparent List Ġ= Ġif Ġ( parent ListItem Ġ!= Ġnull ) ĠgetParent List Element ( parent ListItem ) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġparent Prefixes Ġ= Ġif Ġ( parent List Ġ!= Ġnull ) ĠMd Psi Impl Util . getBlock Prefixes ( parent List , Ġnull , Ġcontext ) Ġelse ĠBlock Prefixes . EMPTY ĊĠĠĠĠĠĠĠ Ġval Ġcaret Line In Item Ġ= Ġcontext . caret Line Ġ- Ġwrapping Context . first Line ĊĊĠĠĠĠĠĠĠ Ġ// Ġun Ġindent Ġthis Ġitem Ġby Ġinserting Ġthe Ġprevious Ġparent 's Ġprefix ĊĠĠĠĠĠĠĠ Ġval Ġitem Lines Ġ= ĠMd Psi Impl Util . lines For Wr apping ( list Item , Ġtrue , Ġtrue , Ġtrue , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġvar Ġcaret Delta Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġlines Added Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġprefixed Lines Ġ= Ġitem Lines . copy Append able () ĊĠĠĠĠĠĠĠ ĠMd Psi Impl Util . add Line Prefix ( prefix ed Lines , Ġparent Prefixes . child Prefix , Ġparent Prefixes . child Cont Prefix ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadjust Ġfor Ġprefix Ġchange ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġ 1 Ġchar Ġfor Ġevery Ġ\ n Ġadded , Ġplus Ġone Ġprefix Ġfor Ġevery Ġline Ġadded Ġplus Ġone Ġprefix Ġchange Ġfor Ġevery Ġadditional Ġline Ġcaret Ġis Ġoffset Ġfrom Ġthe Ġfirst Ġline ĊĠĠĠĠĠĠĠ Ġval Ġprefix Change Ġ= Ġprefixed Lines [ 0 ]. prefix Length Ġ- Ġitem Lines [ 0 ]. prefix Length ĊĠĠĠĠĠĠĠ Ġcaret Delta Ġ+= Ġlines Added Ġ+ Ġ( lines Added Ġ* Ġparent Prefixes . child Prefix . length ) Ġ+ Ġprefix Change Ġ* Ġ( caret Line In Item Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġadjust Ġthe Ġreplaced Ġend Ġto Ġinclude Ġthe ĠE OL , Ġif Ġnot Ġdone Ġfor Ġempty Ġtask Ġitems Ġthis Ġcauses Ġan Ġextra Ġ\ n Ġto Ġbe Ġleft Ġin Ġthe Ġdocument ĊĠĠĠĠĠĠĠ Ġval Ġpost Edit Node End Ġ= Ġcontext . post Edit Node End ( list Item . node ) ĊĠĠĠĠĠĠĠ Ġval Ġvirtual Spaces Ġ= Ġcontext . editor . caret Model . logical Position . column Ġ- Ġ( context . caret Offset Ġ- Ġcontext . document . getLine Start Offset ( context . document . get LineNumber ( context . caret Offset ))) ĊĠĠĠĠĠĠĠ Ġvar Ġend Delta Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( post Edit Node End Ġ+ Ġend Delta Ġ< Ġcontext . document . text Length Ġ&& Ġ! context . document . chars Sequence . sub Sequence ( context . offset Line Start ( context . post Edit Node Start ( list Item . node )) !! , Ġpost Edit Node End Ġ+ Ġend Delta ). endsWith ("\ n ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Delta ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontext . document . replace String ( context . offset Line Start ( context . post Edit Node Start ( list Item . node )) !! , Ġpost Edit Node End Ġ+ Ġend Delta , Ġprefixed Lines . toString ( 1 , Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġcaret Offset Ġ= Ġcontext . adjusted Document Position (( context . caret Offset Ġ+ Ġcaret Delta ). min Limit ( 0 )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( adjust Caret ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Delta Ġ> Ġ 0 Ġ|| Ġvirtual Spaces Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadjust Ġfor Ġany Ġtrailing Ġspaces Ġafter Ġthe Ġmarker Ġthat Ġwere Ġremoved Ġfor Ġan Ġempty Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġcontext . editor . offset To Logical Position ( caret Offset . adjusted Offset Ġ- Ġ( end Delta Ġ- Ġ 1 ). min Limit ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . editor . caret Model . moveTo Logical Position ( Logical Position ( pos . line , Ġpos . column Ġ+ Ġ( end Delta Ġ- Ġ 1 ). min Limit ( 0 ) Ġ+ Ġvirtual Spaces )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . editor . caret Model . moveTo Offset ( caret Offset . adjusted Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġadd Item ( adjust Caret : ĠBoolean , Ġremove Done Marker : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Line Offset Ġ= Ġcontext . offset Line Start ( context . caret Offset ) ĊĠĠĠĠĠĠĠ Ġval Ġend Line Offset Ġ= Ġcontext . offset Line End ( context . caret Offset ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġlist Element ĊĊĠĠĠĠĠĠĠ Ġif Ġ( start Line Offset Ġ!= Ġnull Ġ&& Ġend Line Offset Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Item Ġ= Ġlist Item Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefixes Ġ= ĠMd Psi Impl Util . getBlock Prefixes ( list , Ġnull , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġprefixes . child Prefix ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtake Ġthe Ġprefix Ġfrom Ġwrapping Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Only Prefix Ġ= Ġlist Item . actual Text Prefix ( context , Ġtrue ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitem Prefix Ġ= Ġprefix . toString () Ġ+ Ġitem Only Prefix Ġ// wrapping Context . prefix Text (). toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove Done Marker ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Marker Pos Ġ= Ġitem Prefix . toLowerCase (). indexOf ("[ x ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task Marker Pos Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreplace Ġby Ġnot Ġcompleted Ġtask ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Prefix Ġ= Ġitem Prefix . substring ( 0 , Ġtask Marker Pos Ġ+ Ġ 1 ) Ġ+ Ġ" Ġ" Ġ+ Ġitem Prefix . substring ( task Marker Pos Ġ+ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġprefix Ġwas Ġinserted Ġthen Ġit Ġwill Ġhave Ġnot Ġjust Ġwhitespace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Pos Ġ= Ġstart Line Offset ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug (" repl acing Ġstart Ġof Ġline Ġprefix : Ġ'${ context . char Sequence . sub Sequence ( last Pos , Ġend Line Offset )} ' Ġwith : Ġ'$ item Prefix '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( last Pos Ġ< Ġend Line Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcontext . char Sequence [ last Pos ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( c . is Whitespace () Ġ|| Ġcontext . is Indenting Char ( c ))) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Pos ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . document . replace String ( start Line Offset , Ġlast Pos , Ġitem Prefix ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Length Ġ= Ġitem Prefix . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaret Offset Ġ= Ġcontext . adjusted Document Position ( start Line Offset Ġ+ Ġprefix Length ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adjust Caret ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . editor . caret Model . current Caret . moveTo Offset ( caret Offset . adjusted Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġremove Item ( adjust Caret : ĠBoolean , Ġwill Back space : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġlist Element ĊĠĠĠĠĠĠĠ Ġval Ġlist Item Ġ= Ġlist Item Element ĊĠĠĠĠĠĠĠ Ġval Ġlist Marker Node Ġ= Ġlist Item . firstChild . node ĊĠĠĠĠĠĠĠ Ġval Ġstart Line Offset Ġ= Ġcontext . offset Line Start ( context . caret Offset ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( start Line Offset Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefixes Ġ= ĠMd Psi Impl Util . getBlock Prefixes ( list , Ġnull , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġprefixes . child Prefix ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreplace Prefix Ġ= Ġif Ġ( will Back space ) Ġ" Ġ" Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadjust Caret Offset Ġ= Ġif Ġ( will Back space ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Start Offset Ġ= Ġcontext . post Edit Node Start ( list Marker Node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Marker Node Ġ= ĠMd Psi Impl Util . next Non WhiteSpace Sibling ( list Marker Node ) Ġ?: Ġlist Marker Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode End Offset Ġ= Ġcontext . post Edit Node End ( last Marker Node ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġif Ġwe Ġneed Ġto Ġinsert Ġa Ġblank Ġline Ġbefore , Ġif Ġthe Ġprevious Ġitem 's Ġlast Ġchild Ġis Ġnot Ġthe Ġfirst Ġindent ing Ġand Ġnot Ġblank Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isEmpty Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Sibling Ġ= Ġcontext . findElement At ( context . offset Line Start ( list Item . node . start Offset ) !! Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Sibling Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Sibling Ġ! is ĠMd Blank Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Element Ġ= ĠMd Psi Impl Util . getBlock Element ( prev Sibling ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Element Ġ== Ġnull Ġ|| Ġ! Md Psi Impl Util . is Follow edBy Blank Line ( block Element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġa Ġblank Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Prefix Ġ= Ġ"\ n " Ġ+ Ġprefix Ġ+ Ġreplace Prefix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Caret Offset Ġ+= Ġprefix . length Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġif Ġwe Ġneed Ġto Ġinsert Ġa Ġblank Ġline Ġafter , Ġif Ġthe Ġitem 's Ġlast Ġchild Ġis Ġnot Ġthe Ġfirst Ġindent ing Ġand Ġnot Ġblank Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Sibling Ġ= Ġlist Item . next Sibling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Sibling Ġ! is ĠMd Blank Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Item . children . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Block Element Ġ= ĠMd Psi Impl Util . getBlock Element ( list Item . last Child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Block Element Ġ!= Ġnull Ġ&& Ġ! Md Psi Impl Util . is Follow edBy Blank Line ( child Block Element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock End Offset Ġ= Ġcontext . post Edit Node End ( child Block Element . node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . document . insert String ( block End Offset , Ġprefix . toString () Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġa Ġblank Ġline Ġafter Ġthe Ġparagraph Ġor Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Element Ġ= ĠMd Psi Impl Util . find Child TextBlock ( list Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Element Ġ!= Ġnull Ġ&& Ġ! Md Psi Impl Util . is Follow edBy Blank Line ( block Element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock End Offset Ġ= Ġcontext . post Edit Node End ( block Element . node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . document . insert String ( block End Offset , Ġprefix . toString () Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . document . replace String ( node Start Offset , Ġif Ġ( will Back space ) Ġcontext . wrapping Context ?. first Prefix End ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġnode End Offset Ġelse Ġnode End Offset , Ġreplace Prefix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . document . replace String ( node Start Offset , Ġif Ġ( will Back space ) Ġcontext . wrapping Context ?. first Prefix End ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġnode End Offset Ġelse Ġnode End Offset , Ġreplace Prefix Ġ+ Ġif Ġ( will Back space ) Ġ"" Ġelse Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaret Offset Ġ= Ġcontext . adjusted Document Position ( node Start Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adjust Caret ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . editor . caret Model . current Caret . moveTo Offset ( caret Offset . adjusted Offset Ġ+ Ġadjust Caret Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLogger . getInstance (" com . vl ad sch . md . nav . editor . handlers . list ") ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġval ĠTRACE _ LIST _ ITEM _ EDIT : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun ĠgetContext ( context : ĠCare t Context Info , Ġpre Edit ListItem Element : ĠPsi Element ? Ġ= Ġnull ): ĠListItem Context ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaret Offset Ġ= Ġcontext . caret Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcaret Line Ġ= Ġcontext . offset LineNumber ( context . pre Edit Offset ( caret Offset )) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠuseContext Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Md Psi Impl Util . isBlank Line ( context . findElement At ( caret Offset ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgo Ġup Ġto Ġnon Ġblank Ġand Ġcheck ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( caret Line Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaret Line -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġcontext . line Start ( caret Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= Ġcontext . line End ( caret Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( startIndex Ġ!= Ġnull Ġ&& Ġend Index Ġ!= Ġnull Ġ&& ĠstartIndex Ġ< Ġend Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Md Psi Impl Util . isBlank Line ( context . file . findElement At ( end Index Ġ- Ġ 1 ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcan Ġfind Ġstart Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuseContext Ġ= ĠCare t Context Info . sub Context ( context , Ġend Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . caret Line Ġ- Ġcaret Line Ġ> Ġ 1 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapping Context Ġ= ĠuseContext . wrapping Context ?. with Main ListItem ( context , Ġpre Edit ListItem Element ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wrapping Context . main Element Ġis ĠMd ListItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wrapping Context . main Element Ġ=== Ġpre Edit ListItem Element Ġ|| Ġwrapping Context . format Element Ġ== Ġnull Ġ|| ĠMd Psi Impl Util . is First Indent ed Block ( wrapping Context . format Element , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Sibling Ġ= ĠMd Psi Impl Util . next Non WhiteSpace Sibling ( wrapping Context . main Element . firstChild . node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Task Item Ġ= Ġnext Sibling . is Type In ( Md Token Sets . TASK _ LIST _ ITEM _ MARK ERS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Item Done Ġ= Ġis Task Item Ġ&& Ġnext Sibling Ġ!= Ġnull Ġ&& Ġnext Sibling . elementType Ġ!= ĠMd Types . TASK _ ITEM _ MARKER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Element Ġ= ĠgetParent List Element ( wrapping Context . main Element ) Ġas ĠMd List Impl ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Item Element Ġ= Ġwrapping Context . main Element Ġas ? ĠMd ListItem Impl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Element Ġ!= Ġnull Ġ&& Ġlist Item Element Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMd Element Context Info Provider . PROVIDER . value . get ListItem Context ( context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Item Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . caret Line Ġ- Ġcaret Line , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrapping Context . start Offset Ġ== Ġwrapping Context . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Task Item , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Item Done , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrapping Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġlast ListItem ( list : ĠPsi Element ): ĠMd ListItem Impl ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchild ListItem Ġ= Ġlist . last Child ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( child ListItem Ġ!= Ġnull Ġ&& Ġchild ListItem Ġ! is ĠMd ListItem Impl ) Ġchild ListItem Ġ= Ġchild ListItem . prev Sibling ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchild ListItem Ġas ? ĠMd ListItem Impl ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġlist ItemCount ( list : ĠPsi Element ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitems Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġlist . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġis ĠMd ListItem Impl ) Ġitems ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitems ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetParent List Element ( list Item : ĠPsi Element ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġelement Ġ= Ġlist Item ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( element Ġ! is ĠMd List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġelement . parent Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠPsi File Ġ|| Ġelement . node Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetParent ListItem Element ( list : ĠPsi Element ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġelement Ġ= Ġlist . parent Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( element Ġ! is ĠMd ListItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġelement . parent Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠPsi File Ġ|| Ġelement . node Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġprev ListItem ( list : ĠPsi Element , Ġlist Item : ĠPsi Element ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprev ListItem : ĠPsi Element ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġlist . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ=== Ġlist Item ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġis ĠMd ListItem ) Ġprev ListItem Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprev ListItem ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetList Level ( list Element : ĠPsi Element ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist Element Ġ= Ġlist Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist Level Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( list Element Ġ! is ĠPsi File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Element Ġis ĠMd List ) Ġlist Level ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Element Ġ= Ġlist Element . parent Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist Level ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠAdd Blank Line Type ( val Ġadd Before : ĠBoolean , Ġval Ġadd After : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNONE ( false , Ġfalse ), ĠAFTER ( false , Ġtrue ), ĠBE FORE ( true , Ġfalse ), ĠA ROUND ( true , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġlo osen List Items ( list Element : ĠPsi Element , Ġlist Items : ĠSet < Psi Element >? Ġ= Ġnull , Ġmax W anted : ĠInt Ġ= ĠInt . MAX _ VALUE ): ĠPair < List < Add Blank Line Type >, ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Add Blank Line Type >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist ItemCount Ġ= Ġlist ItemCount ( list Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist Item Ordinal Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstate Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list ItemCount Ġ< Ġ 2 Ġ|| Ġlist Element Ġ! is ĠMd List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Add Blank Line Type . NONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( result , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġlist Element . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ! is ĠMd ListItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadd Blank Line Type Ġ= ĠAdd Blank Line Type . NONE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Items Ġ== Ġnull Ġ|| Ġlist Items . contains ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( item . next Sibling Ġ== Ġnull Ġ|| Ġitem . next Sibling . is TypeOf ( Md Token Sets . BLANK _ LINE _ SET )) Ġ&& Ġ! Md Psi Impl Util . is Follow edBy Blank Line ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Item Ordinal Ġ== Ġlist ItemCount Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Element . parent Ġis ĠMd ListItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Blank Line Type Ġ= ĠAdd Blank Line Type . AFTER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Blank Line Type Ġ= ĠAdd Blank Line Type . AFTER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Item Ordinal Ġ== Ġ 0 Ġ&& ĠMd Formatter . list Needs Blank Line Before ( list Element , Ġnull , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġitem . node . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Offset Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! add Blank Line Type . add After ) Ġadd Blank Line Type Ġ= ĠAdd Blank Line Type . BEFORE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġadd Blank Line Type Ġ= ĠAdd Blank Line Type . AR O UND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( add Blank Line Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Blank Line Type . add After ) Ġ++ state ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Blank Line Type . add Before ) Ġ++ state ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ>= Ġmax W anted ) Ġreturn ĠPair ( result , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Item Ordinal ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( result , Ġstate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġtight en List Items ( list Element : ĠPsi Element , Ġlist Items : ĠSet < Psi Element >? Ġ= Ġnull , Ġmax W anted : ĠInt Ġ= ĠInt . MAX _ VALUE ): ĠPair < List < Psi Element >, ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Psi Element >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist ItemCount Ġ= Ġlist ItemCount ( list Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist Item Ordinal Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstate Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list ItemCount Ġ< Ġ 2 Ġ|| Ġlist Element Ġ! is ĠMd List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( result , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop For @ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġlist Element . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ! is ĠMd ListItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Items Ġ== Ġnull Ġ|| Ġlist Items . contains ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Item Ordinal Ġ== Ġ 0 Ġ&& ĠMd Psi Impl Util . parent Skip Block Quote ( list Element ) Ġis ĠMd ListItem Ġ&& Ġ! Md Formatter . list Needs Blank Line Before ( list Element , Ġnull , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Sibling Ġ= ĠMd Psi Impl Util . prev Non WhiteSpace Sibling ( item . prev Sibling ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Sibling Ġis ĠMd Paragraph ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġif Ġthis Ġis Ġour Ġparent Ġitem Ġparagraph ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġlist Element . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠMd ListItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent . is First Item Block ( prev Sibling )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġblank Line Ġ= ĠMd Psi Impl Util . pre ced ing Blank Line ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġresult . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( blank Line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( index , Ġblank Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ>= Ġmax W anted ) Ġbreak @ loop For ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblank Line Ġ= ĠMd Psi Impl Util . pre ced ing Blank Line ( blank Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Item Ordinal Ġ!= Ġlist ItemCount Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġblank Line Ġ= ĠMd Psi Impl Util . following Blank Line ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( blank Line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( blank Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ>= Ġmax W anted ) Ġbreak @ loop For ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblank Line Ġ= ĠMd Psi Impl Util . following Blank Line ( blank Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Item Ordinal ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( result , Ġstate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġcan T ight en List ( list Element : ĠPsi Element , Ġlist Items : ĠSet < Psi Element >? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist ItemCount ( list Element ) Ġ> Ġ 1 Ġ&& Ġtight en List Items ( list Element , Ġlist Items , Ġ 1 ). second Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġcan Lo osen List ( list Element : ĠPsi Element , Ġlist Items : ĠSet < Psi Element >? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist ItemCount ( list Element ) Ġ> Ġ 1 Ġ&& Ġlo osen List Items ( list Element , Ġlist Items , Ġ 1 ). second Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġis L oose List ( list Element : ĠPsi Element , Ġlist Items : ĠSet < Psi Element >? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! can T ight en List ( list Element , Ġlist Items ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġis T ight List ( list Element : ĠPsi Element , Ġlist Items : ĠSet < Psi Element >? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! can Lo osen List ( list Element , Ġlist Items ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmake L oose List ( context : ĠCare t Context Info , Ġlist Element : ĠPsi Element , Ġlist Items : ĠSet < Psi Element > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaret Offset Ġ= Ġcontext . adjusted Document Position ( context . caret Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefixes Ġ= ĠMd Psi Impl Util . getBlock Prefixes ( list Element , Ġnull , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( item List , Ġ_) Ġ= Ġlo osen List Items ( list Element , Ġlist Items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġlist Element . children ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġlist Items ?. size Ġ?: Ġlist ItemCount ( list Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġchildren . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ! is ĠMd ListItem Impl Ġ|| Ġlist Items Ġ!= Ġnull Ġ&& Ġ! list Items . contains ( item )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinsert Type Ġ= Ġitem List [ -- i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( insert Type . add After ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . document . insert String ( context . post Edit Node End ( item . node ), Ġprefixes . child Prefix . toString () Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( insert Type . add Before ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . document . insert String ( context . offset Line Start ( context . post Edit Node Start ( item . node )) !! , Ġprefixes . child Prefix . toString () Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . editor . caret Model . moveTo Offset ( caret Offset . adjusted Offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmake T ight List ( context : ĠCare t Context Info , Ġlist Element : ĠPsi Element , Ġlist Items : ĠSet < Psi Element > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( blank Lines , Ġ_) Ġ= Ġtight en List Items ( list Element , Ġlist Items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaret Offset Ġ= Ġcontext . adjusted Document Position ( context . caret Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġblank Lines . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġline . node . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġstart Offset Ġ+ Ġline . node . text Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . document . delete String ( start Offset , Ġend Offset . max Limit ( context . char Sequence . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . editor . caret Model . moveTo Offset ( caret Offset . adjusted Offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġlist Item Ordinal ( list : ĠPsi Element , Ġlist Item : ĠPsi Element ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist Item Ordinal Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġlist . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ! is ĠMd ListItem ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Item Ordinal ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ=== Ġlist Item ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist Item Ordinal ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ