package Ġcom . hal ili bo . richt ext . markdown Ċ Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Composition Local Provider Ċ import Ġandroidx . compose . runtime . composition Local Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . remember Updated State Ċ import Ġandroidx . compose . ui . platform . Local Uri Handler Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Block Quote Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Bullet List Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Document Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast F enced Code Block Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Heading Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Html Block Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Indent ed Code Block Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Inline NodeType Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Link Reference Definition Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast ListItem Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Node Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Order edList Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Paragraph Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Table Body Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast TableCell Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Table Header Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Table Root Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast TableRow Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast Text Ċ import Ġcom . hal ili bo . richt ext . markdown . node . Ast The matic Break Ċ import Ġcom . hal ili bo . richt ext . ui . Block Quote Ċ import Ġcom . hal ili bo . richt ext . ui . Code Block Ċ import Ġcom . hal ili bo . richt ext . ui . Formatted List Ċ import Ġcom . hal ili bo . richt ext . ui . Heading Ċ import Ġcom . hal ili bo . richt ext . ui . Horizontal Rule Ċ import Ġcom . hal ili bo . richt ext . ui . ListType . Ordered Ċ import Ġcom . hal ili bo . richt ext . ui . ListType . Un ordered Ċ import Ġcom . hal ili bo . richt ext . ui . Rich Text Scope Ċ import Ġcom . hal ili bo . richt ext . ui . string . Inline Content Ċ import Ġcom . hal ili bo . richt ext . ui . string . Text Ċ import Ġcom . hal ili bo . richt ext . ui . string . rich TextString Ċ Ċ /** Ċ Ġ* ĠA Ġcomp osable Ġthat Ġrenders ĠMarkdown Ġcontent Ġusing ĠRich Text . Ċ Ġ* Ċ Ġ* Ġ@ param Ġcontent ĠMarkdown Ġtext . ĠNo Ġrestriction Ġon Ġlength . Ċ Ġ* Ġ@ param Ġon Link Clicked ĠA Ġfunction Ġto Ġinvoke Ġwhen Ġa Ġlink Ġis Ġclicked Ġfrom Ġrendered Ġcontent . Ċ Ġ*/ Ċ @ Composable Ċ public Ġfun ĠRich Text Scope . Markdown ( ĊĠ Ġcontent : ĠString , ĊĠ Ġon Link Clicked : Ġ(( String ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ{ ĊĠ Ġval Ġon Link Clicked State Ġ= Ġremember Updated State ( on Link Clicked ) ĊĠ Ġ// ĠCan 't Ġuse ĠUri Handler Ambient . current :: open Uri Ġhere , ĊĠ Ġ// Ġsee Ġhttps :// issue tracker . google . com / issues / 1 7 2 3 6 6 4 8 3 ĊĠ Ġval Ġreal Link Clicked Handler Ġ= Ġon Link Clicked State . value Ġ?: ĠLocal Uri Handler . current . let Ġ{ ĊĠĠĠ Ġremember Ġ{ ĊĠĠĠĠĠ Ġ{ Ġurl Ġ-> Ġit . open Uri ( url ) Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ ĠComp osition Local Provider ( Local On Link Clicked Ġprovides Ġreal Link Clicked Handler ) Ġ{ ĊĠĠĠ Ġval Ġmarkdown Ast Ġ= Ġparsed Markdown Ast ( text Ġ= Ġcontent ) ĊĠĠĠ ĠRecursive Render Markdown Ast ( ast Node Ġ= Ġmarkdown Ast ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠParse Ġmarkdown Ġcontent Ġand Ġreturn ĠAbstract ĠSyntax ĠTree ( AST ). Ċ Ġ* ĠComp osable Ġis Ġefficient Ġthanks Ġto Ġremember Ġconstruct . Ċ Ġ* Ċ Ġ* Ġ@ param Ġtext ĠMarkdown Ġtext Ġto Ġbe Ġparsed . Ċ Ġ*/ Ċ @ Composable Ċ internal Ġexpect Ġfun Ġparsed Markdown Ast ( text : ĠString ): ĠAst Node ? Ċ Ċ /** Ċ Ġ* ĠWhen Ġparsed , Ġmarkdown Ġcontent Ġor Ġany Ġother Ġrich Ġtext Ġcan Ġbe Ġrepresented Ġas Ġa Ġtree . Ċ Ġ* ĠThe Ġdefault Ġmarkdown Ġparser Ġthat Ġis Ġused Ġin Ġthis Ġproject Ġ` common - markdown ` Ġalso Ċ Ġ* Ġutil izes Ġthe Ġsaid Ġapproach . ĠAlthough Ġthere Ġare Ġways Ġto Ġiter atively Ġtraverse Ġa Ġtree , Ċ Ġ* Ġit Ġis Ġmore Ġreadable Ġand Ġcompose - friendly Ġto Ġdo Ġit Ġrecursively . Ċ Ġ* Ċ Ġ* ĠThis Ġfunction Ġbasically Ġreceives Ġa Ġnode Ġfrom Ġthe Ġtree , Ġroot Ġor Ġany Ġnode , Ġand Ġthen Ċ Ġ* Ġrecursively Ġtravel s Ġalong Ġthe Ġnodes Ġwhile Ġsp it ting Ġout Ġor Ġwrapping Ġcomp os ables Ġaround Ċ Ġ* Ġthe Ġcontent . ĠRich Text ĠAPI Ġis Ġhighly Ġcompatible Ġwith Ġthis Ġmethod . Ċ Ġ* Ċ Ġ* ĠHowever , Ġthere Ġare Ġmultiple Ġassumptions Ġto Ġincrease Ġpredict ability . ĠDes p ite Ġthe Ġfact Ċ Ġ* Ġthat Ġevery Ġ[ Ast Node ] Ġcan Ġhave Ġanother Ġ[ Ast Node ] Ġas Ġa Ġchild , Ġit Ġshould Ġnot Ġbe Ġthat Ċ Ġ* Ġgeneric Ġin ĠMarkdown Ġcontent . ĠFor Ġexample , Ġa ĠText Ġnode Ġmust Ġnot Ġhave Ġany Ġother Ġchildren . Ċ Ġ* ĠThat 's Ġwhy Ġthis Ġfunction Ġdoes Ġnot Ġhave Ġ 1 0 0 % Ġcoverage Ġfor Ġall Ġ[ Ast Node ] Ġtypes . Ċ Ġ* Ċ Ġ* ĠHeading , ĠParagraph Ġare Ġconsidered Ġto Ġbe Ġmain Ġtext Ġcontainers . ĠThe ir Ġcontent Ġis Ġreg arded Ċ Ġ* Ġas Ġone Ġblock Ġand Ġchildren Ġtraversal Ġhappens Ġseparately . Ċ Ġ* Ċ Ġ* ĠForm att edList , ĠOrder edList Ġare Ġalso Ġcontent Ġblocks . ĠThe ir Ġchildren Ġare Ġfiltered Ġbefore Ċ Ġ* Ġbeing Ġtra versed . ĠOnly ĠList Items Ġare Ġaccepted Ġas Ġvalid Ġchildren Ġfor Ġthese Ġblocks . Ċ Ġ* Ċ Ġ* ĠFor Ġnow , Ġonly Ġtables Ġare Ġrendered Ġfrom ĠCustom Block Ġor ĠCustom Node . Ċ Ġ* Ċ Ġ* Ġ@ param Ġast Node ĠRoot Ġnode Ġto Ġstart Ġrendering . Ċ Ġ*/ Ċ @ Suppress (" IMP LICIT _ CAST _ TO _ ANY ") Ċ @ Composable Ċ internal Ġfun ĠRich Text Scope . Recursive Render Markdown Ast ( ast Node : ĠAst Node ?) Ġ{ ĊĠ Ġast Node Ġ?: Ġreturn ĊĊĠ Ġwhen Ġ( val Ġast NodeType Ġ= Ġast Node . type ) Ġ{ ĊĠĠĠ Ġis ĠAst Document Ġ-> Ġvisit Children ( node Ġ= Ġast Node ) ĊĠĠĠ Ġis ĠAst Block Quote Ġ-> Ġ{ ĊĠĠĠĠĠ ĠBlock Quote Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Children ( ast Node ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst Bullet List Ġ-> Ġ{ ĊĠĠĠĠĠ ĠForm att edList ( ĊĠĠĠĠĠĠĠ Ġlist Type Ġ= ĠUn ordered , ĊĠĠĠĠĠĠĠ Ġitems Ġ= Ġast Node . filter Children Type < Ast ListItem >(). toList () ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Children ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst Order edList Ġ-> Ġ{ ĊĠĠĠĠĠ ĠForm att edList ( ĊĠĠĠĠĠĠĠ Ġlist Type Ġ= ĠOrdered , ĊĠĠĠĠĠĠĠ Ġitems Ġ= Ġast Node . children Sequence (). toList () ĊĠĠĠĠĠ Ġ) Ġ{ Ġast ListItem Ġ-> ĊĠĠĠĠĠĠĠ Ġvisit Children ( ast ListItem ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst The matic Break Ġ-> Ġ{ ĊĠĠĠĠĠ ĠHorizontal Rule () ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst Heading Ġ-> Ġ{ ĊĠĠĠĠĠ ĠHeading ( level Ġ= Ġast NodeType . level ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMarkdown Rich Text ( ast Node ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst Indent ed Code Block Ġ-> Ġ{ ĊĠĠĠĠĠ ĠCode Block ( text Ġ= Ġast NodeType . literal . trim ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst F enced Code Block Ġ-> Ġ{ ĊĠĠĠĠĠ ĠCode Block ( text Ġ= Ġast NodeType . literal . trim ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst Html Block Ġ-> Ġ{ ĊĠĠĠĠĠ ĠText ( text Ġ= Ġrich TextString Ġ{ ĊĠĠĠĠĠĠĠ Ġappend Inline Content ( content Ġ= ĠInline Content Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠHtml Block ( ast NodeType . literal ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst Link Reference Definition Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// ĠTODO ( h ali lo zer can ) ĊĠĠĠĠĠ Ġ/* Ġno - op Ġ*/ ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst Paragraph Ġ-> Ġ{ ĊĠĠĠĠĠ ĠMarkdown Rich Text ( ast Node ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst Table Root Ġ-> Ġ{ ĊĠĠĠĠĠ ĠRender Table ( ast Node ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠThis Ġshould Ġalmost Ġnever Ġhappen . ĠAll Ġthe Ġpossible Ġtext ĊĠĠĠ Ġ// Ġnodes Ġmust Ġbe Ġunder Ġeither ĠHeading , ĠParagraph Ġor ĠCustom Node ĊĠĠĠ Ġ// ĠIn Ġany Ġcase , Ġwe Ġshould Ġinclude Ġit Ġhere Ġto Ġprevent Ġany ĊĠĠĠ Ġ// Ġnon - rendered Ġtext Ġproblems . ĊĠĠĠ Ġis ĠAst Text Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// ĠTODO ( h ali lo zer can ) Ġuse Ġmulti platform Ġcompatible Ġstderr Ġlogging ĊĠĠĠĠĠ Ġprintln (" Unexpected Ġraw Ġtext Ġwhile Ġtra ver sing Ġthe ĠAbstract ĠSyntax ĠTree .") ĊĠĠĠĠĠ ĠText ( rich TextString Ġ{ Ġappend ( ast NodeType . literal ) Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst ListItem Ġ-> Ġ{ ĊĠĠĠĠĠ Ġprintln (" Markdown Rich Text : ĠUnexpected ĠAst ListItem Ġwhile Ġtra ver sing Ġthe ĠAbstract ĠSyntax ĠTree .") ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠAst Inline NodeType Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠ Ġprintln (" Markdown Rich Text : ĠUnexpected ĠAst Inline NodeType Ġ$ ast NodeType Ġwhile Ġtra ver sing Ġthe ĠAbstract ĠSyntax ĠTree .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠAst Table Body , ĊĠĠĠ ĠAst Table Header , ĊĠĠĠ ĠAst TableRow , ĊĠĠĠ Ġis ĠAst TableCell Ġ-> Ġ{ ĊĠĠĠĠĠ Ġprintln (" Markdown Rich Text : ĠUnexpected ĠTable Ġnode Ġwhile Ġtra ver sing Ġthe ĠAbstract ĠSyntax ĠTree .") ĊĠĠĠ Ġ} ĊĠ Ġ}. let Ġ{} Ċ } Ċ Ċ /** Ċ Ġ* ĠVisit Ġand Ġrender Ġchildren Ġfrom Ġfirst Ġto Ġlast . Ċ Ġ* Ċ Ġ* Ġ@ param Ġnode ĠRoot ĠAST Node Ġwhose Ġchildren Ġwill Ġbe Ġvisited . Ċ Ġ*/ Ċ @ Composable Ċ internal Ġfun ĠRich Text Scope . visit Children ( node : ĠAst Node ?) Ġ{ ĊĠ Ġnode ?. children Sequence ()?. forEach Ġ{ ĊĠĠĠ ĠRecursive Render Markdown Ast ( ast Node Ġ= Ġit ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġinternal Ġambient Ġto Ġpass Ġthrough ĠOn Link Clicked Ġfunction Ġfrom Ġroot Ġ[ Markdown ] Ġcomp osable Ċ Ġ* Ġto Ġchildren Ġthat Ġrender Ġlinks . ĠAlthough Ġbeing Ġexplicit Ġis Ġpreferred , Ġrecursive Ġcalls Ġto Ċ Ġ* Ġ[ visit Children ] Ġincreases Ġverbosity Ġwith Ġeach Ġextra Ġargument . Ċ Ġ*/ Ċ internal Ġval ĠLocal On Link Clicked Ġ= ĊĠ Ġcomposition Local Of <( String ) Ġ-> ĠUnit > Ġ{ Ġerror (" On Link Clicked Ġis Ġnot Ġprovided ") Ġ} Ċ