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