Меню сайта
Категории раздела
Мои статьи [6]
Модули Цитаты [0]
Загрузка модулей Цитаты
Форма входа
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Мои статьи

Нововведения
Одним из слабых мест "Цитаты" является сравнение библейских текстов: вы можете выбрать только одну "параллельную" Библию, и если повезет, она будет отображаться дополнительным столбцом. Другие, "импортные" программы способны на большее. Код, генерирющий текст главы, изначально был итальянским(спагетти), и мои заплатки, латающие в нем дыры, не сделали его лучше.

Размышяя над тем, что нужно для добавления нового механизма сравнения текстов Св. Писания, я, прежде всего думал, "а как выбирать" эти модули? Многим нравится сделанное мною окошко "Моя библиотека", и поддержка Тегов/Категорий, так что модули уже как-то умели у меня группироваться. Но категории выставляются создателем модуля, а нужен был механизм, доступных каждому пользователю. Так появились "Группы".
Чтобы сравнить несколько тестов Библии, можно выбрать Группу. Цитата сама выберет из модулей,в ней содержащихся те, что имеют нужный отрывок.
Что же до групп, то можно создать несколько именованных групп, вставлять(перетаскиванием), удалять(щелчком на круглой кнопке "-") модули, менять перетаскиванием их порядок(автоматически они не сортируются), перетаскивать модуль из одной групы в другую.
Мне пришлось перелопатить половину, если не большую часть кода "Библиотеки", чтобы это заработало. Но вчерне это уже работает. Хотелось бы , чтобы принадлежность к группам была видна и в главном списке, но пока оставил это занятие. Во всяком случае, вы не сможете добавить в одну группу два одинаковых модуля. Сохранение групп уже тоже работает, но там есть еще шероховатости.
Другой задачей было решить, как будут выглядеть это сравнение? Некоторые программы используют столбцы. Но реально, больше 3-4 модулей на экране не сможет поместиться. Другие программы текст вариантов стиха выдают списком, и это неплохой вариант. Только уж совсем спартанский. Самому мне хотелась плитка: чтобы стихи были помещены на разноцветных подлжках в несколько( но не много, два или три) стобцов.

Но понятно, как бы я не сделал, нашлись бы такие, которые сказали бы "арргх! Не, не то. Вот в программе X, там ваще клево все, а тут - кисло". Можно, конечно было реализовать все варианты, но, во-первых, я боялся, что нужный для это код будет не лучше прежнего "итальянского". А во-вторых гибкости угодить всем все равно бы не хватило.
Тут я вспомнил про шаблоны. Ну, это уже пытались и я, и до меня реализовать в Цитате. Руки не доходили. Суть такова: где нибудь в папке настроек Цитаты лежит шаблонная страница, так, что при генерации главы Цитата берет ее и запихивает в специально обозначенные места текст стихов. Пусть это и никогда не было доведено до конца для обычного режима(потому что трудно, и при этом не очень важно), для сравнения Библий это вариант показался мне единственно правильным. Мы будем строить шаблонизатор.

Для понимания, что произошло дальше, нужно пояснить: я склонен к рекурсии. Я не ищу простых путей, напротив, склонен использовать наилучшие, трудные, те, что бросают вызов.
Шаблонизатор - это работа со строками: у тебя есть шаблон, ты читаешь его строка за строкой, находишь и наполняешь обозначенные места нужным содержимым(название книги, номер стиха, сам стих) Чем более гибок шаблон, тем он более сложен и требователен к механизму-шаблонизатору. А значит, работа со строками усложняется.

Я не хотел этой рутины, и решил упростить себе задачу, используя библиотеку регулярных выражений. После некоторых исследований, поскольку нужна была не абы какая, а мощная, с поддержкой юникода, и при этом стабильная(чтобы не копаться, исправляя чужие ошибки) библиотека, выбор пал на PCRE.

Трудность была в том, что поддержка юникода появилась в ней недавно, так что мне хотелось включить в Цитату самую последнюю, и, надеюсь, наиболее отлаженную версию (для справки, это 8.34). А стало быть компилировать ее вручную(ибо я хотел интегрировать ее в тело исполняемого файла) старичком C++ Builder(тут отдельная эпопея, поскольку нет для него волшебного make-файла). Вдобавок, даже собрав движок с поддержкой UTF-16 и Unicode Properies(что бы PCRE мог отличать, например , букву кириллицы от буквы латинницы, это может пригодиться), я оказался перед фактом, что не существует для старой версии Delphi, компилятора самой Цитаты, юникодной обертки PCRE. А она нужна, PCRE - это голый C(да,без крестов), необъектный. Такая скомпилируется и под тостер, но для прикладного прораммиста - по нашим временам дикость. К счастью нашелся код для новых, чисто юникодных Дельфей, который был мной перетолмачен под нашу старушку. Работа пошла.

Однако, по мере того, как шаблонизатор из идей в голове перетекал в программный код, мне становилось все более очевидно, что, если для чего-то простого, вроде отображения главы, такой подстановочный шаблонизатор и годится, для сравнения стихов Писания с различными вариантами отображения, гибкости не хватает. Шаблон должен быть "умным", а стало быть, он не может быть статичным.Ergo, раз в самом шаблоне должен быть код, то где-то должен найтись и интерпретатор.

Честно, берясь за работу, не думал я, что все так повернется.
Следующим моим шагом было найти интерпретатор. И вновь старая Delphi не оставила мне широты выбора. Для современных — вот тебе и dwScript, с пылу-жару svn, и Pascal Script. А я немодный. Цитата написана на старенькой Delphi, и ее код нельзя вот так просто перенести на современные, юникодные версии. Слишком много костылей мы изобрели. Скрепя сердце, из sourceforge(который, в отличие от гитхаба и гуглокода, лично у меня ассоциируется как раз с кладбищем заброшенного опенсорса) была извлечен прототип dwscript 2002 года выделки. Эта наиболее "свежая" версия, которая подходила для используемой Delphi. После нескольких дней тестов и правок, мне удалось вчерне внедрить скриптовую поддержку в заготовку шаблонизатора.
Если интересно, вот порождающий картинку справа шаблон:

К сожалению, очень многое еще нужно сделать: поддержку шрифтов для каждого модуля в сравнении, нужно еще подружить остальной код Ц. с новым способом отображения. В На шаблонизаторе еще есть узкие места(баги). Будем надеятся, что у нас все получится.

Алексадр Снигерев, 2014

Категория: Мои статьи | Добавил: AlekId (25.01.2014)
Просмотров: 1183 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]