ika_bot/lib/verb.rb

186 lines
4.1 KiB
Ruby
Raw Normal View History

2025-08-16 07:21:11 -04:00
U_VOWEL_CHANGES = {
"" => { "a" => "", "i" => "", "u" => "", "e" => "", "o" => "" },
"" => { "a" => "", "i" => "", "u" => "", "e" => "", "o" => "" },
"" => { "a" => "", "i" => "", "u" => "", "e" => "", "o" => "" },
"" => { "a" => "", "i" => "", "u" => "", "e" => "", "o" => "" },
"" => { "a" => "", "i" => "", "u" => "", "e" => "", "o" => "" },
"" => { "a" => "", "i" => "", "u" => "", "e" => "", "o" => "" },
"" => { "a" => "", "i" => "", "u" => "", "e" => "", "o" => "" },
2025-08-16 06:58:26 -04:00
"" => { "a" => "", "i" => "", "u" => "", "e" => "", "o" => "" },
2025-08-16 07:21:11 -04:00
"" => { "a" => "", "i" => "", "u" => "", "e" => "", "o" => "" },
2025-08-16 06:58:26 -04:00
}
2025-08-16 09:22:23 -04:00
TE_TA_DE_DA = {
"" => "", "" => ""
}
2025-08-16 06:58:26 -04:00
class KanaKanji
attr_reader :kana, :kanji
def initialize(kana, kanji=nil)
@kana = kana
@kanji = kanji || kana
end
def [] (index)
self.class.new kana[index], kanji[index]
end
def + (other)
self.class.new kana + other, kanji + other
end
2025-08-16 07:21:11 -04:00
def last_character(new_form=nil)
return kana[-1] unless new_form
U_VOWEL_CHANGES[kana[-1]][new_form]
2025-08-16 06:58:26 -04:00
end
def all_but_last_character
self.class.new kana[0...-1], kanji[0...-1]
end
end
class Verb
2025-08-16 09:39:37 -04:00
attr_reader :dict_kanji, :dict_kana, :definition, :dict
2025-08-16 06:58:26 -04:00
2025-08-16 09:39:37 -04:00
def initialize(dict_kanji, dict_kana, definition)
2025-08-16 06:58:26 -04:00
@dict_kanji = dict_kanji || dict_kana
@dict_kana = dict_kana
@dict = KanaKanji.new dict_kana, dict_kanji
2025-08-16 09:39:37 -04:00
@definition = definition
2025-08-16 06:58:26 -04:00
end
2025-08-16 07:21:11 -04:00
def last_character(new_form=nil)
dict.last_character(new_form)
2025-08-16 06:58:26 -04:00
end
def all_but_last_character
dict.all_but_last_character
end
def ve
VerbExpression
end
def dictionary
dict
end
2025-08-16 08:50:56 -04:00
2025-08-16 09:08:45 -04:00
def long_form_present_positive
stem + "ます"
end
def long_form_present_negative
stem + "ません"
end
2025-08-16 09:22:23 -04:00
def long_form_past_positive
stem + "ました"
end
def long_form_past_negative
long_form_present_negative + "でした"
end
2025-08-16 08:50:56 -04:00
def short_form_present_positive
dictionary
end
2025-08-16 09:22:23 -04:00
def short_form_past_positive
te.all_but_last_character + TE_TA_DE_DA[te.last_character]
end
def short_form_past_negative
short_form_present_negative.all_but_last_character + "かった"
end
2025-08-16 09:24:52 -04:00
def desire
stem + "たい"
end
2025-08-16 09:39:37 -04:00
def potential
IchidanVerb.new(potential_starter.kanji, potential_starter.kana, "to be able #{definition}")
end
2025-08-16 06:58:26 -04:00
end
class IchidanVerb < Verb
2025-08-16 09:08:45 -04:00
def stem
all_but_last_character
2025-08-16 08:45:52 -04:00
end
2025-08-16 08:50:56 -04:00
def short_form_present_negative
all_but_last_character + "ない"
end
2025-08-16 07:21:11 -04:00
def te
all_but_last_character + ""
end
2025-08-16 09:39:37 -04:00
def potential_starter
stem + "られる"
end
2025-08-16 06:58:26 -04:00
end
class GodanVerb < Verb
2025-08-16 09:08:45 -04:00
def iku?
dict.kanji == "行く"
2025-08-16 07:21:11 -04:00
end
2025-08-16 09:08:45 -04:00
def stem
all_but_last_character + last_character("i")
2025-08-16 08:45:52 -04:00
end
2025-08-16 08:50:56 -04:00
def short_form_present_negative
all_but_last_character + last_character("a") + "ない"
end
2025-08-16 09:39:37 -04:00
def potential_starter
all_but_last_character + last_character("e") + ""
end
2025-08-16 07:21:11 -04:00
def te
2025-08-16 09:08:45 -04:00
all_but_last_character + case last_character
when ""
"って"
when ""
"って"
when ""
"って"
when ""
"して"
when ""
iku? ? "って" : "いて"
when ""
"いで"
when ""
"んで"
when ""
"んで"
when ""
"んで"
end
2025-08-16 06:58:26 -04:00
end
end
class SuruVerb < Verb
2025-08-16 07:21:11 -04:00
def prefix
dict[..-3]
end
2025-08-16 09:08:45 -04:00
def stem
prefix + ""
2025-08-16 08:45:52 -04:00
end
2025-08-16 08:50:56 -04:00
def short_form_present_negative
prefix + "しない"
end
2025-08-16 08:45:52 -04:00
2025-08-16 07:21:11 -04:00
def te
prefix + "して"
2025-08-16 06:58:26 -04:00
end
2025-08-16 09:39:37 -04:00
def potential_starter
prefix + "できる"
end
2025-08-16 06:58:26 -04:00
end