glaemscribe 1.1.14 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +5 -5
  2. data/bin/glaemscribe +19 -15
  3. data/glaemresources/charsets/cirth_ds.cst +205 -0
  4. data/glaemresources/charsets/sarati_eldamar.cst +256 -0
  5. data/glaemresources/charsets/tengwar_ds_annatar.cst +546 -0
  6. data/glaemresources/charsets/tengwar_ds_eldamar.cst +535 -0
  7. data/glaemresources/charsets/tengwar_ds_elfica.cst +551 -0
  8. data/glaemresources/charsets/tengwar_ds_parmaite.cst +534 -0
  9. data/glaemresources/charsets/tengwar_ds_sindarin.cst +531 -0
  10. data/glaemresources/charsets/tengwar_freemono.cst +217 -0
  11. data/glaemresources/charsets/tengwar_guni_annatar.cst +628 -0
  12. data/glaemresources/charsets/tengwar_guni_eldamar.cst +618 -0
  13. data/glaemresources/charsets/tengwar_guni_elfica.cst +620 -0
  14. data/glaemresources/charsets/tengwar_guni_parmaite.cst +621 -0
  15. data/glaemresources/charsets/tengwar_guni_sindarin.cst +617 -0
  16. data/glaemresources/charsets/tengwar_telcontar.cst +218 -0
  17. data/glaemresources/charsets/unicode_gothic.cst +64 -0
  18. data/glaemresources/charsets/unicode_runes.cst +121 -0
  19. data/glaemresources/modes/{adunaic.glaem → adunaic-tengwar-glaemscrafu.glaem} +14 -2
  20. data/glaemresources/modes/{blackspeech.glaem → blackspeech-tengwar-general_use.glaem} +12 -2
  21. data/glaemresources/modes/japanese-tengwar.glaem +771 -0
  22. data/glaemresources/modes/{khuzdul.glaem → khuzdul-cirth-moria.glaem} +4 -1
  23. data/glaemresources/modes/{futhorc.glaem → old_english-futhorc.glaem} +0 -0
  24. data/glaemresources/modes/{mercian.glaem → old_english-tengwar-mercian.glaem} +22 -12
  25. data/glaemresources/modes/{westsaxon.glaem → old_english-tengwar-westsaxon.glaem} +20 -11
  26. data/glaemresources/modes/{futhark-runicus.glaem → old_norse-futhark-runicus.glaem} +0 -0
  27. data/glaemresources/modes/{futhark-younger.glaem → old_norse-futhark-younger.glaem} +0 -0
  28. data/glaemresources/modes/{quenya.glaem → quenya-tengwar-classical.glaem} +32 -50
  29. data/glaemresources/modes/raw-tengwar.glaem +46 -23
  30. data/glaemresources/modes/{rlyehian.glaem → rlyehian-tengwar.glaem} +14 -3
  31. data/glaemresources/modes/{sindarin-daeron.glaem → sindarin-cirth-daeron.glaem} +55 -14
  32. data/glaemresources/modes/{sindarin-beleriand.glaem → sindarin-tengwar-beleriand.glaem} +154 -28
  33. data/glaemresources/modes/{sindarin.glaem → sindarin-tengwar-general_use.glaem} +86 -25
  34. data/glaemresources/modes/{telerin.glaem → telerin-tengwar-glaemscrafu.glaem} +16 -6
  35. data/glaemresources/modes/{westron.glaem → westron-tengwar-glaemscrafu.glaem} +18 -8
  36. data/lib/api/charset.rb +67 -7
  37. data/lib/api/charset_parser.rb +7 -0
  38. data/lib/api/constants.rb +3 -4
  39. data/lib/api/fragment.rb +26 -5
  40. data/lib/api/if_tree.rb +70 -8
  41. data/lib/api/macro.rb +40 -0
  42. data/lib/api/mode.rb +35 -13
  43. data/lib/api/mode_parser.rb +106 -12
  44. data/lib/api/object_additions.rb +23 -1
  45. data/lib/api/option.rb +17 -2
  46. data/lib/api/post_processor/resolve_virtuals.rb +25 -9
  47. data/lib/api/resource_manager.rb +1 -0
  48. data/lib/api/rule_group.rb +170 -26
  49. data/lib/api/sheaf_chain_iterator.rb +1 -1
  50. data/lib/api/transcription_processor.rb +3 -3
  51. data/lib/api/tts.rb +51 -0
  52. data/lib/glaemscribe.rb +34 -31
  53. data/lib_espeak/espeakng.for.glaemscribe.nowasm.sync.js +21 -0
  54. data/lib_espeak/glaemscribe_tts.js +365 -0
  55. metadata +67 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ebb0041e342e79b9b97f7e6a5ce163e58c8fd966
