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,419 @@
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 "Old English"
26
+ \writing "Tengwar"
27
+ \mode "Mercian"
28
+ \version "0.0.1"
29
+ \authors "Talagan (Benjamin Babut)"
30
+
31
+ \charset tengwar_ds 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
+ \substitute "ae" "æ"
46
+ \substitute "ea" "æa"
47
+ \substitute "éa" "ǽa"
48
+ \substitute "7" "⁊"
49
+
50
+ \** Dis-ambiguate long vowels **\
51
+ \rxsubstitute "(ā|â|aa)" "á"
52
+ \rxsubstitute "(ē|ê|ee)" "é"
53
+ \rxsubstitute "(ī|î|ii)" "í"
54
+ \rxsubstitute "(ō|ô|oo)" "ó"
55
+ \rxsubstitute "(ū|û|uu)" "ú"
56
+ \rxsubstitute "(ȳ|ŷ|yy)" "ý"
57
+ \end
58
+
59
+ \beg processor
60
+
61
+ \beg rules litteral
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
+ \** Diphtongs are always splitted, so consider we don't have any. **\
82
+ \** @ is the phantom vowel added by the preprocessor **\
83
+
84
+ {S_VOWELS_NP} === {A} * {AE} * {OE} * {E} * {I} * {O} * {U} * {Y}
85
+ {S_VOWELS} === {S_VOWELS_NP} * @
86
+
87
+ \** UP TEHTAS **\
88
+ {UTEHTA_NP_XS} === A_TEHTA_XS * Y_TEHTA_XS * E_TEHTA_DOUBLE_XS * E_TEHTA_XS * I_TEHTA_XS * O_TEHTA_XS * U_TEHTA_XS * THSUP_SEV_XS
89
+ {UTEHTA_NP__S} === A_TEHTA_S * Y_TEHTA_S * E_TEHTA_DOUBLE_S * E_TEHTA_S * I_TEHTA_S * O_TEHTA_S * U_TEHTA_S * THSUP_SEV_S
90
+ {UTEHTA_NP__L} === A_TEHTA_L * Y_TEHTA_L * E_TEHTA_DOUBLE_L * E_TEHTA_L * I_TEHTA_L * O_TEHTA_L * U_TEHTA_L * THSUP_SEV_L
91
+ {UTEHTA_NP_XL} === A_TEHTA_XL * Y_TEHTA_XL * E_TEHTA_DOUBLE_XL * E_TEHTA_XL * I_TEHTA_XL * O_TEHTA_XL * U_TEHTA_XL * THSUP_SEV_XL
92
+ {UTEHTA_XS} === {UTEHTA_NP_XS} * {NULL}
93
+ {UTEHTA__S} === {UTEHTA_NP__S} * {NULL}
94
+ {UTEHTA__L} === {UTEHTA_NP__L} * {NULL}
95
+ {UTEHTA_XL} === {UTEHTA_NP_XL} * {NULL}
96
+
97
+ \** FOR LONG VOWELS **\
98
+ {L_VOWELS} === {AA} * {AEAE} * {OEOE} * {EE} * {II} * {OO} * {UU} * {YY}
99
+ {L_PTEHTAS} === ARA A_TEHTA_XS * ARA Y_TEHTA_XS * ARA E_TEHTA_DOUBLE_XS * ARA E_TEHTA_XS * ARA I_TEHTA_XS * ARA O_TEHTA_XS * ARA U_TEHTA_XS * ARA THSUP_SEV_XS
100
+
101
+ {LVOWEL_MARKER_XS} === THINF_STROKE_XS
102
+ {LVOWEL_MARKER__S} === THINF_STROKE_S
103
+ {LVOWEL_MARKER__L} === THINF_STROKE_L
104
+ {LVOWEL_MARKER_XL} === THINF_STROKE_XL
105
+
106
+ \** DOWN TEHTAS **\
107
+ {DTEHTA_XS} === THINF_TDOT_XS * THINF_DDOT_XS * TH_SUB_CIRC_XS * THINF_ACCENT_XS * THINF_DOT_XS * THINF_CURL_XS * THINF_CURL_INV_XS * THINF_STROKE_XS * {NULL}
108
+ {DTEHTA__S} === THINF_TDOT_S * THINF_DDOT_S * TH_SUB_CIRC_S * THINF_ACCENT_S * THINF_DOT_S * THINF_CURL_S * THINF_CURL_INV_S * THINF_STROKE_S * {NULL}
109
+ {DTEHTA__L} === THINF_TDOT_L * THINF_DDOT_L * TH_SUB_CIRC_L * THINF_ACCENT_L * THINF_DOT_L * THINF_CURL_L * THINF_CURL_INV_L * THINF_STROKE_L * {NULL}
110
+ {DTEHTA_XL} === THINF_TDOT_XL * THINF_DDOT_XL * TH_SUB_CIRC_XL * THINF_ACCENT_XL * THINF_DOT_XL * THINF_CURL_XL * THINF_CURL_INV_XL * THINF_STROKE_XL * {NULL}
111
+
112
+ {S_VOWELS_NP_KER} === [ {S_VOWELS_NP} ]
113
+ {S_VOWELS_NP_KER_WN} === [ {S_VOWELS_NP} * {NULL} ]
114
+ {S_VOWELS_KER} === [ {S_VOWELS} ]
115
+ {S_VOWELS_KER_WN} === [ {S_VOWELS} * {NULL} ]
116
+
117
+ \** IMG Sheaves for all vowels **\
118
+ {SU_VOWELS_IMG_XS} === [ {UTEHTA_XS} ]
119
+ {SU_VOWELS_IMG__S} === [ {UTEHTA__S} ]
120
+ {SU_VOWELS_IMG__L} === [ {UTEHTA__L} ]
121
+ {SU_VOWELS_IMG_XL} === [ {UTEHTA_XL} ]
122
+ {SD_VOWELS_IMG_XS} === [ {DTEHTA_XS} ]
123
+ {SD_VOWELS_IMG__S} === [ {DTEHTA__S} ]
124
+ {SD_VOWELS_IMG__L} === [ {DTEHTA__L} ]
125
+ {SD_VOWELS_IMG_XL} === [ {DTEHTA_XL} ]
126
+
127
+ {SU_VOWELS_IMG_XS_WN} === [ {UTEHTA_XS} * {NULL} ]
128
+ {SU_VOWELS_IMG__S_WN} === [ {UTEHTA__S} * {NULL} ]
129
+ {SU_VOWELS_IMG__L_WN} === [ {UTEHTA__L} * {NULL} ]
130
+ {SU_VOWELS_IMG_XL_WN} === [ {UTEHTA_XL} * {NULL} ]
131
+ {SD_VOWELS_IMG_XS_WN} === [ {DTEHTA_XS} * {NULL} ]
132
+ {SD_VOWELS_IMG__S_WN} === [ {DTEHTA__S} * {NULL} ]
133
+ {SD_VOWELS_IMG__L_WN} === [ {DTEHTA__L} * {NULL} ]
134
+ {SD_VOWELS_IMG_XL_WN} === [ {DTEHTA_XL} * {NULL} ]
135
+
136
+ \** Fallback rule for all vowels **\
137
+ [ {L_VOWELS} ] --> [ {L_PTEHTAS} ] \** If found alone, long vowel will have a long carrier **\
138
+
139
+ \** Fallback rule for short vowels **\
140
+ @ --> {NULL} \** If found alone, put nothing **\
141
+ [ {S_VOWELS_NP} ] --> TELCO [ {UTEHTA_NP_XS} ] \** If found alone, a vowel will have a short carrier **\
142
+ _{A} --> VILYA \** We don't want a short carrier for _a **\
143
+ (w,u)_ --> VALA \** Only resolved after vowels **\
144
+
145
+ \** Next rule not valid in mercian mode **\
146
+ \** {UU} -> yU - Nope in mercian **\
147
+
148
+
149
+ \** ========== **\
150
+ \** CONSONANTS **\
151
+ \** ========== **\
152
+
153
+ \** ========== **\
154
+ \** 1st Line (Voiceless occlusives) **\
155
+ \** Short upper dash for nasalisation **\
156
+
157
+ {L1_KER_1} === t * p
158
+ {L1_IMG_1} === TINCO * PARMA
159
+
160
+ {L1_KER_2} === ċ * c * k
161
+ {L1_IMG_2} === CALMA * QUESSE * QUESSE
162
+
163
+ {L1_KER_1_GEMS} === tt * pp
164
+ {L1_IMG_1_GEMS} === TINCO THINF_DSTROKE_XS * PARMA THINF_DSTROKE_XS
165
+
166
+ {L1_KER_2_GEMS} === ċċ * cc * kk
167
+ {L1_IMG_2_GEMS} === CALMA THINF_DSTROKE_XL * QUESSE THINF_DSTROKE_XL * QUESSE THINF_DSTROKE_XL
168
+
169
+ \** C, CV, CVV. Rules are declared to avoid conflicts between [C, NULLV, V] and [C, V, NULLV] **\
170
+ \** We also have rules for long vowels **\
171
+ [{L1_KER_1}] --> [{L1_IMG_1}]
172
+ [{L1_KER_2}] --> [{L1_IMG_2}]
173
+ [{L1_KER_1}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{L1_IMG_1}]{SU_VOWELS_IMG__L}{SD_VOWELS_IMG__S_WN}
174
+ [{L1_KER_2}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{L1_IMG_2}]{SU_VOWELS_IMG__L}{SD_VOWELS_IMG_XL_WN}
175
+ [{L1_KER_1}][{L_VOWELS}] --> [{L1_IMG_1}][{UTEHTA_NP__L}]{LVOWEL_MARKER__S}
176
+ [{L1_KER_2}][{L_VOWELS}] --> [{L1_IMG_2}][{UTEHTA_NP__L}]{LVOWEL_MARKER_XL}
177
+
178
+ \** Geminateds (double sign below) **\
179
+ \** C², C²V **\
180
+ \** NOT C²V² (cannot put second tehta below due to gemination sign) **\
181
+ \** NOT C²L (long vowel not possible with gemination sign) **\
182
+ [{L1_KER_1_GEMS}]{S_VOWELS_KER_WN} --> [{L1_IMG_1_GEMS}]{SU_VOWELS_IMG__L_WN}
183
+ [{L1_KER_2_GEMS}]{S_VOWELS_KER_WN} --> [{L1_IMG_2_GEMS}]{SU_VOWELS_IMG__L_WN}
184
+
185
+ \** Nasals (tild above) **\
186
+ \** nC, nCV, nCVV **\
187
+ \** We also have rules for long vowels **\
188
+ [ nt * mp ] --> [ TINCO TILD_SUP_S * PARMA TILD_SUP_S ]
189
+ [ nċ * nc ] --> [ CALMA TILD_SUP_S * QUESSE TILD_SUP_S ]
190
+ [ nt * mp ]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [ TINCO TILD_SUP_S * PARMA TILD_SUP_S ]{SU_VOWELS_IMG__L}{SD_VOWELS_IMG__S_WN}
191
+ [ nċ * nc ]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [ CALMA TILD_SUP_S * QUESSE TILD_SUP_S ]{SU_VOWELS_IMG__L}{SD_VOWELS_IMG_XL_WN}
192
+ [ nt * mp ][{L_VOWELS}] --> [ TINCO TILD_SUP_S * PARMA TILD_SUP_S ][{UTEHTA_NP__L}]{LVOWEL_MARKER__S}
193
+ [ nċ * nc ][{L_VOWELS}] --> [ CALMA TILD_SUP_S * QUESSE TILD_SUP_S ][{UTEHTA_NP__L}]{LVOWEL_MARKER_XL}
194
+
195
+ \** ========== **\
196
+ \** 2nd Line (Voiced occlusives) **\
197
+ \** Long upper dash for nasalisation **\
198
+
199
+ {L2_KER} === d * b * ġ * g
200
+ {L2_IMG} === ANDO * UMBAR * ANGA * UNGWE
201
+
202
+ {L2_KER_GEMS} === dd * bb * (ċġ,ġġ) * (cg,gg)
203
+ {L2_IMG_GEMS} === ANDO THINF_DSTROKE_L * UMBAR THINF_DSTROKE_L * ANGA THINF_DSTROKE_L * UNGWE THINF_DSTROKE_L
204
+
205
+ \** C, CV, CVV **\
206
+ [{L2_KER}] --> [{L2_IMG}]
207
+ [{L2_KER}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{L2_IMG}]{SU_VOWELS_IMG_XL}{SD_VOWELS_IMG_XL_WN}
208
+ [{L2_KER}][{L_VOWELS}] --> [{L2_IMG}][{UTEHTA_NP_XL}]{LVOWEL_MARKER_XL}
209
+
210
+ \** Geminated sign below, cannot treat diphthongs or long vowels **\
211
+ [{L2_KER_GEMS}]{S_VOWELS_KER_WN} --> [{L2_IMG_GEMS}]{SU_VOWELS_IMG_XL_WN}
212
+
213
+ \** Nasals, with diphthongs! **\
214
+ [ nd * mb * nġ * ng ] --> [ ANDO TILD_SUP_L * UMBAR TILD_SUP_L * ANGA TILD_SUP_L * UNGWE TILD_SUP_L ]
215
+ [ nd * mb * nġ * ng ]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [ ANDO TILD_SUP_L * UMBAR TILD_SUP_L * ANGA TILD_SUP_L * UNGWE TILD_SUP_L ]{SU_VOWELS_IMG_XL}{SD_VOWELS_IMG_XL_WN}
216
+ [ nd * mb * nġ * ng ][{L_VOWELS}] --> [ ANDO TILD_SUP_L * UMBAR TILD_SUP_L * ANGA TILD_SUP_L * UNGWE TILD_SUP_L ][{UTEHTA_NP_XL}]{LVOWEL_MARKER_XL}
217
+
218
+ \** ========== **\
219
+ \** 3rd Line (Voiceless fricatives) **\
220
+ \** Short upper dash for nasalisation **\
221
+ {L3_KER_1} === þ * f
222
+ {L3_IMG_1} === SULE * FORMEN
223
+
224
+ {L3_KER_2} === ç * (χ,ħ)
225
+ {L3_IMG_2} === AHA * HWESTA
226
+
227
+ {L3_KER_1_GEMS} === þþ * ff
228
+ {L3_IMG_1_GEMS} === SULE THINF_DSTROKE_XS * FORMEN THINF_DSTROKE_XS
229
+
230
+ {L3_KER_2_GEMS} === çç * (χχ,ħħ)
231
+ {L3_IMG_2_GEMS} === AHA THINF_DSTROKE_XS * HWESTA THINF_DSTROKE_XS
232
+
233
+ [{L3_KER_1}] --> [{L3_IMG_1}]
234
+ [{L3_KER_2}] --> [{L3_IMG_2}]
235
+ [{L3_KER_1}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{L3_IMG_1}]{SU_VOWELS_IMG__S}{SD_VOWELS_IMG__L_WN}
236
+ [{L3_KER_2}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{L3_IMG_2}]{SU_VOWELS_IMG__L}{SD_VOWELS_IMG_XL_WN}
237
+ [{L3_KER_1}][{L_VOWELS}] --> [{L3_IMG_1}][{UTEHTA_NP__S}]{LVOWEL_MARKER__L}
238
+ [{L3_KER_2}][{L_VOWELS}] --> [{L3_IMG_2}][{UTEHTA_NP__L}]{LVOWEL_MARKER_XL}
239
+
240
+ \** Geminated sign below, cannot treat diphthongs or long vowels **\
241
+ [{L3_KER_1_GEMS}]{S_VOWELS_KER_WN} --> [{L3_IMG_1_GEMS}]{SU_VOWELS_IMG__S_WN}
242
+ [{L3_KER_2_GEMS}]{S_VOWELS_KER_WN} --> [{L3_IMG_2_GEMS}]{SU_VOWELS_IMG__L_WN}
243
+
244
+
245
+ \** ========== **\
246
+ \** 4th Line (Voiced fricatives) **\
247
+ \** Long upper dash for nasalisation **\
248
+
249
+ {L4_KER} === ð * v * j * ȝ
250
+ {L4_IMG} === ANTO * AMPA * ANCA * UNQUE
251
+
252
+ {L4_KER_GEMS} === ðð * vv * jj * ȝȝ
253
+ {L4_IMG_GEMS} === ANTO THINF_DSTROKE_L * AMPA THINF_DSTROKE_L * ANCA THINF_DSTROKE_L * UNQUE THINF_DSTROKE_L
254
+
255
+ [{L4_KER}] --> [{L4_IMG}]
256
+ [{L4_KER}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{L4_IMG}]{SU_VOWELS_IMG_XL}{SD_VOWELS_IMG_XL_WN}
257
+ [{L4_KER}][{L_VOWELS}] --> [{L4_IMG}][{UTEHTA_NP_XL}]{LVOWEL_MARKER_XL}
258
+
259
+ \** Geminated sign below, cannot treat diphthongs or long vowels **\
260
+ [{L4_KER_GEMS}]{S_VOWELS_KER_WN} --> [{L4_IMG_GEMS}]{SU_VOWELS_IMG_XL_WN}
261
+
262
+
263
+ \** ========== **\
264
+ \** 5th Line (Nasals) **\
265
+ \** Long upper dash for nasalisation (wins on gemination) **\
266
+
267
+ {L5_KER} === n * m
268
+ {L5_IMG} === NUMEN * MALTA
269
+
270
+ [{L5_KER}] --> [{L5_IMG}]
271
+ [{L5_KER}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{L5_IMG}]{SU_VOWELS_IMG_XL}{SD_VOWELS_IMG_XL_WN}
272
+ [{L5_KER}][{L_VOWELS}] --> [{L5_IMG}][{UTEHTA_NP_XL}]{LVOWEL_MARKER_XL}
273
+
274
+ \** Gemination === nasalisation **\
275
+ \** So prefer using tild to put tehtas up and down for diphthongs and long vowels **\
276
+
277
+ [ nn * mm ] --> [ NUMEN TILD_SUP_L * MALTA TILD_SUP_L ]
278
+ [ nn * mm ]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [ NUMEN TILD_SUP_L * MALTA TILD_SUP_L ]{SU_VOWELS_IMG_XL}{SD_VOWELS_IMG_XL_WN}
279
+ [ nn * mm ][{L_VOWELS}] --> [ NUMEN TILD_SUP_L * MALTA TILD_SUP_L ][{UTEHTA_NP_XL}]{LVOWEL_MARKER_XL}
280
+
281
+ \** ========== **\
282
+ \** 6th Line (Approximants == fr : Spirantes) **\
283
+ \** Short upper dash for nasalisation **\
284
+
285
+ {L6_KER} === r * ĭ
286
+ {L6_IMG} === ORE * ANNA
287
+ {L6_KER_GEMS} === rr * ĭĭ
288
+ {L6_IMG_GEMS} === ORE THINF_DSTROKE_XS * ANNA THINF_DSTROKE_XS
289
+
290
+ [{L6_KER}] --> [{L6_IMG}]
291
+ [{L6_KER}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{L6_IMG}]{SU_VOWELS_IMG__S}{SD_VOWELS_IMG__L_WN}
292
+ [{L6_KER}][{L_VOWELS}] --> [{L6_IMG}][{UTEHTA_NP__S}]{LVOWEL_MARKER__L}
293
+
294
+ \** Geminated sign below, cannot treat diphthongs or long vowels **\
295
+ [{L6_KER_GEMS}]{S_VOWELS_KER_WN} --> [{L6_IMG_GEMS}]{SU_VOWELS_IMG__S_WN}
296
+
297
+ \** ========== **\
298
+ \** Liquids **\
299
+
300
+ w --> ROMEN
301
+ w{S_VOWELS_KER}{S_VOWELS_KER_WN} --> ROMEN {SU_VOWELS_IMG__L}{SD_VOWELS_IMG_XS_WN}
302
+ w[{L_VOWELS}] --> ROMEN [{UTEHTA_NP__L}]{LVOWEL_MARKER_XS}
303
+
304
+ \** Geminated sign below, cannot treat diphthongs or long vowels **\
305
+ ww{S_VOWELS_KER_WN} --> ROMEN THINF_DSTROKE_XS {SU_VOWELS_IMG__L_WN}
306
+
307
+ \** L and LL and ld are too big to receive tehtas under, so no diphthongs, no long vowels **\
308
+ [l * ll * ld] {S_VOWELS_KER_WN} --> [LAMBE * LAMBE THINF_DSTROKE_FOR_LAMBE * ALDA] {SU_VOWELS_IMG__L_WN}
309
+
310
+ \** ========== **\
311
+ \** Alveolar (sifflantes) **\
312
+
313
+ {L8_KER} === s * z
314
+ {L8_IMG} === SILME_NUQUERNA * ESSE_NUQUERNA
315
+ {L8_KER_GEMS} === ss * zz
316
+ {L8_IMG_GEMS} === SILME_NUQUERNA THINF_DSTROKE_XS * ESSE_NUQUERNA THINF_DSTROKE_L
317
+
318
+ [{L8_KER}] --> [{L8_IMG}]
319
+ [{L8_KER}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{L8_IMG}]{SU_VOWELS_IMG__S}{SD_VOWELS_IMG__S_WN}
320
+ [{L8_KER}][{L_VOWELS}] --> [{L8_IMG}][{UTEHTA_NP__S}]{LVOWEL_MARKER__S}
321
+
322
+ \** Geminated sign under, cannot treat diphthongs or long vowels **\
323
+ [{L8_KER_GEMS}]{S_VOWELS_KER_WN} --> [{L8_IMG_GEMS}]{SU_VOWELS_IMG__S_WN}
324
+
325
+ \** Final s (Challenging!) **\
326
+ s_ --> SHOOK_BEAUTIFUL \** Final rule for s **\
327
+ {S_VOWELS_KER}s_ --> TELCO {SU_VOWELS_IMG_XS} SILME_NUQUERNA \** Rule es_ **\
328
+ [{L_VOWELS}]s_ --> [{L_PTEHTAS}] SILME_NUQUERNA \** Rule és_ **\
329
+
330
+ s --> SILME \** Overload lonely s **\
331
+ z --> ESSE \** Overload lonely z **\
332
+
333
+ \** ========== **\
334
+ \** Ligatures **\
335
+
336
+ {LINE_VARIOUS_1_KER} === sċ
337
+ {LINE_VARIOUS_1_IMG} === ANCA_CLOSED
338
+ {LINE_VARIOUS_2_KER} === hw * çt * (χt,ħt)
339
+ {LINE_VARIOUS_2_IMG} === HARP_SHAPED * AHA_TINCO * HWESTA_TINCO
340
+
341
+ [{LINE_VARIOUS_1_KER}] --> [{LINE_VARIOUS_1_IMG}]
342
+ [{LINE_VARIOUS_2_KER}] --> [{LINE_VARIOUS_2_IMG}]
343
+ [{LINE_VARIOUS_1_KER}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{LINE_VARIOUS_1_IMG}]{SU_VOWELS_IMG_XL}{SD_VOWELS_IMG_XL_WN}
344
+ [{LINE_VARIOUS_2_KER}]{S_VOWELS_KER}{S_VOWELS_KER_WN} --> [{LINE_VARIOUS_2_IMG}]{SU_VOWELS_IMG__S}{SD_VOWELS_IMG__S_WN}
345
+ [{LINE_VARIOUS_1_KER}][{L_VOWELS}] --> [{LINE_VARIOUS_1_IMG}][{UTEHTA_NP_XL}]{LVOWEL_MARKER_XL}
346
+ [{LINE_VARIOUS_2_KER}][{L_VOWELS}] --> [{LINE_VARIOUS_2_IMG}][{UTEHTA_NP__S}]{LVOWEL_MARKER__S}
347
+
348
+ \** No nasals, no geminated **\
349
+
350
+ \** ========== **\
351
+ \** Various **\
352
+
353
+ h --> HYARMEN
354
+ h{S_VOWELS_KER}{S_VOWELS_KER_WN} --> HYARMEN {SU_VOWELS_IMG_XS}{SD_VOWELS_IMG__L_WN}
355
+ h[{L_VOWELS}] --> HYARMEN [{UTEHTA_NP_XS}]{LVOWEL_MARKER__L}
356
+
357
+ \** Geminated sign below, cannot treat diphthongs or long vowels **\
358
+ hh{S_VOWELS_KER_WN} --> HYARMEN THINF_DSTROKE_XL {SU_VOWELS_IMG_XS_WN}
359
+
360
+ \** ========== **\
361
+ \** X **\
362
+ \** For x, due to the cedilla, we cannot put tehtas under the tengwa (so no need to treat diphthongs or long vowels) **\
363
+
364
+ x{S_VOWELS_KER_WN} --> QUESSE SHOOK_LEFT_L {SU_VOWELS_IMG__S_WN}
365
+ xx{S_VOWELS_KER_WN} --> QUESSE SHOOK_LEFT_L THINF_DSTROKE_XL {SU_VOWELS_IMG__S_WN}
366
+ nx{S_VOWELS_KER_WN} --> QUESSE SHOOK_LEFT_L TILD_SUP_S {SU_VOWELS_IMG__S_WN}
367
+ \end
368
+
369
+ \beg rules punctuation
370
+ ⁊ --> OLD_ENGLISH_AND
371
+
372
+ . --> PUNCT_DDOT
373
+ .. --> PUNCT_DOT PUNCT_DDOT PUNCT_DOT
374
+ … --> PUNCT_TILD
375
+ ... --> PUNCT_TILD
376
+ .... --> PUNCT_TILD
377
+ ..... --> PUNCT_TILD
378
+ ...... --> PUNCT_TILD
379
+ ....... --> PUNCT_TILD
380
+
381
+ , --> PUNCT_DOT
382
+ : --> PUNCT_DOT
383
+ ; --> PUNCT_DOT
384
+ ! --> PUNCT_EXCLAM
385
+ ? --> PUNCT_INTERR
386
+ · --> PUNCT_DOT
387
+
388
+ \** Apostrophe **\
389
+
390
+ ' --> {NULL}
391
+ ’ --> {NULL}
392
+
393
+ \** Quotes **\
394
+
395
+ “ --> DQUOT_OPEN
396
+ ” --> DQUOT_CLOSE
397
+ « --> DQUOT_OPEN
398
+ » --> DQUOT_CLOSE
399
+
400
+ - --> PUNCT_DOT
401
+ – --> PUNCT_TILD
402
+ — --> PUNCT_TILD
403
+
404
+ [ --> PUNCT_PAREN_L
405
+ ] --> PUNCT_PAREN_R
406
+ ( --> PUNCT_PAREN_L_ALT \** TODO : Remove alt ? **\
407
+ ) --> PUNCT_PAREN_R_ALT \** TODO : Remove alt ? **\
408
+ { --> PUNCT_PAREN_L
409
+ } --> PUNCT_PAREN_R
410
+ < --> PUNCT_PAREN_L
411
+ > --> PUNCT_PAREN_R
412
+
413
+ \** Not universal between fonts ... **\
414
+ $ --> BOOKMARK_SIGN
415
+ ≤ --> RING_MARK_L \** Ring inscription left beautiful stuff **\
416
+ ≥ --> RING_MARK_R \** Ring inscription right beautiful stuff **\
417
+ \end
418
+ \end
419
+
@@ -0,0 +1,127 @@
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 "Old Norse"
26
+ \writing "Runes"
27
+ \mode "Futhark Codex Runicus"
28
+ \version "0.0.1"
29
+ \authors "Talagan (Benjamin Babut)"
30
+
31
+ \charset unicode_runes true
32
+
33
+ \beg preprocessor
34
+ \downcase
35
+ \end
36
+
37
+ \beg processor
38
+
39
+ \beg rules litteral
40
+ {A} === (a,á)
41
+ {E} === (e,é)
42
+ {I} === (i,í,j)
43
+ {O} === (o,ó)
44
+ {U} === (u,ú)
45
+ {Y} === (y,ý)
46
+
47
+ {AE} === (æ,ǽ,ę)
48
+ {OE} === (ø,ǿ,œ)
49
+ {OTREM} === (ö,ǫ)
50
+ {AEI} === (æi,ei)
51
+
52
+ \** VOWELS **\
53
+
54
+ \** ą (> a, o, á, ó plus tard) **\
55
+
56
+ {A} --> SHORT_TWIG_AR
57
+ {E} --> RUNIC_E
58
+ {I} --> ISS
59
+ {O} --> RUNIC_O
60
+ {U} --> UR
61
+ {Y} --> LONG_BRANCH_YR
62
+ {AE} --> LONG_BRANCH_AR
63
+ {OE} --> RUNIC_OE
64
+ {OTREM} --> RUNIC_O \** # ö en islandais **\
65
+ ǭ --> SHORT_TWIG_AR \** # á en islandais **\
66
+ {AEI} --> LONG_BRANCH_AR ISS
67
+
68
+ \** au: ok **\
69
+ {E}{Y} --> LONG_BRANCH_AR LONG_BRANCH_YR
70
+ {OE}{Y} --> LONG_BRANCH_AR LONG_BRANCH_YR
71
+
72
+ \** CONSONANTS **\
73
+
74
+ b --> BJARKAN
75
+ c --> RUNIC_C
76
+ \** bb: ok **\
77
+ \** mb: ok **\
78
+ d --> RUNIC_D
79
+ \** dd: ok **\
80
+ \** nd: ok **\
81
+ ð --> THORN
82
+ (f,f_) --> FEHU \** # Second part is unuseful but exists in other modes **\
83
+ _g --> RUNIC_G \** # Initial / After prefix **\
84
+ (g,g_) --> LONG_BRANCH_HAGALL \** # Median / Final Spirant **\
85
+ gg --> RUNIC_G RUNIC_G
86
+ ng --> SHORT_TWIG_NAUD RUNIC_G
87
+ h --> LONG_BRANCH_HAGALL
88
+ k --> KAUN
89
+ \** kk: ok **\
90
+ \** nk: ok **\
91
+ l --> LOGR
92
+ \** ll: ok **\
93
+ m --> LONG_BRANCH_MADR
94
+ \** mm: ok **\
95
+ n --> SHORT_TWIG_NAUD
96
+ \** nn: ok **\
97
+ p --> DOTTED_P
98
+ \** pp: ok **\
99
+ \** mp: ok **\
100
+ r --> REID
101
+ \** rr: ok **\
102
+ \** ř < z = rune ýr, none in this mode **\
103
+ s --> SIGEL
104
+ \** ss: ok **\
105
+ t --> SHORT_TWIG_TYR
106
+ nt --> SHORT_TWIG_TYR
107
+ \** tt: ok **\
108
+ þ --> THORN
109
+ vv --> FEHU \** # v (< f) **\
110
+ v --> URUZ \** # v (< w) **\
111
+ w --> URUZ \** # Should not exist but let's handle it **\
112
+ x --> RUNIC_X
113
+ z --> RUNIC_Z
114
+ \end
115
+
116
+ \beg rules punctuation
117
+ , --> RUNIC_SINGLE_PUNCTUATION
118
+ ; --> RUNIC_SINGLE_PUNCTUATION
119
+ : --> RUNIC_MULTIPLE_PUNCTUATION
120
+ . --> RUNIC_MULTIPLE_PUNCTUATION
121
+ ! --> RUNIC_MULTIPLE_PUNCTUATION
122
+ ? --> RUNIC_CROSS_PUNCTUATION
123
+ \end
124
+ \end
125
+
126
+
127
+