Закладки и сноски
С закладками все предельно просто. Начало закладки определяется элементом text:bookmark-start, конец - text:bookmark-end. Атрибут text:name определяет имя закладки. Имя есть у обоих элементов, но нам оно понадобится только у открывающего.
Код xml | Выделить |
<xsl:template
match="text:bookmark-start">
<xsl:value-of
select="concat('[APLACE="', @text:name, '"]')"/>
</xsl:template>
<xsl:template
match="text:bookmark-end">
<xsl:text>[/APLACE]</xsl:text>
</xsl:template>
Сноски можно использовать по прямому назначению, то есть чтобы давать развернутые пояснения, которые нежелательно включать в текст, но можно и, например, для создания списков внешних ссылок "а ля Википедия". Также полезно будет возле сноски размещать ссылку, с помощью которой можно будет прокрутить страницу обратно к тому месту, с которого перешли к сноске.
Приведу фрагмент кода со сноской
Код xml | Выделить |
<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>
Разберем что мы имеем. Сноска обозначена элементом text:note, атрибут text:id - имя, можем также использовать в качестве идентификатора сноски, правда нам надо будет модифицировать его так, чтобы можно было отличить ссылку на сноску и ссылку, работающую в обратном направлении, то есть чтобы можно было вернуться от сноски к тому месту, откуда на нее ссылались.
Вот так мы обработаем ссылку на сноску внутри документа.
Код xml | Выделить |
<xsl:template match="text:note">
<xsl:value-of select="concat('[APLACE="',
@text:id, '_up"][ALINK="',@text:id, '_down"]',
text:note-citation/text(), '[/ALINK][/APLACE]')"/>
</xsl:template>
Код xml | Выделить |
<xsl:template match="/">
<root>
<xsl:text disable-output-escaping="yes">
<![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="',
@text:id, '_down"][ALINK="',@text:id, '_up"]',
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">
]]>
</xsl:text>
</root>
</xsl:template>
Верхний и нижний индексы.
Верхний и нижний индексы определяютсяв свойствах стиля атрибутом style:text-position. Значение атрибута представлено как super 64% и sub 64% соответственно. То есть для их указания нам надо отредактировать функцию, в которой мы вычисляли свойства стиля.
Код xml | Выделить |
<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 | Выделить |
<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>
С оформлением текста вроде закончили, осталось разобрать только таблицы и списки.
Добрый день, начала изучать программирование, вот добралась до верхний и нижний индекс у вас очень понятно и хорошо расписано,спасибо вам. До это изучала на этом сайте https://sibsisadmin.ru/libreoffice-kak-vklyuchit-indeksy/.
ОтветитьУдалитьВроде бы не так сложно пользоваться индексами, но вск равно бывают трудности. Буду и дальше ваш блог читать, у вас много информации.