OpenTBS — повторяющийся абзац с заменой токена?

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

Вот пример раздела в файле .docx, который я пока использую в качестве шаблона:

[onshow; block=begin; personsblock=tbs:p;]
Person 1
[flex_27.xx.01] [flex_27.xx.02], currently of [flex_27.xx.05], as amazing with the following: __{this has yet to be determined}__.
[onshow; block=end; personsblock=tbs:p]

... и мои данные на данный момент:

$personarray = array(); 
$personarray[] = array('tID27.01.01'=> 'Steve', 'tID27.01.02'=>'Klutcher' , 'tID27.01.05'=>'', 'tID27.01.06'=>'Cook'); 
$personarray[] = array('tID27.02.01'=> 'Tommy', 'tID27.02.02'=>'Boonary' , 'tID27.02.05'=>'Clarksville', 'tID27.02.06'=>'Montgomery'); 

... В этот момент я почти потерялся. Я буду программно заменять центральный «код» (отмеченный xx) количеством участников. В чем разница между слиянием и заменой? Как мне совместить действие? Можно ли как-то сделать многопроходный документ?

Извините, если эти вопросы кажутся такими простыми, но, как я уже сказал, я застрял на этом в течение двух дней.


person KCL    schedule 02.09.2020    source источник


Ответы (1)


Когда вы используете block=begin ... block=end, это синтаксис для абсолютных границ. Они указывают положение начала и конца блока в исходнике. В документе у вас нет доступа к внутреннему источнику XML. Поэтому рекомендуется использовать относительный синтаксис для блоков.

В PHP ваша структура данных должна быть такой:

$personarray = array(); 
$personarray[] = array('c01'=> 'Steve', 'c02'=>'Klutcher' , 'c05'=>'', 'c06'=>'Cook'); 
$personarray[] = array('c01'=> 'Tommy', 'c02'=>'Boonary' , 'c05'=>'Clarksville', 'c06'=>'Montgomery'); 

В вашем DOCX фрагмент вашего шаблона должен выглядеть так:

Person 1
[person.c01;block=tbs:p] [person.c02], currently of [person.c05], as amazing ...

Предположим, что эти две строки находятся в одном абзаце.

Выражение [person.01;block=tbs:p] представляет собой поля TBS, которые объединяют столбец «01», а также определяют блок, связанный как абзац, в который встроено это поле.

Они также являются некоторыми проблемами в вашей исходной сети PHP:

  • В именах столбцов не должно быть точки (.), потому что это символ-разделитель для имен полей TBS.
  • Я использую префикс 'c', потому что PHP преобразует числовой строковый ключ в числовой индекс.
person Skrol29    schedule 03.09.2020
comment
Точечный синтаксис наследуется от ключей к исходным данным — я изменил его на подчеркивание, поэтому ключи массива больше походили на tid27_01_01. Одной из самых больших проблем, с которыми я столкнулся при работе с документацией, был сокращенный синтаксис именования. Приступая к работе с TBS, мне было трудно определить ключевые слова из имен переменных/полей/блоков. Например, использование column_01 вместо c01 было бы очень полезно при попытке разобраться с новой библиотекой с уникальным синтаксисом. Но я определенно начинаю ценить силу TBS. С вашей помощью я смог заставить работать слияние. Спасибо! - person KCL; 04.09.2020