llt-form_builder 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +3 -0
- data/.travis.yml +4 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +8 -0
- data/lib/llt/form/adjective.rb +19 -0
- data/lib/llt/form/adverb.rb +13 -0
- data/lib/llt/form/cardinal.rb +31 -0
- data/lib/llt/form/conjunction.rb +7 -0
- data/lib/llt/form/declinable.rb +23 -0
- data/lib/llt/form/demonstrative_pronoun.rb +7 -0
- data/lib/llt/form/ethnic.rb +6 -0
- data/lib/llt/form/fp.rb +6 -0
- data/lib/llt/form/gerund.rb +9 -0
- data/lib/llt/form/gerundive.rb +12 -0
- data/lib/llt/form/indefinite_pronoun.rb +7 -0
- data/lib/llt/form/infinitive.rb +13 -0
- data/lib/llt/form/interrogative_pronoun.rb +7 -0
- data/lib/llt/form/noun.rb +17 -0
- data/lib/llt/form/participle.rb +9 -0
- data/lib/llt/form/personal_pronoun.rb +13 -0
- data/lib/llt/form/ppa.rb +6 -0
- data/lib/llt/form/ppp.rb +6 -0
- data/lib/llt/form/preposition.rb +32 -0
- data/lib/llt/form/pronoun.rb +17 -0
- data/lib/llt/form/relative_pronoun.rb +7 -0
- data/lib/llt/form/subjunction.rb +7 -0
- data/lib/llt/form/supinum.rb +6 -0
- data/lib/llt/form/uninflectable.rb +22 -0
- data/lib/llt/form/verb.rb +28 -0
- data/lib/llt/form/verbal_noun.rb +18 -0
- data/lib/llt/form.rb +80 -0
- data/lib/llt/form_builder/adjective_builder.rb +86 -0
- data/lib/llt/form_builder/adverb_builder.rb +25 -0
- data/lib/llt/form_builder/declinable_builder.rb +164 -0
- data/lib/llt/form_builder/ethnic_builder.rb +17 -0
- data/lib/llt/form_builder/fp_builder.rb +13 -0
- data/lib/llt/form_builder/gerund_builder.rb +37 -0
- data/lib/llt/form_builder/gerundive_builder.rb +24 -0
- data/lib/llt/form_builder/helpers/adjective_like_building.rb +29 -0
- data/lib/llt/form_builder/helpers/pronoun_segments.rb +226 -0
- data/lib/llt/form_builder/helpers/stem_hash_parser.rb +263 -0
- data/lib/llt/form_builder/helpers/verb_segments.rb +562 -0
- data/lib/llt/form_builder/infinitivum_builder.rb +19 -0
- data/lib/llt/form_builder/irregular_gerund_builder.rb +7 -0
- data/lib/llt/form_builder/irregular_gerundive_builder.rb +7 -0
- data/lib/llt/form_builder/irregular_ppa_builder.rb +7 -0
- data/lib/llt/form_builder/irregular_praesens_builder.rb +5 -0
- data/lib/llt/form_builder/irregular_praesens_infinitivum_builder.rb +5 -0
- data/lib/llt/form_builder/noun_builder.rb +24 -0
- data/lib/llt/form_builder/perfectum_builder.rb +14 -0
- data/lib/llt/form_builder/perfectum_infinitivum_builder.rb +7 -0
- data/lib/llt/form_builder/personal_pronoun_builder.rb +107 -0
- data/lib/llt/form_builder/ppa_builder.rb +20 -0
- data/lib/llt/form_builder/ppp_builder.rb +10 -0
- data/lib/llt/form_builder/praesens_builder.rb +41 -0
- data/lib/llt/form_builder/praesens_infinitivum_builder.rb +9 -0
- data/lib/llt/form_builder/pronoun_builder.rb +106 -0
- data/lib/llt/form_builder/supinum_builder.rb +23 -0
- data/lib/llt/form_builder/verb_builder.rb +37 -0
- data/lib/llt/form_builder/version.rb +5 -0
- data/lib/llt/form_builder.rb +370 -0
- data/lib/llt/stem/adjective_pack.rb +122 -0
- data/lib/llt/stem/adjective_stem.rb +23 -0
- data/lib/llt/stem/ethnic_stem.rb +9 -0
- data/lib/llt/stem/noun_pack.rb +14 -0
- data/lib/llt/stem/noun_stem.rb +26 -0
- data/lib/llt/stem/pack.rb +46 -0
- data/lib/llt/stem/verb_pack.rb +53 -0
- data/lib/llt/stem/verb_stem.rb +18 -0
- data/lib/llt/stem.rb +145 -0
- data/lib/llt/stem_builder.rb +53 -0
- data/llt-form_builder.gemspec +30 -0
- data/spec/lib/llt/form/adjective_spec.rb +10 -0
- data/spec/lib/llt/form/adverb_spec.rb +17 -0
- data/spec/lib/llt/form/conjunction_spec.rb +23 -0
- data/spec/lib/llt/form/demonstrative_pronoun_spec.rb +14 -0
- data/spec/lib/llt/form/fp_spec.rb +12 -0
- data/spec/lib/llt/form/functions_spec.rb +13 -0
- data/spec/lib/llt/form/gerund_spec.rb +10 -0
- data/spec/lib/llt/form/gerundive_spec.rb +13 -0
- data/spec/lib/llt/form/noun_spec.rb +18 -0
- data/spec/lib/llt/form/ppa_spec.rb +12 -0
- data/spec/lib/llt/form/ppp_spec.rb +12 -0
- data/spec/lib/llt/form/preposition_spec.rb +43 -0
- data/spec/lib/llt/form/supinum_spec.rb +9 -0
- data/spec/lib/llt/form/verb_spec.rb +14 -0
- data/spec/lib/llt/form_builder/adjective_builder_spec.rb +182 -0
- data/spec/lib/llt/form_builder/adverb_builder_spec.rb +27 -0
- data/spec/lib/llt/form_builder/ethnic_builder_spec.rb +17 -0
- data/spec/lib/llt/form_builder/form_builder_spec.rb +16 -0
- data/spec/lib/llt/form_builder/fp_builder_spec.rb +42 -0
- data/spec/lib/llt/form_builder/gerund_builder_spec.rb +80 -0
- data/spec/lib/llt/form_builder/gerundive_builder_spec.rb +102 -0
- data/spec/lib/llt/form_builder/helpers/stem_hash_parser_spec.rb +197 -0
- data/spec/lib/llt/form_builder/irregular_gerund_builder_spec.rb +22 -0
- data/spec/lib/llt/form_builder/irregular_gerundive_builder_spec.rb +21 -0
- data/spec/lib/llt/form_builder/irregular_praesens_builder_spec.rb +14 -0
- data/spec/lib/llt/form_builder/irregular_praesens_infinitivum_builder_spec.rb +32 -0
- data/spec/lib/llt/form_builder/noun_builder_spec.rb +245 -0
- data/spec/lib/llt/form_builder/personal_pronoun_builder_spec.rb +49 -0
- data/spec/lib/llt/form_builder/ppa_builder_spec.rb +137 -0
- data/spec/lib/llt/form_builder/ppp_builder_spec.rb +45 -0
- data/spec/lib/llt/form_builder/pronoun_builder_spec.rb +203 -0
- data/spec/lib/llt/form_builder/supinum_builder_spec.rb +24 -0
- data/spec/lib/llt/form_builder/verb_builder_spec.rb +557 -0
- data/spec/lib/llt/form_spec.rb +27 -0
- data/spec/lib/llt/stem/adjective_pack_spec.rb +78 -0
- data/spec/lib/llt/stem/adjective_stem_spec.rb +15 -0
- data/spec/lib/llt/stem/noun_pack_spec.rb +20 -0
- data/spec/lib/llt/stem/noun_stem_spec.rb +14 -0
- data/spec/lib/llt/stem/verb_pack_spec.rb +56 -0
- data/spec/lib/llt/stem_builder_spec.rb +20 -0
- data/spec/spec_helper.rb +21 -0
- metadata +330 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
module LLT
|
2
|
+
class PersonalPronounBuilder < DeclinableBuilder
|
3
|
+
endings_defined_through :inflection_class
|
4
|
+
|
5
|
+
validate :suffix
|
6
|
+
|
7
|
+
def indices
|
8
|
+
{
|
9
|
+
casus: [0, 1, 2, 3, nil, 5],
|
10
|
+
numerus: [0, 6],
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def compute
|
15
|
+
(regular_forms + forms_with_suffix + additional_genetives).sort_by(&:index)
|
16
|
+
end
|
17
|
+
|
18
|
+
def forms
|
19
|
+
endings
|
20
|
+
end
|
21
|
+
|
22
|
+
def forms_with_suffix
|
23
|
+
suffixeds = SUFFIXED_FORMS[@inflection_class]
|
24
|
+
res = []
|
25
|
+
return res unless suffixeds
|
26
|
+
suffixeds.each do |i, suffixes|
|
27
|
+
if @lookup_indices.include?(i)
|
28
|
+
suffixes.each do |suffix|
|
29
|
+
f = forms[i]
|
30
|
+
res << new_form_through_index(f, i, suffix)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
res.flatten.compact
|
35
|
+
end
|
36
|
+
|
37
|
+
def additional_genetives
|
38
|
+
if nos_or_vos && @lookup_indices.include?(7) # gen.pl
|
39
|
+
[new_form_through_index("#{@inflection_class}trum", 7)]
|
40
|
+
else
|
41
|
+
[]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def nos_or_vos
|
46
|
+
@inflection_class == :nos || @inflection_class == :vos
|
47
|
+
end
|
48
|
+
|
49
|
+
def new_form_through_index(form, i, suffix = "")
|
50
|
+
# nil values in ending == form present, vocatives f.e., or se in nom.
|
51
|
+
return unless form
|
52
|
+
c, n = casus_numerus_sexus_by_index(i)
|
53
|
+
new_form(stem: form, casus: c, numerus: n, suffix: suffix, index: i)
|
54
|
+
end
|
55
|
+
|
56
|
+
def default_args
|
57
|
+
# need to override, because we want to use our custom "stem", which is actually the form itself
|
58
|
+
{ inflection_class: @inflection_class }
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def self.compute_suffixed_forms
|
65
|
+
hash = container
|
66
|
+
# arrays are styled as casus, numerus, suffix
|
67
|
+
# 0: cum, 1: met, 2: te, 3: se
|
68
|
+
suffixes = %w{ cum met te se }
|
69
|
+
# -cum
|
70
|
+
hash[:ego] << [6,1,0]
|
71
|
+
hash[:tu] << [6,1,0]
|
72
|
+
hash[:se] << [6,1,0] << [6,2,0]
|
73
|
+
hash[:nos] << [6,2,0]
|
74
|
+
hash[:vos] << [6,2,0]
|
75
|
+
# -met
|
76
|
+
hash[:ego] << [1,1,1] << [2,1,1] << [3,1,1] << [4,1,1] << [6,1,1]
|
77
|
+
hash[:nos] << [1,2,1] << [3,2,1] << [4,2,1] << [6,2,1]
|
78
|
+
hash[:vos] << [1,2,1] << [3,2,1] << [4,2,1] << [6,2,1]
|
79
|
+
hash[:tu] << [3,1,1]
|
80
|
+
# -te
|
81
|
+
hash[:tu] << [1,1,2] << [4,1,2] << [6,1,2]
|
82
|
+
# -se
|
83
|
+
hash[:se] << [4,1,3] << [6,1,3] << [4,2,3] << [6,2,3]
|
84
|
+
|
85
|
+
|
86
|
+
res = {}
|
87
|
+
hash.each do |key, values|
|
88
|
+
h = container
|
89
|
+
values.each do |casus, numerus, suffix|
|
90
|
+
h[ioe(casus, numerus)] << suffixes[suffix]
|
91
|
+
end
|
92
|
+
res[key] = h
|
93
|
+
end
|
94
|
+
res
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.ioe(casus, numerus)
|
98
|
+
casus + (numerus == 1 ? -1 : 5)
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.container
|
102
|
+
Hash.new { |h, k| h[k] = [] }
|
103
|
+
end
|
104
|
+
|
105
|
+
SUFFIXED_FORMS = compute_suffixed_forms
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module LLT
|
2
|
+
class PpaBuilder < DeclinableBuilder
|
3
|
+
builds_like_an :adjective
|
4
|
+
builds_with :modus, :tempus, :extension, :genus
|
5
|
+
|
6
|
+
has_extension "nt"
|
7
|
+
has_modus t.participium
|
8
|
+
has_tempus t.praesens
|
9
|
+
has_genus t.activum
|
10
|
+
|
11
|
+
look_up :thematic
|
12
|
+
validate :extension
|
13
|
+
|
14
|
+
def corrections(args)
|
15
|
+
if args[:ending] == "s"
|
16
|
+
args[:extension] = args[:extension].chop
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module LLT
|
2
|
+
class PraesensBuilder < VerbBuilder
|
3
|
+
endings_defined_through :inflection_class
|
4
|
+
|
5
|
+
look_up :thematic, :extension
|
6
|
+
|
7
|
+
def indices
|
8
|
+
{ persona: persona_index,
|
9
|
+
numerus: [0, 3],
|
10
|
+
genus: genus_index,
|
11
|
+
modus: [0, 12, 24],
|
12
|
+
tempus: [0, 36, 72]
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def indices_by_ending(ending)
|
17
|
+
indices = super
|
18
|
+
if @deponens
|
19
|
+
PASSIVE_INDICES & indices
|
20
|
+
else
|
21
|
+
indices
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def self.passive_indices
|
27
|
+
# build all possible indices, slice them according to their genus, select only even ones,
|
28
|
+
# i.e. the passive endings
|
29
|
+
(0..107).each_slice(6).each_with_index.each_with_object([]) { |(e, i), r| r << e if i.odd? }.flatten
|
30
|
+
end
|
31
|
+
PASSIVE_INDICES = passive_indices
|
32
|
+
|
33
|
+
def corrections(args)
|
34
|
+
if args[:inflection_class] == 1
|
35
|
+
if args[:tempus] == t.pr && (args[:modus] == t.con || args[:ending].match(/or?$/))
|
36
|
+
args[:stem] = args[:stem].chop
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module LLT
|
2
|
+
class PronounBuilder < DeclinableBuilder
|
3
|
+
builds_like_an :adjective
|
4
|
+
lookup_class PronounSegments
|
5
|
+
look_up :stem, :particle, :prefixed_particle
|
6
|
+
|
7
|
+
endings_defined_through :inflection_class
|
8
|
+
|
9
|
+
validate :suffix # quibuscum etc.
|
10
|
+
|
11
|
+
def indices
|
12
|
+
{ casus: [0, 1, 2, 3, nil, 5],
|
13
|
+
numerus: [0, 6],
|
14
|
+
sexus: [0, 12, 24] }
|
15
|
+
end
|
16
|
+
|
17
|
+
def compute
|
18
|
+
(regular_forms + forms_with_suffix).sort_by(&:index) # quibuscum etc.
|
19
|
+
end
|
20
|
+
|
21
|
+
def init_keys
|
22
|
+
%i{ type inflection_class }
|
23
|
+
end
|
24
|
+
|
25
|
+
def default_args
|
26
|
+
{ inflection_class: @inflection_class }
|
27
|
+
end
|
28
|
+
|
29
|
+
def endings_lookup(ending, x)
|
30
|
+
if ending == "s" && is_or_idem
|
31
|
+
x.to_s =~ /^i?s$/
|
32
|
+
elsif ending == "ic"
|
33
|
+
x.to_s == "id"
|
34
|
+
else
|
35
|
+
super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
#quo quibus qua quibus quo quibus
|
39
|
+
INDICES_OF_CUM_WITH_QUI = [5, 11, 17, 23, 29, 35]
|
40
|
+
def forms_with_suffix
|
41
|
+
if @inflection_class == :qui
|
42
|
+
indices = INDICES_OF_CUM_WITH_QUI & @lookup_indices
|
43
|
+
indices.map { |i| [endings[i], i] }.map do |ending, i|
|
44
|
+
casus, numerus, sexus = casus_numerus_sexus_by_index(i)
|
45
|
+
ending = ending.to_s
|
46
|
+
new_form(ending: ending, casus: casus, numerus: numerus, sexus: sexus, index: i, suffix: "cum")
|
47
|
+
end.compact # for forms that don't make it through validation
|
48
|
+
else
|
49
|
+
[]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def corrections(args)
|
54
|
+
if @options[:ending] == "ic"
|
55
|
+
keep_given_value(args, :ending)
|
56
|
+
end
|
57
|
+
|
58
|
+
super
|
59
|
+
end
|
60
|
+
|
61
|
+
# Allows i and e stem for specific forms like ii/ei.
|
62
|
+
# If such a form is detected return the validation,
|
63
|
+
# in every other case use the default rule.
|
64
|
+
def validation_rule(args, validator)
|
65
|
+
if is_or_idem
|
66
|
+
case validator
|
67
|
+
when :stem
|
68
|
+
c, n, s = %i{ casus numerus sexus }.map { |k| args[k] }
|
69
|
+
|
70
|
+
if n == 2 && ((c == 1 && s == :m) || (c == 3 || c == 6))
|
71
|
+
val_values = [args[validator], @options[validator]]
|
72
|
+
if val_values.all? { |stem| stem =~ /^[ei]$/ }
|
73
|
+
keep_given_value(args, validator)
|
74
|
+
# also keep the ending to catch is, iis and eis
|
75
|
+
keep_given_value(args, :ending)
|
76
|
+
return true # to prevent the super call
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
super
|
83
|
+
end
|
84
|
+
|
85
|
+
def is_or_idem
|
86
|
+
@inflection_class == :is || @inflection_class == :idem
|
87
|
+
end
|
88
|
+
|
89
|
+
pt = {
|
90
|
+
demonstrative_pronoun: %i{ hic is idem iste ipse ille },
|
91
|
+
relative_pronoun: %i{ qui quicumque quisquis },
|
92
|
+
indefinite_pronoun: %i{ aliqui quilibet quivis quis aliquis
|
93
|
+
quisquam quisque quisque_s quidam quinam
|
94
|
+
unusquisque unusquisque_s uterque quispiam },
|
95
|
+
interrogative_pronoun: %i{ uter }
|
96
|
+
}
|
97
|
+
|
98
|
+
PRON_TYPE = pt.each_with_object({}) do |(type, infl_classes), h|
|
99
|
+
infl_classes.each { |infl_cl| h[infl_cl] = type }
|
100
|
+
end
|
101
|
+
|
102
|
+
def form_class
|
103
|
+
constant_by_type(PRON_TYPE[@inflection_class], namespace: LLT::Form)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module LLT
|
2
|
+
class SupinumBuilder < DeclinableBuilder
|
3
|
+
builds_with :modus
|
4
|
+
has_modus t.supinum
|
5
|
+
|
6
|
+
def index_of_ending(casus, numerus, sexus = nil)
|
7
|
+
case casus
|
8
|
+
when 3 then 0
|
9
|
+
when 4 then 1
|
10
|
+
when 6 then 2
|
11
|
+
end
|
12
|
+
end
|
13
|
+
alias :ioe :index_of_ending
|
14
|
+
|
15
|
+
def casus_numerus_sexus_by_index(index, sexus = nil)
|
16
|
+
case index
|
17
|
+
when 0 then [3, 1, :n]
|
18
|
+
when 1 then [4, 1, :n]
|
19
|
+
when 2 then [6, 1, :n]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module LLT
|
2
|
+
class VerbBuilder < FormBuilder
|
3
|
+
builds_with :impersonalium, :contraction, :prefix
|
4
|
+
|
5
|
+
form_class :verb
|
6
|
+
|
7
|
+
look_up :thematic, :extension
|
8
|
+
|
9
|
+
def persona_index
|
10
|
+
@impersonalium ? [nil, nil, 2] : [0, 1, 2]
|
11
|
+
end
|
12
|
+
|
13
|
+
def genus_index
|
14
|
+
@deponens ? [6] : [0, 6]
|
15
|
+
end
|
16
|
+
|
17
|
+
def regular_forms
|
18
|
+
endings.each_with_index.map do |ending, i|
|
19
|
+
next unless (@lookup_indices.include?(i) && ending) # nil values in verb endings are escaped
|
20
|
+
new_form_through_index(ending, i)
|
21
|
+
end.compact
|
22
|
+
end
|
23
|
+
|
24
|
+
def new_form_through_index(ending, i)
|
25
|
+
p, n, g, m, t = attributes_by_index(i)
|
26
|
+
new_form(ending: ending, persona: p, numerus: n, tempus: t, modus: m, genus: g, index: i)
|
27
|
+
end
|
28
|
+
|
29
|
+
def contraction
|
30
|
+
@options[:contraction]
|
31
|
+
end
|
32
|
+
|
33
|
+
def endings_namespace
|
34
|
+
super::Verb
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|