4
- data.tar.gz: 8339eb414f9a409dd91fa9f61943dcf0c147f596
2
+ SHA256:
3
+ metadata.gz: 142bc6436e2262629e5cf48a85e91d2a93a3581db59068967d19f807216e7792
4
+ data.tar.gz: 94eb7e50add321dfb44fffd95052405b3752d938e9aabbe18f4434ed53dd5f77
5
5
  SHA512:
6
- metadata.gz: 87f62555dbede9a38d3131b913f3626f1af92767e5a8edb657bc83d868448bd5f8eb66e42ec913fed3513a0466561cdb33bc420e428284ffbb88f7d4f9e309fe
7
- data.tar.gz: 9c61910fd13d721c8d02bf2b73567d86e7fd99a8f56605e99cd1c38858dcde4eeaed4e1b5a68565b9fdee0dc58289167ced72f8cc0993e84b1866f15e3f4e061
6
+ metadata.gz: c2eb4f568566d2fde6b61e4dd84d9e220412e4f21501f1123022d4460a8e64fb00748608957c3b91f5e080429ffc2342b9d4651a76997e9124e15f63d78dd619
7
+ data.tar.gz: bf737a0928bfc9c2a86368f19853d1b56740678ddc91f58bef6bbbbad87b50907f7dcd114e0387fe4e9d9035fe3f7d7a91727a0df80b036c104c44b4c55426df
@@ -32,6 +32,13 @@ rescue Exception => e
32
32
  exit(0)
33
33
  end
34
34
 
35
+ begin
36
+ require 'mini_racer'
37
+ rescue Exception => e
38
+ puts "The 'glaemscribe' binary requires the 'mini_racer' gem to work. Please 'gem install mini_racer' to make it work or add it to your Gemfile."
39
+ exit(0)
40
+ end
41
+
35
42
  env_version = ""
36
43
  begin
37
44
  # Try to load dev version before loading the gem one
@@ -59,8 +66,8 @@ end
59
66
  #############
60
67
 
61
68
  def puts_available_modes
62
- puts "\n #{$terminal.color 'Available modes are :', :bold }\n\n"
63
- puts Glaemscribe::API::ResourceManager.available_mode_names.map{|k| ". " + k.strip}.join("\n")
69
+ puts "\n #{HighLine.default_instance.color 'Available modes are :', :bold }\n\n"
70
+ puts Glaemscribe::API::ResourceManager.available_mode_names.sort.map{|k| ". " + k.strip}.join("\n")
64
71
  puts "\n"
65
72
  end
66
73
 
@@ -237,8 +244,7 @@ command :transcribe do |c|
237
244
  if success
238
245
  STDOUT.puts ret
239
246
  else
240
- perxit("The transcription failed.")
241
- perxit(ret, 42)
247
+ perxit("The transcription failed : #{ret}", 42)
242
248
  end
243
249
  end
244
250
  rescue Interrupt
@@ -301,22 +307,20 @@ command :info do |c|
301
307
  perxit(nil, 3)
302
308
  end
303
309
 
