package Ġorg . jetbrains . kotlin . script . examples . shell . parser Ċ Ċ data Ġclass ĠOverview Description ( ĊĠĠĠ Ġval Ġfree Lines : ĠList < Token . Line >, ĊĠĠĠ Ġval Ġsections : ĠList < Section > Ċ ) Ġ{ ĊĠĠĠ Ġdata Ġclass ĠSection ( ĊĠĠĠĠĠĠĠ Ġval Ġtitle : ĠToken ?, ĊĠĠĠĠĠĠĠ Ġval Ġlines : ĠList < Token . Line > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Usage Section : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġtitle Ġis ĠToken . Word Ġ&& Ġtitle . word . toLowerCase () Ġ== Ġ" usage " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġtake From ( scanner : ĠScanner ) Ġ= Ġscanner . try Look ahead Ġ{ Ġtake Overview Description () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠScanner . take Overview Description (): ĠOverview Description ? Ġ{ ĊĠĠĠ Ġval Ġitems Ġ= Ġcollect Ġ{ ĊĠĠĠĠĠĠĠ Ġskip Lines Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtake Section () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. take If Ġ{ Ġit . isNotEmpty () Ġ} Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġfree Lines Ġ= Ġitems . flatMap Ġ{ Ġit . first ?. take Lines () Ġ?: Ġempty List () Ġ} Ġ+ Ġtake Lines () ĊĠĠĠ Ġval Ġsections Ġ= Ġitems . map Ġ{ Ġit . second Ġ} ĊĊĠĠĠ Ġreturn ĠOverview Description ( free Lines Ġ= Ġfree Lines , Ġsections Ġ= Ġsections ) Ċ } Ċ Ċ private Ġfun ĠScanner . take Lines () Ġ= Ġcollect Ġ{ ĊĠĠĠ Ġtake Line () Ġ?: Ġtake Empty Line ()?. let Ġ{ ĠToken . Line ("") Ġ} Ċ } Ċ Ċ private Ġfun ĠScanner . take Section (): ĠOverview Description . Section ? Ġ{ ĊĠĠĠ Ġval Ġtitle Ġ= Ġtry Look ahead Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġword Ġ= Ġtake Word () Ġ?: Ġreturn @ try Look ahead Ġnull ĊĠĠĠĠĠĠĠ Ġtake Colon () Ġ?: Ġreturn @ try Look ahead Ġnull ĊĠĠĠĠĠĠĠ Ġword ĊĠĠĠ Ġ} Ġ?: Ġtake Line () ĊĊĠĠĠ Ġtake Empty Line () ĊĊĠĠĠ Ġval Ġlines Ġ= Ġcollect Ġ{ ĊĠĠĠĠĠĠĠ Ġtake Spacing () Ġ?: Ġreturn @ collect Ġnull ĊĠĠĠĠĠĠĠ Ġtake Line () ĊĠĠĠ Ġ}. take If Ġ{ Ġit . isNotEmpty () Ġ} Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġreturn ĠOverview Description . Section ( ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġtitle , ĊĠĠĠĠĠĠĠ Ġlines Ġ= Ġlines ĊĠĠĠ Ġ) Ċ }