from cardbuilder.common import Fieldname, Language
from cardbuilder.common.util import log
from cardbuilder.exceptions import CardBuilderUsageException
from cardbuilder.lookup.blank import Blank
from cardbuilder.lookup.en import MerriamWebster, WordFrequency
from cardbuilder.lookup.en.merriam_webster import ScrapingMerriamWebster
from cardbuilder.lookup.en_to_ja.eijiro import Eijiro
from cardbuilder.lookup.en_to_ja.ejdict_hand import EJDictHand
from cardbuilder.lookup.tatoeba import TatoebaExampleSentences
from cardbuilder.lookup.value import SingleValue
from cardbuilder.resolution.anki import AnkiAudioDownloadPrinter
from cardbuilder.resolution.field import Field
from cardbuilder.resolution.instantiable import instantiable_resolvers
from cardbuilder.resolution.printer import ListValuePrinter, MultiListValuePrinter, TatoebaPrinter, \
DownloadPrinter, FirstValuePrinter
from cardbuilder.scripts.helpers import build_parser_with_common_args, get_args_and_input_from_parser, \
log_failed_resolutions, anki_card_html, anki_css
from cardbuilder.scripts.router import command
[docs]@command('en_to_ja')
def main():
"""
英単語をもとに日本語で暗記カードを生成するCardbuilderのコマンドです。
使用可能な引数:
--input 暗記カードを生成する英単語のリスト。テキストファイルでもWordList名でも良い
--output (任意) 出力するファイル名(拡張子なし)
--output_format (任意)出力するデータ形式。CSVやAnkiなど色々あるが、デフォルトではAnkiになる
--start (任意) 入力から処理する最初の単語を定義する整数(5なら5語目以上のみ処理される)
--stop (任意) 入力から処理する最後の単語を定義する整数(5なら5語目以下のみ処理される)
--eijiro_location (任意)英辞郎のテキストファイルの位置(提供すると英辞郎の定義分が使われる)
--learner_key (任意)Merriam-Webster Learner's DictionaryのAPIキー(廃止予定)
--thesaurus_key (任意)Merriam-Webster Collegiate ThesaurusのAPIキー(廃止予定)
このコマンドはmerriam-webster.comから英単語に関する情報を読み込むため、実行するにはインターネット接続が必要です。
使用例: ``cardbuilder en_to_ja --eijiro_location eijiro-1448.txt --input eng_cards.txt``
"""
parser = build_parser_with_common_args()
parser.add_argument('--learner_key', help="Location of a text file containing a Merriam-Webster's Learner's"
" Dictionary api key")
parser.add_argument('--thesaurus_key', help="Location of a text file containing a Merriam-Webster's Collegiate "
"Thesaurus api key")
parser.add_argument('--eijiro_location', help="The location of a dictionary containing the Eijiro data. If present,"
"Eijiro will be used instead of EJDictHand")
args, input_words = get_args_and_input_from_parser(parser, Language.ENGLISH)
try:
mw = MerriamWebster(args.learner_key, args.thesaurus_key)
log(None, 'Using Merriam Webster API keys')
except CardBuilderUsageException:
mw = ScrapingMerriamWebster()
log(None, 'Using scraping Merriam Webster')
if args.eijiro_location is not None:
log(None, 'Using Eijiro as dictionary from {}'.format(args.eijiro_location))
jp_dictionary = Eijiro(args.eijiro_location)
jp_def_printer = MultiListValuePrinter(list_printer=ListValuePrinter(number_format_string='{number} .',
join_string='\n'))
else:
try:
jp_dictionary = Eijiro()
log(None, 'Using previously loaded Eijiro content as dictionary')
jp_def_printer = MultiListValuePrinter(list_printer=ListValuePrinter(number_format_string='{number} .',
join_string='\n'))
except FileNotFoundError:
jp_dictionary = EJDictHand()
log(None, 'Eijiro location not provided and no previously loaded content found: falling back to EJDictHand')
jp_def_printer = ListValuePrinter(number_format_string='{number} .', join_string='\n')
tatoeba = TatoebaExampleSentences(Language.ENGLISH, Language.JAPANESE)
wf = WordFrequency()
def word_freq_sort_key(value: SingleValue) -> int:
return -wf[value.get_data()]
eng_def_printer = MultiListValuePrinter(
list_printer=ListValuePrinter(max_length=2, number_format_string='{number}. ', join_string='\n'),
max_length=1,
)
# max_length=1 combined with print_lone_header=False effectively prints only the content of the first list
related_words_printer = MultiListValuePrinter(list_printer=ListValuePrinter(sort_key=word_freq_sort_key),
print_lone_header=False, max_length=1)
tatoeba_printer = TatoebaPrinter()
if args.output_format == 'anki':
audio_printer = AnkiAudioDownloadPrinter()
else:
audio_directory = args.output+'_audio'
audio_printer = DownloadPrinter(audio_directory)
blank = Blank()
ipa_field_name = '国際音声記号'
infl_field_name = '活用形'
eng_def_field_name = '英語での定義'
fields = [
Field(jp_dictionary, Fieldname.WORD, '英単語'),
Field(mw, Fieldname.PRONUNCIATION_IPA, ipa_field_name, printer=FirstValuePrinter()) if isinstance(mw, MerriamWebster)
else Field(blank, Fieldname.BLANK, ipa_field_name),
Field([mw, jp_dictionary], Fieldname.INFLECTIONS, infl_field_name, printer=related_words_printer) if isinstance(jp_dictionary, Eijiro)
else Field(blank, Fieldname.BLANK, infl_field_name),
Field(mw, Fieldname.AUDIO, '音声', printer=audio_printer),
Field(mw, Fieldname.DEFINITIONS, eng_def_field_name, printer=eng_def_printer) if isinstance(mw, MerriamWebster)
else Field(blank, Fieldname.BLANK, eng_def_field_name),
Field(jp_dictionary, Fieldname.DEFINITIONS, '日本語での定義', printer=jp_def_printer, required=True),
Field(mw, Fieldname.SYNONYMS, '類義語', printer=related_words_printer),
Field(mw, Fieldname.ANTONYMS, '対義語', printer=related_words_printer),
Field(tatoeba, Fieldname.EXAMPLE_SENTENCES, '例文', printer=tatoeba_printer)
]
resolver = instantiable_resolvers[args.output_format](fields)
if args.output_format == 'anki':
resolver.set_note_data(args.output,
[{'name': '英語->日本語', 'qfmt': anki_card_html('en_to_ja', 'word_card_front'),
'afmt': anki_card_html('en_to_ja', 'word_card_back')},
{'name': '日本語->英語', 'qfmt': anki_card_html('en_to_ja', 'def_card_front'),
'afmt': anki_card_html('en_to_ja', 'def_card_back')}], css=anki_css())
failed_resolutions = resolver.resolve_to_file(input_words, args.output)
log_failed_resolutions(failed_resolutions)
if args.output_format == 'csv':
log(None, 'Audio data saved to {}'.format(audio_directory))
if __name__ == '__main__':
main()