glaemscribe 1.0.19 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/glaemresources/charsets/tengwar_ds_annatar.cst +509 -0
  3. data/glaemresources/charsets/tengwar_ds_eldamar.cst +22 -16
  4. data/glaemresources/charsets/tengwar_ds_elfica.cst +461 -0
  5. data/glaemresources/charsets/tengwar_ds_parmaite.cst +500 -0
  6. data/glaemresources/charsets/{tengwar_ds.cst → tengwar_ds_sindarin.cst} +59 -62
  7. data/glaemresources/charsets/tengwar_freemono.cst +176 -0
  8. data/glaemresources/charsets/unicode_runes.cst +1 -0
  9. data/glaemresources/modes/adunaic.glaem +50 -28
  10. data/glaemresources/modes/blackspeech.glaem +156 -82
  11. data/glaemresources/modes/english-ipa.glaem +49 -0
  12. data/glaemresources/modes/french-ipa.glaem +49 -0
  13. data/glaemresources/modes/{oldnorse-medieval.glaem → futhark-runicus.glaem} +4 -4
  14. data/glaemresources/modes/futhark-younger.glaem +129 -0
  15. data/glaemresources/modes/{futhorc.glaem.disabled → futhorc.glaem} +76 -38
  16. data/glaemresources/modes/gothic.glaem +1 -1
  17. data/glaemresources/modes/khuzdul.glaem +1 -1
  18. data/glaemresources/modes/mercian.glaem +31 -16
  19. data/glaemresources/modes/quenya-sarati.glaem +5 -3
  20. data/glaemresources/modes/quenya.glaem +168 -77
  21. data/glaemresources/modes/rlyehian.glaem +41 -43
  22. data/glaemresources/modes/sindarin-beleriand.glaem +39 -17
  23. data/glaemresources/modes/sindarin-daeron.glaem +1 -1
  24. data/glaemresources/modes/{sindarin-classical.glaem → sindarin.glaem} +73 -37
  25. data/glaemresources/modes/telerin.glaem +161 -64
  26. data/glaemresources/modes/valarin-sarati.glaem +1 -1
  27. data/glaemresources/modes/westron.glaem +83 -44
  28. data/glaemresources/modes/westsaxon.glaem +30 -13
  29. data/lib/api/charset.rb +29 -11
  30. data/lib/api/charset_parser.rb +15 -3
  31. data/lib/api/mode.rb +15 -3
  32. data/lib/api/mode_parser.rb +7 -2
  33. data/lib/api/option.rb +15 -1
  34. data/lib/api/post_processor/resolve_virtuals.rb +35 -24
  35. data/lib/api/transcription_pre_post_processor.rb +2 -1
  36. metadata +15 -11
  37. data/glaemresources/modes/blackspeech-annatar.glaem +0 -320
  38. data/glaemresources/modes/futhark-long-branch.glaem.disabled +0 -101
  39. data/glaemresources/modes/futhark-short-twig.glaem.disabled +0 -101
data/lib/api/mode.rb CHANGED
@@ -36,6 +36,8 @@ module Glaemscribe
36
36
 
37
37
  attr_accessor :supported_charsets
38
38
  attr_accessor :default_charset
39
+
40
+ attr_reader :latest_option_values
39
41
 
40
42
  def initialize(name)
41
43
  @name = name
@@ -43,6 +45,7 @@ module Glaemscribe
43
45
  @warnings = []
44
46
  @supported_charsets = {}
45
47
  @options = {}
48
+ @last_raw_options = nil
46
49
 
47
50
  @pre_processor = TranscriptionPreProcessor.new(self)
48
51
  @processor = TranscriptionProcessor.new(self)
@@ -59,6 +62,13 @@ module Glaemscribe
59
62
 
60
63
  def finalize(options={})
61
64
 
65
+ if options == @last_raw_options
66
+ # Small optimization : don't refinalize if options are the same as before
67
+ return
68
+ end
69
+
70
+ @last_raw_options = options
71
+
62
72
  # Hash: option_name => value_name
63
73
  trans_options = {}
64
74
 