304
- puts "#{$terminal.color "Mode ID " , :bold} : #{mode.name}"
305
- puts "#{$terminal.color "Language " , :bold} : #{mode.language}"
306
- puts "#{$terminal.color "Writing " , :bold} : #{mode.writing}"
307
- puts "#{$terminal.color "Human Name" , :bold} : #{mode.human_name}"
308
- puts "#{$terminal.color "Authors " , :bold} : #{mode.authors}"
309
- puts "#{$terminal.color "Version " , :bold} : #{mode.version}"
310
+ puts "#{HighLine.default_instance.color "Mode ID " , :bold} : #{mode.name}"
311
+ puts "#{HighLine.default_instance.color "Language " , :bold} : #{mode.language}"
312
+ puts "#{HighLine.default_instance.color "Writing " , :bold} : #{mode.writing}"
313
+ puts "#{HighLine.default_instance.color "Human Name" , :bold} : #{mode.human_name}"
314
+ puts "#{HighLine.default_instance.color "Authors " , :bold} : #{mode.authors}"
315
+ puts "#{HighLine.default_instance.color "Version " , :bold} : #{mode.version}"
310
316
  puts ""
311
- puts "#{$terminal.color "Options " , :bold} :"
317
+ puts "#{HighLine.default_instance.color "Options " , :bold} :"
312
318
  mode.options.each { |name,option|
313
- puts " #{$terminal.color name, :bold} (#{option.type}) [#{option.default_value_name}]"
319
+ puts " #{HighLine.default_instance.color name, :bold} (#{option.type}) [#{option.default_value_name}]"
314
320
  option.values.each{ |oname,ovalue|
315
- puts " #{$terminal.color oname, :bold}"
321
+ puts " #{HighLine.default_instance.color oname, :bold}"
316
322
  }
317
323
  }
318
324
  end
319
325
 
320
326
  end
