features.dot 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. digraph {
  2. graph [outputorder=edgefirst];
  3. node [shape="record", fontname="Noto Sans Mono SemiBold", fontsize=15];
  4. edge [fontname="Verdana", fontsize=12,labeldistance=7.5 ];
  5. fontname="Verdana";
  6. ranksep=0.02; nodesep=0.5;
  7. subgraph {
  8. ranksep="0.02 equally";
  9. preprocessing[style=filled,fillcolor="lightgreen",fontname="Verdana",label="Glyph pre-processing"];
  10. orthographic[style=filled,fillcolor="lightblue",fontname="Verdana",label="Orthographic Unit Shaping"];
  11. reordering[style=filled, fillcolor="lightcoral",fontname="Verdana",label="Reordering group (USE)"];
  12. topographic[style=filled,fillcolor="lightgoldenrod",fontname="Verdana",label="Topographical Features‡"];
  13. typographic[style=filled,fillcolor="lightpink",fontname="Verdana",label="Typographic Presentation"];
  14. positioning[style=filled,fillcolor="lightsalmon",fontname="Verdana",label="Positioning"];
  15. preprocessing->reordering->orthographic->topographic->typographic->positioning;
  16. }
  17. decision1 [shape="diamond", label="Script\ndirection?",fontname="Verdana"];
  18. rvrn->decision1;
  19. ltrfeatures [label="{ltra|ltrm}", fillcolor="lightgreen",style="filled"];
  20. {
  21. rtlfeatures [label="{rtla|rtlm¹}", fillcolor="lightgreen",style="filled"];
  22. }
  23. {
  24. rank=same;
  25. fracfeatures [label="frac²|numr³|dnom⁴", fillcolor="lightpink",style="filled"];
  26. fracnotes [fontname="Verdana",shape=plaintext,label=<<table border="0" cellborder="0" cellspacing="0">
  27. <tr><td align="left">¹ rtlm is scoped to characters with a Unicode mirroring property</td></tr>
  28. <tr><td align="left">² frac is scoped to numr + the slash + dnom</td></tr>
  29. <tr><td align="left">³ numr is scoped to all decimal numbers before a U+2044 FRACTION SLASH.</td></tr>
  30. <tr><td align="left">⁴ dnom is scoped to all decimal numbers after a U+2044 FRACTION SLASH.</td></tr>
  31. </table>
  32. >];
  33. }
  34. rand [fillcolor="lightpink",style="filled"];
  35. decision1 -> ltrfeatures [label="Left-to-right"];
  36. decision1 -> rtlfeatures [label="Right-to-left"];
  37. decision1 -> fracfeatures [label="Other"];
  38. ltrfeatures -> fracfeatures;
  39. rtlfeatures -> fracfeatures;
  40. fracfeatures->rand;
  41. decision2 [shape="diamond", label="Script?",fontname="Verdana"];
  42. {rank=same; HARF [label="{Harf|HARF}"]; notes;}
  43. rand -> trak -> HARF -> decision2;
  44. commonfeatures [shape=none,label=<<table border="0" cellspacing="0">
  45. <tr>
  46. <td border="1" bgcolor="lightsalmon">abvm</td>
  47. <td border="1" bgcolor="lightsalmon">blwm</td>
  48. <td border="1" bgcolor="lightgreen">ccmp</td>
  49. <td border="1" bgcolor="lightgreen">locl</td>
  50. <td border="1" bgcolor="lightsalmon">mark</td>
  51. <td border="1" bgcolor="lightsalmon">mkmk</td>
  52. <td border="1" bgcolor="lightpink">rlig</td>
  53. </tr>
  54. </table>>
  55. ];
  56. decision3 [shape="diamond", label="Script\ndirection?",fontname="Verdana"];
  57. BUZZ [label="{Buzz|BUZZ}"];
  58. BUZZ -> commonfeatures -> decision3;
  59. horizontalfeatures [
  60. shape=none,label=<<table border="0" cellspacing="0">
  61. <tr><td border="1" bgcolor="lightpink">calt <font face="Verdana">(not Hangul)</font></td></tr>
  62. <tr><td border="1" bgcolor="lightpink">clig <font face="Verdana">(not Khmer)</font></td></tr>
  63. <tr><td border="1" bgcolor="lightsalmon">curs</td></tr>
  64. <tr><td border="1" bgcolor="lightsalmon">dist</td></tr>
  65. <tr><td border="1" bgcolor="lightsalmon">kern</td></tr>
  66. <tr><td border="1" bgcolor="lightpink">liga <font face="Verdana">(not Khmer)</font></td></tr>
  67. <tr><td border="1" bgcolor="lightpink">rclt</td></tr>
  68. </table>>
  69. ];
  70. vert [label="vert",style=filled,fillcolor="lightpink"];
  71. decision3 -> horizontalfeatures [label="Horizontal"];
  72. decision3 -> vert [label="Vertical"];
  73. discretionary [label="User-selected\ndiscretionary\nfeatures",fontname="Verdana"];
  74. horizontalfeatures -> discretionary;
  75. vert -> discretionary;
  76. decision2->stch;
  77. BUZZ;
  78. subgraph shapers {
  79. subgraph cluster_arabic {
  80. bgcolor="lightyellow"
  81. label="Arabic, Syriac";
  82. stch [ style="filled", fillcolor="lightgreen",label="stch"];
  83. ccmplocl [ style="filled", label="ccmp|locl", fillcolor="lightgreen"];
  84. arabicfeatures [label="isol|fina|fin2|fin3|medi|med2|init", style="filled", fillcolor="lightgoldenrod"];
  85. arabicfeatures2 [label="rclt|calt", style="filled",fillcolor="lightpink"];
  86. rlig[style="filled",fillcolor="lightpink"];
  87. mset [fillcolor="lightpink",style="filled"]
  88. stch->ccmplocl->arabicfeatures->rlig->arabicfeatures2->mset;
  89. }
  90. mset->BUZZ:n;
  91. subgraph cluster_hangul {
  92. bgcolor="lightyellow"
  93. label="Hangul";
  94. hangulfeatures [label="ljmo|vjmo|tjmo", style="filled",fillcolor="lightgoldenrod"]
  95. }
  96. hangulfeatures->BUZZ:n;
  97. subgraph cluster_indic {
  98. label="Indic";
  99. bgcolor="lightyellow"
  100. // Preprocessing
  101. loclccmpindic [label="locl†|ccmp†",style=filled,fillcolor="lightgreen"];
  102. node[style=filled,fillcolor="lightgreen"];
  103. nukt [label="nukt†"];
  104. akhn [label="akhn†"];
  105. loclccmpindic->indic_reorder_1->nukt->akhn;
  106. indic_reorder_1[label="Initial reordering", fontname="Verdana",fillcolor="lightgrey",shape=ellipse,style=filled]
  107. // Orthographic
  108. node[style=filled,fillcolor="lightblue"]
  109. rphf [label="rphf⁵"];
  110. rkpf [label="rkpf†"];
  111. pref [label="pref⁶"];
  112. blwf [label="blwf⁷"];
  113. abvf [label="abvf⁸"];
  114. half [label="half⁹"];
  115. pstf [label="pstf⁸"];
  116. vatu [label="vatu†"];
  117. cjct [label="cjct†"];
  118. akhn ->rphf -> rkpf -> pref -> blwf -> abvf -> half -> pstf -> vatu -> cjct;
  119. // Typographic presentation
  120. indic_typographic[style=filled,fillcolor="lightpink",label="init|pres|abvs|blws|psts|haln"]
  121. indic_reorder_2[label="Final reordering",fillcolor="lightgrey",fontname="Verdana", shape=ellipse,style=filled]
  122. cjct->indic_reorder_2->indic_typographic;
  123. notes2 [fontname="Verdana",shape=plaintext,style="",label=<<table border="0" cellborder="0" cellspacing="0">
  124. <tr><td align="right">⁵ rphf is scoped to pre-base ra+halant sequences</td></tr>
  125. <tr><td align="right">⁶ pref is scoped to the two glyphs after the base; outputs are reordered</td></tr>
  126. <tr><td align="right">⁷ blwf is usually scoped to the whole syllable, except in Telugu and Kannada where it is post-base</td></tr>
  127. <tr><td align="right">⁸ abvf and pstf are scoped to post-base</td></tr>
  128. <tr><td align="right">⁹ half is scoped to pre-base</td></tr>
  129. </table>
  130. >];
  131. indic_typographic -> notes2 [style=invis];
  132. }
  133. subgraph cluster_khmer {
  134. label="Khmer";
  135. bgcolor="lightyellow"
  136. khmerbasic [style=filled,fillcolor="lightgreen",label="locl†|ccmp†|pref†|bwlf†|abvf†|pstf†|cfar†"]
  137. khmerother [style=filled,fillcolor="lightpink",label="pres|abvs|blws|psts"]
  138. khmerbasic -> khmerother -> khmerclig;
  139. khmerclig [label="clig",style=filled,fillcolor="lightpink"];
  140. }
  141. subgraph cluster_myanmar {
  142. label="Myanmar";
  143. bgcolor="lightyellow"
  144. loclccmpmyanmar [label="locl†|ccmp†",style=filled,fillcolor="lightgreen"];
  145. rphfmymr [label="rphf†",style=filled,fillcolor="lightblue"]
  146. prefmymr [label="pref†",style=filled,fillcolor="lightblue"]
  147. blwfmymr [label="blwf†",style=filled,fillcolor="lightblue"]
  148. pstfmymr [label="pstf†",style=filled,fillcolor="lightblue"]
  149. myanmarother [label="pres|abvs|blws|psts",style=filled,fillcolor="lightpink"];
  150. reorder_myanmar[label="Reordering", shape=ellipse,style=filled,fontname="Verdana"]
  151. loclccmpmyanmar -> reorder_myanmar-> rphfmymr -> prefmymr -> blwfmymr -> pstfmymr -> myanmarother;
  152. }
  153. subgraph cluster_use {
  154. label="Universal Shaping Engine"
  155. bgcolor="lightyellow"
  156. use_preprocessing [style=filled, label="locl†|ccmp†|nukt†|akhn†", fillcolor="lightgreen"];
  157. // Reoredering
  158. rphfuse [label="rphf¹⁰", style=filled, fillcolor="lightcoral"];
  159. prefuse [label="pref¹¹", style=filled, fillcolor="lightcoral"];
  160. // Orthographic
  161. orthographicuse [label="rkrf†|abvf†|blwf†|half†|pstf†|vatu†|cjct†", style="filled", fillcolor="lightblue"];
  162. topographicaluse [label="isol|init|medi|fina", style="filled", fillcolor="lightgoldenrod"];
  163. typographicaluse [label="abvs|blws|haln|pres|psts", style="filled", fillcolor="lightpink"];
  164. reorder_use[label="Reordering", shape=ellipse,style=filled,fontname="Verdana"]
  165. use_preprocessing -> rphfuse -> prefuse->orthographicuse ->reorder_use -> topographicaluse -> typographicaluse;
  166. notes3 [fontname="Verdana",shape=plaintext,label=<<table border="0" cellborder="0" cellspacing="0">
  167. <tr><td align="left">¹⁰ Outputs are reordered as category R</td></tr>
  168. <tr><td align="left">¹¹ Outputs are reordered to before base</td></tr>
  169. </table>
  170. >];
  171. typographicaluse -> notes3 [style=invis];
  172. }
  173. }
  174. indic_typographic->BUZZ:n;
  175. typographicaluse->BUZZ:n;
  176. khmerclig -> BUZZ:n;
  177. myanmarother -> BUZZ:n;
  178. decision2->hangulfeatures;
  179. decision2->loclccmpindic;
  180. decision2->khmerbasic;
  181. decision2->loclccmpmyanmar;
  182. decision2->use_preprocessing;
  183. decision2->BUZZ [label=" Hebrew, Thai,\n Lao, other"];
  184. notes [fontname="Verdana",shape=box,label=<<table border="0" cellborder="0" cellspacing="0">
  185. <tr><td align="left">
  186. <b>Indic</b> scripts are: Bengali, Devanagari,
  187. Gujarati, Gurmukhi, Kannada,
  188. Malayalam, Oriya, Tamil,
  189. Telugu
  190. </td></tr>
  191. <tr><td align="left">
  192. <b>USE</b> scripts are:
  193. Adlam, Ahom, Balinese, Batak, Bhaiksuki, Brahmi, Buginese,
  194. Buhid, Chakma, Cham, Chorasmian, Dives Akuru, Dogra, Duployan,
  195. </td></tr>
  196. <tr><td align="left">
  197. Egyptian hieroglyphs, Elymaic, Grantha, Gunjala Ggondi, Hanifi Rohingya,
  198. Hanunoo, Javanese, Kaithi, Kayah li, Kharoshthi, Khojki,
  199. </td></tr>
  200. <tr><td align="left">
  201. Khudawadi, Lepcha, Limbu, Mahajani, Makasar, Mandaic, Manichaean,
  202. Marchen, Masaram Gondi, Medefaidrin, Meetei Mayek, Miao, Modi,
  203. </td></tr>
  204. <tr><td align="left">
  205. Mongolian, Multani, Nandinagari, Newa, Nko, Nyiakeng Puachue Hmong,
  206. Old Sogdian, Pahawh Hmong, Phags Pa, Psalter Pahlavi, Rejang,
  207. </td></tr>
  208. <tr><td align="left">
  209. Saurashtra, Sharada, Siddham, Sinhala, Sogdian, Soyombo, Sundanese,
  210. Syloti Nagri, Tagalog, Tagbanwa, Tai Le, Tai Tham, Tai Viet,
  211. </td></tr>
  212. <tr><td align="left">
  213. Takri, Tibetan, Tifinagh, Tirhuta, Wancho, Zanabazar square,
  214. </td></tr>
  215. </table>>]
  216. footnote[fontname="Verdana",label=<<table border="0" cellborder="0" cellspacing="0">
  217. <tr><td align="left">† Feature is scoped to each syllable</td></tr>
  218. <tr><td align="left">‡ All topographic features are scoped based on topographic position</td></tr>
  219. </table>>];
  220. notes3->footnote[style=invis];
  221. }