Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 21, 2016 01:13:04

Romul81
Зарегистрирован: 2016-01-20
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

pyglossary - интеграция новых функций.

Приветствую всех!

Первый пост - пришёл за помощью несколько из другой области. Любительски занимаюсь словарями. Не программист, но более или менее имею представление об AutoIt, VBA и общих принципах программирования. Неплохо знаю регулярные выражения. Суть проблемы:

Наверное, большинство знает что такое язык разметки Lingvo DSL от ABBYY (вероятно, учили инглиш с помощью словарей в этом формате). На данный момент большинство любительских словарей как и оцифровка печатных делается именно в нём (см. ру-боард). По сути формат является сырцом-исходником для компиляции во всевозможные другие форматы под различные программы/платформы. Одним из самых универсальных конвертеров является pyglossary, написанный на Python 2.7. Но с DSL он работает криво. Точнее неполноценно.

Проблема 1. Сам формат DSL, хоть и похож на BBCode, имеет специфические особенности. Он допускает “ill-nested” теги, что является основным препятствием для корректного конвертирования (в html, к примеру). Здесь скрипт на Perl, решающий эту проблему (там же и примеры для наглядности). Но он сортирует теги только внутри группы без пробелов, тогда как могут существовать и такие ситуации:

    #fix unclosed tags like [b]...[c]...[/b]...[/c]
#change it to [b]...[c]...[/c][/b][c]...[/c]
Данная секция из dsl.py самого pyglossary, который, по идее, должен с этим сам справляться. Есть ещё модуль Normalizer на Ruby 2.0 и normalize_tags.cpp для dsl_parser.cpp проекта xdxf_makedict (C++). Все они нацелены на решение именно этой проблемы.

Проблема 2. Чистка заголовков. В pyglossary она отсутствует, отсюда артефакты и битый индекс. Одним из наилучших примеров конвертирования DSL в другой формат (в данном случае в Apple Dictionary) является DSLConverter (Python 3.x). Данная проблема решена так:
            gEntryHeader = re.sub('[{}]', '', thisString) # this one shows up as an entry header
            gEntryHeader = re.sub('(\s+?)\)', ') ', gEntryHeader)
            gEntryHeader = re.sub('\((\s+?)', ' (', gEntryHeader)                       
            gEntryHeader = re.sub(' \]', '] ', gEntryHeader)
            gEntryHeader = re.sub('\[ ', ' [', gEntryHeader)
                        
            gEntryTitle = re.sub('{(.*?)}', '', thisString) # this one is the value displayed in window header and search list
            gEntryTitle = re.sub('^\.\.\.', '', gEntryTitle)

Проблема 3. Внедрение аббревиатур из файла *_abbr.dsl. Реализовано только в конвертере DSLConverter от svintuss.

Проблема 4. Сами теги HTML на выходе. Везде они разные. В идеале лучше ничего безвозвратно не удалять, а добавлять как Class к span-ам (чтоб потом можно было навесить CSS). Аббревиатуры (расшифровки) можно как title к ним же. Есть ещё один конвертер в html - pyDSL2HTM.py. Нет ни нормализации, ни аббревиатур.

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

Надеюсь на помощь и заранее благодарю.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version