321
-
322
-
@@ -0,0 +1,205 @@
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
+
26
+ \** **\ \char 20 SPACE
27
+ \** ! **\ \char 21 CIRTH_11
28
+ \** " **\ \char 22 CIRTH_EREB_3
29
+ \** # **\ \char 23 CIRTH_13
30
+ \** $ **\ \char 24 CIRTH_14
31
+ \** % **\ \char 25 CIRTH_15
32
+ \** & **\ \char 26 CIRTH_EREB_4
33
+ \** ' **\ \char 27 ?
34
+ \** ( **\ \char 28 CIRTH_EREB_6
35
+ \** ) **\ \char 29 CIRTH_EREB_7
36
+ \** * **\ \char 2a CIRTH_EREB_5
37
+ \** + **\ \char 2b CIRTH_NUMERAL_4
38
+ \** , **\ \char 2c CIRTH_53
39
+ \** - **\ \char 2d ?
40
+ \** . **\ \char 2e CIRTH_54
41
+ \** / **\ \char 2f CIRTH_55
42
+ \** 0 **\ \char 30 CIRTH_10
43
+ \** 1 **\ \char 31 CIRTH_1
44
+ \** 2 **\ \char 32 CIRTH_2
45
+ \** 3 **\ \char 33 CIRTH_3
46
+ \** 4 **\ \char 34 CIRTH_4
47
+ \** 5 **\ \char 35 CIRTH_5
48
+ \** 6 **\ \char 36 CIRTH_6
49
+ \** 7 **\ \char 37 CIRTH_7
50
+ \** 8 **\ \char 38 CIRTH_8
51
+ \** 9 **\ \char 39 CIRTH_9
52
+ \** : **\ \char 3a CIRTH_EREB_2
53
+ \** ; **\ \char 3b CIRTH_40
54
+ \** < **\ \char 3c CIRTH_52_ALT
55
+ \** = **\ \char 3d ?
56
+ \** > **\ \char 3e CIRTH_55_ALT
57
+ \** ? **\ \char 3f CIRTH_56_ALT
58
+ \** @ **\ \char 40 CIRTH_12
59
+ \** A **\ \char 41 CIRTH_41
60
+ \** B **\ \char 42 CIRTH_60
61
+ \** C **\ \char 43 CIRTH_58
62
+ \** D **\ \char 44 CIRTH_43
63
+ \** E **\ \char 45 CIRTH_28
64
+ \** F **\ \char 46 CIRTH_44
65
+ \** G **\ \char 47 CIRTH_45
66
+ \** H **\ \char 48 ?
67
+ \** I **\ \char 49 CIRTH_PUNCT_MID_DOT
68
+ \** J **\ \char 4a CIRTH_38_ALT
69
+ \** K **\ \char 4b CIRTH_EREB_1
70
+ \** L **\ \char 4c CIRTH_45_ALT
71
+ \** M **\ \char 4d CIRTH_51_ALT
72
+ \** N **\ \char 4e CIRTH_SPACE
73
+ \** O **\ \char 4f CIRTH_PUNCT_TWO_DOTS
74
+ \** P **\ \char 50 CIRTH_PUNCT_THREE_DOTS
75
+ \** Q **\ \char 51 CIRTH_26
76
+ \** R **\ \char 52 CIRTH_29
77
+ \** S **\ \char 53 CIRTH_42
78
+ \** T **\ \char 54 CIRTH_30
79
+ \** U **\ \char 55 CIRTH_PUNCT_STAR
80
+ \** V **\ \char 56 CIRTH_59
81
+ \** W **\ \char 57 CIRTH_27
82
+ \** X **\ \char 58 CIRTH_57
83
+ \** Y **\ \char 59 ?
84
+ \** Z **\ \char 5a CIRTH_56
85
+ \** [ **\ \char 5b ?
86
+ \** \ **\ \char 5c CIRTH_PUNCT_DOT
87
+ \** ] **\ \char 5d ?
88
+ \** ^ **\ \char 5e ?
89
+ \** _ **\ \char 5f ?
90
+ \** ` **\ \char 60 CIRTH_SPACE_BIG
91
+ \** a **\ \char 61 CIRTH_31
92
+ \** b **\ \char 62 CIRTH_50
93
+ \** c **\ \char 63 CIRTH_48
94
+ \** d **\ \char 64 CIRTH_33
95
+ \** e **\ \char 65 CIRTH_18
96
+ \** f **\ \char 66 CIRTH_34
97
+ \** g **\ \char 67 CIRTH_35
98
+ \** h **\ \char 68 CIRTH_36
99
+ \** i **\ \char 69 CIRTH_23
100
+ \** j **\ \char 6a CIRTH_37
101
+ \** k **\ \char 6b CIRTH_38
102
+ \** l **\ \char 6c CIRTH_39
103
+ \** m **\ \char 6d CIRTH_52
104
+ \** n **\ \char 6e CIRTH_51
105
+ \** o **\ \char 6f CIRTH_24
106
+ \** p **\ \char 70 CIRTH_25
107
+ \** q **\ \char 71 CIRTH_16
108
+ \** r **\ \char 72 CIRTH_19
109
+ \** s **\ \char 73 CIRTH_32
110
+ \** t **\ \char 74 CIRTH_20
111
+ \** u **\ \char 75 CIRTH_22
112
+ \** v **\ \char 76 CIRTH_49
113
+ \** w **\ \char 77 CIRTH_17
114
+ \** x **\ \char 78 CIRTH_47
115
+ \** y **\ \char 79 CIRTH_21
116
+ \** z **\ \char 7a CIRTH_46
117
+ \** { **\ \char 7b CIRTH_PUNCT_THREE_DOTS_L
118
+ \** | **\ \char 7c CIRTH_PUNCT_DOUBLE_VBAR
119
+ \** } **\ \char 7d CIRTH_PUNCT_FOUR_DOTS
120
+ \** ~ **\ \char 7e ?
121
+ \** € **\ \char 80 ?
122
+ \**   **\ \char a0 ?
123
+ \** ¤ **\ \char a4 ?
124
+ \** § **\ \char a7 ?
125
+ \** © **\ \char a9 ?
126
+ \** « **\ \char ab ?
127
+ \** ® **\ \char ae ?
128
+ \** ¶ **\ \char b6 ?
129
+ \** » **\ \char bb ?
130
+ \** ¼ **\ \char bc ?
131
+ \** ½ **\ \char bd ?
132
+ \** ¾ **\ \char be ?
133
+ \** ¿ **\ \char bf ?
134
+ \** À **\ \char c0 ?
135
+ \** Á **\ \char c1 ?
136
+ \** Â **\ \char c2 ?
137
+ \** Ã **\ \char c3 ?
138
+ \** Ä **\ \char c4 ?
139
+ \** Å **\ \char c5 ?
140
+ \** Æ **\ \char c6 ?
141
+ \** Ç **\ \char c7 ?
142
+ \** È **\ \char c8 ?
143
+ \** É **\ \char c9 ?
144
+ \** Ê **\ \char ca ?
145
+ \** Ë **\ \char cb ?
146
+ \** Ì **\ \char cc ?
147
+ \** Í **\ \char cd ?
148
+ \** Î **\ \char ce ?
149
+ \** Ï **\ \char cf ?
150
+ \** Ð **\ \char d0 ?
151
+ \** Ñ **\ \char d1 ?
152
+ \** Ò **\ \char d2 ?
153
+ \** Ó **\ \char d3 ?
154
+ \** Ô **\ \char d4 ?
155
+ \** Õ **\ \char d5 ?
156
+ \** Ö **\ \char d6 ?
157
+ \** × **\ \char d7 ?
158
+ \** Ø **\ \char d8 ?
159
+ \** Ù **\ \char d9 ?
160
+ \** Ú **\ \char da ?
161
+ \** Û **\ \char db ?
162
+ \** Ü **\ \char dc ?
163
+ \** Ý **\ \char dd ?
164
+ \** Þ **\ \char de ?
165
+ \** ß **\ \char df ?
166
+ \** à **\ \char e0 ?
167
+ \** á **\ \char e1 ?
168
+ \** â **\ \char e2 ?
169
+ \** ã **\ \char e3 ?
170
+ \** ä **\ \char e4 ?
171
+ \** å **\ \char e5 ?
172
+ \** æ **\ \char e6 ?
173
+ \** ç **\ \char e7 ?
174
+ \** è **\ \char e8 ?
175
+ \** é **\ \char e9 ?
176
+ \** ê **\ \char ea ?
177
+ \** ë **\ \char eb ?
178
+ \** ì **\ \char ec ?
179
+ \** í **\ \char ed ?
180
+ \** î **\ \char ee ?
181
+ \** ï **\ \char ef ?
182
+ \** ð **\ \char f0 ?
183
+ \** ñ **\ \char f1 ?
184
+ \** ò **\ \char f2 ?
185
+ \** ó **\ \char f3 ?
186
+ \** ô **\ \char f4 ?
187
+ \** õ **\ \char f5 ?
188
+ \** ö **\ \char f6 ?
189
+ \** ÷ **\ \char f7 ?
190
+ \** ø **\ \char f8 ?
191
+ \** ù **\ \char f9 ?
192
+ \** ú **\ \char fa ?
193
+ \** û **\ \char fb ?
194
+ \** ü **\ \char fc ?
195
+ \** ý **\ \char fd ?
196
+ \** þ **\ \char fe ?
197
+ \** ÿ **\ \char ff ?
198
+ \** ‘ **\ \char 2018 ?
199
+ \** • **\ \char 2022 ?
200
+ \** … **\ \char 2026 ?
201
+ \** ‹ **\ \char 2039 ?
202
+ \** › **\ \char 203a ?
203
+ \** ∙ **\ \char 2219 ?
204
+ \** ◼ **\ \char 25fc ?
205
+
@@ -0,0 +1,256 @@
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
+ \** **\ \char 20 ?
26
+ \** ! **\ \char 21 SARATI_SPACE
27
+ \** " **\ \char 22 SARATI_T
28
+ \** # **\ \char 23 SARATI_QUENYA_C
29
+ \** $ **\ \char 24 ?
30
+ \** % **\ \char 25 SARATI_D
31
+ \** & **\ \char 26 SARATI_NG
32
+ \** ' **\ \char 27 SARATI_PHONETIC_GW
33
+ \** ( **\ \char 28 ?
34
+ \** ) **\ \char 29 ?
35
+ \** * **\ \char 2a ?
36
+ \** + **\ \char 2b SARATI_QUENYA_VELAR_NASAL
37
+ \** , **\ \char 2c SARATI_QUENYA_NW
38
+ \** - **\ \char 2d ?
39
+ \** . **\ \char 2e ?
40
+ \** / **\ \char 2f ?
41
+ \** 0 **\ \char 30 ?
42
+ \** 1 **\ \char 31 ?
43
+ \** 2 **\ \char 32 ?
44
+ \** 3 **\ \char 33 ?
45
+ \** 4 **\ \char 34 ?
46
+ \** 5 **\ \char 35 ?
47
+ \** 6 **\ \char 36 ?
48
+ \** 7 **\ \char 37 ?
49
+ \** 8 **\ \char 38 ?
50
+ \** 9 **\ \char 39 ?
51
+ \** : **\ \char 3a ?
52
+ \** ; **\ \char 3b ?
53
+ \** < **\ \char 3c ?
54
+ \** = **\ \char 3d ?
55
+ \** > **\ \char 3e ?
56
+ \** ? **\ \char 3f SARATI_L
57
+ \** @ **\ \char 40 ?
58
+ \** A **\ \char 41 SARATI_QUENYA_HL
59
+ \** B **\ \char 42 ?
60
+ \** C **\ \char 43 ?
61
+ \** D **\ \char 44 ?
62
+ \** E **\ \char 45 ?
63
+ \** F **\ \char 46 SARATI_R
64
+ \** G **\ \char 47 ?
65
+ \** H **\ \char 48 ?
66
+ \** I **\ \char 49 ?
67
+ \** J **\ \char 4a SARATI_QUENYA_HR
68
+ \** K **\ \char 4b ?
69
+ \** L **\ \char 4c ?
70
+ \** M **\ \char 4d ?
71
+ \** N **\ \char 4e ?
72
+ \** O **\ \char 4f ?
73
+ \** P **\ \char 50 SARATI_M
74
+ \** Q **\ \char 51 ?
75
+ \** R **\ \char 52 ?
76
+ \** S **\ \char 53 ?
77
+ \** T **\ \char 54 ?
78
+ \** U **\ \char 55 ?
79
+ \** V **\ \char 56 ?
80
+ \** W **\ \char 57 ?
81
+ \** X **\ \char 58 ?
82
+ \** Y **\ \char 59 ?
83
+ \** Z **\ \char 5a SARATI_P
84
+ \** [ **\ \char 5b SARATI_F
85
+ \** \ **\ \char 5c SARATI_QUENYA_F_ALT
86
+ \** ] **\ \char 5d ?
87
+ \** ^ **\ \char 5e ?
88
+ \** _ **\ \char 5f SARATI_B SARATI_QUENYA_MB
89
+ \** ` **\ \char 60 SARATI_V
90
+ \** a **\ \char 61 SARATI_QUENYA_V_ALT
91
+ \** b **\ \char 62 ?
92
+ \** c **\ \char 63 ?
93
+ \** d **\ \char 64 SARATI_QUENYA_MP SARATI_QUENYA_QU_ALT
94
+ \** e **\ \char 65 ?
95
+ \** f **\ \char 66 ?
96
+ \** g **\ \char 67 SARATI_QUENYA_TS
97
+ \** h **\ \char 68 ?
98
+ \** i **\ \char 69 ?
99
+ \** j **\ \char 6a ?
100
+ \** k **\ \char 6b ?
101
+ \** l **\ \char 6c ?
102
+ \** m **\ \char 6d ?
103
+ \** n **\ \char 6e SARATI_VOICELESS_VELAR_FRICATIVE
104
+ \** o **\ \char 6f ?
105
+ \** p **\ \char 70 SARATI_QUENYA_QU
106
+ \** q **\ \char 71 SARATI_VOICED_VELAR_FRICATIVE
107
+ \** r **\ \char 72 ?
108
+ \** s **\ \char 73 SARATI_QUENYA_NGW
109
+ \** t **\ \char 74 ?
110
+ \** u **\ \char 75 ?
111
+ \** v **\ \char 76 SARATI_QUENYA_ST
112
+ \** w **\ \char 77 ?
113
+ \** x **\ \char 78 ?
114
+ \** y **\ \char 79 SARATI_QUENYA_X SARATI_VELAR_LATERAL_APPROXIMANT
115
+ \** z **\ \char 7a SARATI_UVULAR_TRILL
116
+ \** { **\ \char 7b ?
117
+ \** | **\ \char 7c ?
118
+ \** } **\ \char 7d ?
119
+ \** ~ **\ \char 7e ?
120
+ \**   **\ \char a0 ?
121
+ \** ¡ **\ \char a1 ?
122
+ \** ¢ **\ \char a2 SARATI_VOICELESS_PALATO_ALVEOLAR_SIBILANT_FRICATIVE
123
+ \** £ **\ \char a3 ?
124
+ \** ¤ **\ \char a4 ?
125
+ \** ¥ **\ \char a5 ?
126
+ \** ¦ **\ \char a6 SARATI_QUENYA_SS_ALT_1
127
+ \** § **\ \char a7 ?
128
+ \** ¨ **\ \char a8 ?
129
+ \** © **\ \char a9 ?
130
+ \** ª **\ \char aa SARATI_QUENYA_NT
131
+ \** « **\ \char ab SARATI_VOICED_DENTAL_FRICATIVE
132
+ \** ¬ **\ \char ac ?
133
+ \** ­ **\ \char ad ?
134
+ \** ® **\ \char ae ?
135
+ \** ¯ **\ \char af ?
136
+ \** ° **\ \char b0 ?
137
+ \** ± **\ \char b1 SARATI_QUENYA_TY
138
+ \** ² **\ \char b2 SARATI_QUENYA_HT_ALT_1
139
+ \** ³ **\ \char b3 SARATI_QUENYA_NDY
140
+ \** ´ **\ \char b4 ?
141
+ \** µ **\ \char b5 ?
142
+ \** ¶ **\ \char b6 ?
143
+ \** · **\ \char b7 ?
144
+ \** ¸ **\ \char b8 ?
145
+ \** ¹ **\ \char b9 SARATI_W
146
+ \** º **\ \char ba SARATI_QUENYA_HW SARATI_VOICELESS_LABIOVELAR_APPROXIMANT
147
+ \** » **\ \char bb SARATI_QUENYA_Y SARATI_J
148
+ \** ¼ **\ \char bc ?
149
+ \** ½ **\ \char bd SARATI_QUENYA_HY SARATI_VOICELESS_PALATAL_APPROXIMANT
150
+ \** ¾ **\ \char be ?
151
+ \** ¿ **\ \char bf ?
152
+ \** À **\ \char c0 SARATI_N
153
+ \** Á **\ \char c1 ?
154
+ \** Â **\ \char c2 ?
155
+ \** Ã **\ \char c3 ?
156
+ \** Ä **\ \char c4 ?
157
+ \** Å **\ \char c5 ?
158
+ \** Æ **\ \char c6 ?
159
+ \** Ç **\ \char c7 ?
160
+ \** È **\ \char c8 SARATI_QUENYA_LONG_VOWEL_CARRIER
161
+ \** É **\ \char c9 ?
162
+ \** Ê **\ \char ca ?
163
+ \** Ë **\ \char cb SARATI_H
164
+ \** Ì **\ \char cc ?
165
+ \** Í **\ \char cd PUNCT_DOT
166
+ \** Î **\ \char ce PUNCT_2_DOT
167
+ \** Ï **\ \char cf PUNCT_TRI
168
+ \** Ð **\ \char d0 PUNCT_2_TRI
169
+ \** Ñ **\ \char d1 ?
170
+ \** Ò **\ \char d2 SARATI_DOT_U SARATI_QUENYA_I
171
+ \** Ó **\ \char d3 SARATI_DOT_D
172
+ \** Ô **\ \char d4 ?
173
+ \** Õ **\ \char d5 ?
174
+ \** Ö **\ \char d6 SARATI_QUENYA_A
175
+ \** × **\ \char d7 ?
176
+ \** Ø **\ \char d8 SARATI_QUENYA_A_REVERSED
177
+ \** Ù **\ \char d9 ?
178
+ \** Ú **\ \char da ?
179
+ \** Û **\ \char db ?
180
+ \** Ü **\ \char dc SARATI_QUENYA_O
181
+ \** Ý **\ \char dd ?
182
+ \** Þ **\ \char de SARATI_QUENYA_U
183
+ \** ß **\ \char df ?
184
+ \** à **\ \char e0 ?
185
+ \** á **\ \char e1 ?
186
+ \** â **\ \char e2 ?
187
+ \** ã **\ \char e3 ?
188
+ \** ä **\ \char e4 ?
189
+ \** å **\ \char e5 ?
190
+ \** æ **\ \char e6 ?
191
+ \** ç **\ \char e7 ?
192
+ \** è **\ \char e8 SARATI_QUENYA_E
193
+ \** é **\ \char e9 ?
194
+ \** ê **\ \char ea ?
195
+ \** ë **\ \char eb ?
196
+ \** ì **\ \char ec ?
197
+ \** í **\ \char ed ?
198
+ \** î **\ \char ee ?
199
+ \** ï **\ \char ef ?
200
+ \** ð **\ \char f0 SARATI_DIACRITIC_CIRCLE
201
+ \** ñ **\ \char f1 ?
202
+ \** ò **\ \char f2 SARATI_DASH_U
203
+ \** ó **\ \char f3 SARATI_DASH_D
204
+ \** ô **\ \char f4 ?
205
+ \** õ **\ \char f5 ?
206
+ \** ö **\ \char f6 ?
207
+ \** ÷ **\ \char f7 ?
208
+ \** ø **\ \char f8 ?
209
+ \** ù **\ \char f9 ?
210
+ \** ú **\ \char fa ?
211
+ \** û **\ \char fb ?
212
+ \** ü **\ \char fc ?
213
+ \** ý **\ \char fd ?
214
+ \** þ **\ \char fe ?
215
+ \** ÿ **\ \char ff ?
216
+ \** Ā **\ \char 100 ?
217
+ \** ā **\ \char 101 ?
218
+ \** Ă **\ \char 102 ?
219
+ \** Đ **\ \char 110 ?
220
+ \** đ **\ \char 111 ?
221
+ \** Ġ **\ \char 120 ?
222
+ \** ġ **\ \char 121 ?
223
+ \** Ģ **\ \char 122 ?
224
+ \** ģ **\ \char 123 ?
225
+ \** Ĥ **\ \char 124 ?
226
+ \** İ **\ \char 130 ?
227
+ \** ı **\ \char 131 ?
228
+ \** ŀ **\ \char 140 ?
229
+ \** Π**\ \char 152 SARATI_QUENYA_HTY
230
+ \** œ **\ \char 153 ?
231
+ \** Š **\ \char 160 ?
232
+ \** š **\ \char 161 ?
233
+ \** Ÿ **\ \char 178 SARATI_QUENYA_S
234
+ \** Ž **\ \char 17d ?
235
+ \** ž **\ \char 17e ?
236
+ \** ƒ **\ \char 192 ?
237
+ \** ˆ **\ \char 2c6 ?
238
+ \** ˜ **\ \char 2dc SARATI_QUENYA_NQU
239
+ \** – **\ \char 2013 ?
240
+ \** — **\ \char 2014 SARATI_QUENYA_NC
241
+ \** ‘ **\ \char 2018 ?
242
+ \** ’ **\ \char 2019 ?
243
+ \** ‚ **\ \char 201a ?
244
+ \** “ **\ \char 201c ?
245
+ \** ” **\ \char 201d ?
246
+ \** „ **\ \char 201e SARATI_QUENYA_NTY
247
+ \** † **\ \char 2020 ?
248
+ \** ‡ **\ \char 2021 ?
249
+ \** • **\ \char 2022 ?
250
+ \** … **\ \char 2026 SARATI_QUENYA_STY
251
+ \** ‰ **\ \char 2030 SARATI_QUENYA_NY
252
+ \** ‹ **\ \char 2039 ?
253
+ \** › **\ \char 203a ?
254
+ \** € **\ \char 20ac SARATI_QUENYA_ND
255
+ \** ™ **\ \char 2122 ?
256
+