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,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
+