@@ -95,10 +105,12 @@ module Glaemscribe
95
105
  }
96
106
  end
97
107
  }
108
+
109
+ @latest_option_values = trans_options_converted
98
110
 
99
- @pre_processor.finalize(trans_options_converted)
100
- @post_processor.finalize(trans_options_converted)
101
- @processor.finalize(trans_options_converted)
111
+ @pre_processor.finalize(@latest_option_values)
112
+ @post_processor.finalize(@latest_option_values)
113
+ @processor.finalize(@latest_option_values)
102
114
 
103
115
  self
104
116
  end
@@ -214,11 +214,16 @@ module Glaemscribe
214
214
  @mode.version = doc.root_node.gpath('version').first.args.first
215
215
 
216
216
  doc.root_node.gpath("options.option").each{ |option_element|
217
- values = {}
217
+ values = {}
218
+ visibility = nil
219
+
218
220
  option_element.gpath("value").each{ |value_element|
219
221
  value_name = value_element.args.first
220
222
  values[value_name] = value_element.args.last.to_i
221
223
  }
224
+ option_element.gpath("visible_when").each{ |visible_element|
225
+ visibility = visible_element.args.first
226
+ }
222
227
 
223
228
  option_name_at = option_element.args[0]
224
229
  option_default_val_at = option_element.args[1]
@@ -228,7 +233,7 @@ module Glaemscribe
228
233
  @mode.errors << Glaeml::Error.new(option_element.line, "Missing option default value.")
229
234
  end
230
235
 
231
- option = Option.new(option_name_at, option_default_val_at, values)
236
+ option = Option.new(@mode, option_name_at, option_default_val_at, values, visibility)
232
237
  @mode.options[option.name] = option
233
238
  }
234
239
 
data/lib/api/option.rb CHANGED
@@ -24,21 +24,25 @@ module Glaemscribe
24
24
  module API
25
25
 
26
26
  class Option
27
+ attr_reader :mode
27
28
  attr_reader :name
28
29
  attr_reader :type
29
30
  attr_reader :default_value_name
30
31
  attr_reader :values
32
+
31
33
 
32
34
  class Type
33
35
  ENUM = "ENUM"
34
36
  BOOL = "BOOL"
35
37
  end
36
38
 
37
- def initialize(name, default_value_name, values)
39
+ def initialize(mode, name, default_value_name, values, visibility = nil)
40
+ @mode = mode
38
41
  @name = name
39
42
  @default_value_name = default_value_name
40
43
  @type = (values.keys.count == 0)?(Type::BOOL):(Type::ENUM)
41
44
  @values = values
45
+ @visibility = visibility
42
46
  end
43
47
 
44
48
  def default_value
@@ -59,6 +63,16 @@ module Glaemscribe
59
63
  end
60
64
  end
61
65
 
66
+ def visible?
67
+ if_eval = Eval::Parser.new()
68
+
69
+ begin
70
+ (if_eval.parse(@visibility || "true", @mode.latest_option_values || {}) == true)
71
+ rescue Eval::IfEvalError => e
72
+ nil
73
+ end
74
+ end
75
+
62
76
  end
63
77
  end
64
78
  end
@@ -37,35 +37,46 @@ module Glaemscribe
37
37
  }
38
38
  end
39
39
 
40
+ def apply_loop(charset, tokens, new_tokens, reversed, token, idx)
41
+ if token == '*SPACE'
42
+ reset_trigger_states(charset)
43
+ return
44
+ end
45
+
46
+ # Check if token is a virtual char
47
+ c = charset[token]
48
+ return if c.nil? # May happen for empty tokens
49
+ if c.virtual? && (reversed == c.reversed)
50
+ # Try to replace
51
+ last_trigger = @last_triggers[c]
52
+ if last_trigger != nil
53
+ new_tokens[idx] = last_trigger.names.first # Take the first name of the non-virtual replacement.
54
+ end
55
+ else
56
+ # Update states of virtual classes
57
+ charset.virtual_chars.each{|vc|
58
+ rc = vc[token]
59
+ @last_triggers[vc] = rc if rc != nil
60
+ }
61
+ end
62
+ end
63
+
40
64
  def apply(tokens,charset)
