Добавляем фуригану к кандзи Python макросом для LibreOffice

Дамы и господа, план такой:

  • всё, что вы хотели знать о японской письменности, но боялись спросить
  • что такое ruby text
  • как писать аддоны для LibreOffice на Python
  • как сгенирировать чтение для канзи
  • собираем всё это вместе в фуриганайзер!


cc524f513715442397b9e3abaff3612f.png


В современном японском языке используются, в основном, три письменных системы.

Во-первых, это две слоговые азбуки: хирагана и катакана. Хирагана более округлая, выглядит примерно вот так: これはひらがなです и является как-бы основной азбукой.。 Катакана более угловатая (カタカナデス) и используется в основном для заимствованных слов, в целом же набор знаков хираганы и катаканы практически аналогичный. Дальше будем называть всё это просто «кана». «Слоговая азбука» значит, что вместо наших гласных и согласных «а», «б» и «в» — только целые слоги типа «ка», «са» и «то». Гласные, правда тоже есть, шесть штук («а», «и», «у», «э», «о») и только один согласный знак «н» в порядке исключения.

Именно поэтому японцам очень трудно выговаривать слова с подряд идущими согласными — они к такому просто не привыкли, но это нам сейчас не важно. Одной каной, в принципе, можно написать любую фразу на японском.

Еще одна система — это заимствованные из Китая иероглифы, которые мы будем дальше называть кандзи, потом что они так называются. После заимствования японские, да собсно и китайские тоже, кандзи существенно поменялись, и сейчас довольно таки различаются, хотя конечно, с другой стороны, во многом остались схожи. Скажем так, глядя на китайский текст японец может более-менее понять о чём там идёт речь. Кандзи выглядят примерно так: 友達、日本酒、世界。 Да, в японском — круглая точка.

Тут ключевой для понимания момент: японский и китайский языки на уровне грамматики вообще никак не родственные. Так что вот так вот просто взять китайские знаки и начать ими писать было не можно. Собственно с помощью кандзи можно писать отдельные слова, скорее даже основы слов, а для указания грамматических форм и связи слов между собой по-прежнему используется кана. Выглядит это примерно так:  送りがなはとっても便利です. Если присмотреться — видно что первый символ — кандзи, за ним идут несколько знаков каны и т.д. Таким трюком легко визуально отличить японский текст от китайского, которые выглядит графически более «плотным» т.к. там исключительно кандзи. Эта кана, которая прицепляется в кандзи для указания грамматической формы, называется «окуригана».

Вот, ну и наконец… Число кандзи довольно велико, и, если вы не робот — то запомнить все сложно. Если слово написано кандзи — то часто не очевидно как собс-но его читать, при том, что что в устной речи слово вполне могла встречаться и человек его знает. Чтобы помочь в такой ситуации, особенно для редких кандзи или когда текст предназначен для детей, иностранцев, или других умственно ограниченных категорий граждан — чтение кандзи подписывают сверху с помощью каны. Это и называется »фуригана». Выглядит как на картинке в начале поста.

Фух, переходим к следующему пункту.

Для добавления аннотации поверх текста используется так называемый 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темами — будет вообще замечательно.

© Geektimes