digraph { graph [outputorder=edgefirst]; node [shape="record", fontname="Noto Sans Mono SemiBold", fontsize=15]; edge [fontname="Verdana", fontsize=12,labeldistance=7.5 ]; fontname="Verdana"; ranksep=0.02; nodesep=0.5; subgraph { ranksep="0.02 equally"; preprocessing[style=filled,fillcolor="lightgreen",fontname="Verdana",label="Glyph pre-processing"]; orthographic[style=filled,fillcolor="lightblue",fontname="Verdana",label="Orthographic Unit Shaping"]; reordering[style=filled, fillcolor="lightcoral",fontname="Verdana",label="Reordering group (USE)"]; topographic[style=filled,fillcolor="lightgoldenrod",fontname="Verdana",label="Topographical Features‡"]; typographic[style=filled,fillcolor="lightpink",fontname="Verdana",label="Typographic Presentation"]; positioning[style=filled,fillcolor="lightsalmon",fontname="Verdana",label="Positioning"]; preprocessing->reordering->orthographic->topographic->typographic->positioning; } decision1 [shape="diamond", label="Script\ndirection?",fontname="Verdana"]; rvrn->decision1; ltrfeatures [label="{ltra|ltrm}", fillcolor="lightgreen",style="filled"]; { rtlfeatures [label="{rtla|rtlm¹}", fillcolor="lightgreen",style="filled"]; } { rank=same; fracfeatures [label="frac²|numr³|dnom⁴", fillcolor="lightpink",style="filled"]; fracnotes [fontname="Verdana",shape=plaintext,label=<<table border="0" cellborder="0" cellspacing="0"> <tr><td align="left">¹ rtlm is scoped to characters with a Unicode mirroring property</td></tr> <tr><td align="left">² frac is scoped to numr + the slash + dnom</td></tr> <tr><td align="left">³ numr is scoped to all decimal numbers before a U+2044 FRACTION SLASH.</td></tr> <tr><td align="left">⁴ dnom is scoped to all decimal numbers after a U+2044 FRACTION SLASH.</td></tr> </table> >]; } rand [fillcolor="lightpink",style="filled"]; decision1 -> ltrfeatures [label="Left-to-right"]; decision1 -> rtlfeatures [label="Right-to-left"]; decision1 -> fracfeatures [label="Other"]; ltrfeatures -> fracfeatures; rtlfeatures -> fracfeatures; fracfeatures->rand; decision2 [shape="diamond", label="Script?",fontname="Verdana"]; {rank=same; HARF [label="{Harf|HARF}"]; notes;} rand -> trak -> HARF -> decision2; commonfeatures [shape=none,label=<<table border="0" cellspacing="0"> <tr> <td border="1" bgcolor="lightsalmon">abvm</td> <td border="1" bgcolor="lightsalmon">blwm</td> <td border="1" bgcolor="lightgreen">ccmp</td> <td border="1" bgcolor="lightgreen">locl</td> <td border="1" bgcolor="lightsalmon">mark</td> <td border="1" bgcolor="lightsalmon">mkmk</td> <td border="1" bgcolor="lightpink">rlig</td> </tr> </table>> ]; decision3 [shape="diamond", label="Script\ndirection?",fontname="Verdana"]; BUZZ [label="{Buzz|BUZZ}"]; BUZZ -> commonfeatures -> decision3; horizontalfeatures [ shape=none,label=<<table border="0" cellspacing="0"> <tr><td border="1" bgcolor="lightpink">calt <font face="Verdana">(not Hangul)</font></td></tr> <tr><td border="1" bgcolor="lightpink">clig <font face="Verdana">(not Khmer)</font></td></tr> <tr><td border="1" bgcolor="lightsalmon">curs</td></tr> <tr><td border="1" bgcolor="lightsalmon">dist</td></tr> <tr><td border="1" bgcolor="lightsalmon">kern</td></tr> <tr><td border="1" bgcolor="lightpink">liga <font face="Verdana">(not Khmer)</font></td></tr> <tr><td border="1" bgcolor="lightpink">rclt</td></tr> </table>> ]; vert [label="vert",style=filled,fillcolor="lightpink"]; decision3 -> horizontalfeatures [label="Horizontal"]; decision3 -> vert [label="Vertical"]; discretionary [label="User-selected\ndiscretionary\nfeatures",fontname="Verdana"]; horizontalfeatures -> discretionary; vert -> discretionary; decision2->stch; BUZZ; subgraph shapers { subgraph cluster_arabic { bgcolor="lightyellow" label="Arabic, Syriac"; stch [ style="filled", fillcolor="lightgreen",label="stch"]; ccmplocl [ style="filled", label="ccmp|locl", fillcolor="lightgreen"]; arabicfeatures [label="isol|fina|fin2|fin3|medi|med2|init", style="filled", fillcolor="lightgoldenrod"]; arabicfeatures2 [label="rclt|calt", style="filled",fillcolor="lightpink"]; rlig[style="filled",fillcolor="lightpink"]; mset [fillcolor="lightpink",style="filled"] stch->ccmplocl->arabicfeatures->rlig->arabicfeatures2->mset; } mset->BUZZ:n; subgraph cluster_hangul { bgcolor="lightyellow" label="Hangul"; hangulfeatures [label="ljmo|vjmo|tjmo", style="filled",fillcolor="lightgoldenrod"] } hangulfeatures->BUZZ:n; subgraph cluster_indic { label="Indic"; bgcolor="lightyellow" // Preprocessing loclccmpindic [label="locl†|ccmp†",style=filled,fillcolor="lightgreen"]; node[style=filled,fillcolor="lightgreen"]; nukt [label="nukt†"]; akhn [label="akhn†"]; loclccmpindic->indic_reorder_1->nukt->akhn; indic_reorder_1[label="Initial reordering", fontname="Verdana",fillcolor="lightgrey",shape=ellipse,style=filled] // Orthographic node[style=filled,fillcolor="lightblue"] rphf [label="rphf⁵"]; rkpf [label="rkpf†"]; pref [label="pref⁶"]; blwf [label="blwf⁷"]; abvf [label="abvf⁸"]; half [label="half⁹"]; pstf [label="pstf⁸"]; vatu [label="vatu†"]; cjct [label="cjct†"]; akhn ->rphf -> rkpf -> pref -> blwf -> abvf -> half -> pstf -> vatu -> cjct; // Typographic presentation indic_typographic[style=filled,fillcolor="lightpink",label="init|pres|abvs|blws|psts|haln"] indic_reorder_2[label="Final reordering",fillcolor="lightgrey",fontname="Verdana", shape=ellipse,style=filled] cjct->indic_reorder_2->indic_typographic; notes2 [fontname="Verdana",shape=plaintext,style="",label=<<table border="0" cellborder="0" cellspacing="0"> <tr><td align="right">⁵ rphf is scoped to pre-base ra+halant sequences</td></tr> <tr><td align="right">⁶ pref is scoped to the two glyphs after the base; outputs are reordered</td></tr> <tr><td align="right">⁷ blwf is usually scoped to the whole syllable, except in Telugu and Kannada where it is post-base</td></tr> <tr><td align="right">⁸ abvf and pstf are scoped to post-base</td></tr> <tr><td align="right">⁹ half is scoped to pre-base</td></tr> </table> >]; indic_typographic -> notes2 [style=invis]; } subgraph cluster_khmer { label="Khmer"; bgcolor="lightyellow" khmerbasic [style=filled,fillcolor="lightgreen",label="locl†|ccmp†|pref†|bwlf†|abvf†|pstf†|cfar†"] khmerother [style=filled,fillcolor="lightpink",label="pres|abvs|blws|psts"] khmerbasic -> khmerother -> khmerclig; khmerclig [label="clig",style=filled,fillcolor="lightpink"]; } subgraph cluster_myanmar { label="Myanmar"; bgcolor="lightyellow" loclccmpmyanmar [label="locl†|ccmp†",style=filled,fillcolor="lightgreen"]; rphfmymr [label="rphf†",style=filled,fillcolor="lightblue"] prefmymr [label="pref†",style=filled,fillcolor="lightblue"] blwfmymr [label="blwf†",style=filled,fillcolor="lightblue"] pstfmymr [label="pstf†",style=filled,fillcolor="lightblue"] myanmarother [label="pres|abvs|blws|psts",style=filled,fillcolor="lightpink"]; reorder_myanmar[label="Reordering", shape=ellipse,style=filled,fontname="Verdana"] loclccmpmyanmar -> reorder_myanmar-> rphfmymr -> prefmymr -> blwfmymr -> pstfmymr -> myanmarother; } subgraph cluster_use { label="Universal Shaping Engine" bgcolor="lightyellow" use_preprocessing [style=filled, label="locl†|ccmp†|nukt†|akhn†", fillcolor="lightgreen"]; // Reoredering rphfuse [label="rphf¹⁰", style=filled, fillcolor="lightcoral"]; prefuse [label="pref¹¹", style=filled, fillcolor="lightcoral"]; // Orthographic orthographicuse [label="rkrf†|abvf†|blwf†|half†|pstf†|vatu†|cjct†", style="filled", fillcolor="lightblue"]; topographicaluse [label="isol|init|medi|fina", style="filled", fillcolor="lightgoldenrod"]; typographicaluse [label="abvs|blws|haln|pres|psts", style="filled", fillcolor="lightpink"]; reorder_use[label="Reordering", shape=ellipse,style=filled,fontname="Verdana"] use_preprocessing -> rphfuse -> prefuse->orthographicuse ->reorder_use -> topographicaluse -> typographicaluse; notes3 [fontname="Verdana",shape=plaintext,label=<<table border="0" cellborder="0" cellspacing="0"> <tr><td align="left">¹⁰ Outputs are reordered as category R</td></tr> <tr><td align="left">¹¹ Outputs are reordered to before base</td></tr> </table> >]; typographicaluse -> notes3 [style=invis]; } } indic_typographic->BUZZ:n; typographicaluse->BUZZ:n; khmerclig -> BUZZ:n; myanmarother -> BUZZ:n; decision2->hangulfeatures; decision2->loclccmpindic; decision2->khmerbasic; decision2->loclccmpmyanmar; decision2->use_preprocessing; decision2->BUZZ [label=" Hebrew, Thai,\n Lao, other"]; notes [fontname="Verdana",shape=box,label=<<table border="0" cellborder="0" cellspacing="0"> <tr><td align="left"> <b>Indic</b> scripts are: Bengali, Devanagari, Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu </td></tr> <tr><td align="left"> <b>USE</b> scripts are: Adlam, Ahom, Balinese, Batak, Bhaiksuki, Brahmi, Buginese, Buhid, Chakma, Cham, Chorasmian, Dives Akuru, Dogra, Duployan, </td></tr> <tr><td align="left"> Egyptian hieroglyphs, Elymaic, Grantha, Gunjala Ggondi, Hanifi Rohingya, Hanunoo, Javanese, Kaithi, Kayah li, Kharoshthi, Khojki, </td></tr> <tr><td align="left"> Khudawadi, Lepcha, Limbu, Mahajani, Makasar, Mandaic, Manichaean, Marchen, Masaram Gondi, Medefaidrin, Meetei Mayek, Miao, Modi, </td></tr> <tr><td align="left"> Mongolian, Multani, Nandinagari, Newa, Nko, Nyiakeng Puachue Hmong, Old Sogdian, Pahawh Hmong, Phags Pa, Psalter Pahlavi, Rejang, </td></tr> <tr><td align="left"> Saurashtra, Sharada, Siddham, Sinhala, Sogdian, Soyombo, Sundanese, Syloti Nagri, Tagalog, Tagbanwa, Tai Le, Tai Tham, Tai Viet, </td></tr> <tr><td align="left"> Takri, Tibetan, Tifinagh, Tirhuta, Wancho, Zanabazar square, </td></tr> </table>>] footnote[fontname="Verdana",label=<<table border="0" cellborder="0" cellspacing="0"> <tr><td align="left">† Feature is scoped to each syllable</td></tr> <tr><td align="left">‡ All topographic features are scoped based on topographic position</td></tr> </table>>]; notes3->footnote[style=invis]; }