41
65
 
42
- reset_trigger_states(charset)
66
+ # Clone the tokens so that we can perform ligatures AND diacritics without interferences
67
+ new_tokens = tokens.clone
43
68
 
69
+ # Handle l to r virtuals (diacritics ?)
70
+ reset_trigger_states(charset)
44
71
  tokens.each_with_index{ |token,idx|
45
-
46
- if token == '*SPACE'
47
- reset_trigger_states(charset)
48
- next
49
- end
50
-
51
- # Check if token is a virtual char
52
- c = charset[token]
53
- next if c.nil? # May happen for empty tokens
54
- if c.virtual?
55
- # Try to replace
56
- last_trigger = @last_triggers[c]
57
- if last_trigger != nil
58
- tokens[idx] = last_trigger.names.first # Take the first name of the non-virtual replacement.
59
- end
60
- else
61
- # Update states of virtual classes
62
- charset.virtual_chars.each{|vc|
63
- rc = vc[token]
64
- @last_triggers[vc] = rc if rc != nil
65
- }
66
- end
72
+ apply_loop(charset,tokens,new_tokens,false,token,idx)
73
+ }
74
+ # Handle r to l virtuals (ligatures ?)
75
+ reset_trigger_states(charset)
76
+ tokens.reverse_each.with_index{ |token,idx|
77
+ apply_loop(charset,tokens,new_tokens,true,token,tokens.count - 1 - idx)
67
78
  }
68
- tokens
79
+ new_tokens
69
80
  end
70
81
  end
71
82
 
@@ -142,7 +142,8 @@ module Glaemscribe
142
142
  when "*LF"
143
143
  ret += "\n"
144
144
  else
145
- ret += out_charset[token].str
145
+ c = out_charset[token]
146
+ ret += (c.nil?)?(UNKNOWN_CHAR_OUTPUT):c.str
146
147
  end
147
148
  }
148
149
  ret
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glaemscribe
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.19
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin 'Talagan' Babut
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-06 00:00:00.000000000 Z
11
+ date: 2017-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -38,26 +38,30 @@ files:
38
38
  - bin/glaemscribe
39
39
  - glaemresources/charsets/cirth_ds.cst
40
40
  - glaemresources/charsets/sarati_eldamar.cst
41
- - glaemresources/charsets/tengwar_ds.cst
41
+ - glaemresources/charsets/tengwar_ds_annatar.cst
42
42
  - glaemresources/charsets/tengwar_ds_eldamar.cst
43
+ - glaemresources/charsets/tengwar_ds_elfica.cst
44
+ - glaemresources/charsets/tengwar_ds_parmaite.cst
45
+ - glaemresources/charsets/tengwar_ds_sindarin.cst
46
+ - glaemresources/charsets/tengwar_freemono.cst
43
47
  - glaemresources/charsets/unicode_gothic.cst
44
48
  - glaemresources/charsets/unicode_runes.cst
45
49
  - glaemresources/modes/adunaic.glaem
46
- - glaemresources/modes/blackspeech-annatar.glaem
47
50
  - glaemresources/modes/blackspeech.glaem
48
- - glaemresources/modes/futhark-long-branch.glaem.disabled
49
- - glaemresources/modes/futhark-short-twig.glaem.disabled
50
- - glaemresources/modes/futhorc.glaem.disabled
51
+ - glaemresources/modes/english-ipa.glaem
52
+ - glaemresources/modes/french-ipa.glaem
53
+ - glaemresources/modes/futhark-runicus.glaem
54
+ - glaemresources/modes/futhark-younger.glaem
55
+ - glaemresources/modes/futhorc.glaem
51
56
  - glaemresources/modes/gothic.glaem
52
57
  - glaemresources/modes/khuzdul.glaem
53
58
  - glaemresources/modes/mercian.glaem
54
- - glaemresources/modes/oldnorse-medieval.glaem
55
59
  - glaemresources/modes/quenya-sarati.glaem
56
60
  - glaemresources/modes/quenya.glaem
