aboutsummaryrefslogtreecommitdiff
path: root/docs/features.dot
blob: 88cb3faebdd58fa271941ac9e34696077729a1bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
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];

}