glaemscribe 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +19 -0
  3. data/bin/glaemscribe +307 -0
  4. data/glaemresources/charsets/cirth_ds.cst +205 -0
  5. data/glaemresources/charsets/sarati_eldamar.cst +256 -0
  6. data/glaemresources/charsets/tengwar_ds.cst +318 -0
  7. data/glaemresources/charsets/unicode_gothic.cst +64 -0
  8. data/glaemresources/charsets/unicode_runes.cst +120 -0
  9. data/glaemresources/modes/adunaic.glaem +251 -0
  10. data/glaemresources/modes/blackspeech-annatar.glaem +318 -0
  11. data/glaemresources/modes/blackspeech.glaem +260 -0
  12. data/glaemresources/modes/gothic.glaem +78 -0
  13. data/glaemresources/modes/khuzdul.glaem +141 -0
  14. data/glaemresources/modes/mercian.glaem +419 -0
  15. data/glaemresources/modes/oldnorse-medieval.glaem +127 -0
  16. data/glaemresources/modes/quenya-sarati.glaem +320 -0
  17. data/glaemresources/modes/quenya.glaem +307 -0
  18. data/glaemresources/modes/sindarin-beleriand.glaem +285 -0
  19. data/glaemresources/modes/sindarin-classical.glaem +276 -0
  20. data/glaemresources/modes/sindarin-daeron.glaem +182 -0
  21. data/glaemresources/modes/telerin.glaem +302 -0
  22. data/glaemresources/modes/valarin-sarati.glaem +210 -0
  23. data/glaemresources/modes/westron.glaem +340 -0
  24. data/glaemresources/modes/westsaxon.glaem +342 -0
  25. data/lib/api/charset.rb +84 -0
  26. data/lib/api/charset_parser.rb +55 -0
  27. data/lib/api/constants.rb +29 -0
  28. data/lib/api/debug.rb +36 -0
  29. data/lib/api/eval.rb +268 -0
  30. data/lib/api/fragment.rb +113 -0
  31. data/lib/api/glaeml.rb +200 -0
  32. data/lib/api/if_tree.rb +96 -0
  33. data/lib/api/mode.rb +112 -0
  34. data/lib/api/mode_parser.rb +314 -0
  35. data/lib/api/option.rb +64 -0
  36. data/lib/api/post_processor/reverse.rb +36 -0
  37. data/lib/api/pre_processor/downcase.rb +35 -0
  38. data/lib/api/pre_processor/elvish_numbers.rb +47 -0
  39. data/lib/api/pre_processor/rxsubstitute.rb +40 -0
  40. data/lib/api/pre_processor/substitute.rb +38 -0
  41. data/lib/api/pre_processor/up_down_tehta_split.rb +138 -0
  42. data/lib/api/resource_manager.rb +130 -0
  43. data/lib/api/rule.rb +99 -0
  44. data/lib/api/rule_group.rb +159 -0
  45. data/lib/api/sheaf.rb +70 -0
  46. data/lib/api/sheaf_chain.rb +86 -0
  47. data/lib/api/sheaf_chain_iterator.rb +108 -0
  48. data/lib/api/sub_rule.rb +40 -0
  49. data/lib/api/transcription_pre_post_processor.rb +118 -0
  50. data/lib/api/transcription_processor.rb +137 -0
  51. data/lib/api/transcription_tree_node.rb +91 -0
  52. data/lib/glaemscribe.rb +70 -0
  53. metadata +112 -0
