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,64 @@
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
+ \** Charset for the analecta font used by the gothic mode **\
26
+ \** Very incomplete outside of the gothic range **\
27
+ \** Minimal service here ... **\
28
+
29
+ \** **\ \char 20 SPACE
30
+ \** , **\ \char 2C COMA
31
+ \** . **\ \char 2E PERIOD
32
+ \** : **\ \char 3A COLON
33
+ \** ; **\ \char 3B SEMICOLON
34
+
35
+ \** Gothic part **\
36
+ \** 𐌰 **\ \char 10330 AZA
37
+ \** 𐌱 **\ \char 10331 BERCNA
38
+ \** 𐌳 **\ \char 10333 DAAZ
39
+ \** 𐌴 **\ \char 10334 EYZ
40
+ \** 𐍆 **\ \char 10346 FE
41
+ \** 𐌲 **\ \char 10332 GEUUA
42
+ \** 𐌷 **\ \char 10337 HAAL
43
+ \** 𐌹 **\ \char 10339 IIZ
44
+ \** 𐌾 **\ \char 1033E GAAR
45
+ \** 𐌺 **\ \char 1033A CHOZMA
46
+ \** 𐌻 **\ \char 1033B LAAZ
47
+ \** 𐌼 **\ \char 1033C MANNA
48
+ \** 𐌽 **\ \char 1033D NOICZ
49
+ \** 𐍉 **\ \char 10349 UTAL
50
+ \** 𐍀 **\ \char 10340 PERTRA
51
+ \** 𐌵 **\ \char 10335 QUETRA
52
+ \** 𐍂 **\ \char 10342 REDA
53
+ \** 𐍃 **\ \char 10343 SUGIL
54
+ \** 𐍄 **\ \char 10344 TYZ
55
+ \** 𐌸 **\ \char 10338 THYTH
56
+ \** 𐌿 **\ \char 1033F URAZ
57
+ \** 𐍇 **\ \char 10347 ENGUZ
58
+ \** 𐍅 **\ \char 10345 UUINNE
59
+ \** 𐌶 **\ \char 10336 EZEC
60
+ \** 𐍈 **\ \char 10348 UUAER
61
+ \** 𐍋 **\ \char 1034B IIZ_TREMA \** Special Glaemscrafu ! **\
62
+ \** 𐍁 **\ \char 10341 ?
63
+ \** 𐍊 **\ \char 1034A ?
64
+
@@ -0,0 +1,120 @@
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
+ \** Charset for the pfeffermediaeval font used by the furtharc mode **\
26
+ \** Very incomplete outside of the runes range **\
27
+ \** Minimal service here ... **\
28
+
29
+ \** **\ \char 20 SPACE
30
+ \** , **\ \char 2C COMA
31
+ \** . **\ \char 2E PERIOD
32
+ \** ; **\ \char 3B SEMICOLON
33
+ \** ᚠ **\ \char 16A0 FEHU FEOH FE
34
+ \** ᚡ **\ \char 16A1 RUNIC_V
35
+ \** ᚢ **\ \char 16A2 URUZ UR
36
+ \** ᚣ **\ \char 16A3 YR
37
+ \** ᚤ **\ \char 16A4 RUNIC_Y
38
+ \** ᚥ **\ \char 16A5 RUNIC_W
39
+ \** ᚦ **\ \char 16A6 THURISAZ THURS THORN
40
+ \** ᚧ **\ \char 16A7 ETH
41
+ \** ᚨ **\ \char 16A8 ANSUZ
42
+ \** ᚩ **\ \char 16A9 OS
43
+ \** ᚪ **\ \char 16AA AC
44
+ \** ᚫ **\ \char 16AB AESC
45
+ \** ᚬ **\ \char 16AC LONG_BRANCH_OSS
46
+ \** ᚭ **\ \char 16AD SHORT_TWIG_OSS
47
+ \** ᚮ **\ \char 16AE RUNIC_O
48
+ \** ᚯ **\ \char 16AF RUNIC_OE
49
+ \** ᚰ **\ \char 16B0 RUNIC_ON
50
+ \** ᚱ **\ \char 16B1 RAIDO RAD REID
51
+ \** ᚲ **\ \char 16B2 KAUNA
52
+ \** ᚳ **\ \char 16B3 CEN
53
+ \** ᚴ **\ \char 16B4 KAUN
54
+ \** ᚵ **\ \char 16B5 RUNIC_G
55
+ \** ᚶ **\ \char 16B6 ENG
56
+ \** ᚷ **\ \char 16B7 GEBO GYFU
57
+ \** ᚷ **\ \char 16B8 GAR
58
+ \** ᚹ **\ \char 16B9 WUNJO WYNN
59
+ \** ᚺ **\ \char 16BA HAGLAZ
60
+ \** ᚻ **\ \char 16BB HAEGL
61
+ \** ᚼ **\ \char 16BC LONG_BRANCH_HAGALL
62
+ \** ᚽ **\ \char 16BD SHORT_TWIG_HAGALL
63
+ \** ᚾ **\ \char 16BE NAUDIZ NYD NAUD
64
+ \** ᚿ **\ \char 16BF SHORT_TWIG_NAUD
65
+ \** ᛀ **\ \char 16C0 DOTTED_N
66
+ \** ᛁ **\ \char 16C1 ISAZ IS ISS
67
+ \** ᛂ **\ \char 16C2 RUNIC_E
68
+ \** ᛃ **\ \char 16C3 JERAN
69
+ \** ᛄ **\ \char 16C4 GER
70
+ \** ᛅ **\ \char 16C5 LONG_BRANCH_AR
71
+ \** ᛆ **\ \char 16C6 SHORT_TWIG_AR
72
+ \** ᛇ **\ \char 16C7 IWAZ EOH
73
+ \** ᛈ **\ \char 16C8 PERTHO PEORTH
74
+ \** ᛉ **\ \char 16C9 ALGIZ EOLHX
75
+ \** ᛊ **\ \char 16CA SOWILO
76
+ \** ᛋ **\ \char 16CB SIGEL LONG_BRANCH_SOL
77
+ \** ᛌ **\ \char 16CC SHORT_TWIG_SOL
78
+ \** ᛍ **\ \char 16CD RUNIC_C
79
+ \** ᛎ **\ \char 16CE RUNIC_Z
80
+ \** ᛏ **\ \char 16CF TIWAZ TIR TYR
81
+ \** ᛐ **\ \char 16D0 SHORT_TWIG_TYR
82
+ \** ᛑ **\ \char 16D1 RUNIC_D
83
+ \** ᛒ **\ \char 16D2 BERKANAN BEORC BJARKAN
84
+ \** ᛔ **\ \char 16D4 DOTTED_P
85
+ \** ᛕ **\ \char 16D5 OPEN_P
86
+ \** ᛖ **\ \char 16D6 EHWAZ EH
87
+ \** ᛗ **\ \char 16D7 MANNAZ MAN
88
+ \** ᛘ **\ \char 16D8 LONG_BRANCH_MADR
89
+ \** ᛙ **\ \char 16D9 SHORT_TWIG_MADR
90
+ \** ᛚ **\ \char 16DA LAUKAZ LAGU LOGR
91
+ \** ᛛ **\ \char 16DB DOTTED_L
92
+ \** ᛜ **\ \char 16DC INGWAZ
93
+ \** ᛝ **\ \char 16DD ING
94
+ \** ᛞ **\ \char 16DE DAGAZ DAEG
95
+ \** ᛟ **\ \char 16DF OTHALAN ETHEL
96
+ \** ᛠ **\ \char 16E0 EAR
97
+ \** ᛡ **\ \char 16E1 IOR
98
+ \** ᛢ **\ \char 16E2 CWEORTH
99
+ \** ᛣ **\ \char 16E3 CALC
100
+ \** ᛤ **\ \char 16E4 CEALC
101
+ \** ᛥ **\ \char 16E4 STAN
102
+ \** ᛦ **\ \char 16E6 LONG_BRANCH_YR
103
+ \** ᛧ **\ \char 16E7 SHORT_TWIG_YR
104
+ \** ᛨ **\ \char 16E8 ICELANDIC_YR
105
+ \** ᛩ **\ \char 16E9 RUNIC_Q
106
+ \** ᛪ **\ \char 16EA RUNIC_X
107
+ \** ᛫ **\ \char 16EB RUNIC_SINGLE_PUNCTUATION
108
+ \** ᛬ **\ \char 16EC RUNIC_MULTIPLE_PUNCTUATION
109
+ \** ᛭ **\ \char 16ED RUNIC_CROSS_PUNCTUATION
110
+ \** ᛮ **\ \char 16EE RUNIC_ARLAUG_SYMBOL
111
+ \** ᛯ **\ \char 16EF RUNIC_TVIMADUR_SYMBOL
112
+ \** ᛰ **\ \char 16F0 RUNIC_BELGTHOR_SYMBOL
113
+ \** ᛱ **\ \char 16F1 RUNIC_LETTER_K
114
+ \** ᛲ **\ \char 16F2 RUNIC_LETTER_SH
115
+ \** ᛳ **\ \char 16F3 RUNIC_LETTER_OO
116
+ \** ᛴ **\ \char 16F4 RUNIC_LETTER_FRANKS_CASKET_OS
117
+ \** ᛵ **\ \char 16F5 RUNIC_LETTER_FRANKS_CASKET_IS
118
+ \** ᛶ **\ \char 16F6 RUNIC_LETTER_FRANKS_CASKET_EH
119
+ \** ᛷ **\ \char 16F7 RUNIC_LETTER_FRANKS_CASKET_AC
120
+ \** ᛸ **\ \char 16F8 RUNIC_LETTER_FRANKS_CASKET_AESC
@@ -0,0 +1,251 @@
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
+ \** Adunaic mode for glaemscribe (MAY BE INCOMPLETE) **\
26
+ \language Adûnaic
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
+
84
+ \** LONG diphthongs **\
85
+ {AAI} === {AA}{I} \** âi **\
86
+ {AAU} === {AA}{U} \** âu **\
87
+ {EEI} === {EE}{I} \** êi **\
88
+ {EEU} === {EE}{U} \** êu **\
89
+ {OOI} === {OO}{I} \** ôi **\
90
+ {OOU} === {OO}{U} \** ôu **\
91
+
92
+ {SDIPHTHONGS} === {AI} * {AU}
93
+ {SDIPHTHENGS} === YANTA A_TEHTA_L * URE A_TEHTA_L
94
+
95
+ {LDIPHTHONGS} === {AAI} * {AAU} * {EEI} * {EEU} * {OOI} * {OOU}
96
+ {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
97
+
98
+ {VOWELS} === {A} * {E} * {I} * {O} * {U}
99
+ {TEHTA_XS} === A_TEHTA_XS * E_TEHTA_XS * I_TEHTA_XS * O_TEHTA_XS * U_TEHTA_XS
100
+ {TEHTA__S} === A_TEHTA_S * E_TEHTA_S * I_TEHTA_S * O_TEHTA_S * U_TEHTA_S
101
+ {TEHTA__L} === A_TEHTA_L * E_TEHTA_L * I_TEHTA_L * O_TEHTA_L * U_TEHTA_L
102
+ {TEHTA_XL} === A_TEHTA_XL * E_TEHTA_XL * I_TEHTA_XL * O_TEHTA_XL * U_TEHTA_XL
103
+
104
+ {LVOWELS} === {AA} * {EE} * {II} * {OO} * {UU}
105
+ {LVOWTNG} === ARA A_TEHTA_XS * ARA E_TEHTA_XS * ARA I_TEHTA_XS * ARA O_TEHTA_XS * ARA U_TEHTA_XS
106
+
107
+ \** Let' put all vowels/diphthongs in the same basket **\
108
+ {V_D} === [ {VOWELS} * {LVOWELS} * {SDIPHTHONGS} * {LDIPHTHONGS} ]
109
+ \** And their images... **\
110
+ {T_XS_D} === [ {TEHTA_XS} * {LVOWTNG} * {SDIPHTHENGS} * {LDIPHTHENGS} ]
111
+ {T_S_D} === [ {TEHTA__S} * {LVOWTNG} * {SDIPHTHENGS} * {LDIPHTHENGS} ]
112
+ {T_L_D} === [ {TEHTA__L} * {LVOWTNG} * {SDIPHTHENGS} * {LDIPHTHENGS} ]
113
+ {T_XL_D} === [ {TEHTA_XL} * {LVOWTNG} * {SDIPHTHENGS} * {LDIPHTHENGS} ]
114
+
115
+ [{VOWELS}] --> TELCO [{TEHTA_XS}] \** Replace isolated short vowels **\
116
+ [{LVOWELS}] --> [{LVOWTNG}] \** Replace long vowels **\
117
+ [{SDIPHTHONGS}] --> [{SDIPHTHENGS}] \** Replace short diphthongs **\
118
+ [{LDIPHTHONGS}] --> [{LDIPHTHENGS}] \** Replace long diphthongs **\
119
+
120
+ \** ================ **\
121
+ \** CONSONANTS **\
122
+ \** ================ **\
123
+ {K} === (c,k)
124
+ {V} === (v,w)
125
+
126
+ {L1_S} === {K} * p * t * {K}{K} * pp * tt
127
+ {L1_T} === QUESSE * PARMA * TINCO * CALMA DASH_INF_S * PARMA DASH_INF_S * TINCO DASH_INF_S
128
+
129
+ [{L1_S}] --> [ {L1_T} ]
130
+ [{L1_S}]{V_D} --> [ {L1_T} ]{T_S_D}
131
+
132
+ {L2_S} === d * b * g * dd * bb * gg
133
+ {L2_T} === ANDO * UMBAR * UNGWE * ANDO DASH_INF_L * UMBAR DASH_INF_L * UNGWE DASH_INF_L
134
+ [{L2_S}] --> [{L2_T}]
135
+ [{L2_S}]{V_D} --> [{L2_T}]{T_XL_D}
136
+
137
+ \** Alignment of tehta is not the same in the font **\
138
+ \** So we need to split the third line unfortunately **\
139
+ {L3_1_S} === th * ph * (t,th)th * (p,ph)ph * (t,th)ph * (k,kh)ph * (p,ph)th * (k,kh)th
140
+ {L3_1_T} === SULE * FORMEN * SULE DASH_INF_S * FORMEN DASH_INF_S * SULE FORMEN * HWESTA FORMEN * FORMEN SULE * HWESTA SULE
141
+
142
+ {L3_2_S} === sh * kh * (k,kh)kh * (p,ph)kh * (t,th)kh
143
+ {L3_2_T} === AHA * HWESTA * HWESTA DASH_INF_S * FORMEN HWESTA * SULE HWESTA
144
+
145
+ [{L3_1_S}] --> [{L3_1_T}]
146
+ [{L3_1_S}]{V_D} --> [{L3_1_T}]{T_S_D}
147
+ [{L3_2_S}] --> [{L3_2_T}]
148
+ [{L3_2_S}]{V_D} --> [{L3_2_T}]{T_L_D}
149
+
150
+ {L4_S} === nd * mb * ng
151
+ {L4_T} === ANTO * AMPA * UNQUE
152
+ [{L4_S}] --> [{L4_T}]
153
+ [{L4_S}]{V_D} --> [{L4_T}]{T_XL_D}
154
+
155
+ {L5_S} === n * m * nn * mm
156
+ {L5_T} === NUMEN * MALTA * NUMEN DASH_INF_L * MALTA DASH_INF_L
157
+ [{L5_S}] --> [{L5_T}]
158
+ [{L5_S}]{V_D} --> [{L5_T}]{T_XL_D}
159
+
160
+ {L6_S} === {V} * y * rr * {V}{V} * yy
161
+ {L6_T} === VALA * ANNA * ROMEN DASH_INF_S * VALA DASH_INF_S * ANNA DASH_INF_S
162
+ [r * {L6_S}] --> [ ORE * {L6_T}]
163
+ [r * {L6_S}]{V_D} --> [ ROMEN * {L6_T}]{T_S_D}
164
+
165
+ \** This one is not useful (redundant with higher) **\
166
+ \** Keep it for clarity of mind **\
167
+ r_ --> ORE
168
+
169
+ s{V_D} --> SILME_NUQUERNA {T_S_D} \** Before a vowel goes down **\
170
+ s --> SILME \** Any other pos, up **\
171
+ z{V_D} --> ESSE_NUQUERNA {T_S_D} \** Before a vowel goes down **\
172
+ z --> ESSE \** Any other pos, up **\
173
+
174
+ h{V_D} --> HYARMEN {T_XS_D}
175
+ h --> HYARMEN
176
+ hh{V_D} --> HYARMEN DASH_INF_L {T_XS_D}
177
+ hh --> HYARMEN DASH_INF_L
178
+
179
+ l{V_D} --> LAMBE {T_XL_D}
180
+ l --> LAMBE
181
+
182
+ ll{V_D} --> LAMBE LAMBE_MARK_TILD {T_XL_D}
183
+ ll --> LAMBE LAMBE_MARK_TILD
184
+
185
+ \end
186
+
187
+ \beg rules punctutation
188
+ . --> PUNCT_DDOT
189
+ .. --> PUNCT_DOT PUNCT_DDOT PUNCT_DOT
190
+ … --> PUNCT_TILD
191
+ ... --> PUNCT_TILD
192
+ .... --> PUNCT_TILD
193
+ ..... --> PUNCT_TILD
194
+ ...... --> PUNCT_TILD
195
+ ....... --> PUNCT_TILD
196
+
197
+ , --> PUNCT_DOT
198
+ : --> PUNCT_DOT
199
+ ; --> PUNCT_DOT
200
+ ! --> PUNCT_EXCLAM
201
+ ? --> PUNCT_INTERR
202
+ · --> PUNCT_DOT
203
+
204
+ \** Apostrophe **\
205
+
206
+ ' --> {NULL}
207
+ ’ --> {NULL}
208
+
209
+ \** Quotes **\
210
+
211
+ “ --> DQUOT_OPEN
212
+ ” --> DQUOT_CLOSE
213
+ « --> DQUOT_OPEN
214
+ » --> DQUOT_CLOSE
215
+
216
+ - --> PUNCT_DOT
217
+ – --> WAVE_MED_SIMPLE
218
+ — --> WAVE_MED_DOUBLE
219
+
220
+ [ --> PUNCT_PAREN_L
221
+ ] --> PUNCT_PAREN_R
222
+ ( --> PUNCT_PAREN_L
223
+ ) --> PUNCT_PAREN_R
224
+ { --> PUNCT_PAREN_L
225
+ } --> PUNCT_PAREN_R
226
+ < --> PUNCT_PAREN_L
227
+ > --> PUNCT_PAREN_R
228
+
229
+ \** Not universal between fonts ... **\
230
+ $ --> BOOKMARK_SIGN
231
+ ≤ --> RING_MARK_L \** Ring inscription left beautiful stuff **\
232
+ ≥ --> RING_MARK_R \** Ring inscription right beautiful stuff **\
233
+ \end
234
+
235
+ \beg rules numbers
236
+ 0 --> NUM_0
237
+ 1 --> NUM_1
238
+ 2 --> NUM_2
239
+ 3 --> NUM_3
240
+ 4 --> NUM_4
241
+ 5 --> NUM_5
242
+ 6 --> NUM_6
243
+ 7 --> NUM_7
244
+ 8 --> NUM_8
245
+ 9 --> NUM_9
246
+ A --> NUM_10
247
+ B --> NUM_11
248
+ \end
249
+
250
+ \end
251
+
@@ -0,0 +1,318 @@
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
+ \** BlackSpeech ring mode for glaemscribe (FAR FROM BEING COMPLETE!!!) **\
26
+
27
+ \language "Black Speech"
28
+ \writing "Tengwar"
29
+ \mode "Ring Style / Cursive"
30
+ \version "0.0.1"
31
+ \authors "Talagan (Benjamin Babut)"
32
+
33
+ \charset tengwar_ds true
34
+
35
+ \beg options
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
+
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
+ {AI} === {A}{I} \** attested **\
81
+ {AU} === {A}{U} \** attested **\
82
+ {OI} === {O}{I} \** Not quite sure (dushgoi) **\
83
+
84
+ {K} === (c,k)
85
+
86
+ \** VOWELS **\
87
+ {VOWELS} === {A} * {E} * {I} * {O} * {U}
88
+ {LVOWELS} === {AA} * {EE} * {II} * {OO} * {UU}
89
+ \** Reverse o and u **\
90
+ {TEHTA_XS} === A_TEHTA_XS * E_TEHTA_XS * I_TEHTA_XS * U_TEHTA_XS * O_TEHTA_XS
91
+ {TEHTA__S} === A_TEHTA_S * E_TEHTA_S * I_TEHTA_S * U_TEHTA_S * O_TEHTA_S
92
+ {TEHTA__L} === A_TEHTA_L * E_TEHTA_L * I_TEHTA_L * U_TEHTA_L * O_TEHTA_L
93
+ {TEHTA_XL} === A_TEHTA_XL * E_TEHTA_XL * I_TEHTA_XL * U_TEHTA_XL * O_TEHTA_XL
94
+ \** Double tehtas **\
95
+ {DTEHTA_XS} === A_TEHTA_DOUBLE_XS * E_TEHTA_DOUBLE_XS * Y_TEHTA_XS * U_TEHTA_DOUBLE_XS * O_TEHTA_DOUBLE_XS
96
+ {DTEHTA_S} === A_TEHTA_DOUBLE_S * E_TEHTA_DOUBLE_S * Y_TEHTA_S * U_TEHTA_DOUBLE_S * O_TEHTA_DOUBLE_S
97
+ {DTEHTA_L} === A_TEHTA_DOUBLE_L * E_TEHTA_DOUBLE_L * Y_TEHTA_L * U_TEHTA_DOUBLE_L * O_TEHTA_DOUBLE_L
98
+ {DTEHTA_XL} === A_TEHTA_DOUBLE_XL * E_TEHTA_DOUBLE_XL * Y_TEHTA_XL * U_TEHTA_DOUBLE_XL * O_TEHTA_DOUBLE_XL
99
+
100
+ {DIPHTHONGS} === {AI} * {AU} * {OI}
101
+ {DIPHTHENGS} === YANTA A_TEHTA_L * URE A_TEHTA_L * YANTA U_TEHTA_L
102
+
103
+ {V_D_KER} === [ {VOWELS} * {LVOWELS} * {DIPHTHONGS} ]
104
+ {V_D_IMG_XS} === [ {TEHTA_XS} * {DTEHTA_XS} * {DIPHTHENGS} ]
105
+ {V_D_IMG__S} === [ {TEHTA__S} * {DTEHTA_L} * {DIPHTHENGS} ]
106
+ {V_D_IMG__L} === [ {TEHTA__L} * {DTEHTA_S} * {DIPHTHENGS} ]
107
+ {V_D_IMG_XL} === [ {TEHTA_XL} * {DTEHTA_XL} * {DIPHTHENGS} ]
108
+
109
+ [{VOWELS}] --> TELCO [{TEHTA_XS}] \** Replace isolated short vowels **\
110
+ [{LVOWELS}] --> ARA [{TEHTA_XS}] \** Replace long vowels **\
111
+ [{DIPHTHONGS}] --> [{DIPHTHENGS}] \** Replace diphthongs **\
112
+
113
+ \** CONSONANT RULES (could be factorized with crossrules) **\
114
+
115
+ \** ======================== **\
116
+
117
+ l --> LAMBE
118
+ \** If we look closely on the ring inscription, **\
119
+ \** we can see the offset for the tehta starting point **\
120
+ \** That's why we use the XL tehtas **\
121
+ {V_D_KER} l --> LAMBE {V_D_IMG_XL}
122
+ \** when telco follows, ligature with telco **\
123
+ l {V_D_KER} _ --> LAMBE_LIG TELCO {V_D_IMG_XS}
124
+
125
+ \** ======================== **\
126
+
127
+ b --> UMBAR
128
+ {V_D_KER} b --> UMBAR {V_D_IMG_XL}
129
+ \** Attached l to b **\
130
+ l {V_D_KER} b --> LAMBE_LIG UMBAR {V_D_IMG_XL}
131
+ {V_D_KER} l {V_D_KER} b --> LAMBE_LIG {V_D_IMG_XL} UMBAR {V_D_IMG_XL}
132
+
133
+ d --> ANDO
134
+ {V_D_KER} d --> ANDO {V_D_IMG_XL}
135
+ \** Attached l to d **\
136
+ l {V_D_KER} d --> LAMBE_LIG ANDO {V_D_IMG_XL}
137
+ {V_D_KER} l {V_D_KER} d --> LAMBE_LIG {V_D_IMG_XL} ANDO {V_D_IMG_XL}
138
+
139
+ f --> FORMEN
140
+ {V_D_KER} f --> FORMEN_EXT {V_D_IMG__S} \** Beware. **\
141
+ \** Attached l to f **\
142
+ l {V_D_KER} f --> LAMBE_LIG FORMEN_EXT {V_D_IMG__S}
143
+ {V_D_KER} l {V_D_KER} f --> LAMBE_LIG {V_D_IMG_XL} FORMEN_EXT {V_D_IMG__S}
144
+
145
+ g --> UNGWE
146
+ {V_D_KER} g --> UNGWE {V_D_IMG_XL}
147
+ \** Attached l to g **\
148
+ l {V_D_KER} g --> LAMBE_LIG UNGWE {V_D_IMG_XL}
149
+ {V_D_KER} l {V_D_KER} g --> LAMBE_LIG {V_D_IMG_XL} UNGWE {V_D_IMG_XL}
150
+
151
+ gh --> UNGWE_EXT
152
+ {V_D_KER} gh --> UNGWE_EXT {V_D_IMG_XL}
153
+ \** Attached l to g **\
154
+ l {V_D_KER} gh --> LAMBE_LIG UNGWE_EXT {V_D_IMG_XL}
155
+ {V_D_KER} l {V_D_KER} gh --> LAMBE_LIG {V_D_IMG_XL} UNGWE_EXT {V_D_IMG_XL}
156
+
157
+ h --> HYARMEN
158
+ {V_D_KER} h --> HYARMEN {V_D_IMG_XS}
159
+ \** Attached l to g **\
160
+ l {V_D_KER} h --> LAMBE_LIG HYARMEN {V_D_IMG_XS}
161
+ {V_D_KER} l {V_D_KER} h --> LAMBE_LIG {V_D_IMG_XL} HYARMEN {V_D_IMG_XS}
162
+
163
+ {K} --> QUESSE
164
+ {V_D_KER} {K} --> QUESSE {V_D_IMG__L}
165
+ \** Attached l to g **\
166
+ l {V_D_KER} {K} --> LAMBE_LIG QUESSE {V_D_IMG__L}
167
+ {V_D_KER} l {V_D_KER} {K} --> LAMBE_LIG {V_D_IMG_XL} QUESSE {V_D_IMG__L}
168
+
169
+ {K}h --> HWESTA
170
+ {V_D_KER} {K}h --> HWESTA_EXT {V_D_IMG__L}
171
+ \** Attached l to g **\
172
+ l {V_D_KER} {K}h --> LAMBE_LIG HWESTA_EXT {V_D_IMG__L}
173
+ {V_D_KER} l {V_D_KER} {K}h --> LAMBE_LIG {V_D_IMG_XL} HWESTA_EXT {V_D_IMG__L}
174
+
175
+
176
+ m --> MALTA
177
+ {V_D_KER} m --> MALTA {V_D_IMG_XL}
178
+
179
+ mb --> UMBAR TILD_SUP_L
180
+ {V_D_KER} mb --> UMBAR TILD_SUP_L {V_D_IMG_XL}
181
+
182
+ mp --> PARMA TILD_SUP_S
183
+ {V_D_KER} mp --> PARMA TILD_SUP_S {V_D_IMG__L}
184
+
185
+ n --> NUMEN
186
+ {V_D_KER} n --> NUMEN {V_D_IMG_XL}
187
+
188
+ n{K} --> QUESSE TILD_SUP_S
189
+ {V_D_KER} n{K} --> QUESSE TILD_SUP_S {V_D_IMG__S}
190
+
191
+ p --> PARMA
192
+
193
+ r --> ROMEN
194
+ {V_D_KER} r --> ORE {V_D_IMG__L}
195
+ \** Attached l to r **\
196
+ l {V_D_KER} r --> LAMBE_LIG ORE {V_D_IMG__L}
197
+ {V_D_KER} l {V_D_KER} r --> LAMBE_LIG {V_D_IMG_XL} ORE {V_D_IMG__L}
198
+
199
+
200
+ r --> ROMEN
201
+ r_ --> ORE
202
+ {V_D_KER} r --> ORE {V_D_IMG__S}
203
+ {V_D_KER} rb --> ORE {V_D_IMG__L} UMBAR
204
+ {V_D_KER} rz --> ORE {V_D_IMG__L} ESSE
205
+
206
+ s --> SILME
207
+
208
+
209
+ \** Beware sh is not the same if not preceeded by vowel **\
210
+ sh --> AHA
211
+ {A}sh --> AHA_EXT A_TEHTA_L
212
+ {E}sh --> AHA_EXT E_TEHTA_L
213
+ {I}sh --> AHA_EXT I_TEHTA_L
214
+ {O}sh --> AHA_EXT U_TEHTA_S
215
+ {U}sh --> AHA_EXT O_TEHTA_XS \** The best one still not satisfying... **\
216
+ {AA}sh --> ESSE_NUQUERNA A_TEHTA_DOUBLE_L
217
+ {EE}sh --> ESSE_NUQUERNA E_TEHTA_DOUBLE_L
218
+ {II}sh --> ESSE_NUQUERNA Y_TEHTA_L
219
+ {OO}sh --> ESSE_NUQUERNA U_TEHTA_DOUBLE_S
220
+ {UU}sh --> ESSE_NUQUERNA O_TEHTA_DOUBLE_XS
221
+
222
+ t --> TINCO
223
+ {V_D_KER} t --> TINCO {V_D_IMG__L}
224
+
225
+ th --> SULE
226
+ y --> ANNA
227
+
228
+ z --> ESSE
229
+
230
+ \** Need to break thisone too **\
231
+ {A}z --> ESSE_NUQUERNA A_TEHTA_L
232
+ {E}z --> ESSE_NUQUERNA E_TEHTA_L
233
+ {I}z --> ESSE_NUQUERNA I_TEHTA_L
234
+ {O}z --> ESSE_NUQUERNA U_TEHTA_S
235
+ {U}z --> ESSE_NUQUERNA O_TEHTA_S
236
+ {AA}z --> ESSE_NUQUERNA A_TEHTA_DOUBLE_L
237
+ {EE}z --> ESSE_NUQUERNA E_TEHTA_DOUBLE_L
238
+ {II}z --> ESSE_NUQUERNA Y_TEHTA_L
239
+ {OO}z --> ESSE_NUQUERNA U_TEHTA_DOUBLE_S
240
+ {UU}z --> ESSE_NUQUERNA O_TEHTA_DOUBLE_S
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
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+