// ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . google . gson . JsonObject Ċ import Ġcom . google . gson . Json Parser Ċ import Ġcom . google . gson . Json Primitive Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġcom . intellij . documentation . md n . M dn Api Status Ċ import Ġcom . intellij . documentation . md n . M dn Html Attribute Documentation Ċ import Ġcom . intellij . documentation . md n . M dn Html Element Documentation Ċ import Ġcom . intellij . lang . html . HTML Language Ċ import Ġcom . intellij . openapi . application . Path Manager Ċ import Ġcom . intellij . openapi . util . io . File Util Ċ import Ġcom . intellij . psi . Psi File Factory Ċ import Ġcom . intellij . psi . XmlElement Factory Ċ import Ġcom . intellij . psi . Xml Recursive Element Visitor Ċ import Ġcom . intellij . psi . impl . source . html . Html File Impl Ċ import Ġcom . intellij . psi . xml . XmlElement Ċ import Ġcom . intellij . psi . xml . Xml Tag Ċ import Ġcom . intellij . psi . xml . Xml Text Ċ import Ġcom . intellij . test Framework . fixtures . Base Platform TestCase Ċ import Ġcom . intellij . util . cast S af ely To Ċ import Ġcom . intellij . util . text . Name Util Core Ċ import Ġjunit . framework . TestCase Ċ import Ġorg . junit . Ignore Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . Suite Ċ import Ġjava . io . File Ċ import Ġjava . io . FileReader Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util .* Ċ Ċ val Ġmissing Doc Ġ= Ġmap Of ( ĊĠ Ġ// HTML ĊĠ Ġ" area " Ġto Ġset Of (" media "), ĊĠ Ġ" audio " Ġto Ġset Of (" buffered ", Ġ" moz current sample offset ", Ġ" play ed ", Ġ" volume "), ĊĠ Ġ" colgroup " Ġto Ġset Of (" width "), ĊĠ Ġ" div " Ġto Ġset Of (" align "), ĊĠ Ġ" ol " Ġto Ġset Of (" compact "), ĊĠ Ġ" img " Ġto Ġset Of (" onerror "), ĊĠ Ġ" script " Ġto Ġset Of (" text "), ĊĠ Ġ" video " Ġto Ġset Of (" play ed "), ĊĊĠ Ġ// Math ML ĊĠ Ġ" mm ult is cript s " Ġto Ġset Of (" dir ", Ġ" math size "), ĊĠ Ġ" mo " Ġto Ġset Of (" move able limits "), ĊĠ Ġ" m style " Ġto Ġset Of (" infix break style "), ĊĊĠ Ġ// ĠSVG ĊĠ Ġ" fe composite " Ġto Ġset Of (" light er for error "), ĊĠ Ġ" h atch " Ġto Ġset Of (" h atch content units ", Ġ" h atch units ", Ġ" pitch "), ĊĠ Ġ" h atch path " Ġto Ġset Of (" offset "), ĊĠ Ġ" switch " Ġto Ġset Of (" allow reorder "), Ċ ) Ċ Ċ val Ġhtml Special Mappings Ġ= Ġmap Of ( ĊĠ Ġ" heading _ elements " Ġto Ġset Of (" h 1 ", Ġ" h 2 ", Ġ" h 3 ", Ġ" h 4 ", Ġ" h 5 ", Ġ" h 6 ") Ċ ) Ċ Ċ const Ġval ĠY ARI _ BUILD _ PATH Ġ= Ġ"/ Users / pio tr . tom i ak / Web storm Projects / y ari / client / build " Ċ const Ġval ĠBU IL T _ LANG Ġ= Ġ" en - us " Ċ const Ġval ĠWEB _ DOCS Ġ= Ġ" docs / web " Ċ const Ġval ĠM DN _ DOCS _ URL _ PREFIX Ġ= Ġ"\ $ MD N _ URL \ $" Ċ const Ġval ĠOUTPUT _ DIR Ġ= Ġ" xml / xml - psi - impl / gen / com / intellij / documentation / md n /" Ċ Ċ /* ĠIt 's Ġso Ġmuch Ġeasier Ġto Ġrun Ġa Ġtest , Ġthan Ġto Ġsetup Ġthe Ġwhole ĠI J Ġenvironment Ġ*/ Ċ class ĠGenerate M dn Documentation Ġ: ĠBase Platform TestCase () Ġ{ ĊĊĠ Ġ/* ĠRun Ġthese Ġtests Ġto Ġgenerate Ġdocumentation Ġ*/ ĊĠ Ġfun Ġtest Gen Html () Ġ{ ĊĠĠĠ Ġval Ġattributes Ġ= Ġextract Information (" html / global _ attributes ", Ġthis :: extract Attribute Documentation ) ĊĠĠĠ Ġoutput Json (" md n - html . json ", Ġmap Of ( ĊĠĠĠĠĠ Ġ" attrs " Ġto Ġattributes , ĊĠĠĠĠĠ Ġ" tags " Ġto Ġextract Information (" html / element ", Ġhtml Special Mappings . keys ) Ġ{ Ġthis . extract Element Documentation ( it , Ġattributes ) Ġ}, ĊĠĠĠĠĠ Ġ" tag Aliases " Ġto Ġreversed Aliases Map ( html Special Mappings ) ĊĠĠĠ Ġ)) ĊĠ Ġ} ĊĊĠ Ġfun Ġtest Gen Math ML () Ġ{ ĊĠĠĠ Ġval Ġattributes Ġ= Ġextract Information (" math ml / attribute ", Ġthis :: extract Attribute Documentation ) ĊĠĠĠ Ġoutput Json (" md n - math ml . json ", Ġmap Of ( ĊĠĠĠĠĠ Ġ" attrs " Ġto Ġattributes , ĊĠĠĠĠĠ Ġ" tags " Ġto Ġextract Information (" math ml / element ") Ġ{ Ġthis . extract Element Documentation ( it , Ġattributes ) Ġ} ĊĠĠĠ Ġ)) ĊĠ Ġ} ĊĊĠ Ġfun Ġtest Gen Svg () Ġ{ ĊĠĠĠ Ġval Ġattributes Ġ= Ġextract Information (" svg / attribute ", Ġthis :: extract Attribute Documentation ) ĊĠĠĠ Ġoutput Json (" md n - svg . json ", Ġmap Of ( ĊĠĠĠĠĠ Ġ" attrs " Ġto Ġattributes , ĊĠĠĠĠĠ Ġ" tags " Ġto Ġextract Information (" svg / element ") Ġ{ Ġthis . extract Element Documentation ( it , Ġattributes ) Ġ} ĊĠĠĠ Ġ)) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġoutput Json ( outputFile : ĠString , Ġdata : ĠMap < String , ĠAny >) Ġ{ ĊĠĠĠ ĠFile Util . write ToFile ( Path . of ( Path Manager . get Community Home Path (), ĠOUTPUT _ DIR , ĠoutputFile ). to File (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGson Builder (). set Pretty Print ing (). disable Html Esc aping (). create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toJson ( license And At tribution () Ġ+ Ġdata )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġ< T > Ġextract Information ( path : ĠString , Ġextractor : Ġ( File ) Ġ-> ĠT ): ĠMap < String , ĠT > Ġ= ĊĠĠĠ Ġextract Information ( path , Ġempty Set (), Ġextractor ) ĊĊĠ Ġprivate Ġfun Ġ< T > Ġextract Information ( path : ĠString , Ġspecial Dirs : ĠSet < String >, Ġextractor : Ġ( File ) Ġ-> ĠT ): ĠMap < String , ĠT > Ġ= ĊĠĠĠ ĠPath . of ( Y ARI _ BUILD _ PATH , ĠBU IL T _ LANG , ĠWEB _ DOCS , Ġpath ). to File (). list Files () !! ĊĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isDirectory Ġ&& Ġ(! it . name . contains ('- ') Ġ|| Ġspecial Dirs . contains ( it . name . toLowerCase ( Locale . US ))) Ġ&& ĠFile ( it , Ġ" index . json "). exists () Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ Ġdoc Dir Ġ-> ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠPair ( doc Dir . name , Ġextractor ( doc Dir )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Error Ġfor Ġ$ doc Dir : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠ Ġ. toMap () ĊĊĊĠ Ġprivate Ġfun Ġlicense And At tribution (): ĠMap < String , ĠAny > Ġ= ĊĠĠĠ Ġmap Of ( ĊĠĠĠĠĠ Ġ" license " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ" name " Ġto Ġ" CC - BY - SA Ġ 2 . 5 ", ĊĠĠĠĠĠĠĠ Ġ" url " Ġto Ġ" https :// creativecommons . org / licenses / by - sa / 2 . 5 /", ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ Ġ" author " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ" name " Ġto Ġ" Mo zz ila ĠContributors ", ĊĠĠĠĠĠĠĠ Ġ" url " Ġto Ġ" https :// github . com / md n / content " ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠ Ġprivate Ġfun Ġextract Element Documentation ( dir : ĠFile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommon Attributes : ĠMap < String , ĠM dn Html Attribute Documentation >): ĠM dn Html Element Documentation Ġ{ ĊĠĠĠ Ġval Ġ( compat Data , Ġindex Data Pro se Values ) Ġ= ĠgetData And Pro se Values ( dir ) ĊĊĠĠĠ Ġval Ġelement Doc Ġ= Ġindex Data Pro se Values . first () ĊĠĠĠĠĠ Ġ. getAs Json Primitive (" content "). asString ĊĠĠĠĠĠ Ġ. let Ġ{ Ġpatch Pro se ( it ) Ġ} ĊĊĠĠĠ Ġval Ġattributes Doc Ġ= Ġindex Data Pro se Values ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠ Ġvalue . get (" id ") ĊĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit Ġis ĠJson Primitive Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ? . asString ?. toLowerCase ( Locale . US )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġ" attributes " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit Ġ== Ġ" attributes _ for _ form _ submission " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit Ġ== Ġ" deprecated _ attributes " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit Ġ== Ġ" ob solete _ attributes " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit Ġ== Ġ" non - standard _ attributes " ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġ== Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. join ToString ("\ n ") Ġ{ Ġit . getAs Json Primitive (" content "). asString Ġ} ĊĠĠĠĠĠ Ġ. let Ġ{ Ġpatch Pro se ( it ) Ġ} ĊĊĠĠĠ Ġval Ġstatus Ġ= Ġextract Status ( compat Data ) ĊĠĠĠ Ġval Ġdoc Ġ= Ġprocess Element Documentation ( element Doc ) ĊĊĠĠĠ Ġval Ġdocumentation Ġ= Ġdoc . first ĊĠĠĠ Ġval Ġproperties Ġ= Ġdoc . second . take If Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġindex Data Pro se Values . find Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . get (" id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit Ġis ĠJson Primitive Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . asString ?. toLowerCase ( Locale . US )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġ" properties " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getAs Json Primitive (" content ") ?. asString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġpatch Pro se ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġprocess Element Documentation ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . isNotEmpty () Ġ} ĊĊĠĠĠ Ġreturn ĠM dn Html Element Documentation ( getM dn Docs Url ( dir ), Ġstatus , Ġdocumentation , Ġproperties , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Attributes ( dir , Ġattributes Doc , Ġcompat Data , Ġcommon Attributes )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġextract Attribute Documentation ( dir : ĠFile ): ĠM dn Html Attribute Documentation Ġ{ ĊĠĠĠ Ġval Ġ( compat Data , Ġindex Data Pro se Values ) Ġ= ĠgetData And Pro se Values ( dir ) ĊĠĠĠ Ġreturn ĠM dn Html Attribute Documentation ( getM dn Docs Url ( dir ), Ġextract Status ( compat Data ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Data Pro se Values . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAs Json Primitive (" content "). asString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġpatch Pro se ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġcreate Html File ( it ). text Ġ}, Ġnull ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġreversed Aliases Map ( special Mappings : ĠMap < String , ĠSet < String >> ): ĠMap < String , ĠString > Ġ= ĊĠĠĠ Ġspecial Mappings . entries . as Sequence (). flatMap Ġ{ mapping Ġ-> Ġmapping . value . as Sequence (). map Ġ{ ĠPair ( it , Ġmapping . key ) Ġ} Ġ}. toMap () ĊĊĠ Ġprivate Ġfun Ġget M dn Docs Url ( dir : ĠFile ): ĠString Ġ= ĊĠĠĠ ĠM DN _ DOCS _ URL _ PREFIX Ġ+ Ġdir . path . replace ('\\ ', Ġ'/ '). let Ġ{ Ġit . substring ( it . indexOf ("/ docs /") Ġ+ Ġ 5 ) Ġ} ĊĊĠ Ġprivate Ġfun ĠgetData And Pro se Values ( dir : ĠFile ): ĠPair < JsonObject ?, ĠList < JsonObject >> Ġ= ĊĠĠĠ ĠPair ( ĊĠĠĠĠĠ ĠFile ( dir , Ġ" bcd . json "). take If Ġ{ Ġit . exists () Ġ} ?. let Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠ ĠJson Parser . parse Reader ( Json Reader ( FileReader ( file )). also Ġ{ Ġit . is Len ient Ġ= Ġtrue Ġ}) ĊĠĠĠĠĠĠĠĠĠ Ġ. as JsonObject ĊĠĠĠĠĠĠĠĠĠ Ġ. getAs JsonObject (" data ") ĊĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠ ĠJson Parser . parse Reader ( Json Reader ( FileReader ( File ( dir , Ġ" index . json ")) ). also Ġ{ Ġit . is Len ient Ġ= Ġtrue Ġ}) ĊĠĠĠĠĠĠĠ Ġ. as JsonObject ĊĠĠĠĠĠĠĠ Ġ. getAs JsonObject (" doc ") ĊĠĠĠĠĠĠĠ Ġ. getAs JsonArray (" body ") !! ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . as JsonObject Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . getAs Json Primitive (" type "). asString Ġ== Ġ" pro se " Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . getAs JsonObject (" value ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ) ĊĊĠ Ġprivate Ġfun Ġpatch Pro se ( pro se : ĠString ): ĠString Ġ= ĊĠĠĠ Ġpro se ĊĠĠĠĠĠ Ġ. replace ("/ en - US / docs ", ĠM DN _ DOCS _ URL _ PREFIX , Ġtrue ) ĊĠĠĠĠĠ Ġ. replace ("& apos ;", Ġ"' ") ĊĠĠĠĠĠ Ġ. replace ("& quot ;", Ġ"\" ") ĊĠĠĠĠĠ Ġ. also Ġ{ Ġfixed Pro se Ġ-> ĊĠĠĠĠĠĠĠ ĠRegex ("& (? ! lt | gt | amp )[ a - z ]* ; "). find ( fixed Pro se )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Unknown Ġentity Ġfound Ġin Ġpro se : Ġ${ it . value }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbuild Attributes ( tag Dir : ĠFile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Doc : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Compat Data : ĠJsonObject ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommon Attributes : ĠMap < String , ĠM dn Html Attribute Documentation >): ĠMap < String , ĠM dn Html Attribute Documentation >? Ġ{ ĊĠĠĠ Ġval Ġdoc Attrs Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠ Ġif Ġ(! attributes Doc . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠ Ġvar Ġlast Title Ġ= Ġ"" ĊĠĠĠĠĠ Ġcreate Html File ( attributes Doc ) ĊĠĠĠĠĠĠĠ Ġ. document ?. children ?. as Sequence () ĊĠĠĠĠĠĠĠ Ġ? . filter Is Instance < Xml Tag >() ĊĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġit . name Ġ== Ġ" dl " Ġ} ĊĠĠĠĠĠĠĠ Ġ? . flatMap Ġ{ Ġit . sub Tags . as Sequence () Ġ} ĊĠĠĠĠĠĠĠ Ġ? . forEach Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" RegExp Duplicate Altern ation Branch ") ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( data . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" dt " Ġ-> Ġlast Title Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . find Sub Tag (" code ") Ġ?: Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . find Sub Tag (" a ") Ġ?: Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . find Sub Tag (" strong ") Ġ?: Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . find Sub Tag (" code ") Ġ?: Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inner Html () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġif Ġ( it . contains ('< ')) Ġthrow ĠException ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( Regex ("\ uD 8 3 D \ u DDD 1 |\ uD 8 3 D \ u DC 4 E | â ļłï¸ı |\ uD 8 3 E \ uD DE A "), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toLowerCase (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" dd " Ġ-> Ġdoc Attrs [ last Title ] Ġ= Ġdoc Attrs . get OrDefault ( last Title , Ġ"") Ġ+ Ġdata . inner Html () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcompat Attrs Ġ= Ġelement Compat Data ?. entrySet ()?. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġdata Ġ-> Ġ! data . key . any Ġ{ Ġit Ġ== Ġ'_' Ġ|| Ġit Ġ== Ġ'-' Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ ĠPair ( it . key . toLowerCase (), Ġextract Status ( it . value . as JsonObject )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toMap () Ġ?: Ġempty Map () ĊĊĠĠĠ Ġval ĠtagName Ġ= Ġtag Dir . name ĊĠĠĠ Ġval Ġmissing Ġ= Ġ((( compat Attrs . keys Ġ- Ġdoc Attrs . keys )) Ġ- Ġcommon Attributes . keys ) Ġ- Ġ( missing Doc [ tagName ] Ġ?: Ġempty Set ()) ĊĠĠĠ Ġif Ġ( missing . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ ĠSystem . err . println ("$ tagName Ġ- Ġmissing Ġattrs Ġpresent Ġin ĠB CD : Ġ${ missing }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġurl Prefix Ġ= Ġget M dn Docs Url ( tag Dir ) Ġ+ Ġ"# attr -" ĊĠĠĠ Ġreturn Ġdoc Attrs . keys . as Sequence () ĊĠĠĠĠĠ Ġ. plus ( compat Attrs . keys ). distinct () ĊĠĠĠĠĠ Ġ. map Ġ{ ĠPair ( it , ĠM dn Html Attribute Documentation ( url Prefix Ġ+ Ġit , Ġcompat Attrs [ it ], Ġdoc Attrs [ it ], Ġnull )) Ġ} ĊĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠ Ġ. toMap () ĊĠĠĠĠĠ Ġ. take If Ġ{ Ġit . isNotEmpty () Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġprocess Element Documentation ( element Doc : ĠString ): ĠPair < String , ĠMap < String , ĠString >> Ġ{ ĊĠĠĠ Ġval Ġsections Ġ= Ġmutable Map Of < String , ĠString >() ĊĊĠĠĠ Ġfun Ġprocess Properties Table ( table : ĠXml Tag ) Ġ{ ĊĠĠĠĠĠ Ġtable . accept Children ( object Ġ: ĠXml Recursive Element Visitor () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Xml Tag ( tag : ĠXml Tag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( tag . name Ġ== Ġ" tr ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtitle Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag . sub Tags . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" th " Ġ-> Ġtitle Ġ+= Ġit . inner Html () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" td " Ġ-> Ġcontent Ġ+= Ġit . inner Html () Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsections [ title ] Ġ= Ġcontent ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġsuper . visit Xml Tag ( tag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġhtml File Ġ= Ġcreate Html File ( element Doc ) ĊĠĠĠ Ġhtml File . accept Children ( object Ġ: ĠXml Recursive Element Visitor () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Xml Tag ( tag : ĠXml Tag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tag . name Ġ== Ġ" table " Ġ&& Ġtag . getAttribute Value (" class ") Ġ== Ġ" properties ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġprocess Properties Table ( tag ) ĊĠĠĠĠĠĠĠĠĠ Ġtag . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġsuper . visit Xml Tag ( tag ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġreturn ĠPair ( fix Spaces ( html File . text ), Ġsections ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Html File ( contents : ĠString ): ĠHtml File Impl Ġ{ ĊĠĠĠ Ġval Ġhtml File Ġ= ĠPsi File Factory . getInstance ( project ) ĊĠĠĠĠĠ Ġ. create File FromText (" dummy . html ", ĠHTML Language . INSTANCE , Ġcontents , Ġfalse , Ġtrue ) ĊĠĠĠ Ġval Ġto Remove Ġ= Ġmutable Set Of < Xml Tag >() ĊĠĠĠ Ġhtml File . accept Children ( object Ġ: ĠXml Recursive Element Visitor () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Xml Tag ( tag : ĠXml Tag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(( tag . getAttribute Value (" class ") ?. contains (" hidden ", Ġtrue ) Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġtag . getAttribute Value (" id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit Ġ== Ġ" top Example " Ġ|| Ġit Ġ== Ġ" Exe emple " Ġ|| Ġit Ġ== Ġ" Example " Ġ|| Ġit Ġ== Ġ" Ex emple " Ġ|| Ġit Ġ== Ġ" Live Sample " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( tag . name Ġ== Ġ" span " Ġ&& Ġtag . getAttribute Value (" class ") Ġ== Ġ" not ec ard Ġinline Ġwarning ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġtag . name Ġ== Ġ" iframe ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġto Remove . add ( tag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( tag . name Ġ== Ġ" svg ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcls Ġ= Ġtag . getAttribute Value (" class ") ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( cls Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcls . contains (" ob solete ") Ġ-> Ġ" ðŁ Ĺ ĳ " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcls . contains (" deprecated ") Ġ-> Ġ" ðŁĳ İ " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcls . contains (" non - standard ") Ġ-> Ġ" â ļłï¸ı " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcls . contains (" experimental ") Ġ-> Ġ" ðŁ § ª " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Unknown ĠSVG Ġclass : Ġ$ cls ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag . parent Tag !!. add Before ( XmlElement Factory . getInstance ( project ). create Display Text ( it ), Ġtag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" SVG Ġwith Ġno Ġclass ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġtag . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġsuper . visit Xml Tag ( tag ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġto Remove . forEach Ġ{ Ġit . delete () Ġ} ĊĠĠĠ Ġval Ġtext Ġ= Ġfix Spaces ( html File . text ) ĊĠĠĠ Ġif Ġ( text . contains (" The Ġsource Ġfor Ġthis Ġinteract ")) ĊĠĠĠĠĠ Ġthrow ĠException (" Un hidden Ġstuff !") ĊĠĠĠ Ġreturn ĠPsi File Factory . getInstance ( project ) ĊĠĠĠĠĠ Ġ. create File FromText (" dummy . html ", ĠHTML Language . INSTANCE , Ġtext , Ġfalse , Ġtrue ) ĊĠĠĠĠĠ Ġas ĠHtml File Impl ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġextract Status ( compat Data : ĠJsonObject ?): ĠSet < M dn Api Status >? Ġ= ĊĠĠĠ Ġcompat Data ?. get ("__ compat ") ĊĠĠĠĠĠ Ġ? . cast S af ely To < JsonObject >() ĊĠĠĠĠĠ Ġ? . getAs JsonObject (" status ") ĊĠĠĠĠĠ Ġ? . entrySet () ĊĠĠĠĠĠ Ġ? . as Sequence () ĊĠĠĠĠĠ Ġ? . filter Ġ{ Ġit . value . as Boolean Ġ} ĊĠĠĠĠĠ Ġ? . map Ġ{ ĠM dn Api Status . valueOf ( it . key . to Pas cal Case ()) Ġ} ĊĠĠĠĠĠ Ġ? . toSet () Ċ } Ċ Ċ private Ġfun ĠXml Tag . inner Html (): ĠString Ġ= Ġthis . children . as Sequence () ĊĠ Ġ. filter Ġ{ Ġit Ġis ĠXml Tag Ġ|| Ġit Ġis ĠXml Text Ġ}. map Ġ{ Ġit . text Ġ}. join ToString ("\ n "). let Ġ{ Ġfix Spaces ( it ) Ġ} Ċ Ċ private Ġfun ĠXml Element . find Sub Tag ( name : ĠString ): ĠXml Tag ? Ġ= Ġthis . children . find Ġ{ Ġ( it Ġas ? ĠXml Tag )?. name Ġ== Ġname Ġ} Ġas ? ĠXml Tag Ċ Ċ private Ġfun Ġfix Spaces ( doc : ĠString ): ĠString Ġ= Ġdoc . replace ( Regex ("[ Ġ\ t ]* \ n [ Ġ\ t \ n ]* "), Ġ"\ n "). trim () Ċ Ċ private Ġfun ĠString . to Pas cal Case (): ĠString Ġ= Ġget Words (). map Ġ{ Ġit . toLowerCase () Ġ}. join ToString ( separator Ġ= Ġ"", Ġtransform Ġ= ĠString :: capitalize ) Ċ private Ġfun ĠString . get Words () Ġ= ĠName Util Core . name To Words ( this ). filter Ġ{ Ġit . isNotEmpty () Ġ&& ĠCharacter . is Letter Or Digit ( it [ 0 ]) Ġ}