AngelinaReader icon indicating copy to clipboard operation
AngelinaReader copied to clipboard

Сделать и включить в интерфейс обратный конвертер (текст-брайль)

Open IlyaOvodov opened this issue 4 years ago • 6 comments

IlyaOvodov avatar Jan 26 '21 13:01 IlyaOvodov

Если будет необходимость, могу помочь с этим, а именно, со специфическими правилами Брайля. Возможно, стоит воспользоваться уже готовыми решениями типа Liblouis и просто сделать интерфейс между сайтом и транслятором?

Futyn-Maker avatar Feb 06 '21 12:02 Futyn-Maker

Спасибо! Именно LibLouis я и собирался использовать. Мне не удалось заставить его нормально переводить с брайля, но перевод в брайль там, вроде, работает. Так что вопрос чисто технический - подключить его к программе и встроить эту функцию в UI сайта. Если реализуете - будет здорово.

IlyaOvodov avatar Feb 07 '21 17:02 IlyaOvodov

Здравствуйте! К сожалению, пока не могу разобраться, как добавить это напрямую в ваш код, потому что раньше дело с серьёзными Python-проектами не имел, работая только по WEB-у (фронтенд). Поэтому пока просто опишу код, который, в принципе, можно использовать как функцию для перевода.

import louis
from textwrap import fill

def text2Braille(table, file, format='but', lineLength=0):
    tableList = ["en-us-brf.dis", table]
    out = ""
    lines = file.readlines()
    for line in lines:
        if format == 'brf':
            translation = louis.dotsToChar(tableList, louis.translateString(tableList, line, mode=louis.dotsIO|louis.ucBrl))
        else:
            translation = louis.translateString(tableList, line, mode=louis.dotsIO|louis.ucBrl)
        if lineLength != 0:
            translation = fill(translation, lineLength)
        out += translation
        if line != lines[-1]:
            out += "\n"
    file.close()
    return out

Здесь функция на вход получает файл, брайлевскую таблицу, формат выходного документа и длину брайлевской строки. Текст лучше переводить построчно, потому что иначе некоторые правила Liblouis не срабатывают (например, обработка прямой речи). По формату: я думаю, что целесообразно предоставлять пользователям выбор. Брайлевский текст может быть представлен в виде брайлевских Unicode символов (but), либо в виде Braille ASCII (файлы .brf). Этот формат поддерживают многие брайлевские дисплеи и принтеры, хотя наибольшее распространение, конечно, он получил в западных странах. Здесь я ввёл также параметр linelength, который позволяет отформатировать готовый брайлевский текст согласно определенной длине брайлевской строки (например, для маленьких брайлевских дисплеев или для вывода на бумагу). Возможно, стоит ввести какую-то более продвинутую систему и реализовать расстановку переносов, но этим я пока не занимался.

Для литературного (шеститочечного брайля) в последней версии Liblouis существуют две таблицы, они называются "ru-litbrl.ctb" и "ru-litbrl-detailed.utb". Отличие в том, что в "detailed" проставляются все признаки заглавных букв, в другой - только при смене алфавита, примерно как в учебниках. Это так же имеет смысл оставить на выбор пользователя.

Возможно, позже смогу сам добавить в код, но, наверное, у вас получится лучше и быстрее :)

Андрей

Futyn-Maker avatar Feb 09 '21 08:02 Futyn-Maker

@Futyn-Maker, да, спасибо. При прямом переводе, действительно, самое сложное - добавить функцию в интерфейс, но и это не сложно. Интерфейс сейчас меняем, так что лучше делать, когда уже будет новый. Вопрос: можете подсказать, есть ли готовые функции по формированию Braille ASCII ?

IlyaOvodov avatar Feb 09 '21 09:02 IlyaOvodov

Вопрос: можете подсказать, есть ли готовые функции по формированию Braille ASCII ?

Я сначало делаю брайлевский Unicode, потом перевожу в Braille ASCII с помощью louis.dotsToChar(["en-us-brf.dis", text) Таблица "en-us-brf.dis" как раз содержит соответствие символам ASCII точечных шаблонов.

Futyn-Maker avatar Feb 09 '21 09:02 Futyn-Maker

На всякий случай, чуть подробнее о функциях louis.translateString(tableList, line, mode=MODE) - переводит строку текста в Брайль. tableList - массив с таблицами Брайля, можно указать несколько, если текст, например, мультиязычный. Но я не рекомендую так делать без необходимости. Чтобы на выходе получался брайлевский Unicode, в аргументе mode должно быть louis.dotsIO|louis.ucBrl. louis.dotsToChar(tableList, line) - переводит точечные символы в любое другое представление Брайля в компьютере. В своё время было изобретено много форматов для разных стран, но самый популярный - Braille ASCII. Чтобы переводить в Braille ASCII, в TableList здесь как раз нужна таблица "en-us-brf.dis"

Futyn-Maker avatar Feb 09 '21 12:02 Futyn-Maker