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

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




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

Во-первых, это две слоговые азбуки: хирагана и катакана. Хирагана более округлая, выглядит примерно вот так: ????????? и является как-бы основной азбукой.??Катакана более угловатая (??????) и используется в основном для заимствованных слов, в целом же набор знаков хираганы и катаканы практически аналогичный. Дальше будем называть всё это просто “кана”. “Слоговая азбука” значит, что вместо наших гласных и согласных “а”, “б” и “в” — только целые слоги типа “ка”, “са” и “то”. Гласные, правда тоже есть, шесть штук (“а”, “и”, “у”, “э“, “о”) и только один согласный знак “н” в порядке исключения.

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

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

Тут ключевой для понимания момент: японский и китайский языки на уровне грамматики вообще никак не родственные. Так что вот так вот просто взять китайские знаки и начать ими писать было не можно. Собственно с помощью кандзи можно писать отдельные слова, скорее даже основы слов, а для указания грамматических форм и связи слов между собой по-прежнему используется кана. Выглядит это примерно так:??????????????. Если присмотреться — видно что первый символ — кандзи, за ним идут несколько знаков каны и т.д. Таким трюком легко визуально отличить японский текст от китайского, которые выглядит графически более “плотным” т.к. там исключительно кандзи. Эта кана, которая прицепляется в кандзи для указания грамматической формы, называется “окуригана”.

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

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

Для добавления аннотации поверх текста используется так называемый ruby. К языку программирования отношения не имеет. Как я только что узнал из Википедии — по-русски называется “агат”

Поддержка руби есть в html с помощью тэга ruby:
<ruby>
 текст
 <rt>аннотация</rt>
</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темами — будет вообще замечательно.
Поделиться с друзьями
-->