57
61
  - glaemresources/modes/rlyehian.glaem
58
62
  - glaemresources/modes/sindarin-beleriand.glaem
59
- - glaemresources/modes/sindarin-classical.glaem
60
63
  - glaemresources/modes/sindarin-daeron.glaem
64
+ - glaemresources/modes/sindarin.glaem
61
65
  - glaemresources/modes/telerin.glaem
62
66
  - glaemresources/modes/valarin-sarati.glaem
63
67
  - glaemresources/modes/westron.glaem
@@ -91,7 +95,7 @@ files:
91
95
  - lib/api/transcription_processor.rb
92
96
  - lib/api/transcription_tree_node.rb
93
97
  - lib/glaemscribe.rb
94
- homepage: http://jrrvf.com/~glaemscrafu/english/glaemscribe.html
98
+ homepage: https://jrrvf.com/~glaemscrafu/english/glaemscribe.html
95
99
  licenses:
96
100
  - AGPL-3.0
97
101
  metadata: {}
@@ -111,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
115
  version: '0'
112
116
  requirements: []
113
117
  rubyforge_project:
114
- rubygems_version: 2.5.1
118
+ rubygems_version: 2.6.11
115
119
  signing_key:
116
120
  specification_version: 4
117
121
  summary: Glǽmscribe
