glaemscribe 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,210 @@
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 "Valarin"
26
+ \writing "Sarati"
27
+ \mode "Glaemscrafu"
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
+ \substitute ä a
39
+ \substitute ë e
40
+ \substitute ï i
41
+ \substitute ö o
42
+ \substitute ü u
43
+ \substitute ÿ y
44
+
45
+ \** Dis-ambiguate long vowels **\
46
+ \rxsubstitute "(ā|â|aa)" "á"
47
+ \rxsubstitute "(ē|ê|ee)" "é"
48
+ \rxsubstitute "(ī|î|ii)" "í"
49
+ \rxsubstitute "(ō|ô|oo)" "ó"
50
+ \rxsubstitute "(ū|û|uu)" "ú"
51
+ \rxsubstitute "(ȳ|ŷ|yy)" "ý"
52
+
53
+ \substitute "ai" "ay" \** Dis-ambiguate ai **\
54
+ \end
55
+
56
+ \beg processor
57
+
58
+ \outspace SARATI_SPACE
59
+
60
+ \beg rules litteral
61
+
62
+ {A} === a
63
+ {AA} === á
64
+ {E} === e
65
+ {EE} === é
66
+ {I} === i
67
+ {II} === í
68
+ {O} === o
69
+ {OO} === ó
70
+ {U} === u
71
+ {UU} === ú
72
+ {Y} === y
73
+ {YY} === ý
74
+
75
+ {AE} === (æ,ae)
76
+ {AEAE} === (ǽ,ǣ)
77
+
78
+ {OE} === ǫ
79
+ {OEOE} === ǭ
80
+
81
+ \** ################################################# **\
82
+ \** DIPHTHONGS are dis-ambiguated in the preprocessor # **\
83
+ \** ################################################# **\
84
+
85
+ \** ############# **\
86
+ \** DIACRITICS # **\
87
+ \** ############# **\
88
+
89
+ {VOWELS} === {A} * {E} * {I} * {O} * {U} * {AE} * {OE}
90
+ {LVOWELS} === {AA} * {EE} * {II} * {OO} * {UU} * {AEAE} * {OEOE}
91
+ {STEHTAS} === SARATI_QUENYA_A * SARATI_QUENYA_E * SARATI_QUENYA_I * SARATI_QUENYA_O * SARATI_QUENYA_U * SARATI_QUENYA_A_REVERSED * SARATI_DIACRITIC_CIRCLE
92
+
93
+ {V_L_KER_WN} === [ {VOWELS} * {NULL} ]
94
+ {V_IMG_FOR_CONSONNANTS_WN} === [ {STEHTAS} * {NULL} ] \** # No vowel == nothing **\
95
+
96
+ \** ######## **\
97
+ \** RULES # **\
98
+ \** ######## **\
99
+
100
+ [{VOWELS}] --> [{STEHTAS}] SARATI_QUENYA_LONG_VOWEL_CARRIER \** # Isolated vowels : use short carrier (reversed order RTL) **\
101
+ [{LVOWELS}] --> [{STEHTAS}] SARATI_DASH_U SARATI_QUENYA_LONG_VOWEL_CARRIER \** # Long vowels: carrier + dash + tehta **\
102
+
103
+ \** ########### **\
104
+ \** FIRST LINE **\
105
+
106
+ {K} === (c,k) \** # For tolkienian compatibility's sake **\
107
+
108
+ {LINE_1ST_KER} === t * p * {K} \** # * tt * pp * {K}{K} **\
109
+ {LINE_1ST_IMG} === SARATI_T * SARATI_P * SARATI_QUENYA_C \** # * ó" * óq * ó# **\
110
+
111
+ {V_L_KER_WN}[{LINE_1ST_KER}] --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_1ST_IMG}]
112
+
113
+ \** ########### **\
114
+ \** SECOND LINE **\
115
+
116
+ {LINE_2ND_KER} === d * b * g * gw
117
+ {LINE_2ND_IMG} === SARATI_QUENYA_ND * SARATI_QUENYA_MB * SARATI_NG * SARATI_PHONETIC_GW
118
+
119
+ {V_L_KER_WN}[{LINE_2ND_KER}] --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_2ND_IMG}]
120
+
121
+ \** ########### **\
122
+ \** THIRD LINE **\
123
+
124
+ {LINE_3RD_KER} === þ * s * š * (χ,x) * h * šš \** # * s_ **\
125
+ {LINE_3RD_IMG} === SARATI_QUENYA_NT * SARATI_QUENYA_S * SARATI_VOICELESS_PALATO_ALVEOLAR_SIBILANT_FRICATIVE * SARATI_VOICELESS_VELAR_FRICATIVE * SARATI_H * SARATI_DASH_D SARATI_VOICELESS_PALATO_ALVEOLAR_SIBILANT_FRICATIVE \** # * ü **\
126
+
127
+ {V_L_KER_WN}[{LINE_3RD_KER}] --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_3RD_IMG}]
128
+
129
+ \** ########### **\
130
+ \** FOURTH LINE **\
131
+
132
+ {LINE_4TH_KER} === ð * z * ȝ \** # * z_ **\
133
+ {LINE_4TH_IMG} === SARATI_VOICED_DENTAL_FRICATIVE * SARATI_QUENYA_SS_ALT_1 * SARATI_VOICED_VELAR_FRICATIVE \** # * ú **\
134
+
135
+ {V_L_KER_WN}[{LINE_4TH_KER}] --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_4TH_IMG}]
136
+
137
+ \** ########### **\
138
+ \** FIFTH LINE **\
139
+
140
+ {LINE_5TH_KER} === m * n
141
+ {LINE_5TH_IMG} === SARATI_M * SARATI_N
142
+
143
+ {V_L_KER_WN}[{LINE_5TH_KER}] --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_5TH_IMG}]
144
+
145
+ \** ########### **\
146
+ \** SIXTH LINE **\
147
+
148
+ {LINE_6TH_KER} === l * ll
149
+ {LINE_6TH_IMG} === SARATI_L * SARATI_DASH_D SARATI_L
150
+
151
+ {V_L_KER_WN}[{LINE_6TH_KER}] --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_6TH_IMG}]
152
+
153
+ \** ########### **\
154
+ \** SEVENTH LINE **\
155
+
156
+ {LINE_7TH_KER} === r * rr
157
+ {LINE_7TH_IMG} === SARATI_R * SARATI_DASH_D SARATI_R
158
+
159
+ {V_L_KER_WN}[{LINE_7TH_KER}] --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_7TH_IMG}]
160
+
161
+ \** ########### **\
162
+ \** EIGHTH LINE **\
163
+
164
+ {LINE_8TH_KER} === y * w
165
+ {LINE_8TH_IMG} === SARATI_QUENYA_Y * SARATI_W
166
+
167
+ {V_L_KER_WN}[{LINE_8TH_KER}] --> {V_IMG_FOR_CONSONNANTS_WN}[{LINE_8TH_IMG}]
168
+ \end
169
+
170
+ \beg rules punctuation
171
+ · --> {NULL}
172
+ , --> {NULL}
173
+ ; --> {NULL}
174
+ : --> {NULL}
175
+ . --> SARATI_SPACE
176
+ - --> SARATI_SPACE
177
+ – --> SARATI_SPACE
178
+ ! --> {NULL}
179
+ ? --> {NULL}
180
+ ' --> {NULL}
181
+ [ --> {NULL}
182
+ ] --> {NULL}
183
+ ‘ --> {NULL}
184
+ ’ --> {NULL}
185
+ “ --> {NULL}
186
+ ” --> {NULL}
187
+ \end
188
+ \end
189
+
190
+ \beg postprocessor
191
+ \reverse
192
+ \end
193
+
194
+
195
+ \** # Voyelles : a æ e i o ǫ u / ǭ Ǭ **\
196
+ \** # Diphtongues : ai **\
197
+ \** # **\
198
+ \** # Occlusives aspirées ph th . . . kh . **\
199
+ \** # Occlusives sourdes p t . . . k . **\
200
+ \** # Occlusives sonores b d . . . g . **\
201
+ \** # Fricatives sourdes . þ s š . χ h **\
202
+ \** # Fricatives sonores . ð z . . ȝ . **\
203
+ \** # Nasales m n . . . . . **\
204
+ \** # Latérales . l . . . . . **\
205
+ \** # Vibrantes . r . . . . . **\
206
+ \** # Semi-voyelles w . . . y . . **\
207
+
208
+
209
+
210
+
@@ -0,0 +1,340 @@
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
+ \** Westron mode for glaemscribe (MAY BE INCOMPLETE) **\
26
+ \language Westron
27
+ \writing Tengwar
28
+ \mode Glaemscrafu
29
+ \version 0.0.1
30
+ \authors "Talagan (Benjamin Babut)"
31
+
32
+ \charset tengwar_ds true
33
+
34
+ \beg options
35
+ \option reverse_numbers true
36
+ \beg option numbers_base BASE_12
37
+ \value BASE_10 10
38
+ \value BASE_12 12
39
+ \end
40
+ \end
41
+
42
+ \beg preprocessor
43
+ \** Work exclusively downcase **\
44
+ \downcase
45
+
46
+ \** Simplify trema vowels **\
47
+ \substitute "ä" "a"
48
+ \substitute "ë" "e"
49
+ \substitute "ï" "i"
50
+ \substitute "ö" "o"
51
+ \substitute "ü" "u"
52
+ \substitute "ÿ" "y"
53
+
54
+ \** Dis-ambiguate long vowels **\
55
+ \rxsubstitute "(ā|â|aa)" "á"
56
+ \rxsubstitute "(ē|ê|ee)" "é"
57
+ \rxsubstitute "(ī|î|ii)" "í"
58
+ \rxsubstitute "(ō|ô|oo)" "ó"
59
+ \rxsubstitute "(ū|û|uu)" "ú"
60
+ \rxsubstitute "(ȳ|ŷ|yy)" "ý"
61
+
62
+ \** Preprocess numbers **\
63
+ \elvish_numbers "\\eval numbers_base" "\\eval reverse_numbers"
64
+ \end
65
+
66
+ \beg processor
67
+
68
+ \beg rules litteral
69
+ {A} === a
70
+ {AA} === á
71
+ {E} === e
72
+ {EE} === é
73
+ {I} === i
74
+ {II} === í
75
+ {O} === o
76
+ {OO} === ó
77
+ {U} === u
78
+ {UU} === ú
79
+
80
+ \** Short diphthongs **\
81
+ {AI} === {A}{I}
82
+ {AU} === {A}{U}
83
+ {EI} === {E}{I}
84
+ {EU} === {E}{U}
85
+ {OI} === {O}{I}
86
+ {OU} === {O}{U}
87
+ {UI} === {U}{I}
88
+ {IU} === {I}{U}
89
+
90
+ \** LONG diphthongs **\
91
+ {AAI} === {AA}{I} \** âi **\
92
+ {AAU} === {AA}{U} \** âu **\
93
+ {EEI} === {EE}{I} \** êi **\
94
+ {EEU} === {EE}{U} \** êu **\
95
+ {OOI} === {OO}{I} \** ôi **\
96
+ {OOU} === {OO}{U} \** ôu **\
97
+
98
+ {SDIPHTHONGS} === {AI} * {AU} * {EI} * {EU} * {IU} * {OI} * {OU} * {UI}
99
+ {SDIPHTHENGS} === YANTA A_TEHTA_L * URE A_TEHTA_L * YANTA E_TEHTA_L * URE E_TEHTA_L * URE I_TEHTA_L * YANTA O_TEHTA_L * URE O_TEHTA_L * YANTA U_TEHTA_L
100
+ {LDIPHTHONGS} === {AAI} * {AAU} * {EEI} * {EEU} * {OOI} * {OOU}
101
+ {LDIPHTHENGS} === ARA A_TEHTA_XS YANTA * ARA A_TEHTA_XS URE * ARA E_TEHTA_XS YANTA * ARA E_TEHTA_XS URE * ARA O_TEHTA_XS YANTA * ARA O_TEHTA_XS URE
102
+
103
+ {VOWELS} === {A} * {E} * {I} * {O} * {U}
104
+ {TEHTA_XS} === A_TEHTA_XS * E_TEHTA_XS * I_TEHTA_XS * O_TEHTA_XS * U_TEHTA_XS
105
+ {TEHTA__S} === A_TEHTA_S * E_TEHTA_S * I_TEHTA_S * O_TEHTA_S * U_TEHTA_S
106
+ {TEHTA__L} === A_TEHTA_L * E_TEHTA_L * I_TEHTA_L * O_TEHTA_L * U_TEHTA_L
107
+ {TEHTA_XL} === A_TEHTA_XL * E_TEHTA_XL * I_TEHTA_XL * O_TEHTA_XL * U_TEHTA_XL
108
+
109
+ {LVOWELS} === {AA} * {EE} * {II} * {OO} * {UU}
110
+ {LVOWTNG} === ARA A_TEHTA_XS * ARA E_TEHTA_XS * ARA I_TEHTA_XS * ARA O_TEHTA_XS * ARA U_TEHTA_XS
111
+
112
+ \** Let' put all vowels/diphthongs in the same basket **\
113
+ {V_D} === [ {VOWELS} * {LVOWELS} * {SDIPHTHONGS} * {LDIPHTHONGS} ]
114
+ \** And their images... **\
115
+ {T_XS_D} === [ {TEHTA_XS} * {LVOWTNG} * {SDIPHTHENGS} * {LDIPHTHENGS} ]
116
+ {T_S_D} === [ {TEHTA__S} * {LVOWTNG} * {SDIPHTHENGS} * {LDIPHTHENGS} ]
117
+ {T_L_D} === [ {TEHTA__L} * {LVOWTNG} * {SDIPHTHENGS} * {LDIPHTHENGS} ]
118
+ {T_XL_D} === [ {TEHTA_XL} * {LVOWTNG} * {SDIPHTHENGS} * {LDIPHTHENGS} ]
119
+
120
+ [{VOWELS}] --> TELCO [{TEHTA_XS}] \** Replace isolated short vowels **\
121
+ [{LVOWELS}] --> [{LVOWTNG}] \** Replace long vowels **\
122
+ [{SDIPHTHONGS}] --> [{SDIPHTHENGS}] \** Replace short diphthongs **\
123
+ [{LDIPHTHONGS}] --> [{LDIPHTHENGS}] \** Replace long diphthongs **\
124
+
125
+ \** ================ **\
126
+ \** CONSONANTS **\
127
+ \** ================ **\
128
+
129
+ {L1_S} === t * p * ch * (c,k)
130
+ {L1_T} === TINCO * PARMA * CALMA * QUESSE
131
+
132
+ [{L1_S}] --> [ {L1_T} ]
133
+ [{L1_S}]{V_D} --> [ {L1_T} ]{T_S_D}
134
+
135
+ {L1_G_S} === tt * pp *cch * (c,k)(c,k)
136
+ {L1_G_T} === TINCO DASH_INF_S * PARMA DASH_INF_S *CALMA DASH_INF_S * QUESSE DASH_INF_S
137
+
138
+ [{L1_G_S}] --> [ {L1_G_T} ]
139
+ [{L1_G_S}]{V_D} --> [ {L1_G_T} ]{T_S_D}
140
+
141
+ {L1_N_S} === nt * mp * nch * (n,ñ)(c,k)
142
+ {L1_N_T} === TINCO DASH_SUP_S * PARMA DASH_SUP_S * CALMA DASH_SUP_S * QUESSE DASH_SUP_S
143
+
144
+ [{L1_N_S}] --> [ {L1_N_T} ]
145
+ [{L1_N_S}]{V_D} --> [ {L1_N_T} ]{T_S_D}
146
+
147
+ {L2_S} === d * b * j * g
148
+ {L2_T} === ANDO * UMBAR * ANGA * UNGWE
149
+
150
+ [{L2_S}] --> [{L2_T}]
151
+ [{L2_S}]{V_D} --> [{L2_T}]{T_XL_D}
152
+
153
+ {L2_G_S} === dd * bb * jj * gg
154
+ {L2_G_T} === ANDO DASH_INF_L * UMBAR DASH_INF_L * ANGA DASH_INF_L * UNGWE DASH_INF_L
155
+
156
+ [{L2_G_S}] --> [{L2_G_T}]
157
+ [{L2_G_S}]{V_D} --> [{L2_G_T}]{T_XL_D}
158
+
159
+ {L2_N_S} === nd * Mb * nj * (n,ñ)g
160
+ {L2_N_T} === ANDO DASH_SUP_L * UMBAR DASH_SUP_L * ANGA DASH_SUP_L * UNGWE DASH_SUP_L
161
+
162
+ [{L2_N_S}] --> [{L2_N_T}]
163
+ [{L2_N_S}]{V_D} --> [{L2_N_T}]{T_XL_D}
164
+
165
+ \** Alignment of tehta is not the same in the font **\
166
+ \** So we need to split the third line unfortunately **\
167
+ {L3_1_S} === (th,þ) * (f,ph)
168
+ {L3_1_T} === SULE * FORMEN
169
+
170
+ {L3_2_S} === sh * kh
171
+ {L3_2_T} === AHA * HWESTA
172
+
173
+ [{L3_1_S}] --> [{L3_1_T}]
174
+ [{L3_1_S}]{V_D} --> [{L3_1_T}]{T_S_D}
175
+ [{L3_2_S}] --> [{L3_2_T}]
176
+ [{L3_2_S}]{V_D} --> [{L3_2_T}]{T_L_D}
177
+
178
+ {L3_1G_S} === (thth,tth,þþ) * (ff,phph,pph)
179
+ {L3_1G_T} === SULE DASH_INF_S * FORMEN DASH_INF_S
180
+
181
+ {L3_2G_S} === (shsh,ssh) * (k,kh)kh
182
+ {L3_2G_T} === AHA DASH_INF_S * HWESTA DASH_INF_S
183
+
184
+ [{L3_1G_S}] --> [{L3_1G_T}]
185
+ [{L3_1G_S}]{V_D} --> [{L3_1G_T}]{T_S_D}
186
+ [{L3_2G_S}] --> [{L3_2G_T}]
187
+ [{L3_2G_S}]{V_D} --> [{L3_2G_T}]{T_L_D}
188
+
189
+ {L3_1N_S} === (nth,nþ) * (nf,mf,mph)
190
+ {L3_1N_T} === SULE DASH_SUP_S * FORMEN DASH_SUP_S
191
+
192
+ {L3_2N_S} === nsh * (n,ñ)kh
193
+ {L3_2N_T} === AHA DASH_SUP_S * HWESTA DASH_SUP_S
194
+
195
+ [{L3_1N_S}] --> [{L3_1N_T}]
196
+ [{L3_1N_S}]{V_D} --> [{L3_1N_T}]{T_S_D}
197
+ [{L3_2N_S}] --> [{L3_2N_T}]
198
+ [{L3_2N_S}]{V_D} --> [{L3_2N_T}]{T_L_D}
199
+
200
+ {L4_S} === (dh,ð) * v * zh * gh
201
+ {L4_T} === ANTO * AMPA * ANCA * UNQUE
202
+
203
+ [{L4_S}] --> [{L4_T}]
204
+ [{L4_S}]{V_D} --> [{L4_T}]{T_XL_D}
205
+
206
+ {L4_G_S} === (dh,ð)(dh,ð) * vv * (zhzh,zzh) * (ghgh,ggh)
207
+ {L4_G_T} === ANTO DASH_INF_L * AMPA DASH_INF_L * ANCA DASH_INF_L * UNQUE DASH_INF_L
208
+
209
+ [{L4_G_S}] --> [{L4_G_T}]
210
+ [{L4_G_S}]{V_D} --> [{L4_G_T}]{T_XL_D}
211
+
212
+ {L4_N_S} === n(dh,ð) * (mv,nv) * nzh * (n,ñ)gh
213
+ {L4_N_T} === ANTO DASH_SUP_L * AMPA DASH_SUP_L * ANCA DASH_SUP_L * UNQUE DASH_SUP_L
214
+
215
+ [{L4_N_S}] --> [{L4_N_T}]
216
+ [{L4_N_S}]{V_D} --> [{L4_N_T}]{T_XL_D}
217
+
218
+ {L5_S} === n * m * ny * ñ
219
+ {L5_T} === NUMEN * MALTA * NOLDO * NWALME
220
+
221
+ [{L5_S}] --> [{L5_T}]
222
+ [{L5_S}]{V_D} --> [{L5_T}]{T_XL_D}
223
+
224
+ {L5_G_S} === nn * mn * (nyny,nny) * ññ
225
+ {L5_G_T} === NUMEN * MALTA * NOLDO * NWALME
226
+
227
+ [{L5_G_S}] --> [{L5_G_T}]
228
+ [{L5_G_S}]{V_D} --> [{L5_G_T}]{T_XL_D}
229
+
230
+ {L6_S} === w * y * rr * ww * yy
231
+ {L6_T} === VALA * ANNA * ROMEN DASH_INF_S * VALA DASH_INF_S * ANNA DASH_INF_S
232
+ [r * {L6_S}] --> [ ORE * {L6_T}]
233
+ [r * {L6_S}]{V_D} --> [ ROMEN * {L6_T}]{T_S_D}
234
+
235
+ \** This one is not useful (redundant with higher) **\
236
+ \** Keep it for clarity of mind **\
237
+ r_ --> ORE
238
+
239
+ s{V_D} --> SILME_NUQUERNA {T_S_D} \** Before a vowel goes down **\
240
+ s --> SILME \** Any other pos, up **\
241
+ z{V_D} --> ESSE_NUQUERNA {T_S_D} \** Before a vowel goes down **\
242
+ z --> ESSE \** Any other pos, up **\
243
+
244
+ ns{V_D} --> SILME_NUQUERNA DASH_SUP_S {T_S_D}
245
+ ns --> SILME_NUQUERNA DASH_SUP_S
246
+ nz{V_D} --> ESSE_NUQUERNA DASH_SUP_S {T_S_D}
247
+ nz --> ESSE_NUQUERNA DASH_SUP_S
248
+
249
+ ts --> TINCO SHOOK_RIGHT_L
250
+ ps --> PARMA SHOOK_RIGHT_L
251
+ (ks,cs,x) --> QUESSE SHOOK_LEFT_L
252
+
253
+ ts{V_D} --> TINCO SHOOK_RIGHT_L {T_XL_D}
254
+ ps{V_D} --> PARMA SHOOK_RIGHT_L {T_XL_D}
255
+ (ks,cs,x){V_D} --> QUESSE SHOOK_LEFT_L {T_S_D}
256
+
257
+ h{V_D} --> HYARMEN {T_XS_D}
258
+ h --> HYARMEN
259
+ hh{V_D} --> HYARMEN DASH_INF_L {T_XS_D}
260
+ hh --> HYARMEN DASH_INF_L
261
+
262
+ l{V_D} --> LAMBE {T_L_D}
263
+ l --> LAMBE
264
+
265
+ ll{V_D} --> LAMBE LAMBE_MARK_TILD {T_L_D}
266
+ ll --> LAMBE LAMBE_MARK_TILD
267
+
268
+ (hl,lh){V_D} --> ALDA {T_XL_D}
269
+ (hl,lh) --> ALDA
270
+
271
+ (hr,rh){V_D} --> ARDA {T_XL_D}
272
+ (hr,rh) --> ARDA
273
+
274
+ \end
275
+
276
+ \beg rules punctutation
277
+ . --> PUNCT_DDOT
278
+ .. --> PUNCT_DOT PUNCT_DDOT PUNCT_DOT
279
+ … --> PUNCT_TILD
280
+ ... --> PUNCT_TILD
281
+ .... --> PUNCT_TILD
282
+ ..... --> PUNCT_TILD
283
+ ...... --> PUNCT_TILD
284
+ ....... --> PUNCT_TILD
285
+
286
+ , --> PUNCT_DOT
287
+ : --> PUNCT_DOT
288
+ ; --> PUNCT_DOT
289
+ ! --> PUNCT_EXCLAM
290
+ ? --> PUNCT_INTERR
291
+ · --> PUNCT_DOT
292
+
293
+ \** Apostrophe **\
294
+
295
+ ' --> {NULL}
296
+ ’ --> {NULL}
297
+
298
+ \** Quotes **\
299
+
300
+ “ --> DQUOT_OPEN
301
+ ” --> DQUOT_CLOSE
302
+ « --> DQUOT_OPEN
303
+ » --> DQUOT_CLOSE
304
+
305
+ - --> PUNCT_DOT
306
+ – --> WAVE_MED_SIMPLE
307
+ — --> WAVE_MED_DOUBLE
308
+
309
+ [ --> PUNCT_PAREN_L
310
+ ] --> PUNCT_PAREN_R
311
+ ( --> PUNCT_PAREN_L
312
+ ) --> PUNCT_PAREN_R
313
+ { --> PUNCT_PAREN_L
314
+ } --> PUNCT_PAREN_R
315
+ < --> PUNCT_PAREN_L
316
+ > --> PUNCT_PAREN_R
317
+
318
+ \** Not universal between fonts ... **\
319
+ $ --> BOOKMARK_SIGN
320
+ ≤ --> RING_MARK_L \** Ring inscription left beautiful stuff **\
321
+ ≥ --> RING_MARK_R \** Ring inscription right beautiful stuff **\
322
+ \end
323
+
324
+ \beg rules numbers
325
+ 0 --> NUM_0
326
+ 1 --> NUM_1
327
+ 2 --> NUM_2
328
+ 3 --> NUM_3
329
+ 4 --> NUM_4
330
+ 5 --> NUM_5
331
+ 6 --> NUM_6
332
+ 7 --> NUM_7
333
+ 8 --> NUM_8
334
+ 9 --> NUM_9
335
+ A --> NUM_10
336
+ B --> NUM_11
337
+ \end
338
+
339
+ \end
340
+