Комментарии (21)


  1. Vitaminka
    18.06.2016 12:47
    +22

    Кодил на Питоне…
    Под весенней сакурой
    фуриганайзер


  1. Bhudh
    18.06.2016 14:47
    +1

    | Каной, в принципе, можно написать всё. Давным-давно, собсвенно, так и делали. Пока в один прекрасный день не захотели чего-нить позатейливей и не позаимтсвовали из Китая иероглифы, которые мы будем дальше называть кандзи, потом что они так называются.
    А теперь идём в Википедию и узнаём правду: «The first kana was a system called man'yogana, a set of kanji used solely for their phonetic values, much as Chinese uses characters for their phonetic values in foreign loanwords (especially proper nouns) today. Man'yoshu (???), a poetry anthology assembled in 759, is written in this early script. Hiragana developed as a distinct script from cursive man'yogana, whereas katakana developed from abbreviated parts of regular script man'yogana as a glossing system to add readings or explanations to Buddhist sutras.».
    Да и вообще, не увидеть в кане упрощённые скорописью иероглифы это надо каким-то особенным зрением обладать.


    1. blackbird
      18.06.2016 15:19

      Чтобы увидеть в кане упрощенные канзи — мне кажется нужно как минимум посмотреть пару примеров с последовательным упрощением последних в специальной книжке.

      Кана действительно произошла из китайских иероглифов, причём довольно давно, в V-VII веках — и стала доступной широким массам формой письменности. Посмотрите на один из ранних литературных памятников, повесть о Гэндзи ( X-XI) — написана каной. Да, женщиной, но от мужчин одни сутры остались. Кандзи использовались для сутр и подобного, простые люди пользовались каной, в моём наивном представлении. До языковых реформ которые установили смешанную форму письменности. Еще раз, что я сказал: одной каной можно написать любую фразу на японском — верно, сейчас используется смешанный скрипт с каной и производными от китайских иероглифов — верно.

      Действительно я неаккуратно выразился в том смысле что переход на кандзи — это не изначальное заимствование оных из китайского. Спасибо что донесли правду ;)


      1. Bhudh
        18.06.2016 19:47

        Ну, думаю, если показать японский текст человеку, который до того с японским делом не имел, он не станет разбираться и сходу назовёт всё «иероглифами». Даже если там не будет ни одного кандзи. :)
        А последовательное упрощение нужно далеко не для всех. Скажем, ? в ? (который часто пишется слитно) или ? в ?, можно сказать, напрямую при быстром письме переходят.


  1. ARD8S
    18.06.2016 16:51

    ОК, полезная вещь. А скрипт не будет путать он-ёми и кун-ёми? Как дело с этим обстоит в случае с идущими подряд канджи?


    1. blackbird
      19.06.2016 08:37

      В основном корректно работает. ?[??]?[??]???.?[??]???.
      Оно же не отдельные кандзи «озвучивает» — mecab разбивает на «слова», kakasi видит что пришла группа кандзи и берёт китайское чтение в этом случае. Неточности возникают, когда следующее слово должно было бы, например, чуть-чуть изменить озвучкку согласного в предыдущем.


      1. ARD8S
        19.06.2016 16:42

        Неточности с рендаку?


  1. DenerKup
    18.06.2016 21:37
    +1

    Я конечно понимаю, что статья про японский, но обилие слов паразитов типа «собсно» и каких-то очевидных опечаток типа «начать ими писать было не можно» затрудняет чтение. Да и манера изложения со всякими «Фух», «Ну и наконец» создает впечатление будто вы статью из-под палки пишете (ИМХО).


    1. dbanet
      19.06.2016 10:07

      Отнюдь. Как будто последнее дыхание мёртвого хабра.


    1. blackbird
      19.06.2016 18:07

      Хм, мне скорее казалось неловким такой длинный текст на читателя вываливать, так что я добавил пару «ну и наконец» в этом смысле. Впрочем на обладание литературным талантом я совсем не претендую, да и по-русски, по большому счёту, не писал и не говорил уже лет шесть :)
      Ну и в каком-то смысле может быть из-под палки — всё руки не доходили, пока не сказал «сколько ж можно уже»


  1. argentumbolo
    19.06.2016 08:19

    Простите за критику, но было бы неплохо, если бы вы ознакомились с PEP8 (https://www.python.org/dev/peps/pep-0008/).
    В текущем виде код местами практически не читаем.
    Вам самому будет намного легче разбираться в нём, если оформление будет пусть даже и не строго по PEP8, но хотя бы единообразно.


    1. blackbird
      19.06.2016 08:25

      Нет мне прощенья, как говорят японцы.
      На самом деле код на 90 процентов скопирован «с миру по нитке», взаимодействие с консольным софтом — в основном с Anki, например.
      Будем время — попробую немного его причесать.


      1. argentumbolo
        19.06.2016 14:30

        Создал пулл реквест.
        Впринципе можно убрать множество продублированного кода, организовав наследование.
        Но я бесконечно далёк от темы и боюсь не смогу протестировать изменения)


        1. blackbird
          19.06.2016 17:39

          в аду для перфекционистов
          ни серы нету ни огня
          а лишь слегка несимметрично
          стоят щербатые котлы

          я смотрю что вы поменяли в своём форке — пробелы вокруг операторов в основном. Вот если честно, ни разу они мне не помешали понимать код, который кстати написал не я — это фрагменты как раз в основном из Anki (очень, кстати, замечательной и популярной софтины) — прикрутил к макросу и забыл благополучно :)

          В любом случае большое спасибо за труд, я бы с радостью принял ваш pull request, но вы его отправили себе же в своём репозитории…


          1. blackbird
            19.06.2016 17:56

            Ладно, я прогнал сам через autopep8 — эффект тот же. И закоммитил, так что в принципе не актуально. Спасибо еще раз!


          1. argentumbolo
            19.06.2016 18:42

            Упс… А вот с гитхабом пока дружу не сильно, больше с геритом) Что там нужно было делать, что бы отправить пул реквест вам, а не себе?

            Это не сколько перфекционизм, сколько профессиональная деформация.
            Когда бегло смотрю на:
            res= str(self.kakasi.stdout.readline(), «sjis»).rstrip('\r\n')

            Воображение услужливо дорисовывает:
            def res= str… # < — начало объявления метода-сеттера в Ruby.

            Прошу прощения за излишние придирки)


            1. blackbird
              19.06.2016 18:59

              ну я с Ruby не знаком :)

              Вы на гитхабе сдели бранч у себя, поэтому он вам по-умолчанию предложил, вероятно, мёрджить (grammar-nazi меня расстреляют точно за количество запретных слов в этом предложении ><) в ваш master, а там же рядом была по-идее ссылка «compare across forks» после которой можно было бы выбрать из какого форка (вашего) в какой (в мой)

              может быть если нажимать pull reqeust в моём репозитории — то будут другие умлочания, не уверен…

              p.s.
              пойду остальные проекты по-autopep8-лю…


  1. blackbird
    19.06.2016 08:24

    Нет мне прощенья, как говорят японцы.
    На самом деле код на 90 процентов скопирован «с миру по нитке», взаимодействие с консольным софтом — в основном с Anki, например.
    Будем время — попробую немного его причесать.


  1. CrashLogger
    19.06.2016 22:19

    Это офигенно! Хочу плагин к браузеру, который делает тоже самое.


    1. blackbird
      19.06.2016 22:23

      для браузера (у меня в фаерфоксе и thunderbird-е стоит) есть rikaichan — делает даже больше, в смысле показывает перевод. Я собственно так японский в-основном и читаю: незнакомые кандзи можно посмотреть быстро, наложить на свои знания общей грамматики и быстро всё понять. Для сравнения гугл-транслейтом была бы полная каша.


    1. Keroro
      20.06.2016 08:27

      Давно же есть. IPA furigana для Хрома, Furigana Inserter для Лисы