@@ -1,320 +0,0 @@
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
- \** TODO : NEEDS PORTING TO VIRTUAL CHARS, BUT NEEDS A NEW CHARSET FOR ANNATAR FOR THAT **\
34
-
35
- \charset tengwar_ds true
36
-
37
- \beg options
38
- \option reverse_numbers true
39
- \beg option numbers_base BASE_12
40
- \value BASE_10 10
41
- \value BASE_12 12
42
- \end
43
- \end
44
-
45
- \beg preprocessor
46
- \** Work exclusively downcase **\
47
- \downcase
48
-
49
- \** Simplify trema vowels **\
50
- \substitute ä a
51
- \substitute ë e
52
- \substitute ï i
53
- \substitute ö o
54
- \substitute ü u
55
- \substitute ÿ y
56
-
57
- \** Dis-ambiguate long vowels **\
58
- \rxsubstitute "(ā|â|aa)" "á"
59
- \rxsubstitute "(ē|ê|ee)" "é"
60
- \rxsubstitute "(ī|î|ii)" "í"
61
- \rxsubstitute "(ō|ô|oo)" "ó"
62
- \rxsubstitute "(ū|û|uu)" "ú"
63
-
64
- \** Preprocess numbers **\
65
- \elvish_numbers "\\eval numbers_base" "\\eval reverse_numbers"
66
- \end
67
-
68
- \beg processor
69
-
70
- \beg rules litteral
71
- {A} === a
72
- {AA} === á
73
- {E} === e
74
- {EE} === é
75
- {I} === i
76
- {II} === í
77
- {O} === o
78
- {OO} === ó
79
- {U} === u
80
- {UU} === ú
81
-
82
- {AI} === {A}{I} \** attested **\
83
- {AU} === {A}{U} \** attested **\
84
- {OI} === {O}{I} \** Not quite sure (dushgoi) **\
85
-
86
- {K} === (c,k)
87
-
88
- \** VOWELS **\
89
- {VOWELS} === {A} * {E} * {I} * {O} * {U}
90
- {LVOWELS} === {AA} * {EE} * {II} * {OO} * {UU}
91
- \** Reverse o and u **\
92
- {TEHTA_XS} === A_TEHTA_XS * E_TEHTA_XS * I_TEHTA_XS * U_TEHTA_XS * O_TEHTA_XS
93
- {TEHTA__S} === A_TEHTA_S * E_TEHTA_S * I_TEHTA_S * U_TEHTA_S * O_TEHTA_S
94
- {TEHTA__L} === A_TEHTA_L * E_TEHTA_L * I_TEHTA_L * U_TEHTA_L * O_TEHTA_L
95
- {TEHTA_XL} === A_TEHTA_XL * E_TEHTA_XL * I_TEHTA_XL * U_TEHTA_XL * O_TEHTA_XL
96
- \** Double tehtas **\
97
- {DTEHTA_XS} === A_TEHTA_DOUBLE_XS * E_TEHTA_DOUBLE_XS * Y_TEHTA_XS * U_TEHTA_DOUBLE_XS * O_TEHTA_DOUBLE_XS
98
- {DTEHTA_S} === A_TEHTA_DOUBLE_S * E_TEHTA_DOUBLE_S * Y_TEHTA_S * U_TEHTA_DOUBLE_S * O_TEHTA_DOUBLE_S
99
- {DTEHTA_L} === A_TEHTA_DOUBLE_L * E_TEHTA_DOUBLE_L * Y_TEHTA_L * U_TEHTA_DOUBLE_L * O_TEHTA_DOUBLE_L
100
- {DTEHTA_XL} === A_TEHTA_DOUBLE_XL * E_TEHTA_DOUBLE_XL * Y_TEHTA_XL * U_TEHTA_DOUBLE_XL * O_TEHTA_DOUBLE_XL
101
-
102
- {DIPHTHONGS} === {AI} * {AU} * {OI}
103
- {DIPHTHENGS} === YANTA A_TEHTA_L * URE A_TEHTA_L * YANTA U_TEHTA_L
104
-
105
- {V_D_KER} === [ {VOWELS} * {LVOWELS} * {DIPHTHONGS} ]
106
- {V_D_IMG_XS} === [ {TEHTA_XS} * {DTEHTA_XS} * {DIPHTHENGS} ]
107
- {V_D_IMG__S} === [ {TEHTA__S} * {DTEHTA_L} * {DIPHTHENGS} ]
108
- {V_D_IMG__L} === [ {TEHTA__L} * {DTEHTA_S} * {DIPHTHENGS} ]
109
- {V_D_IMG_XL} === [ {TEHTA_XL} * {DTEHTA_XL} * {DIPHTHENGS} ]
110
-
111
- [{VOWELS}] --> TELCO [{TEHTA_XS}] \** Replace isolated short vowels **\
112
- [{LVOWELS}] --> ARA [{TEHTA_XS}] \** Replace long vowels **\
113
- [{DIPHTHONGS}] --> [{DIPHTHENGS}] \** Replace diphthongs **\
114
-
115
- \** CONSONANT RULES (could be factorized with crossrules) **\
116
-
117
- \** ======================== **\
118
-
119
- l --> LAMBE
120
- \** If we look closely on the ring inscription, **\
121
- \** we can see the offset for the tehta starting point **\
122
- \** That's why we use the XL tehtas **\
123
- {V_D_KER} l --> LAMBE {V_D_IMG_XL}
124
- \** when telco follows, ligature with telco **\
125
- l {V_D_KER} _ --> LAMBE_LIG TELCO {V_D_IMG_XS}
126
-
127
- \** ======================== **\
128
-
129
- b --> UMBAR
130
- {V_D_KER} b --> UMBAR {V_D_IMG_XL}
131
- \** Attached l to b **\
132
- l {V_D_KER} b --> LAMBE_LIG UMBAR {V_D_IMG_XL}
133
- {V_D_KER} l {V_D_KER} b --> LAMBE_LIG {V_D_IMG_XL} UMBAR {V_D_IMG_XL}
134
-
135
- d --> ANDO
136
- {V_D_KER} d --> ANDO {V_D_IMG_XL}
137
- \** Attached l to d **\
138
- l {V_D_KER} d --> LAMBE_LIG ANDO {V_D_IMG_XL}
139
- {V_D_KER} l {V_D_KER} d --> LAMBE_LIG {V_D_IMG_XL} ANDO {V_D_IMG_XL}
140
-
141
- f --> FORMEN
142
- {V_D_KER} f --> FORMEN_EXT {V_D_IMG__S} \** Beware. **\
143
- \** Attached l to f **\
144
- l {V_D_KER} f --> LAMBE_LIG FORMEN_EXT {V_D_IMG__S}
145
- {V_D_KER} l {V_D_KER} f --> LAMBE_LIG {V_D_IMG_XL} FORMEN_EXT {V_D_IMG__S}
146
-
147
- g --> UNGWE
148
- {V_D_KER} g --> UNGWE {V_D_IMG_XL}
149
- \** Attached l to g **\
150
- l {V_D_KER} g --> LAMBE_LIG UNGWE {V_D_IMG_XL}
151
- {V_D_KER} l {V_D_KER} g --> LAMBE_LIG {V_D_IMG_XL} UNGWE {V_D_IMG_XL}
152
-
153
- gh --> UNGWE_EXT
154
- {V_D_KER} gh --> UNGWE_EXT {V_D_IMG_XL}
155
- \** Attached l to g **\
156
- l {V_D_KER} gh --> LAMBE_LIG UNGWE_EXT {V_D_IMG_XL}
157
- {V_D_KER} l {V_D_KER} gh --> LAMBE_LIG {V_D_IMG_XL} UNGWE_EXT {V_D_IMG_XL}
158
-
159
- h --> HYARMEN
160
- {V_D_KER} h --> HYARMEN {V_D_IMG_XS}
161
- \** Attached l to g **\
162
- l {V_D_KER} h --> LAMBE_LIG HYARMEN {V_D_IMG_XS}
163
- {V_D_KER} l {V_D_KER} h --> LAMBE_LIG {V_D_IMG_XL} HYARMEN {V_D_IMG_XS}
164
-
165
- {K} --> QUESSE
166
- {V_D_KER} {K} --> QUESSE {V_D_IMG__L}
167
- \** Attached l to g **\
168
- l {V_D_KER} {K} --> LAMBE_LIG QUESSE {V_D_IMG__L}
169
- {V_D_KER} l {V_D_KER} {K} --> LAMBE_LIG {V_D_IMG_XL} QUESSE {V_D_IMG__L}
170
-
171
- {K}h --> HWESTA
172
- {V_D_KER} {K}h --> HWESTA_EXT {V_D_IMG__L}
173
- \** Attached l to g **\
174
- l {V_D_KER} {K}h --> LAMBE_LIG HWESTA_EXT {V_D_IMG__L}
175
- {V_D_KER} l {V_D_KER} {K}h --> LAMBE_LIG {V_D_IMG_XL} HWESTA_EXT {V_D_IMG__L}
176
-
177
-
178
- m --> MALTA
179
- {V_D_KER} m --> MALTA {V_D_IMG_XL}
180
-
181
- mb --> UMBAR TILD_SUP_L
182
- {V_D_KER} mb --> UMBAR TILD_SUP_L {V_D_IMG_XL}
183
-
184
- mp --> PARMA TILD_SUP_S
185
- {V_D_KER} mp --> PARMA TILD_SUP_S {V_D_IMG__L}
186
-
187
- n --> NUMEN
188
- {V_D_KER} n --> NUMEN {V_D_IMG_XL}
189
-
190
- n{K} --> QUESSE TILD_SUP_S
191
- {V_D_KER} n{K} --> QUESSE TILD_SUP_S {V_D_IMG__S}
192
-
193
- p --> PARMA
194
-
195
- r --> ROMEN
196
- {V_D_KER} r --> ORE {V_D_IMG__L}
197
- \** Attached l to r **\
198
- l {V_D_KER} r --> LAMBE_LIG ORE {V_D_IMG__L}
199
- {V_D_KER} l {V_D_KER} r --> LAMBE_LIG {V_D_IMG_XL} ORE {V_D_IMG__L}
200
-
201
-
202
- r --> ROMEN
203
- r_ --> ORE
204
- {V_D_KER} r --> ORE {V_D_IMG__S}
205
- {V_D_KER} rb --> ORE {V_D_IMG__L} UMBAR
206
- {V_D_KER} rz --> ORE {V_D_IMG__L} ESSE
207
-
208
- s --> SILME
209
-
210
-
211
- \** Beware sh is not the same if not preceeded by vowel **\
212
- sh --> AHA
213
- {A}sh --> AHA_EXT A_TEHTA_L
214
- {E}sh --> AHA_EXT E_TEHTA_L
215
- {I}sh --> AHA_EXT I_TEHTA_L
216
- {O}sh --> AHA_EXT U_TEHTA_S
217
- {U}sh --> AHA_EXT O_TEHTA_XS \** The best one still not satisfying... **\
218
- {AA}sh --> ESSE_NUQUERNA A_TEHTA_DOUBLE_L
219
- {EE}sh --> ESSE_NUQUERNA E_TEHTA_DOUBLE_L
220
- {II}sh --> ESSE_NUQUERNA Y_TEHTA_L
221
- {OO}sh --> ESSE_NUQUERNA U_TEHTA_DOUBLE_S
222
- {UU}sh --> ESSE_NUQUERNA O_TEHTA_DOUBLE_XS
223
-
224
- t --> TINCO
225
- {V_D_KER} t --> TINCO {V_D_IMG__L}
226
-
227
- th --> SULE
228
- y --> ANNA
229
-
230
- z --> ESSE
231
-
232
- \** Need to break thisone too **\
233
- {A}z --> ESSE_NUQUERNA A_TEHTA_L
234
- {E}z --> ESSE_NUQUERNA E_TEHTA_L
235
- {I}z --> ESSE_NUQUERNA I_TEHTA_L
236
- {O}z --> ESSE_NUQUERNA U_TEHTA_S
237
- {U}z --> ESSE_NUQUERNA O_TEHTA_S
238
- {AA}z --> ESSE_NUQUERNA A_TEHTA_DOUBLE_L
239
- {EE}z --> ESSE_NUQUERNA E_TEHTA_DOUBLE_L
240
- {II}z --> ESSE_NUQUERNA Y_TEHTA_L
241
- {OO}z --> ESSE_NUQUERNA U_TEHTA_DOUBLE_S
242
- {UU}z --> ESSE_NUQUERNA O_TEHTA_DOUBLE_S
243
- \end
244
-
245
- \beg rules punctuation
246
- . --> PUNCT_DDOT
247
- .. --> PUNCT_DOT PUNCT_DDOT PUNCT_DOT
248
- … --> PUNCT_TILD
249
- ... --> PUNCT_TILD
250
- .... --> PUNCT_TILD
251
- ..... --> PUNCT_TILD
252
- ...... --> PUNCT_TILD
253
- ....... --> PUNCT_TILD
254
-
255
- , --> PUNCT_DOT
256
- : --> PUNCT_DOT
257
- ; --> PUNCT_DOT
258
- ! --> PUNCT_EXCLAM
259
- ? --> PUNCT_INTERR
260
- · --> PUNCT_DOT
261
-
262
- \** Apostrophe **\
263
-
264
- ' --> {NULL}
265
- ’ --> {NULL}
266
-
267
- \** Quotes **\
268
-
269
- “ --> DQUOT_OPEN
270
- ” --> DQUOT_CLOSE
271
- « --> DQUOT_OPEN
272
- » --> DQUOT_CLOSE
273
-
274
- - --> {NULL}
275
- – --> PUNCT_TILD
276
- — --> PUNCT_TILD
277
-
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
- < --> PUNCT_PAREN_L
285
- > --> PUNCT_PAREN_R
286
-
287
- \** Not universal between fonts ... **\
288
- $ --> BOOKMARK_SIGN
289
- ≤ --> RING_MARK_L \** Ring inscription left beautiful stuff **\
290
- ≥ --> RING_MARK_R \** Ring inscription right beautiful stuff **\
291
-
292
- \end
293
-
294
- \beg rules numbers
295
- 0 --> NUM_0
296
- 1 --> NUM_1
297
- 2 --> NUM_2
298
- 3 --> NUM_3
299
- 4 --> NUM_4
300
- 5 --> NUM_5
301
- 6 --> NUM_6
302
- 7 --> NUM_7
303
- 8 --> NUM_8
304
- 9 --> NUM_9
305
- A --> NUM_10
306
- B --> NUM_11
307
- \end
308
-
309
- \end
310
-
311
-
312
-
313
-
314
-
315
-
316
-
317
-
318
-
319
-
320
-