llt-form_builder 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +8 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +29 -0
  8. data/Rakefile +8 -0
  9. data/lib/llt/form/adjective.rb +19 -0
  10. data/lib/llt/form/adverb.rb +13 -0
  11. data/lib/llt/form/cardinal.rb +31 -0
  12. data/lib/llt/form/conjunction.rb +7 -0
  13. data/lib/llt/form/declinable.rb +23 -0
  14. data/lib/llt/form/demonstrative_pronoun.rb +7 -0
  15. data/lib/llt/form/ethnic.rb +6 -0
  16. data/lib/llt/form/fp.rb +6 -0
  17. data/lib/llt/form/gerund.rb +9 -0
  18. data/lib/llt/form/gerundive.rb +12 -0
  19. data/lib/llt/form/indefinite_pronoun.rb +7 -0
  20. data/lib/llt/form/infinitive.rb +13 -0
  21. data/lib/llt/form/interrogative_pronoun.rb +7 -0
  22. data/lib/llt/form/noun.rb +17 -0
  23. data/lib/llt/form/participle.rb +9 -0
  24. data/lib/llt/form/personal_pronoun.rb +13 -0
  25. data/lib/llt/form/ppa.rb +6 -0
  26. data/lib/llt/form/ppp.rb +6 -0
  27. data/lib/llt/form/preposition.rb +32 -0
  28. data/lib/llt/form/pronoun.rb +17 -0
  29. data/lib/llt/form/relative_pronoun.rb +7 -0
  30. data/lib/llt/form/subjunction.rb +7 -0
  31. data/lib/llt/form/supinum.rb +6 -0
  32. data/lib/llt/form/uninflectable.rb +22 -0
  33. data/lib/llt/form/verb.rb +28 -0
  34. data/lib/llt/form/verbal_noun.rb +18 -0
  35. data/lib/llt/form.rb +80 -0
  36. data/lib/llt/form_builder/adjective_builder.rb +86 -0
  37. data/lib/llt/form_builder/adverb_builder.rb +25 -0
  38. data/lib/llt/form_builder/declinable_builder.rb +164 -0
  39. data/lib/llt/form_builder/ethnic_builder.rb +17 -0
  40. data/lib/llt/form_builder/fp_builder.rb +13 -0
  41. data/lib/llt/form_builder/gerund_builder.rb +37 -0
  42. data/lib/llt/form_builder/gerundive_builder.rb +24 -0
  43. data/lib/llt/form_builder/helpers/adjective_like_building.rb +29 -0
  44. data/lib/llt/form_builder/helpers/pronoun_segments.rb +226 -0
  45. data/lib/llt/form_builder/helpers/stem_hash_parser.rb +263 -0
  46. data/lib/llt/form_builder/helpers/verb_segments.rb +562 -0
  47. data/lib/llt/form_builder/infinitivum_builder.rb +19 -0
  48. data/lib/llt/form_builder/irregular_gerund_builder.rb +7 -0
  49. data/lib/llt/form_builder/irregular_gerundive_builder.rb +7 -0
  50. data/lib/llt/form_builder/irregular_ppa_builder.rb +7 -0
  51. data/lib/llt/form_builder/irregular_praesens_builder.rb +5 -0
  52. data/lib/llt/form_builder/irregular_praesens_infinitivum_builder.rb +5 -0
  53. data/lib/llt/form_builder/noun_builder.rb +24 -0
  54. data/lib/llt/form_builder/perfectum_builder.rb +14 -0
  55. data/lib/llt/form_builder/perfectum_infinitivum_builder.rb +7 -0
  56. data/lib/llt/form_builder/personal_pronoun_builder.rb +107 -0
  57. data/lib/llt/form_builder/ppa_builder.rb +20 -0
  58. data/lib/llt/form_builder/ppp_builder.rb +10 -0
  59. data/lib/llt/form_builder/praesens_builder.rb +41 -0
  60. data/lib/llt/form_builder/praesens_infinitivum_builder.rb +9 -0
  61. data/lib/llt/form_builder/pronoun_builder.rb +106 -0
  62. data/lib/llt/form_builder/supinum_builder.rb +23 -0
  63. data/lib/llt/form_builder/verb_builder.rb +37 -0
  64. data/lib/llt/form_builder/version.rb +5 -0
  65. data/lib/llt/form_builder.rb +370 -0
  66. data/lib/llt/stem/adjective_pack.rb +122 -0
  67. data/lib/llt/stem/adjective_stem.rb +23 -0
  68. data/lib/llt/stem/ethnic_stem.rb +9 -0
  69. data/lib/llt/stem/noun_pack.rb +14 -0
  70. data/lib/llt/stem/noun_stem.rb +26 -0
  71. data/lib/llt/stem/pack.rb +46 -0
  72. data/lib/llt/stem/verb_pack.rb +53 -0
  73. data/lib/llt/stem/verb_stem.rb +18 -0
  74. data/lib/llt/stem.rb +145 -0
  75. data/lib/llt/stem_builder.rb +53 -0
  76. data/llt-form_builder.gemspec +30 -0
  77. data/spec/lib/llt/form/adjective_spec.rb +10 -0
  78. data/spec/lib/llt/form/adverb_spec.rb +17 -0
  79. data/spec/lib/llt/form/conjunction_spec.rb +23 -0
  80. data/spec/lib/llt/form/demonstrative_pronoun_spec.rb +14 -0
  81. data/spec/lib/llt/form/fp_spec.rb +12 -0
  82. data/spec/lib/llt/form/functions_spec.rb +13 -0
  83. data/spec/lib/llt/form/gerund_spec.rb +10 -0
  84. data/spec/lib/llt/form/gerundive_spec.rb +13 -0
  85. data/spec/lib/llt/form/noun_spec.rb +18 -0
  86. data/spec/lib/llt/form/ppa_spec.rb +12 -0
  87. data/spec/lib/llt/form/ppp_spec.rb +12 -0
  88. data/spec/lib/llt/form/preposition_spec.rb +43 -0
  89. data/spec/lib/llt/form/supinum_spec.rb +9 -0
  90. data/spec/lib/llt/form/verb_spec.rb +14 -0
  91. data/spec/lib/llt/form_builder/adjective_builder_spec.rb +182 -0
  92. data/spec/lib/llt/form_builder/adverb_builder_spec.rb +27 -0
  93. data/spec/lib/llt/form_builder/ethnic_builder_spec.rb +17 -0
  94. data/spec/lib/llt/form_builder/form_builder_spec.rb +16 -0
  95. data/spec/lib/llt/form_builder/fp_builder_spec.rb +42 -0
  96. data/spec/lib/llt/form_builder/gerund_builder_spec.rb +80 -0
  97. data/spec/lib/llt/form_builder/gerundive_builder_spec.rb +102 -0
  98. data/spec/lib/llt/form_builder/helpers/stem_hash_parser_spec.rb +197 -0
  99. data/spec/lib/llt/form_builder/irregular_gerund_builder_spec.rb +22 -0
  100. data/spec/lib/llt/form_builder/irregular_gerundive_builder_spec.rb +21 -0
  101. data/spec/lib/llt/form_builder/irregular_praesens_builder_spec.rb +14 -0
  102. data/spec/lib/llt/form_builder/irregular_praesens_infinitivum_builder_spec.rb +32 -0
  103. data/spec/lib/llt/form_builder/noun_builder_spec.rb +245 -0
  104. data/spec/lib/llt/form_builder/personal_pronoun_builder_spec.rb +49 -0
  105. data/spec/lib/llt/form_builder/ppa_builder_spec.rb +137 -0
  106. data/spec/lib/llt/form_builder/ppp_builder_spec.rb +45 -0
  107. data/spec/lib/llt/form_builder/pronoun_builder_spec.rb +203 -0
  108. data/spec/lib/llt/form_builder/supinum_builder_spec.rb +24 -0
  109. data/spec/lib/llt/form_builder/verb_builder_spec.rb +557 -0
  110. data/spec/lib/llt/form_spec.rb +27 -0
  111. data/spec/lib/llt/stem/adjective_pack_spec.rb +78 -0
  112. data/spec/lib/llt/stem/adjective_stem_spec.rb +15 -0
  113. data/spec/lib/llt/stem/noun_pack_spec.rb +20 -0
  114. data/spec/lib/llt/stem/noun_stem_spec.rb +14 -0
  115. data/spec/lib/llt/stem/verb_pack_spec.rb +56 -0
  116. data/spec/lib/llt/stem_builder_spec.rb +20 -0
  117. data/spec/spec_helper.rb +21 -0
  118. metadata +330 -0
