package Ġorg . intellij . markdown . parser . marker blocks Ċ Ċ import Ġorg . intellij . markdown . parser . Look ahead Text Ċ import Ġorg . intellij . markdown . parser . constraints . Markdown Constraints Ċ Ċ object ĠMarkdown Parser Util Ġ{ ĊĊĠĠĠ Ġfun Ġcalc NumberOf Con sequent E ols ( pos : ĠLook ahead Text . Position , Ġconstraints : ĠMarkdown Constraints ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( pos . offset In Current Line Ġ== Ġ- 1 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Pos Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġis Clear Line : Ġ( Look ahead Text . Position ) Ġ-> ĠBoolean Ġ= Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Constraints Ġ= ĠMarkdown Constraints . fill From Previous ( pos , Ġconstraints ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstraints Length Ġ= Ġcurrent Constraints . get Chars E aten ( pos . current Line ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Constraints . upstream With ( constraints ) Ġ&& Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraints Length Ġ>= Ġpos . current Line . length Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos . next Position ( 1 Ġ+ Ġconstraints Length )?. chars To Non Whitespace () Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( is Clear Line ( current Pos )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pos Ġ= Ġcurrent Pos . nextLine Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġbreak // return Ġ 5 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ> Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget First Non Whitespace Line Pos ( pos : ĠLook ahead Text . Position , Ġe ols To Skip : ĠInt ): ĠLook ahead Text . Position ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Pos Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġrepeat ( e ols To Skip Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pos Ġ= Ġpos . nextLine Position () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Pos . chars To Non Whitespace () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pos Ġ= Ġcurrent Pos . nextLine Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Pos ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Code Block Indent ( pos : ĠLook ahead Text . Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraints : ĠMarkdown Constraints ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstraints Length Ġ= Ġconstraints . get Chars E aten ( pos . current Line ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( pos . offset In Current Line Ġ>= Ġconstraints Length Ġ+ Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġconstraints Length .. pos . offset In Current Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos . current Line [ i ] Ġ== Ġ'\ t ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty Or Spaces ( s : ĠCharSequence ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ!= Ġ' Ġ' Ġ&& Ġc Ġ!= Ġ'\ t ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Non Empty Line With Same Constraints ( constraints : ĠMarkdown Constraints , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos : ĠLook ahead Text . Position ): ĠLook ahead Text . Position ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Pos Ġ= Ġpos ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pos Ġ= Ġcurrent Pos . nextLine Position () Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Line Constraints Ġ= ĠMarkdown Constraints . from Base ( current Pos , Ġconstraints ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġkind a Ġequals ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( nextLine Constraints . upstream With ( constraints ) Ġ&& Ġnext Line Constraints . extends Prev ( constraints ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring After Constraints Ġ= Ġnext Line Constraints . eat It self FromString ( current Pos . current Line ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Markdown Parser Util . isEmpty Or Spaces ( string After Constraints )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Pos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pos Ġ= Ġcurrent Pos . nextLine Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