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