@@ -0,0 +1,263 @@
1
+ module LLT
2
+ class FormBuilder
3
+ class StemHashParser
4
+
5
+ include Helpers::Normalizer
6
+
7
+ def initialize(stem_hashes)
8
+ @stem_hashes = stem_hashes.map { |h| normalize_args(h) }
9
+ @result = []
10
+ end
11
+
12
+ def parse
13
+ @stem_hashes.each do |hash|
14
+ @hash = hash
15
+ @opts = hash[:options]
16
+
17
+ m = "#{type}_changes"
18
+ if respond_to?(m)
19
+ send(m)
20
+ else
21
+ add_unchanged
22
+ end
23
+ end
24
+
25
+ @result
26
+ end
27
+
28
+
29
+ ####### Praesens Changes #######
30
+
31
+ def praesens_changes
32
+ verbal_changes do |ext, m, tmp|
33
+ parse_verb(:extension, ext)
34
+ parse_verb(:mood, m)
35
+
36
+ default_verbal_types(m, ext, tmp)
37
+ end
38
+ end
39
+
40
+ ####### Perfectum Changes #######
41
+
42
+ def perfectum_changes
43
+ verbal_changes do |ext, m, tmp|
44
+ parse_verb(:mood, m)
45
+ parse_verb(:extension, ext)
46
+
47
+ default_verbal_types(m, ext, tmp)
48
+ end
49
+ end
50
+
51
+
52
+ ####### PPP Changes #######
53
+
54
+ def ppp_changes
55
+ verbal_changes do |ext, m, tmp|
56
+ parse_verb(:extension, ext)
57
+ parse_verb(:mood, m)
58
+ parse_verb(:tempus, tmp)
59
+
60
+ add_with_new_type(*verb_defaults) unless m || ext || tmp
61
+ end
62
+ end
63
+
64
+ ####### Adjective Changes #######
65
+
66
+ def adjective_changes
67
+ add_unchanged
68
+ unless irregular_adverb_building? || invalid_options?
69
+ stem = comparativus? ? adapted_stem : @hash[:stem]
70
+ add(@hash.merge(stem: stem, type: :adverb)) unless irregular_adverb_building?
71
+ end
72
+ end
73
+
74
+ def adapted_stem
75
+ @hash[:stem].sub(/ior$/, "ius")
76
+ end
77
+
78
+ def irregular_adverb_building?
79
+ @hash[:irregular_adverb]
80
+ end
81
+
82
+ def comparativus?
83
+ @hash[:comparatio] == :comparativus
84
+ end
85
+
86
+ def invalid_options?
87
+ if @opts
88
+ @opts[:sexus] || @opts[:numerus] || @opts[:casus]
89
+ end
90
+ end
91
+
92
+
93
+ ######### Pronoun Changes #########
94
+
95
+ def pronoun_changes
96
+ if kind_of_quisque && @opts[:ending] == "is"
97
+ # whether quisque or quisque_s arrive - always return both
98
+ base_infl = inflection_class.to_s.match(/([a-z]+)_?/)[1]
99
+ types = [base_infl, base_infl + "_s"].map(&:to_sym)
100
+ add_with_new_inflection_class(*types)
101
+ else
102
+ add_unchanged
103
+ end
104
+ end
105
+
106
+ def kind_of_quisque
107
+ /quisque/ =~ inflection_class
108
+ end
109
+
110
+
111
+ ####### General Helper #######
112
+
113
+ def type
114
+ @hash[:type]
115
+ end
116
+
117
+ def inflection_class
118
+ @hash[:inflection_class]
119
+ end
120
+
121
+ def add_with_new_type(*types)
122
+ types.each do |type|
123
+ @result << @hash.merge(type: type)
124
+ end
125
+ end
126
+
127
+ def add_with_new_inflection_class(*infl_classes)
128
+ infl_classes.each do |infl_cl|
129
+ @result << @hash.merge(inflection_class: infl_cl)
130
+ end
131
+ end
132
+
133
+ def add(hash)
134
+ @result << hash
135
+ end
136
+
137
+ def add_unchanged
138
+ @result << @hash
139
+ end
140
+
141
+
142
+ ####### Verb Helpers #######
143
+
144
+ def verbal_changes
145
+ if @opts
146
+ yield(*attributes)
147
+ else
148
+ add_with_new_type(*verb_defaults)
149
+ end
150
+ end
151
+
152
+ def attributes
153
+ %i{ extension modus tempus }.map { |attr| @opts[attr] }
154
+ end
155
+
156
+
157
+ def verb_defaults
158
+ send("#{type}_defaults")
159
+ end
160
+
161
+ def irregular_verb?
162
+ @hash[:inflection_class].kind_of?(Symbol) # all irregulars are given as symbol, regulars come as Fixnum
163
+ end
164
+
165
+ IRE_DEFAULTS = %i{ irregular_praesens irregular_praesens_infinitivum irregular_ppa irregular_gerund irregular_gerundive }
166
+ FERRE_DEFAULTS = %i{ irregular_praesens irregular_praesens_infinitivum ppa gerund gerundive }
167
+ OTHER_DEFAULTS = %i{ irregular_praesens irregular_praesens_infinitivum }
168
+ REG_DEFAULTS = %i{ praesens praesens_infinitivum ppa gerund gerundive }
169
+ def praesens_defaults
170
+ if irregular_verb?
171
+ case @hash[:inflection_class]
172
+ when :ire then IRE_DEFAULTS
173
+ when :ferre then FERRE_DEFAULTS
174
+ else OTHER_DEFAULTS
175
+ end
176
+ else
177
+ REG_DEFAULTS
178
+ end
179
+ end
180
+
181
+ PERF_DEFAULTS = %i{ perfectum perfectum_infinitivum }
182
+ def perfectum_defaults
183
+ PERF_DEFAULTS
184
+ end
185
+
186
+ PPP_DEFAULTS = %i{ ppp fp supinum }
187
+ def ppp_defaults
188
+ PPP_DEFAULTS
189
+ end
190
+
191
+ def default_verbal_types(m, ext, tmp)
192
+ unless m || ext
193
+ if tmp || @opts[:finite]
194
+ add_with_new_type(verb_defaults.first) # praesens or perfectum
195
+ else
196
+ add_with_new_type(*verb_defaults)
197
+ end
198
+ end
199
+ end
200
+
201
+ def parse_verb(category, var)
202
+ return unless var
203
+ add_with_new_type(*send("#{category}_mapping", var))
204
+ end
205
+
206
+ def extension_mapping(ext)
207
+ case ext
208
+ when "nd" then [:gerund, :gerundive]
209
+ when /^nt?$/ then :ppa
210
+ when "ur" then :fp
211
+ else orig_type
212
+ end
213
+ end
214
+
215
+ def mood_mapping(mood)
216
+ case type
217
+ when :praesens
218
+ case mood
219
+ when mood_term(:participle) then :ppa
220
+ when mood_term(:infinitive) then :praesens_infinitivum
221
+ when mood_term(:gerund) then :gerund
222
+ when mood_term(:gerundive) then :gerundive
223
+ else orig_type
224
+ end
225
+ when :perfectum
226
+ case mood
227
+ when mood_term(:infinitive) then :perfectum_infinitivum
228
+ else type
229
+ end
230
+ when :ppp
231
+ case mood
232
+ when mood_term(:participle) then [:ppp, :fp]
233
+ when mood_term(:supinum) then :supinum
234
+ else type
235
+ end
236
+ end
237
+ end
238
+
239
+ def mood_term(val)
240
+ t.value_term_for(:modus, val)
241
+ end
242
+
243
+ def tempus_mapping(tmp)
244
+ # more to come, especially for praesens stem probably (ppa? gerundive?)
245
+ case type
246
+ when :ppp
247
+ case tmp
248
+ when t.fut then :fp
249
+ when t.pf then :ppp
250
+ end
251
+ end
252
+ end
253
+
254
+ def orig_type
255
+ if irregular_verb?
256
+ verb_defaults.find { |default| default.match(/#{type}$/) }
257
+ else
258
+ type
259
+ end
260
+ end
261
+ end
262
+ end
263
+ end