Форум программистов, компьютерный форум, киберфорум
diadiavova
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Об XML-фильтрах OpenOffice. Часть 5-я.

Запись от diadiavova размещена 11.06.2015 в 16:38
Показов 3022 Комментарии 0
Метки libreoffice, openoffice, xslt

  1. Закладки и сноски
  2. Верхний и нижний индексы.
  3. Горизонтальное выравнивание
Закладки и сноски

С закладками все предельно просто. Начало закладки определяется элементом text:bookmark-start, конец - text:bookmark-end. Атрибут text:name определяет имя закладки. Имя есть у обоих элементов, но нам оно понадобится только у открывающего.
XML
1
2
3
4
5
6
7
  <xsl:template match="text:bookmark-start">
  <xsl:value-of select="concat('[APLACE=&quot;', @text:name, '&quot;]')"/>
  </xsl:template>
 
  <xsl:template match="text:bookmark-end">
    <xsl:text>[/APLACE]</xsl:text>
  </xsl:template>
Сноски - довольно удобная штука, но создавать их вручную - не очень приятно. Поскольку "офис" предоставляет нам возможность сделать это автоматически - надо этим воспользоваться.

Сноски можно использовать по прямому назначению, то есть чтобы давать развернутые пояснения, которые нежелательно включать в текст, но можно и, например, для создания списков внешних ссылок "а ля Википедия". Также полезно будет возле сноски размещать ссылку, с помощью которой можно будет прокрутить страницу обратно к тому месту, с которого перешли к сноске.
Приведу фрагмент кода со сноской
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<text:p text:style-name="Обычный">
  <text:span text:style-name="Название_20_книги">
    <text:span text:style-name="T10">Ссылка на сноску</text:span>
  </text:span>
  <text:span text:style-name="Знак_20_сноски">
    <text:span text:style-name="T18">
      <text:note text:id="ftn1" text:note-class="footnote">
        <text:note-citation>1</text:note-citation>
        <text:note-body>
          <text:p text:style-name="Текст_20_сноски">
            <text:s/>Сноска на странице
          </text:p>
        </text:note-body>
      </text:note>
    </text:span>
  </text:span>
  <text:span text:style-name="Название_20_книги">
    <text:span text:style-name="T10">.</text:span>
  </text:span>
</text:p>
Здесь мы видим, что сам текст перед сноской никак не выделен, а нам надо только обрамить номер сноски ссылкой и установить якорь, а содержимое сноски разместить в самом конце страницы. Разметка Cyberforum позволяет делать текст одновременно и ссылкой и якорем только если якорь устанавливается поверх ссылки.
Разберем что мы имеем. Сноска обозначена элементом text:note, атрибут text:id - имя, можем также использовать в качестве идентификатора сноски, правда нам надо будет модифицировать его так, чтобы можно было отличить ссылку на сноску и ссылку, работающую в обратном направлении, то есть чтобы можно было вернуться от сноски к тому месту, откуда на нее ссылались.

Вот так мы обработаем ссылку на сноску внутри документа.
XML
1
2
3
  <xsl:template match="text:note">
    <xsl:value-of select="concat('[APLACE=&quot;', @text:id, '_up&quot;][ALINK=&quot;',@text:id, '_down&quot;]', text:note-citation/text(), '[/ALINK][/APLACE]')"/>
  </xsl:template>
А для того, чтобы сноски добавить в конец документа, придется отредактировать главный шаблон.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  <xsl:template match="/">
    <root>
 
      <xsl:text disable-output-escaping="yes">
&lt;![CDATA[
</xsl:text>
 
      <xsl:apply-templates select="//office:body"/>
      <xsl:text>[HR][/HR][FIELDSET="Сноски"][LIST=1]
</xsl:text>
      <xsl:for-each select="//text:note">
        <xsl:text>[*]</xsl:text>
          <xsl:value-of select="concat('[APLACE=&quot;', @text:id, '_down&quot;][ALINK=&quot;',@text:id, '_up&quot;]', text:note-citation/text(), '[/ALINK][/APLACE]', '. ')"/>
      <xsl:apply-templates select="text:note-body"/>
      </xsl:for-each>
      <xsl:text>[/LIST]      [/FIELDSET]</xsl:text>
      
      <xsl:text disable-output-escaping="yes">
]]&gt;
</xsl:text>
    </root>
  </xsl:template>