@@ -0,0 +1,320 @@
1
+ \**
2
+
3
+ Glǽmscribe (also written Glaemscribe) is a software dedicated to
4
+ the transcription of texts between writing systems, and more
5
+ specifically dedicated to the transcription of J.R.R. Tolkien's
6
+ invented languages to some of his devised writing systems.
7
+
8
+ Copyright (C) 2015 Benjamin Babut (Talagan).
9
+
10
+ This program is free software: you can redistribute it and/or modify
11
+ it under the terms of the GNU Affero General Public License as published by
12
+ the Free Software Foundation, either version 3 of the License, or
13
+ any later version.
14
+
15
+ This program is distributed in the hope that it will be useful,
16
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ GNU Affero General Public License for more details.
19
+
20
+ You should have received a copy of the GNU Affero General Public License
21
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
22
+
23
+ **\
24
+
25
+ \language "Quenya"
26
+ \writing "Sarati"
27
+ \mode "Quenya Usage"
28
+ \version "0.0.1"
29
+ \authors "Talagan (Benjamin Babut)"
30
+
31
+ \charset sarati_eldamar true
32
+
33
+ \beg preprocessor
34
+ \** Work exclusively downcase **\
35
+ \downcase
36
+
37
+ \** Simplify trema vowels **\
38
+ \** Removed ï and ü, not quite sure how to treat them for qenya : ex : oïkta diphthong or not ? **\
39
+ \substitute ä a
40
+ \substitute ë e
41
+ \substitute ö o
42
+ \substitute ÿ y
43
+
44
+ \** Dis-ambiguate long vowels **\
45
+ \rxsubstitute "(ā|â|aa)" "á"
46
+ \rxsubstitute "(ē|ê)" "é" \** ee is allowed in qenya **\
47
+ \rxsubstitute "(ī|î|iï|ïi|ïï|ii)" "í"
48
+ \rxsubstitute "(ō|ô|oo)" "ó"
49
+ \rxsubstitute "(ū|û|uü|üu|üü|uu)" "ú"
50
+ \rxsubstitute "(ȳ|ŷ|yy)" "ý"
51
+
52
+ \substitute "iu" "iw"
53
+ \substitute "eu" "ew"
54
+ \substitute "au" "aw"
55
+ \substitute "ai" "ay"
56
+ \substitute "oi" "oy"
57
+ \substitute "ui" "uy"
58
+
59
+ \substitute "á" "aa" \** Split long a **\
60
+ \substitute "ā" "aa" \** '' **\
61
+ \substitute "â" "aa" \** '' **\
62
+
63
+ \substitute "qu" "q" \** Dis-ambiguate qu **\
64
+ \end
65
+
66
+ \beg processor
67
+
68
+ \outspace SARATI_SPACE
69
+
70
+ \beg rules litteral
71
+ {A} === a
72
+ {AA} === aa
73
+ {E} === e
74
+ {EE} === é
75
+ {I} === (i,ï)
76
+ {II} === í
77
+ {O} === o
78
+ {OO} === ó
79
+ {U} === (u,ü)
80
+ {UU} === ú
81
+
82
+ {K} === (c,k)
83
+ {MB} === (b,mb)
84
+ {SS} === (z,ss)
85
+
86
+ {VOWELS} === {A} * {E} * {I} * {O} * {U}
87
+ {LVOWELS} === {AA} * {EE} * {II} * {OO} * {UU}
88
+ {TEHTAS_} === SARATI_QUENYA_A * SARATI_QUENYA_E * SARATI_QUENYA_I * SARATI_QUENYA_O * SARATI_QUENYA_U
89
+ {STEHTAS} === {NULL} * SARATI_QUENYA_E * SARATI_QUENYA_I * SARATI_QUENYA_O * SARATI_QUENYA_U
90
+ {LTEHTAS} === SARATI_QUENYA_A SARATI_DASH_U * SARATI_QUENYA_E SARATI_DASH_U * SARATI_QUENYA_I SARATI_DASH_U * SARATI_QUENYA_O SARATI_DASH_U * SARATI_QUENYA_U SARATI_DASH_U
91
+ {LTEHTAS_FOR_CONSONANTS} === SARATI_QUENYA_A * SARATI_QUENYA_E SARATI_DASH_U * SARATI_QUENYA_I SARATI_DASH_U * SARATI_QUENYA_O SARATI_DASH_U * SARATI_QUENYA_U SARATI_DASH_U
92
+
93
+ {V_L_KER_WN} === [ {VOWELS} * {LVOWELS} * {NULL} ]
94
+ {V_IMG_FOR_CONSONNANTS_WN} === [ {STEHTAS} * {LTEHTAS_FOR_CONSONANTS} * SARATI_DOT_D ] \** No vowel == dot below **\
95
+
96
+ \** RULES **\
97
+
98
+ [{VOWELS}] --> [{TEHTAS_}] SARATI_QUENYA_LONG_VOWEL_CARRIER \** Isolated vowels : use short carrier (reversed order RTL) **\
99
+ [{LVOWELS}] --> [{LTEHTAS}] SARATI_QUENYA_LONG_VOWEL_CARRIER \** Long vowels: carrier + dash + tehta **\
100
+
101
+ \** FIRST LINE **\
102
+
103
+ {L1_KER} === t * p * {K} * q * tt * pp * {K}{K}
104
+ {L1_IMG} === SARATI_T * SARATI_P * SARATI_QUENYA_C * SARATI_QUENYA_QU * SARATI_DASH_D SARATI_T * SARATI_DASH_D SARATI_P * SARATI_DASH_D SARATI_QUENYA_C
105
+
106
+ [{L1_KER}]{V_L_KER_WN} --> 2,1 --> {V_IMG_FOR_CONSONNANTS_WN}[{L1_IMG}]
107
+
108
+ ty{V_L_KER_WN} --> {V_IMG_FOR_CONSONNANTS_WN} SARATI_QUENYA_TY
109
+ ts{V_L_KER_WN} --> {V_IMG_FOR_CONSONNANTS_WN} SARATI_QUENYA_TS
110
+
111
+ \** Missing py, ps? **\
112
+
113
+ \** SECOND LINE **\
114
+
115
+ {L2_KER} === nd * {MB} * ng * ngw
116
+ {L2_IMG} === SARATI_QUENYA_ND * SARATI_QUENYA_MB * SARATI_NG * SARATI_QUENYA_NGW
117
+
118
+ [{L2_KER}]{V_L_KER_WN} --> 2,1 --> {V_IMG_FOR_CONSONNANTS_WN}[{L2_IMG}]
119
+
120
+ ndy{V_L_KER_WN} --> {V_IMG_FOR_CONSONNANTS_WN} SARATI_QUENYA_NDY
121
+
122
+ \** ########### **\
123
+ \** THIRD LINE **\
124
+
125
+ {L3_KER} === th * f * h * hw
126
+ {L3_IMG} === SARATI_QUENYA_S * SARATI_QUENYA_F_ALT * SARATI_H * SARATI_QUENYA_HW
127
+
128
+ [{L3_KER}]{V_L_KER_WN} --> 2,1 --> {V_IMG_FOR_CONSONNANTS_WN}[{L3_IMG}]
129
+
130
+ hy{V_L_KER_WN} --> {V_IMG_FOR_CONSONNANTS_WN} SARATI_QUENYA_HY
131
+
132
+ \** # The two following are not treated the same way in tengwar **\
133
+ ht{V_L_KER_WN} --> {V_IMG_FOR_CONSONNANTS_WN} SARATI_QUENYA_HT_ALT_1
134
+ hty{V_L_KER_WN} --> {V_IMG_FOR_CONSONNANTS_WN} SARATI_QUENYA_HTY
135
+
136
+ \** ########### **\
137
+ \** FOURTH LINE **\
138
+
139
+ {LINE_4TH_KER} === nt * mp * nc * nq \** # Not nqu, due to preprocessor **\
140
+ {LINE_4TH_IMG} === SARATI_QUENYA_NT * SARATI_QUENYA_MP * SARATI_QUENYA_NC * SARATI_QUENYA_NQU
141
+
142
+ [{LINE_4TH_KER}]{V_L_KER_WN} --> 2,1 --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_4TH_IMG}]
143
+ nty{V_L_KER_WN} --> {V_IMG_FOR_CONSONNANTS_WN} SARATI_QUENYA_NTY
144
+
145
+ \** ########### **\
146
+ \** FIFTH LINE **\
147
+
148
+ {LINE_5TH_KER} === n * m * ñ * ñw * _nw * nn * mm
149
+ {LINE_5TH_IMG} === SARATI_N * SARATI_M * SARATI_QUENYA_VELAR_NASAL * SARATI_QUENYA_NW * SARATI_QUENYA_NW * SARATI_DASH_D SARATI_N * SARATI_DASH_D SARATI_M
150
+
151
+ [{LINE_5TH_KER}]{V_L_KER_WN} --> 2,1 --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_5TH_IMG}]
152
+ ny{V_L_KER_WN} --> {V_IMG_FOR_CONSONNANTS_WN} SARATI_QUENYA_NY
153
+
154
+ \** Missing my ? **\
155
+
156
+ \** ########### **\
157
+ \** SIXTH LINE **\
158
+
159
+ {LINE_6TH_KER} === r * v * y * w * rr
160
+ {LINE_6TH_IMG} === SARATI_R * SARATI_QUENYA_V_ALT * SARATI_QUENYA_Y * SARATI_W * SARATI_DASH_D SARATI_R
161
+
162
+ [{LINE_6TH_KER}]{V_L_KER_WN} --> 2,1 --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_6TH_IMG}]
163
+
164
+ \** Weak r is not distinguished **\
165
+ \** Missing ry? rd? **\
166
+
167
+ \** ########### **\
168
+ \** L Line **\
169
+
170
+ {LINE_L_KER} === l * ll * d
171
+ {LINE_L_IMG} === SARATI_L * SARATI_DASH_D SARATI_L * SARATI_D
172
+
173
+ [{LINE_L_KER}]{V_L_KER_WN} --> 2,1 --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_L_IMG}]
174
+
175
+ \** Missing ld, ly, hl, hr ? **\
176
+
177
+ \** ########### **\
178
+ \** S/Z line **\
179
+
180
+ \** st v **\
181
+ \** sty … **\
182
+ \** ss ¦ ou w ou i **\
183
+
184
+ \** For s, use the same sarat as for th **\
185
+
186
+ {LINE_8TH_KER} === s * {SS}
187
+ {LINE_8TH_IMG} === SARATI_QUENYA_S * SARATI_QUENYA_SS_ALT_1
188
+
189
+ [{LINE_8TH_KER}]{V_L_KER_WN} --> 2,1 --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_8TH_IMG}]
190
+
191
+ {LINE_8PTH_KER} === st * sty
192
+ {LINE_8PTH_IMG} === SARATI_QUENYA_ST * SARATI_QUENYA_STY
193
+
194
+ [{LINE_8PTH_KER}]{V_L_KER_WN} --> 2,1 --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_8PTH_IMG}]
195
+
196
+ \** Override lonely s / ss / before consonant: TODO!!!! **\
197
+ \** s -> 8 **\
198
+ \** {SS} -> , **\
199
+
200
+ \** ############ **\
201
+ \** OTHERS **\
202
+
203
+ x {V_L_KER_WN} --> {V_IMG_FOR_CONSONNANTS_WN} SARATI_QUENYA_X
204
+ \end
205
+
206
+ \beg rules punctuation
207
+ · --> {NULL}
208
+ , --> {NULL}
209
+ ; --> {NULL}
210
+ : --> {NULL}
211
+ . --> SARATI_SPACE
212
+ - --> SARATI_SPACE
213
+ – --> SARATI_SPACE
214
+ ! --> {NULL}
215
+ ? --> {NULL}
216
+ ' --> {NULL}
217
+ [ --> {NULL}
218
+ ] --> {NULL}
219
+ ‘ --> {NULL}
220
+ ’ --> {NULL}
221
+ “ --> {NULL}
222
+ ” --> {NULL}
223
+ \end
224
+
225
+ \end
226
+
227
+ \beg postprocessor
228
+ \reverse
229
+ \end
230
+
231
+ \** Ponctuation **\
232
+
233
+
234
+
235
+ \** ############### **\
236
+ \** Helpers, transcribed from amanye tenceli **\
237
+
238
+ \** ########### **\
239
+ \** # p Z **\
240
+ \** # t " **\
241
+ \** # c # **\
242
+ \** # q p **\
243
+
244
+ \** # ty ± **\
245
+ \** # ts g **\
246
+
247
+ \** ########### **\
248
+ \** # mb _ **\
249
+ \** # nd € **\
250
+ \** # ndy ³ **\
251
+ \** # ng & **\
252
+ \** # ngw s **\
253
+
254
+ \** ########### **\
255
+
256
+ \** # f \ ou [ ## Aside or below **\
257
+ \** # s (th) Ÿ **\
258
+ \** # hy ½ **\
259
+ \** # h Ë **\
260
+ \** # hw º **\
261
+
262
+ \** # ht ² ou ‚ **\
263
+ \** # hty Π**\
264
+
265
+ \** ########### **\
266
+
267
+ \** # mp d **\
268
+ \** # nt ª **\
269
+ \** # nty „ **\
270
+ \** # nc — **\
271
+ \** # nq ˜ **\
272
+
273
+ \** ########### **\
274
+
275
+ \** # m P **\
276
+ \** # n À **\
277
+ \** # ny ‰ **\
278
+ \** # ñ + **\
279
+ \** # nw , **\
280
+
281
+ \** ########### **\
282
+
283
+ \** # v a ou ` ## Aside or below **\
284
+ \** # r F **\
285
+ \** # y » **\
286
+ \** # w ¹ **\
287
+
288
+ \** ########### **\
289
+
290
+ \** # l ? **\
291
+
292
+ \** ########### **\
293
+
294
+ \** # st v **\
295
+ \** # sty … **\
296
+ \** # ss ¦ ou w ou i **\
297
+
298
+ \** ################ **\
299
+
300
+ \** # x (ks) y **\
301
+
302
+
303
+ \** # GEMINATION -> ó **\
304
+ \** # PRECEDING S -> ý **\
305
+ \** # SHORT CARRIER -> È **\
306
+ \** # **\
307
+ \** # Vowels : **\
308
+ \** # Stop Vowel: Ó **\
309
+ \** # i Ò **\
310
+ \** # e è ou Ô **\
311
+ \** # a Ö **\
312
+ \** # o Ü **\
313
+ \** # u Þ **\
314
+ \** # **\
315
+ \** # Long Vowels: **\
316
+ \** # Carrier dash : ò **\
317
+ \** # Always use carrier dashes EXCEPT for a **\
318
+
319
+
320
+
@@ -0,0 +1,307 @@
1
+ \**
2
+
3
+ Glǽmscribe (also written Glaemscribe) is a software dedicated to
4
+ the transcription of texts between writing systems, and more
5
+ specifically dedicated to the transcription of J.R.R. Tolkien's
6
+ invented languages to some of his devised writing systems.
7
+
8
+ Copyright (C) 2015 Benjamin Babut (Talagan).
9
+
10
+ This program is free software: you can redistribute it and/or modify
11
+ it under the terms of the GNU Affero General Public License as published by
12
+ the Free Software Foundation, either version 3 of the License, or
13
+ any later version.
14
+
15
+ This program is distributed in the hope that it will be useful,
16
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ GNU Affero General Public License for more details.
19
+
20
+ You should have received a copy of the GNU Affero General Public License
21
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
22
+
23
+ **\
24
+
25
+ \language "Quenya"
26
+ \writing "Tengwar"
27
+ \mode "Classical"
28
+ \version "0.0.1"
29
+ \authors "Talagan (Benjamin Babut)"
30
+
31
+ \charset tengwar_ds true
32
+
33
+ \beg options
34
+ \option split_diphthongs false
35
+ \option always_use_romen_for_r false
36
+ \option reverse_numbers true
37
+ \beg option numbers_base BASE_12
38
+ \value BASE_10 10
39
+ \value BASE_12 12
40
+ \end
41
+ \end
42
+
43
+ \beg preprocessor
44
+ \** Work exclusively downcase **\
45
+ \downcase
46
+
47
+ \** Simplify trema vowels **\
48
+ \substitute ä a
49
+ \substitute ë e
50
+ \substitute ï i
51
+ \substitute ö o
52
+ \substitute ü u
53
+ \substitute ÿ y
54
+
55
+ \** Dis-ambiguate long vowels **\
56
+ \rxsubstitute "(ā|â|aa)" "á"
57
+ \rxsubstitute "(ē|ê|ee)" "é"
58
+ \rxsubstitute "(ī|î|ii)" "í"
59
+ \rxsubstitute "(ō|ô|oo)" "ó"
60
+ \rxsubstitute "(ū|û|uu)" "ú"
61
+ \rxsubstitute "(ȳ|ŷ|yy)" "ý"
62
+
63
+ \substitute "qu" "q" \** Dis-ambiguate qu **\
64
+
65
+ \elvish_numbers "\\eval numbers_base" "\\eval reverse_numbers"
66
+ \end
67
+
68
+ \beg processor
69
+
70
+ \beg rules litteral
71
+
72
+ {K} === (c,k)
73
+ {MB} === (b,mb)
74
+ {SS} === (z,ss)
75
+
76
+ {VOWELS} === a * e * i * o * u
77
+ {LVOWELS} === á * é * í * ó * ú
78
+
79
+ {TEHTA_XS} === A_TEHTA_XS * E_TEHTA_XS * I_TEHTA_XS * O_TEHTA_XS * U_TEHTA_XS
80
+ {TEHTA__S} === A_TEHTA_S * E_TEHTA_S * I_TEHTA_S * O_TEHTA_S * U_TEHTA_S
81
+ {TEHTA__L} === A_TEHTA_L * E_TEHTA_L * I_TEHTA_L * O_TEHTA_L * U_TEHTA_L
82
+ {TEHTA_XL} === A_TEHTA_XL * E_TEHTA_XL * I_TEHTA_XL * O_TEHTA_XL * U_TEHTA_XL
83
+
84
+ \if split_diphthongs
85
+ {WDIPHTHONGS} === {NULL}
86
+ {WDIPHTHENGS} === {NULL}
87
+ \else
88
+ {DIPHTHONGS} === ai * au * eu * iu * oi * ui
89
+ {DIPHTHENGS} === YANTA A_TEHTA_L * URE A_TEHTA_L * URE E_TEHTA_L * URE I_TEHTA_L * YANTA O_TEHTA_L * YANTA U_TEHTA_L
90
+ {WDIPHTHONGS} === * {DIPHTHONGS} \** groovy! **\
91
+ {WDIPHTHENGS} === * {DIPHTHENGS} \** same thing **\
92
+ \endif
93
+
94
+ {V_D_KER} === [ {VOWELS} {WDIPHTHONGS} ]
95
+ {V_D_KER_WN} === [ {VOWELS} {WDIPHTHONGS} * {NULL} ]
96
+
97
+ {V_D_IMG_XS} === [ {TEHTA_XS} {WDIPHTHENGS} ]
98
+ {V_D_IMG__S} === [ {TEHTA__L} {WDIPHTHENGS} ]
99
+ {V_D_IMG__L} === [ {TEHTA__S} {WDIPHTHENGS} ]
100
+ {V_D_IMG_XL} === [ {TEHTA_XL} {WDIPHTHENGS} ]
101
+ {V_D_IMG_XS_WN} === [ {TEHTA_XS} {WDIPHTHENGS} * {NULL} ]
102
+ {V_D_IMG__S_WN} === [ {TEHTA__L} {WDIPHTHENGS} * {NULL} ]
103
+ {V_D_IMG__L_WN} === [ {TEHTA__S} {WDIPHTHENGS} * {NULL} ]
104
+ {V_D_IMG_XL_WN} === [ {TEHTA_XL} {WDIPHTHENGS} * {NULL} ]
105
+
106
+ \** VOWEL RULES **\
107
+ [{VOWELS}] --> TELCO [{TEHTA_XS}] \** Replace isolated short vowels **\
108
+ [{LVOWELS}] --> ARA [{TEHTA_XS}] \** Replace long vowels **\
109
+
110
+ \if !split_diphthongs
111
+ [{DIPHTHONGS}] --> [{DIPHTHENGS}] \** Replace diphthongs **\
112
+ \endif
113
+
114
+ \** ===================== **\
115
+ \** 1ST LINE RULES **\
116
+ \** ===================== **\
117
+ {L1_KER_1} === t * p
118
+ {L1_IMG_1} === TINCO * PARMA
119
+ {L1_KER_2} === {K} * q
120
+ {L1_IMG_2} === CALMA * QUESSE
121
+ {L1_KER_1_GEMS} === tt * pp
122
+ {L1_IMG_1_GEMS} === TINCO DASH_INF_S * PARMA DASH_INF_S
123
+
124
+ \** NORMAL **\
125
+ [ {L1_KER_1} ] {V_D_KER_WN} --> [ {L1_IMG_1} ] {V_D_IMG__S_WN}
126
+ [ {L1_KER_2} ] {V_D_KER_WN} --> [ {L1_IMG_2} ] {V_D_IMG__S_WN}
127
+
128
+ \** GEMINATED **\
129
+ [ {L1_KER_1_GEMS} ] {V_D_KER_WN} --> [ {L1_IMG_1_GEMS} ] {V_D_IMG__S_WN} \** Tengscribe uses S but L is probably better **\
130
+ {K}{K}{V_D_KER_WN} --> CALMA DASH_INF_S {V_D_IMG__S_WN}
131
+
132
+ \** OTHERS **\
133
+ ty{V_D_KER_WN} --> TINCO THINF_DDOT_L {V_D_IMG__S_WN}
134
+ py{V_D_KER_WN} --> PARMA THINF_DDOT_L {V_D_IMG__S_WN}
135
+
136
+ ts{V_D_KER_WN}_ --> TINCO SHOOK_RIGHT_L {V_D_IMG_XL_WN}
137
+ ps{V_D_KER_WN}_ --> PARMA SHOOK_RIGHT_L {V_D_IMG_XL_WN}
138
+ x{V_D_KER_WN} --> CALMA SHOOK_LEFT_L {V_D_IMG_S_WN} \** render ks for x **\
139
+
140
+ \** ===================== **\
141
+ \** 2ND LINE RULES **\
142
+ \** ===================== **\
143
+ {L2_KER} === nd * {MB} * ng * ngw
144
+ {L2_IMG} === ANDO * UMBAR * ANGA * UNGWE
145
+
146
+ \** STANDARD **\
147
+ [{L2_KER}]{V_D_KER_WN} --> [{L2_IMG}]{V_D_IMG_XL_WN}
148
+ \** OTHERS **\
149
+ ndy{V_D_KER_WN} --> ANDO THINF_DDOT_XL {V_D_IMG_XL_WN}
150
+
151
+ \** ===================== **\
152
+ \** 3RD LINE RULES **\
153
+ \** ===================== **\
154
+ {L3_KER_1} === (th,þ) * f
155
+ {L3_IMG_1} === SULE * FORMEN
156
+ {L3_KER_2} === h * hw
157
+ {L3_IMG_2} === AHA * HWESTA
158
+
159
+ \** NORMAL **\
160
+ [{L3_KER_1}]{V_D_KER_WN} --> [{L3_IMG_1}]{V_D_IMG__S_WN}
161
+ [{L3_KER_2}]{V_D_KER_WN} --> [{L3_IMG_2}]{V_D_IMG__S_WN} \** Tengscribe uses S but L is probably better **\
162
+
163
+ \** OTHERS **\
164
+ hy{V_D_KER_WN} --> HYARMEN THINF_DDOT_L {V_D_IMG__L_WN}
165
+
166
+ \** Override h with vowels (descendent of hy) **\
167
+ _h{V_D_KER} --> HYARMEN {V_D_IMG__L}
168
+ h[{LVOWELS}] --> HYARMEN ARA [{TEHTA_XS}]
169
+ h --> AHA
170
+
171
+ \** ===================== **\
172
+ \** 4TH LINE RULES **\
173
+ \** ===================== **\
174
+ {L4_KER} === nt * mp * nc * nq \** Not nqu, due to preprocessor **\
175
+ {L4_IMG} === ANTO * AMPA * ANCA * UNQUE
176
+
177
+ \** NORMAL **\
178
+ [{L4_KER}]{V_D_KER_WN} --> [{L4_IMG}]{V_D_IMG_XL_WN}
179
+ \** OTHERS **\
180
+ nty{V_D_KER_WN} --> ANTO THINF_DDOT_XL {V_D_IMG_XL_WN}
181
+
182
+ \** ===================== **\
183
+ \** 5TH LINE RULES **\
184
+ \** ===================== **\
185
+ {L5_KER} === n * m * ñ * ñw * _nw
186
+ {L5_IMG} === NUMEN * MALTA * NOLDO * NWALME * NWALME
187
+
188
+ [{L5_KER}]{V_D_KER_WN} --> [{L5_IMG}]{V_D_IMG_XL_WN}
189
+
190
+ ny{V_D_KER_WN} --> NUMEN THINF_DDOT_XL {V_D_IMG_XL_WN}
191
+ nn{V_D_KER_WN} --> NUMEN DASH_INF_L {V_D_IMG_XL_WN}
192
+ my{V_D_KER_WN} --> MALTA THINF_DDOT_XL {V_D_IMG_XL_WN}
193
+ mm{V_D_KER_WN} --> MALTA DASH_INF_L {V_D_IMG_XL_WN}
194
+
195
+ \** ===================== **\
196
+ \** 6TH LINE RULES **\
197
+ \** ===================== **\
198
+ {L6_KER} === r * v * y * w
199
+ {L6_IMG} === ROMEN * VALA * ANNA THINF_DDOT_L * VILYA
200
+
201
+ [{L6_KER}]{V_D_KER_WN} --> [{L6_IMG}]{V_D_IMG__S_WN}
202
+
203
+ \** r before long vowels is voiced **\
204
+ r[{LVOWELS}] --> ROMEN ARA [{TEHTA_XS}]
205
+
206
+ \if always_use_romen_for_r
207
+ r --> ROMEN
208
+ \else
209
+ r --> ORE \** lonely r is not voiced, so override rule **\
210
+ \endif
211
+
212
+ rr{V_D_KER_WN} --> ROMEN DASH_INF_S {V_D_IMG__S_WN}
213
+ ry{V_D_KER_WN} --> ROMEN THINF_DDOT_L {V_D_IMG__S_WN}
214
+ rd{V_D_KER_WN} --> ARDA {V_D_IMG__S_WN}
215
+
216
+ \** ===================== **\
217
+ \** L LINE RULES **\
218
+ \** ===================== **\
219
+ {LINE_L_KER} === l * ld * ll
220
+ {LINE_L_IMG} === LAMBE * ALDA * LAMBE LAMBE_MARK_TILD
221
+
222
+ [{LINE_L_KER}]{V_D_KER_WN} --> [{LINE_L_IMG}]{V_D_IMG__S_WN}
223
+ ly{V_D_KER_WN} --> LAMBE LAMBE_MARK_DDOT {V_D_IMG__S_WN}
224
+ hl{V_D_KER_WN} --> HALLA LAMBE {V_D_IMG__S_WN}
225
+ hr{V_D_KER_WN} --> HALLA ROMEN {V_D_IMG__S_WN}
226
+
227
+ \** ===================== **\
228
+ \** S/Z LINE RULES **\
229
+ \** ===================== **\
230
+ {L8_KER} === s * {SS}
231
+ {L8_IMG} === SILME_NUQUERNA * ESSE_NUQUERNA
232
+
233
+ [{L8_KER}]{V_D_KER_WN} --> [{L8_IMG}]{V_D_IMG__S_WN}
234
+
235
+ \** Override lonely s / ss / before consonant **\
236
+ s --> SILME
237
+ s[{LVOWELS}] --> SILME ARA [{TEHTA_XS}]
238
+ {SS} --> ESSE
239
+ {SS}[{LVOWELS}] --> ESSE ARA [{TEHTA_XS}]
240
+
241
+ \end
242
+
243
+ \beg rules punctuation
244
+ . --> PUNCT_DDOT
245
+ .. --> PUNCT_DOT PUNCT_DDOT PUNCT_DOT
246
+ … --> PUNCT_TILD
247
+ ... --> PUNCT_TILD
248
+ .... --> PUNCT_TILD
249
+ ..... --> PUNCT_TILD
250
+ ...... --> PUNCT_TILD
251
+ ....... --> PUNCT_TILD
252
+
253
+ , --> PUNCT_DOT
254
+ : --> PUNCT_DOT
255
+ ; --> PUNCT_DOT
256
+ ! --> PUNCT_EXCLAM
257
+ ? --> PUNCT_INTERR
258
+ · --> PUNCT_DOT
259
+
260
+ \** Apostrophe **\
261
+
262
+ ' --> {NULL}
263
+ ’ --> {NULL}
264
+
265
+ \** Quotes **\
266
+
267
+ “ --> DQUOT_OPEN
268
+ ” --> DQUOT_CLOSE
269
+ « --> DQUOT_OPEN
270
+ » --> DQUOT_CLOSE
271
+
272
+ - --> {NULL}
273
+ – --> PUNCT_TILD
274
+ — --> PUNCT_TILD
275
+
276
+ [ --> PUNCT_PAREN_L
277
+ ] --> PUNCT_PAREN_R
278
+ ( --> PUNCT_PAREN_L
279
+ ) --> PUNCT_PAREN_R
280
+ { --> PUNCT_PAREN_L
281
+ } --> PUNCT_PAREN_R
282
+ < --> PUNCT_PAREN_L
283
+ > --> PUNCT_PAREN_R
284
+
285
+ \** Not universal between fonts ... **\
286
+ $ --> BOOKMARK_SIGN
287
+ ≤ --> RING_MARK_L \** Ring inscription left beautiful stuff **\
288
+ ≥ --> RING_MARK_R \** Ring inscription right beautiful stuff **\
289
+
290
+ \end
291
+
292
+ \beg rules numbers
293
+ 0 --> NUM_0
294
+ 1 --> NUM_1
295
+ 2 --> NUM_2
296
+ 3 --> NUM_3
297
+ 4 --> NUM_4
298
+ 5 --> NUM_5
299
+ 6 --> NUM_6
300
+ 7 --> NUM_7
301
+ 8 --> NUM_8
302
+ 9 --> NUM_9
303
+ A --> NUM_10
304
+ B --> NUM_11
305
+ \end
306
+
307
+ \end