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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5e9f617d5136cabf67f2956d2e7f2ff819b10200
4
+ data.tar.gz: 10c475fd8eeb1008b491be028ef418ecc75975ab
5
+ SHA512:
6
+ metadata.gz: 4df56fe4e0d19a4efa206fda5e2654d3670f2c579732ee2b6a30e58bcee2765034e10f0d5377dff7a6c3617b480dba7e1abf4decb462e7eb90838996578683ea
7
+ data.tar.gz: ebfd8a156d2a5a93ae25e455f80275da909891cdc47624bde2a8f37b09ba69c8f6c06267376d92bb6d08a12e237e8526f55350f44de44eb21d34dd6efd6d9dbb
data/LICENSE.txt ADDED
@@ -0,0 +1,19 @@
1
+ Glǽmscribe (also written Glaemscribe) is a software dedicated to
2
+ the transcription of texts between writing systems, and more
3
+ specifically dedicated to the transcription of J.R.R. Tolkien's
4
+ invented languages to some of his devised writing systems.
5
+
6
+ Copyright (C) 2015 Benjamin Babut (Talagan).
7
+
8
+ This program is free software: you can redistribute it and/or modify
9
+ it under the terms of the GNU Affero General Public License as published by
10
+ the Free Software Foundation, either version 3 of the License, or
11
+ any later version.
12
+
13
+ This program is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU Affero General Public License for more details.
17
+
18
+ You should have received a copy of the GNU Affero General Public License
19
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
data/bin/glaemscribe ADDED
@@ -0,0 +1,307 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ #
4
+ # Glǽmscribe (also written Glaemscribe) is a software dedicated to
5
+ # the transcription of texts between writing systems, and more
6
+ # specifically dedicated to the transcription of J.R.R. Tolkien's
7
+ # invented languages to some of his devised writing systems.
8
+ #
9
+ # Copyright (C) 2015 Benjamin Babut (Talagan).
10
+ #
11
+ # This program is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # any later version.
15
+ #
16
+ # This program is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
23
+
24
+ ###############
25
+ # ENV STUFF #
26
+ ###############
27
+
28
+ begin
29
+ require 'commander/import'
30
+ rescue Exception => e
31
+ puts "The 'glaemscribe' binary requires the 'commander' gem to work. Please 'gem install commander' to make it work or add it to your Gemfile."
32
+ exit(0)
33
+ end
34
+
35
+ env_version = ""
36
+ begin
37
+ # Try to load dev version before loading the gem one
38
+ require File.dirname(__FILE__) + "/../lib_rb/glaemscribe.rb"
39
+ env_version = " (DEVELOPER VERSION - LOADED FROM SRC DIRECTORY)"
40
+ Glaemscribe::API::Debug.enabled = false
41
+ rescue Exception => e
42
+ # This is (probably) the gem version
43
+ require 'glaemscribe'
44
+ end
45
+
46
+ # Just a small monkey patch because I found commander lacks a new line at the beginning of its formatters
47
+ module Commander
48
+ module HelpFormatter
49
+ class Terminal < Base
50
+ def render
51
+ "\n" + template(:help).result(ProgramContext.new(@runner).get_binding)
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ #############
58
+ # HELPERS #
59
+ #############
60
+
61
+ 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")
64
+ puts "\n"
65
+ end
66
+
67
+ def perxit(error = nil, exit_code = nil)
68
+ STDERR.puts "*** " + error if(error)
69
+ exit(exit_code) if(exit_code)
70
+ end
71
+
72
+ def pereol
73
+ STDERR.puts "\n"
74
+ end
75
+
76
+ def profile
77
+ # Profile the code
78
+ RubyProf.start
79
+ yield()
80
+ result = RubyProf.stop
81
+ printer = RubyProf::MultiPrinter.new(result)
82
+ printer.print(:path => ".", :profile => "profile")
83
+ end
84
+
85
+ ##############
86
+ # PROGRAMM #
87
+ ##############
88
+
89
+ program :name, "glaemscribe#{env_version}"
90
+ program :version, '0.0.1'
91
+ program :description, 'Glǽmscribe (also written Glaemscribe) is a software dedicated to the
92
+ transcription of texts between writing systems, and more specifically
93
+ dedicated to the transcription of J.R.R. Tolkien\'s invented languages
94
+ to some of his devised writing systems.'
95
+ program :help, 'Author', 'Benjamin Talagan Babut'
96
+
97
+ ##############
98
+ # COMMANDS #
99
+ ##############
100
+
101
+ default_command :transcribe
102
+
103
+ command :transcribe do |c|
104
+
105
+ c.syntax = 'glaemscribe transcribe file [options]'
106
+ c.summary = 'Transcribes a file (default command)'
107
+ c.description = "Transcribes a file with the given options. You can use '-' instead of a file name to work with stdin."
108
+
109
+ c.option '-m', '--mode mode', String, "The name of the embedded mode to use. See the 'list' command to get a list of available modes names."
110
+ c.option '-c', '--charset charset', String, 'The name of the charset to use. If not given, glaemscribe will load and use the default charset defined in the mode.'
111
+ c.option '--modefile modefile', String, 'Use a custom mode file instead of an embedded one. The file extension must be .glaem .'
112
+ c.option '--charsetfile charsetfile', String, 'Use a custom charset file instead of an embedded one. The file extension must be .cst .'
113
+ c.option '-o', '--options name1:value1,name2:value2,...', String, 'Pass options to the transcriptor (see the mode options documentation).'
114
+
115
+ c.action do |args, options|
116
+
117
+ filename = args[0]
118
+ # Let's do some checks
119
+ if !filename && options.__hash__.keys.count == 0
120
+ # Nothing at all given!
121
+ command(:help).run()
122
+ exit(123)
123
+ end
124
+
125
+ if !filename
126
+ perxit("No file given for transcription.", 1)
127
+ end
128
+
129
+ if !options.mode && !options.modefile
130
+ perxit("An option 'mode' (-m) or 'modefile' (--modefile) is mandatory!", 2)
131
+ end
132
+
133
+ if options.mode && options.modefile
134
+ perxit("Option 'mode' (-m) and 'modefile' (--modefile) are not compatible. You have to chose!")
135
+ end
136
+
137
+ if options.charset && options.charsetfile
138
+ perxit("Option 'charset' (-c) and 'charsetfile' (--charsetfile) are not compatible. You have to chose!")
139
+ end
140
+
141
+ charset = nil
142
+ charset_name = nil
143
+
144
+ # If given a charset_file, it should be loaded BEFORE so that we have it in our charset base
145
+ if options.charsetfile
146
+ # External charset file loading
147
+ charset_name = Glaemscribe::API::ResourceManager.charset_name_from_file_path(options.charsetfile)
148
+
149
+ begin
150
+ charset = Glaemscribe::API::CharsetParser.new().parse(options.charsetfile)
151
+ # Put it in our base of charsets
152
+ Glaemscribe::API::ResourceManager.loaded_charsets[charset_name] = charset
153
+ rescue Errno::ENOENT
154
+ perxit("Charset file '#{options.charsetfile}' could not be opened for reading.",3)
155
+ end
156
+ elsif options.charset
157
+ charset_name = options.charset
158
+ # Let the mode load the embedded charset
159
+ end
160
+
161
+ mode = nil
162
+ mode_name = nil
163
+
164
+ if options.mode
165
+ # Embedded mode loading
166
+ mode_name = options.mode
167
+
168
+ Glaemscribe::API::ResourceManager.load_modes([mode_name])
169
+ mode = Glaemscribe::API::ResourceManager.loaded_modes[mode_name]
170
+
171
+ if !mode
172
+ perxit("Embedded #{mode_name} not handled!")
173
+ puts_available_modes
174
+ perxit(nil, 3)
175
+ end
176
+
177
+ else
178
+ # External mode file loading
179
+ mode_name = Glaemscribe::API::ResourceManager.mode_name_from_file_path(options.modefile)
180
+
181
+ begin
182
+ mode = Glaemscribe::API::ModeParser.new().parse(options.modefile)
183
+ rescue Errno::ENOENT
184
+ perxit("Mode file '#{options.modefile}' could not be opened for reading.",3)
185
+ end
186
+
187
+ Glaemscribe::API::ResourceManager.loaded_modes[mode_name] = mode
188
+ end
189
+
190
+ if mode.errors.any?
191
+ pereol
192
+ perxit("The mode '#{mode_name}' contains errors. ")
193
+ mode.errors.each{ |e|
194
+ puts "** #{mode.name}:#{e.line}: #{e.text}"
195
+ }
196
+ pereol
197
+ perxit("Transcription cannot continue", 3)
198
+ end
199
+
200
+ if mode.warnings.any?
201
+ pereol
202
+ perxit("The mode '#{mode_name}' contains warnings. ")
203
+ mode.warnings.each{ |e|
204
+ puts "** #{mode.name}:#{e.line}: #{e.text}"
205
+ }
206
+ pereol
207
+ perxit("Continuing transcription without guarantee...\n")
208
+ end
209
+
210
+ # If a charset was forced (embedded or with external file), check that the mode supports it
211
+ if charset_name
212
+ charset = mode.supported_charsets[charset_name]
213
+ perxit("Was asked to use charset '#{charset_name}', but the mode does not handle it. Aborting.", 12) if !charset
214
+ end
215
+
216
+ if options.options
217
+ a = options.options.split(",").map{ |o| o.split(":") }.flatten.map{|s| s.strip }
218
+ opts = Hash[*a]
219
+ mode.finalize(opts)
220
+ end
221
+
222
+ # Ready for transcription ...
223
+
224
+ if(filename == "-")
225
+ perxit "Opened in stdin mode, waiting for input..."
226
+ begin
227
+ while to_transcribe = STDIN.gets
228
+ success, ret = mode.transcribe(to_transcribe, charset)
229
+ if success
230
+ STDOUT.puts ret
231
+ else
232
+ perxit("The transcription failed.")
233
+ perxit(ret, 42)
234
+ end
235
+ end
236
+ rescue Interrupt
237
+ perxit "Interrupted, end of session.", 42
238
+ end
239
+ else
240
+
241
+ to_transcribe = ""
242
+ begin
243
+ File.open(args[0],"rb:utf-8") {|f|
244
+ to_transcribe = f.read
245
+ }
246
+ rescue Errno::ENOENT
247
+ perxit("File '#{args[0]}' could not be opened for reading.",3)
248
+ end
249
+
250
+ success, ret = mode.transcribe(to_transcribe, charset)
251
+
252
+ if success
253
+ STDOUT.puts ret
254
+ else
255
+ perxit("The transcription failed.")
256
+ perxit(ret, 42)
257
+ end
258
+ end
259
+
260
+ end
261
+ end
262
+
263
+ command :list do |c|
264
+
265
+ c.syntax = 'glaemscribe list'
266
+ c.summary = 'Lists all available embedded modes'
267
+ c.description = 'Lists all available embedded modes.'
268
+
269
+ c.action do |args, options|
270
+ puts_available_modes
271
+ end
272
+
273
+ end
274
+
275
+
276
+ command :info do |c|
277
+
278
+ c.syntax = 'glaemscribe info'
279
+ c.summary = "Displays information about an embedded mode"
280
+ c.description = "Displays information about the embedded mode 'modename'."
281
+
282
+ c.action do |args, options|
283
+
284
+ mode_name = args[0]
285
+ if !mode_name
286
+ perxit("No mode name given!", 2)
287
+ end
288
+
289
+ Glaemscribe::API::ResourceManager.load_modes(mode_name)
290
+ mode = Glaemscribe::API::ResourceManager.loaded_modes[mode_name]
291
+ if !mode
292
+ perxit("Mode #{mode_name} not handled!")
293
+ perxit(nil, 3)
294
+ end
295
+
296
+ puts "#{$terminal.color "Mode ID " , :bold} : #{mode.name}"
297
+ puts "#{$terminal.color "Language " , :bold} : #{mode.language}"
298
+ puts "#{$terminal.color "Writing " , :bold} : #{mode.writing}"
299
+ puts "#{$terminal.color "Human Name" , :bold} : #{mode.human_name}"
300
+ puts "#{$terminal.color "Authors " , :bold} : #{mode.authors}"
301
+ puts "#{$terminal.color "Version " , :bold} : #{mode.version}"
302
+
303
+ end
304
+
305
+ end
306
+
307
+
@@ -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
+