Верхний и нижний индексы.
Верхний и нижний индексы определяютсяв свойствах стиля атрибутом style:text-position. Значение атрибута представлено как super 64% и sub 64% соответственно. То есть для их указания нам надо отредактировать функцию, в которой мы вычисляли свойства стиля.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  <xsl:function name="my:calculate-styles">
    <xsl:param name="node"/>
    <xsl:variable name="text-position">
      <xsl:variable name="att-value" select="my:style-property-value($node, 'style:text-position')"/>
      <xsl:choose>
        <xsl:when test="starts-with($att-value, 'sub') ">
          <xsl:text>SUB</xsl:text>
        </xsl:when>
        <xsl:when test="starts-with($att-value, 'super')">
          <xsl:text>SUP</xsl:text>
        </xsl:when>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name="I" select="my:style-property-value($node, 'fo:font-style')"/>
    <xsl:variable name="B" select="my:style-property-value($node, 'fo:font-weight')"/>
    <xsl:variable name="U" select="my:style-property-value($node, 'style:text-underline-style')"/>
    <xsl:variable name="S" select="my:style-property-value($node, 'style:text-line-through-style')"/>
    <xsl:variable name="SIZE" select="my:style-property-value($node, 'fo:font-size')"/>
    <xsl:variable name="COLOR" select="my:style-property-value($node, 'fo:color')"/>
    <xsl:variable name="content">
      <xsl:value-of select="$node"/>
    </xsl:variable>
    <xsl:variable name="calculated-size"  select="my:calculate-font-syze($SIZE)"/>
    <xsl:value-of select="my:wrap-with-tags($node, (
     (if ($I = 'italic') then 'I' else ''),
     (if ($B = 'bold') then 'B' else ''),
     (if ($U = 'solid') then 'U' else ''),
     (if ($S = 'solid') then 'S' else ''),
     (if ($calculated-size != '') then concat('SIZE=', $calculated-size) else ''),
     (if ($COLOR != '') then concat('COLOR=', $COLOR) else ''),
     $text-position), 1)"/>
  </xsl:function>
Горизонтальное выравнивание

Выравнивание определяется в свойствах абзаца атрибутом fo:text-align. Будет оно левым, правым или центральным - зависит от значения, оно может быть start, center и end. Если не установлено, значит выравнивается по левому краю, растягивание по ширине разметкой Cyberforum не предусмотрено, так что искать не будем. Поскольку задается выравнивание для абзацев, будем редактировать шаблон, где содержатся определения для абзацев. И не забываем о том, что при запросе значения свойства в качестве узла будем передавать не сам абзац, а одного из его потомков, как это делали при вычислении отступов.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  <xsl:template match="text:h|text:p">
    <xsl:variable name="app-t">
      <xsl:apply-templates/>
    </xsl:variable>
    <xsl:variable name="align" select="my:style-property-value(./*[1], 'fo:text-align')"/>
    <xsl:variable name="indent" select="substring-before(my:style-property-value(./*[1], 'fo:margin-left'), 'cm')"/>
    <xsl:variable name="indented">
      <xsl:choose>
        <xsl:when test="$indent = '' or starts-with($indent, '0')">
          <xsl:value-of select="$app-t"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:variable name="indent-width" select="fn:ceiling(number($indent)) cast as xsd:integer"/>
          <xsl:variable name="indent-count" select="$indent-width" as="xsd:integer"/>
          <xsl:value-of select="my:wrap-with-tags($app-t, for $i in (1 to $indent-count) return 'indent' , 1)"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
 
    <xsl:choose>
    <xsl:when test="$align = 'center'">
    <xsl:value-of select="my:wrap-with-tag($indented, 'CENTER')"/>
    </xsl:when>
    <xsl:when test="$align = 'end'">
    <xsl:value-of select="my:wrap-with-tag($indented, 'RIGHT')"/>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="$indented"/>
    </xsl:otherwise>
    </xsl:choose>
    <!--<xsl:value-of select="'
'" disable-output-escaping="yes"/>-->
    <xsl:text>
  </xsl:text>
  </xsl:template>
Ну и на данный момент наш документ выглядит вот так. Ссылка на сноску расположена близко к сноске, поэтому посмотреть ее в работе не выходит. Но если переместить ее вверх, то все работает.
Кликните здесь для просмотра всего текста

Ссылка на закладку
  Заголовок 1
  Обычный текст
  Заголовок 2
  Заголовок 3
  Заголовок 4
  
  Заголовок 5
  Заголовок 6
  Заголовок 7
  Название
  Подзаголовок
  Сильное выделение
  Строгий
  
Цитата 2
  Слабая ссылка
  Сильная ссылка
  
  Название книги
  
Абзац списка.
  Жирный
  Курисив
  Подчеркнутый
  Перечекнутый
  ХНижний индекс
  ХВерхний идекс
  Крупный шрифт 72
  Мелкий шрифт 8
  Левое выравнивание
  
Выравнивание по центру
  
Правое выравнивание
  
Первый пункт маркированного списка
  
Второй пункт маркированного списка
  
  
Первый пункт                                                                                                             н умерованного списка
  
Пункт 1.a;alfjasdf; lj l ;l lj ;lk &#xD;
lkj;lkj l sdls dfslkj as;l
  
Пункт 1.b b xj 'nj pf [eqyz&amp;
  
Второй пункт нумерованного списка
  Текст до десяти пробелов                   Текст после десяти пробелов
  Текст красного цвета
  Текст синего цвета
  Выделение желтым
  /*Далее таблица*/
  1.1
  1.2
  1.3
  1.4
  1.2
  2.2
  2.3
  2.4
  3.1
  3.2
  3.3
  3.4
  
  Ссылка на гуголь
  
  /*Далее картинка*/
  
  Закладка
  
Текст с отступом 2 см
  Ссылка на сноску1.
  
  
Сноски
  1. 1. Сноска на странице
      
      



С оформлением текста вроде закончили, осталось разобрать только таблицы и списки.

>>
Метки libreoffice, openoffice, xslt
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru