Требованиe: пользователи\бизнес желают иметь библиотеку пунктов (параграфов), которые вставляются в документы, генерируемые по различным шаблонам. Изменение пункта в библиотеке должно приводить к изменению этого пункта в документах, которые генерируются по этим шаблонам. Изменять пункты хотел бы сам бизнес, без участия ИТ. Составление шаблонов (по которым генерируются документы) с учетом вставки в разные их места пунктов из библиотеки сокращает размер шаблонов, они становятся полиморфными, и, соответственно, уменьшается количество шаблонов и упрощается их сопровождение.
Начальные данные: для удобства работы с пунктами библиотека может состоять, например, из фрагментов документа, создаваемых в MS Word. Т.е. их создание и редактирование производится в MS Word. Библиотечные пункты хранятся, например, в базе данных и\или в файловой папке. Какие конкретно пункты будут вставлены в документ при генерации определяется во время исполнения приложения, которое использует модуль генератора.
Первая задача, которую надо решить, это задача сопряжения отступов текста, указанных в шаблоне, и добавляемых пунктов из библиотеки, сопряжение размеров шрифта и т.п. Данная задача частично решается правилами составления пунктов, выбранным заранее шрифтом и его размером. Отступы же генератор должен определить сам, исходя из контекста того места в шаблоне, куда вставляется пункт. К счастью, такой контекст определить не сложно, поэтому эта задача здесь просто обозначена.
Вторая задача более сложная. Рассмотрим пример пункта и на его основе перечислим проблемы:
[1.2] Библиотечный пункт является примером, составленным г-ном [Ивановым] для демонстрации проблем, описанных в пунктах [2.3] и [3.1] ["Краткого описания"][данного изложения]
В приведенном примере фрагменты текста, помещенные в [...] скобки, должны задаваться параметрически. Т.е. данный библиотечный пункт при вставке в реальный документ мог бы выглядеть так:
3.1 Библиотечный пункт является примером, составленным г-ном Горбунковым С.С. для демонстрации проблем, описанных в пунктах 4.1 и 4.6 "Краткого описания"
Если приложение в момент исполнения может знать о Горбункове С.С. и о том, описание это или изложение, то о том, какой именно номер пункта в шаблоне, 1.2 или 3.1, приложение не знает, да и не должно. Библиотечных пунктов может быть несколько, вставляться они могут в разные места разных шаблонов, нумерация разделов в них не совпадает, да и ссылаться пункты могут на другие пункты, номера которых не должны быть известны приложению. Приложение должно поручить задачи расчета номеров пунктов самому генератору. Шаблоны совместно с генератором должны обеспечивать нумерацию своих и библиотечных пунктов сами, впрочем, как и определение номеров ссылок на пункты.
Например, в одном шаблоне конкретный библиотечный пункт может ссылаться на пункты 4.1 и 4.6, в другом (или в этом же самом) только на пункт 2.5.1. Кроме того, если нумерация пунктов выполняется внутри одного документа, то ссылки могут ссылаться на пункты в другом документе, как, например, «Краткое описание» может быть не генерируемым в данный момент документом, а уже существующим. Все это говорит о том, что библиотечный пункт должен быть параметризован. Если генератор не может выполнять такие операции, то вносить правки в документ придется человеку вручную, а человек может ошибаться.
Например, вид разметки библиотечного пункта может быть такой:
[Счетчик:X] Библиотечный пункт является примером, составленным г-ном [Наименование автора] для демонстрации проблем, описанных в пунктах [Глобальная ссылка:A][ и [Глобальная ссылка:B]] [[Альтернатива:1="Краткого описания"]|[Альтернатива:2=данного изложения]]
Итак, если модуль генератора знает, каково значение счетчика:X до вставки библиотечного пункта, знает значение поля [Наименование автора], имеет информацию о документе «Краткое описание» и может найти в нем конкретные значения глобальных счетчиков (доступных из других документов) с именами A и B этого документа, и если он знает альернативу 1 или 2, то окончательное значение библиотечного пункта вычисляется генератором по входным параметрам и данный пункт можно использовать в разных шаблонах без проблем.
Остается только добавить, что модифицировать такой библиотечный пункт в MS Word могут не только сотрудники ИТ, но и обученные сотрудники подразделений организаций. Что радует.
Комментарии (5)
telhin
25.07.2017 16:13Мне кажется, для обозначенных проблем должен неплохо подходить Латех, но у него один большой недостаток: он не MS Word.
Из текста не понятно реализована ли данная система или это просто рассуждение о проблематике.
Осознание того, что система сделана в MS Word и вероятно под капотом крутится нечто непонятное из макросов python и visual basic вгоняет в тоску мысли о поддержке данной системы. Индивидуально для себя в принципе можно побаловаться.
Разработка качественного плагина с поддержкой, расширяемым функционалом и каким-нибудь более приличным дизайном не рентабельна (если вы не собираетесь сделать стартап по этой тематике, а потом продавать плагин по всему миру за 5 баксов/месяц).
SirEdvin
25.07.2017 16:39Зависит от задачи. Если вам нужно сделать документ для печати, то MS Word вам совсем не нужен, pdf хватит. А тут уже полное раздолье, отчеты в latex, pentaho report или чем угодно.
wert_lex
26.07.2017 13:51У латеха есть еще одна проблема, сформулировать её можно так: если у вас есть проблема и вы решили использовать латех, у вас уже две проблемы.
Латех сам по себе весьма неплох, и позволяет сделать с документом практически всё, что угодно, но сам по себе достаточно сложен, и с автоматизацией тоже не всё так гладко, хотя и решаемо.
intsurfer
25.07.2017 17:12+1Ворд для таких задач не нужен, особенно в небольших компаниях — либреофис прекрасно подходит для генерации документов на основе шаблона.
bopoh13
Справку только пишите к своим шаблонам. Тостер: Универсальный документ