Добавляем фуригану к кандзи Python макросом для LibreOffice
Дамы и господа, план такой:
- всё, что вы хотели знать о японской письменности, но боялись спросить
- что такое ruby text
- как писать аддоны для LibreOffice на Python
- как сгенирировать чтение для канзи
- собираем всё это вместе в фуриганайзер!
В современном японском языке используются, в основном, три письменных системы.
Во-первых, это две слоговые азбуки: хирагана и катакана. Хирагана более округлая, выглядит примерно вот так: これはひらがなです и является как-бы основной азбукой.。 Катакана более угловатая (カタカナデス) и используется в основном для заимствованных слов, в целом же набор знаков хираганы и катаканы практически аналогичный. Дальше будем называть всё это просто «кана». «Слоговая азбука» значит, что вместо наших гласных и согласных «а», «б» и «в» — только целые слоги типа «ка», «са» и «то». Гласные, правда тоже есть, шесть штук («а», «и», «у», «э», «о») и только один согласный знак «н» в порядке исключения.
Именно поэтому японцам очень трудно выговаривать слова с подряд идущими согласными — они к такому просто не привыкли, но это нам сейчас не важно. Одной каной, в принципе, можно написать любую фразу на японском.
Еще одна система — это заимствованные из Китая иероглифы, которые мы будем дальше называть кандзи, потом что они так называются. После заимствования японские, да собсно и китайские тоже, кандзи существенно поменялись, и сейчас довольно таки различаются, хотя конечно, с другой стороны, во многом остались схожи. Скажем так, глядя на китайский текст японец может более-менее понять о чём там идёт речь. Кандзи выглядят примерно так: 友達、日本酒、世界。 Да, в японском — круглая точка.
Тут ключевой для понимания момент: японский и китайский языки на уровне грамматики вообще никак не родственные. Так что вот так вот просто взять китайские знаки и начать ими писать было не можно. Собственно с помощью кандзи можно писать отдельные слова, скорее даже основы слов, а для указания грамматических форм и связи слов между собой по-прежнему используется кана. Выглядит это примерно так: 送りがなはとっても便利です. Если присмотреться — видно что первый символ — кандзи, за ним идут несколько знаков каны и т.д. Таким трюком легко визуально отличить японский текст от китайского, которые выглядит графически более «плотным» т.к. там исключительно кандзи. Эта кана, которая прицепляется в кандзи для указания грамматической формы, называется «окуригана».
Вот, ну и наконец… Число кандзи довольно велико, и, если вы не робот — то запомнить все сложно. Если слово написано кандзи — то часто не очевидно как собс-но его читать, при том, что что в устной речи слово вполне могла встречаться и человек его знает. Чтобы помочь в такой ситуации, особенно для редких кандзи или когда текст предназначен для детей, иностранцев, или других умственно ограниченных категорий граждан — чтение кандзи подписывают сверху с помощью каны. Это и называется »фуригана». Выглядит как на картинке в начале поста.
Фух, переходим к следующему пункту.
Для добавления аннотации поверх текста используется так называемый ruby. К языку программирования отношения не имеет. Как я только что узнал из Википедии — по-русски называется «агат»
Поддержка руби есть в html с помощью тэга ruby:
текст
Но сейчас нас интересует LibreOffice. В ручном режиме добавить руби аннотацию к тексту можно через меню Format → Asian Phonetic Guide. Это несколько странно, ведь можно поле руби же не только для фонетики использовать, ну да фиг с ними. Если такого нет в меню — то можно попробовать добавить поддержку азиатских языков в Tools → Options → Language Settings.
Дальше, мы хотим это делать автоматически для выделенного текста. LibreOffice прекрасен тем, что в нём можно писать макросы на Python. Для этого должен стоять модуль libreoffice-script-provider-python (ставиться через apt-get), который по-умлочанию не стоит. Ах да, я всё делаю под Ubuntu, если у вас другая операционная система — то вы можете поделиться в комментариях рецептом для неё :)
Собственно макрос пишется как обычная функция на пайтоне. Документ виден через глобальную переменную с инстансом соответствующего класса и, собственно, в нём все нужные методы.
Вот простой пример:
def HelloWorldPython():
desktop = XSCRIPTCONTEXT.getDesktop()
model = desktop.getCurrentComponent()
if not hasattr(model, "Text"):
model = desktop.loadComponentFromURL("private:factory/swriter","_blank", 0, () )
text = model.Text
tRange = text.End
tRange.String = "Hello World (in Python)"
return None
g_exportedScripts = HelloWorldPython,
Сохраняем в файл, кладём его или делаем символьную ссылку в папку, в которой LibreOffice держит скрипты. В моём случае это »~/.config/libreoffice/4/user/Scripts/python».
Открываем LibreOffice Writer (OpenOffice тоже должен работать), идём в Tools → Macros → Run Macro и видим там наш скрипт, если всё получилось.
Осталось написать такой скрипт, который бы брал кандзи из документа и добавлял их чтения в руби соответствующих символов. Тут всё просто: для генерации чтения есть специальные программы, мы просто запустим их из нашего скрипта-макроса, через стандартный ввод-вывод прогоним японский текст и вставим аутпут в документ.
Программа под названием kakasi берёт японский текст и выдаёт чтение целым куском, но это не совсем то, что надо, т.к. хочется фрагменты фонетической подсказки распределить между ruby полями соответствующих симоволов. Для этого с помощью mecab можно токенизировать японский текст, а потому уже кормить его kakasi по частям. На самом деле точность генерации чтения от этого чуть-чуть ухудшается, но улучшается вёрстка документа. Какие-то огрехи можно потом поправить вручную.
Вот собсно и всё, ставим apt-get install kakasi, mecab,
идём в github.com/undertherain/furiganize, качаем оттуда корявый скрипт который я написал и который собс-но вот это всё проделывает. Кладём его в нужную папку и enjoy. Если кто-то поделиться опытом с другими операционными сиcтемами — будет вообще замечательно.