4.1 Заголовки, абзацы и основная текстовая структура
править
В этом разделе описаны элементы XML и атрибуты, которые используются для представления заголовков и абзацев в текстовом документе.
Элементы <text:h>
и <text:p>
представляют заголовки и абзацы, соответственно, вместе упоминаются как элементы абзаца. Все текстовое содержимое в файле OpenDocument должно содержаться в любом из этих элементов.
Заголовки определяют структуру разделов в документе. Раздел или подраздел начинается с заголовка и продолжается до следующего заголовка такого же или более высокого уровня.
<define name="text-h">
<element name="text:h">
<ref name="heading-attrs"/>
<ref name="paragraph-attrs"/>
<optional>
<ref name="text-number"/>
</optional>
<zeroOrMore>
<ref name="paragraph-content"/>
</zeroOrMore>
</element>
</define>
Атрибут text:outline-level
связан с элементом заголовка и определяет уровень заголовка, начиная с 1. Уровень заголовка без данного атрибута принимается равным 1.
<define name="heading-attrs" combine="interleave">
<attribute name="text:outline-level">
<ref name="positiveInteger"/>
</attribute>
</define>
Нумерация заголовка может быть изменена за счет использования дополнительных атрибутов, подобных пунктам списка (см. раздел 4.3.2). Нумерация заголовков может быть запущена сначала установкой значения true
для атрибута text:restart-numbering
.
<define name="heading-attrs" combine="interleave">
<optional>
<attribute name="text:restart-numbering" a:defaultValue="false">
<ref name="boolean"/>
</attribute>
</optional>
</define>
Атрибут text:start-value
может быть использован для возобновления нумерации заголовков на текущем уровне при помощи установки нового значения нумерации.
<define name="heading-attrs" combine="interleave">
<optional>
<attribute name="text:start-value">
<ref name="nonNegativeInteger"/>
</attribute>
</optional>
</define>
Подавление нумерации заголовка
править
Иногда необходим специальный заголовок, который не должен быть пронумерован. Это соответствует ненумерованным заголовкам в списках (см. раздел 4.3). Чтобы достичь этого, можно использовать дополнительный атрибут text:is-list-header
. Если его значение true
, то данный заголовок не будет пронумерован, даже если будет явно указан list-style
.
<define name="heading-attrs" combine="interleave">
<optional>
<attribute name="text:is-list-header" a:defaultValue="false">
<ref name="boolean"/>
</attribute>
</optional>
</define>
Форматированная нумерация заголовков
править
Если заголовок пронумерован, текст форматированного номера может быть добавлен в элемент <text:number>
. Этот текст может использовать приложение, не поддерживающее нумерацию заголовков, но он будет проигнорирован, если такая поддержка присутствует.
<define name="text-number">
<element name="text:number">
<ref name="string"/>
</element>
</define>
Абзацы — основные единицы текста.
<define name="text-p">
<element name="text:p">
<ref name="paragraph-attrs"/>
<zeroOrMore>
<ref name="paragraph-content"/>
</zeroOrMore>
</element>
</define>
4.1.3 Общие атрибуты элементов абзаца
править
Элементы абзаца имеют следующие атрибуты: text:style-name
, text:class-names
и text:cond-style-name
. Эти атрибуты должны ссылаться на стиль абзаца.
Атрибут text:style-name
указывает на стиль абзаца, в то время как атрибут text:cond-style-name
ссылается на условный стиль, то есть, стиль который содержит указатели на другие стили (см. раздел 14.1.1). Если к абзацу применен условный стиль, то атрибут text:style-name
содержит имя стиля, который стал результатом условной оценки, в то время как само имя условного стиля является значением атрибута text:cond-style-name
. Такая структура XML упрощает преобразование [XSLT], поскольку XSLT должен воспользоваться только условным стилем, если атрибуты форматирования корректны. Указанный стиль может быть общим или автоматическим.
Атрибут text:class-names
содержит список имен стилей в абзаце, разделенных пробелами. Указанные стили применяются в порядке, в котором они содержатся в списке. Если указаны атрибуты text:style-name
и text:class-names
, то стиль, на который ссылается атрибут text:style-name
, будет в text:class-names
как первый стиль в списке. Если условный стиль определен совместно с атрибутом style:class-names
, но без атрибута text:style-name
, тогда первый стиль в списке стилей используется как значение пропущенного атрибута text:style-name
.
Соответствующие спецификации приложения должны поддерживать атрибут text:class-names
, а также сохранять их в процессе редактирования.
<define name="paragraph-attrs">
<optional>
<attribute name="text:style-name">
<ref name="styleNameRef"/>
</attribute>
</optional>
<optional>
<attribute name="text:class-names">
<ref name="styleNameRefs"/>
</attribute>
</optional>
<optional>
<attribute name="text:cond-style-name">
<ref name="styleNameRef"/>
</attribute>
</optional>
</define>
Пример — Стили и условные стили:
<text:p text:style-name="Heading 1">
"Heading 1" is not a conditional style.
</text:p>
<text:p text:style-name="Numbering 1" text:cond-style-name="Text body">
"Text body" is a conditional style. If it is contained in a numbered
paragraph, it maps to "Numbering 1". This is assumed in this example.
</text:p>
Абзац может иметь идентификатор, который может быть использован для ссылки на абзац из других элементов.
<define name="paragraph-attrs" combine="interleave">
<optional>
<ref name="text-id"/>
</optional>
</define>
4.2 Последовательности страниц
править
Элемент последовательности страниц <text:page-sequence>
определяет последовательность мастер-страниц, которые представлены в том же порядке, в каком на них имеются ссылки в последовательности страниц. Если текстовый документ содержит последовательность страниц, то он будет состоять из точно такого количества страниц, какое определено. Документ с последовательностью страниц не имеет основного потока текста, состоящего из заголовков и абзацев, как в случае, если документ не содержит последовательности страниц. Для документов с последовательностью страниц текстовое наполнение заключается внутри текстовых блоков. Единственно допустимым содержимым другого характера являются графические объекты.
Пример — Последовательность страниц:
<style:automatic-style>
<style:page-layout name="pm1">
<!-- portrait page -->
</style:page-layout>
<style:page-layout name="pm2">
<!-- landscape page -->
</style:page-layout>
</style:automatic-style>
...
<style:master-styles>
<style:master-page name="portrait" style:page-layout-name="pm1"/>
<style:master-page name="landscape" style:page-layout-name="pm2"/>
</style:master-styles>
...
<office:body>
<text:page-sequence>
<text:page text:master-page-name="portrait"/>
<text:page text:master-page-name="portrait"/>
<text:page text:master-page-name="landscape"/>
<text:page text:master-page-name="landscape"/>
<text:page text:master-page-name="portrait"/>
</text:page-sequence>
<draw:frame ...>
<draw:text-box ...>
<text:p>Example text.</text:p>
...
</draw:text-box>
</draw:frame>
</office:body>
<define name="text-page-sequence">
<element name="text:page-sequence">
<oneOrMore>
<ref name="text-page"/>
</oneOrMore>
</element>
</define>
Элемент <text:page>
описывает отдельную страницу из последовательности страниц.
<define name="text-page">
<element name="text:page">
<ref name="text-page-attlist"/>
<empty/>
</element>
</define>
Атрибут text:master-page-name
определяет имя мастер-страницы, которой он присваивается.
<define name="text-page-attlist">
<attribute name="text:master-page-name">
<ref name="styleNameRef"/>
</attribute>
</define>
Формат OpenDocument поддерживает структуру списков, подобную описанной в [HTML4]. Список является элементом уровня абзаца, который содержит необязательный заголовок списка, следующего за последовательностью пунктов списка. Заголовок списка, а также каждый пункт списка содержат последовательность абзацев или элементов списка. Списки могут быть вложенными.
Списки могут быть нумерованными. Нумерация возможна с произвольного номера, который может быть присвоен в каждом пункте списка. Нумерация списка может также продолжать нумерацию другого списка, что позволяет пользователю объединять несколько списков в один прерывающийся список. Отметим, что отображение нумерации зависит от использованного стиля списка.
В дополнении к этой структурной информации, списки могут иметь стили, связанные с ними, которые содержат информацию о разметке, такую как:
- тип метки пункта списка, такой как маркер или номер;
- ширина метки пункта списка и отступ;
- символ маркера или изображения (если есть);
- формат номера для нумерованных списков (если есть);
- отступ абзаца для пунктов списка.
Списки описываются элементом <text:list>
. Он содержит необязательный заголовок списка со следующим за ним произвольным числом пунктов списка.
Каждый список имеет свой уровень (list level), который определяется вложенностью элементов <text:list>
. Если список не находится внутри другого списка, то его уровень равен 1. Если список находится внутри другого списка, его уровень равен уровню списка, в котором он содержится, увеличенному на единицу. Если список содержится внутри ячейки таблицы или текстового блока, его уровень равен единице даже в том случае, когда таблица или текстовый блок сами являются вложенными в другой список.
С элементом списка могут быть связаны следующие атрибуты:
- имя стиля;
- продолжение нумерации.
<define name="text-list">
<element name="text:list">
<ref name="text-list-attr"/>
<optional>
<ref name="text-list-header"/>
</optional>
<zeroOrMore>
<ref name="text-list-item"/>
</zeroOrMore>
</element>
</define>
Необязательный атрибут text:style-name
определяет имя стиля списка, который применяется для списка.
Если данный атрибут пропущен, следовательно стиль списка не определен, применяется одно из следующих действий.
- Если список содержится внутри другого, стилем списка по умолчанию является стиль внешнего списка.
- Если для внешнего списка не определен стиль списка, но список содержит абзацы, у которых описан стиль абзаца с определенным стилем списка, этот стиль списка используется для любого из этих абзацев.
- Для всех остальных абзацев применяется стиль списка по умолчанию.
Для определения свойств форматирования списка принимается во внимание уровень списка и имя стиля списка (см. раздел 14.10 для получения дополнительной информации о свойствах форматирования списка).
<define name="text-list-attr" combine="interleave">
<optional>
<attribute name="text:style-name">
<ref name="styleNameRef"/>
</attribute>
</optional>
</define>
По умолчанию первый пункт списка начинается с номера, определенного в стиле списка. Атрибут продолжения нумерации может использоваться для продолжения нумерации от предшествующего списка.
Атрибут может использоваться с элементом <text:list>
и может принимать значения true
и false
.
Если значение атрибута равно true
и стиль нумерации предшествующего списка такой же, как в текущем списке, то номер первого пункта списка в текущем списке равен номеру последнего пункта предыдущего списка, увеличенному на единицу.
<define name="text-list-attr" combine="interleave">
<optional>
<attribute name="text:continue-numbering">
<ref name="boolean"/>
</attribute>
</optional>
</define>
Пункты списка содержат текстовое содержимое списка. Элемент <text:list-item>
может содержать абзацы или списки. Пункт списка не может содержать заголовки или таблицы.
<define name="text-list-item">
<element name="text:list-item">
<ref name="text-list-item-attr"/>
<ref name="text-list-item-content"/>
</element>
</define>
<define name="text-list-item-content">
<optional>
<ref name="text-number"/>
</optional>
<zeroOrMore>
<choice>
<ref name="text-p"/>
<ref name="text-h"/>
<ref name="text-list"/>
</choice>
</zeroOrMore>
</define>
Первой строке в пункте списка предшествует маркер или номер, в зависимости от стиля списка, связанного с данным списком. Если пункт списка непосредственно начинает другой список и не содержит никакого текста, маркер или номер не отображается.
С элементом <text:list-item>
может быть связан только следующий атрибут:
Нумерация текущего списка может быть начата заново с указанного номера. Атрибут text:start-value
используется для определения начального номера списка.
Этот атрибут может быть применен только к пунктам с нумерованным типом списка. Он начинает нумерацию списка заново в текущем пункте.
<define name="text-list-item-attr" combine="interleave">
<optional>
<attribute name="text:start-value">
<ref name="nonNegativeInteger"/>
</attribute>
</optional>
</define>
Если к пункту списка применяется нумерация, то текст форматированного номера может быть включен в элемент <text:number>
. Этот текст может быть использован приложениями, которые не поддерживают нумерацию, но он не будет рассматриваться приложением, которое нумерацию поддерживает (см. также раздел 4.1.1).
Пример — Списки и вложенные списки:
<text:list text:style-name="List 1">
<text:list-item>
<text:p>This is the first list item</text:p>
<text:p>This is a continuation of the first list item.</text:p>
</text:list-item>
<text:list-item>
<text:p>This is the second list item.
It contains a sub list.</text:p>
<text:list>
<text:list-item><text:p>This is a sub list item.</text:p>
<text:list-item><text:p>This is a sub list item.</text:p>
<text:list-item><text:p>This is a sub list item.</text:p>
</text:list>
</text:list-item>
<text:list-item>
<text:p>This is the third list item</text:p>
</text:list-item>
</text:list>
Заголовок списка — это специальный вид пункта списка. Он содержит один или несколько абзацев, которые отображаются перед списком. Абзацы отображаются как пункты списка, но без предшествующего номера или маркера. Заголовок списка представляется элементом заголовок списка.
<define name="text-list-header">
<element name="text:list-header">
<ref name="text-list-item-content"/>
</element>
</define>
В некоторых случаях желательно определять список не как структурный элемент, состоящий из нескольких пунктов списка, а определять его на уровне целых абзацев, установив, нумерован ли абзац и на каком уровне. Для обеспечения этого используется элемент <text:numbered-paragraph>
, который позволяет осуществлять нумерацию отдельных абзацев, как если бы они являлись частью списка на определенном уровне.
Нумерованные абзацы могут использовать те же самые свойства сквозной нумерации, что и пункты списков, таким образом формируется похожий, альтернативный способ определения списков. Список, представленный в <text:list>
, может быть преобразован в список, представленный в <text:numbered-paragraph>
, и наоборот.
<define name="text-numbered-paragraph">
<element name="text:numbered-paragraph">
<ref name="text-numbered-paragraph-attr"/>
<optional>
<ref name="text-number"/>
</optional>
<choice>
<ref name="text-p"/>
<ref name="text-h"/>
</choice>
</element>
</define>
Нумерованному абзацу может быть назначен уровень списка. Нумерованный абзац эквивалентен вложенному списку представленного уровня, содержащего один пункт списка с одним абзацем. Если уровень не назначен, нумерованный абзац интерпретируется как находящийся на первом уровне.
<define name="text-numbered-paragraph-attr" combine="interleave">
<optional>
<attribute name="text:level" a:defaultValue="1">
<ref name="positiveInteger"/>
</attribute>
</optional>
</define>
Так как нумерованный абзац совмещает функциональность списка (возможно вложенного) с одним пунктом списка, он также может использовать атрибуты этого элемента.
<define name="text-numbered-paragraph-attr" combine="interleave">
<ref name="text-list-attr"/>
</define>
<define name="text-numbered-paragraph-attr" combine="interleave">
<ref name="text-list-item-attr"/>
</define>
Текст форматированного номера может быть включен в элемент <text:number>
. Этот текст может быть использован приложением, которое не поддерживает нумерацию, но он не будет использоваться, если нумерация поддерживается приложением (см. также раздел 4.1.1).
Текстовый раздел — это именованная область текстового содержимого уровня абзаца. Раздел начинается и заканчивается на границах абзаца и может содержать любое количество абзацев.
В формате OpenDocument есть два способа применения разделов: для назначения определенных свойств оформления области текста; для группировки текста, который получается автоматически из некоторого внешнего источника данных.
В дополнении разделы могут содержать обычное текстовое содержимое или текст может содержаться в другом файле, связанном с разделом. Раздел также может иметь защиту от записи или быть скрытым.
Раздел может иметь параметры текстовых колонок, цвета фона или образца и настройку сносок. Параметры настройки формируют стиль раздела, который представлен в элементе <style:style>
(см. раздел 14.8.3).
Свойства форматирования для разделов объясняются в разделе 15.7.
Разделы поддерживают два способа связи с внешним содержимым. Если раздел связан с другим документом, связь может быть организована одним из следующих способов.
- Источник, определяемый XLink, задается элементом
text:section-source
.
- Динамический обмен данными (Dynamic Data Exchange, DDE) задается элементом
office:dde-source
.
Ссылочная информация на внешнее содержимое располагается в первом потомке элемента раздела. Раздел, который ссылается на внешнее содержимое, содержит полное представление источника данных, так что приложения нуждаются в понимании информации о связях, только если они предполагают обновить содержимое раздела.
<define name="text-section">
<element name="text:section">
<ref name="text-section-attr"/>
<choice>
<ref name="text-section-source"/>
<ref name="text-section-source-dde"/>
<empty/>
</choice>
<zeroOrMore>
<ref name="text-content"/>
</zeroOrMore>
</element>
</define>
Примечание — Пункты списка не могут содержать разделов. Таким образом, списки могут только полностью содержаться внутри элементов раздела. Если решено достичь эффекта наложения списков и разделов или разделы содержатся внутри списков, то списки должны быть разбиты на несколько списков, каждый из которых находился бы полностью внутри раздела. Разбивая список, атрибуты сквозной нумерации следует установить такими, чтобы отображение и поведение их совпадало с исходным списком, не прерванным разделами.
Текстовые индексы, описанные в разделе 7, можно считать специальным видом текстового раздела, поскольку они разделяют такую же самую общую структуру, а также определенные атрибуты. Они собраны в следующем определении:
<define name="text-section-attr" combine="interleave">
<ref name="sectionAttr"/>
</define>
Остальные атрибуты в этом разделе относятся к элементу <text:section>
.
Атрибут text:style-name
ссылается на стиль раздела.
<define name="sectionAttr" combine="interleave">
<optional>
<attribute name="text:style-name">
<ref name="styleNameRef"/>
</attribute>
</optional>
</define>
Каждый раздел должен иметь уникальное имя, которое определяет его однозначно. Атрибут text:name
содержит имя раздела.
<define name="sectionAttr" combine="interleave">
<attribute name="text:name">
<ref name="string"/>
</attribute>
</define>
Раздел может быть защищен, это означает, что пользователь не может редактировать его. Атрибут text:protected
показывает, защищен ли раздел. Пользовательский интерфейс должен реализовывать защиту, если атрибут установлен.
<define name="sectionAttr" combine="interleave">
<optional>
<attribute name="text:protected">
<ref name="boolean"/>
</attribute>
</optional>
</define>
Средствами пользовательского интерфейса можно сбросить флаг защиты, если раздел не защищен паролем. В этом случае пользователь должен знать пароль, чтобы сбросить флаг защиты. Атрибут text:protection-key
определяет пароль защиты раздела. Для предотвращения сохранения пароля непосредственно в XML-файле, сохраняется только хеш-значение пароля.
<define name="sectionAttr" combine="interleave">
<optional>
<attribute name="text:protection-key">
<ref name="string"/>
</attribute>
</optional>
</define>
Разделы могут быть скрыты при выполнении определенного условия или скрыты безусловно.
Атрибут text:display
определяет, скрыт раздел или нет. Этот атрибут может принимать следующие значения:
true
— раздел отображается (значение по умолчанию);
none
— раздел скрыт безусловно;
condition
— раздел скрыт по условию, определенному в атрибуте text:condition
.
Атрибут text:condition
определяет условие, по которому раздел становится скрытым. Условие представляется в виде строки. Если значение атрибута text:display
равно condition
, атрибут text:condition
должен быть определен.
<define name="text-section-attr" combine="interleave">
<choice>
<attribute name="text:display">
<choice>
<value>true</value>
<value>none</value>
</choice>
</attribute>
<group>
<attribute name="text:display">
<value>condition</value>
</attribute>
<attribute name="text:condition">
<ref name="string"/>
</attribute>
</group>
<empty/>
</choice>
</define>
Элемент <text:section-source>
указывает на то, что включенный раздел является связанным. Если этот элемент используется, то он должен быть первым элементом в элементе <text:section>
.
<define name="text-section-source">
<element name="text:section-source">
<ref name="text-section-source-attr"/>
</element>
</define>
С элементом <text:section-source>
могут быть связаны следующие атрибуты:
- URL источника раздела;
- имя связанного раздела;
- имя фильтра.
Этот атрибут определяет документ или раздел, с которым связан данный раздел. Имя целевого раздела устанавливается локальной частью URL, следующей после знака диез. Подразумевается использование атрибута xlink:href
, потому что элементы <text:section-source>
могут также ссылаться на внутренние разделы.
<define name="text-section-source-attr" combine="interleave">
<optional>
<attribute name="xlink:href">
<ref name="anyURI"/>
</attribute>
<optional>
<attribute name="xlink:type" a:defaultValue="simple">
<value>simple</value>
</attribute>
</optional>
<optional>
<attribute name="xlink:show" a:defaultValue="embed">
<value>embed</value>
</attribute>
</optional>
</optional>
</define>
Если целевой объект ссылки является разделом документа, атрибут text:section
содержит имя целевого раздела. Если атрибут не задан, целевым объектом ссылки является документ целиком.
<define name="text-section-source-attr" combine="interleave">
<optional>
<attribute name="text:section-name">
<ref name="string"/>
</attribute>
</optional>
</define>
Атрибут text:filter-name
определяет, какой фильтр будет использован при импорте целевого объекта ссылки. Значение этого атрибута обуславливается реализацией.
<define name="text-section-source-attr" combine="interleave">
<optional>
<attribute name="text:filter-name">
<ref name="string"/>
</attribute>
</optional>
</define>
Если разделы связаны по DDE, то информация об их присоединении представлена в элементах <office:dde-source>
. Он содержит атрибуты, которые определяют приложение, тему и пункт DDE-соединения. Отметим это, потому что раздел содержит XML-интерпретацию содержимого DDE-ссылки, эта информация нужна только в том случае, если желательно обновление данных по DDE.
<define name="text-section-source-dde">
<ref name="office-dde-source"/>
</define>
4.5 Графическое наполнение, привязанное к странице
править
В пределах текстовых документов изображения, вложенные объекты и другие графические объекты представляются на уровне абзаца, если они привязаны к странице, а не к абзацу или символьной позиции внутри абзаца (см. раздел 9.2 для получения детальной информации о графических объектах и раздел 9.2.16 для информации по их привязке).
В этом разделе описано, как могут быть представлены изменения в документе.
4.6.1 Отслеженные изменения
править
Все отслеженные изменения в текстовом документе сохраняются в списке. Список содержит элементы для каждого произошедшего изменения документа. Если элемент <text:tracked-changes>
отсутствует, значит отслеживание изменений выключено.
<define name="text-tracked-changes">
<optional>
<element name="text:tracked-changes">
<ref name="text-tracked-changes-attr"/>
<zeroOrMore>
<ref name="text-changed-region"/>
</zeroOrMore>
</element>
</optional>
</define>
Этот атрибут определяет, должны ли пользовательские приложения отслеживать и записывать изменения в данном документе.
<define name="text-tracked-changes-attr" combine="interleave">
<optional>
<attribute name="text:track-changes" a:defaultValue="true">
<ref name="boolean"/>
</attribute>
</optional>
</define>
Для каждой измененной области документа есть только одна запись в списке отслеженных изменений. Эта запись содержит список всех изменений, которые были сделаны в этой области. Начало и конец данной области обозначены с помощью элементов начала и конца, которые описаны ниже.
<define name="text-changed-region">
<element name="text:changed-region">
<ref name="text-changed-region-attr"/>
<ref name="text-changed-region-content"/>
</element>
</define>
Каждый элемент имеет идентификатор. Элементы, обозначающие начало и конец области, используют этот идентификатор определения области, к которой они относятся.
<define name="text-changed-region-attr" combine="interleave">
<attribute name="text:id">
<ref name="ID"/>
</attribute>
</define>
Элемент <text:insertion>
содержит информацию, необходимую для определения вставки в содержимое. Содержимое может быть частью текста внутри абзаца, целым абзацем или целой таблицей. Вставленное содержимое — непосредственно часть текстового документа, отмеченная элементами начала и конца изменения.
<define name="text-changed-region-content" combine="choice">
<element name="text:insertion">
<ref name="office-change-info"/>
</element>
</define>
<text:tracked-changes>
<text:changed-region text:id="c001">
<text:insertion>
<office:change-info>
<dc:creator>Michael Brauer</dc:creator>
<dc:date>1999-05-18T12:56:04</dc:date>
</office:change-info>
</text:insertion>
</text:changed-region>
</text:tracked-changes>
<text:p>
This is the original text<text:change-start text:change-id="c001"/>,
but this has been added</text:change-end text:change-id="c001"/>.
</text:p>
Элемент <text:deletion>
содержит содержимое, которое было удалено при включенном слежении за изменениями. Позиция, где текст был удален, обозначена с помощью элемента позиции изменения.
Если часть абзаца была удалена, то удаленный текст содержится в этом элементе как элемент абзаца. Если удаленный текст был повторно вставлен в документ, абзац объединяется с абзацем где было удаление.
<define name="text-changed-region-content" combine="choice">
<element name="text:deletion">
<ref name="office-change-info"/>
<zeroOrMore>
<ref name="text-content"/>
</zeroOrMore>
</element>
</define>
Пример — Удаление текста:
<text:tracked-changes>
<text:changed-region text:id="c002">
<text:deletion>
<office:change-info>
<dc:creator>Michael Brauer</dc:creator>
<dc:date>1999-05-18T12:56:04</dc:date>
</office:change-info>
<text:p>, but this has been deleted</text:p>
</text:deletion>
</text:changed-region>
</text:tracked-changes>
<text:p>
This is the original text<text:change text:region-id="c002"/>.
</text:p>
Этот пример показывает следующее:
- текст, который был удален=
, but this has been deleted
, содержится в элементе <text:p>
внутри элемента <text:deletion>
;
- текущий текст=
This is the original text
содержится в элементе <text:p>
в конце примера;
- до удаления текст был следующим=
This is the original text, but this has been deleted
.
Отметим, что удаленный текст, как и весь текст в формате OpenDocument, содержится в элементе абзаца. Для восстановления изначального текста, абзац объединяется с его окружением. Другими словами, удаленный фрагмент, состоящий из одного слова, будет представлен в виде абзаца, содержащего одно слово.
Для восстановления текста до момента удаления сделайте следующее:
- если метка изменения находится внутри абзаца, вставьте текстовое содержимое элемента
<text:deletion>
, как будто начальный <text:p>
и конечный </text:p>
теги пропущены;
- если метка изменения находится внутри заголовка, поступайте как описано выше, но приспосабливая вставляемые теги под особенности их нового прототипа;
- иначе просто скопируйте содержимое элемента
<text:deletion>
в место метки изменения.
Пример —
Даны следующие изменения:
<text:changed-region text:id="example">
<text:deletion>
<office:change-info>...</office:change-info>
<text:p>Hello</text:p>
<text:p>World!</text:p>
</text:deletion>
</text:changed-region>
Первый (и самый обычный) случай — если метка изменения находится внутри обычного абзаца:
<text:p>abc<text:change text:id="example/>def</text:p>
Для восстановления изначального текста, два элемента <text:p>
копируются взамен метки изменения, за исключением тех случаев, когда теги начала и конца отсутствуют:
<text:p>abcHello</text:p>
<text:p>World!def</text:p>
Второй случай — метка изменения встречается внутри заголовка, следует такая же процедура, только скопированные теги адаптируются, чтобы быть уверенными что мы все еще имеем правильно сформированный XML:
<text:h>abc<text:change text:id="example/>def</text:h>
<text:h>abcHello</text:h>
<text:h>World!def</text:h>
Третий случай — изменения встречаются вне абзаца. При этом удаленный текст просто копируется:
<text:p>abcdef</text:p>
<text:change text:id="example/>
<text:p>ghijkl</text:p>
<text:p>abcdef</text:p>
<text:h>Hello</text:h>
<text:h>World!</text:h>
<text:p>ghijkl</text:p>
Если бы в первых двух случаях удаленный фрагмент содержал целый абзац, то дополнительные пустые абзацы должны были бы быть вставлены в элемент <text:deletion>
для достижения желаемого результата.
Изменение от
<text:p>abc</text:p>
<text:h>Hello</text:h>
<text:h>World!</text:h>
<text:p>def</text:p>
<text:p>abc<text:change text:id="example/>def</text:p>
<text:changed-region text:id="example">
<text:deletion>
<office:change-info>...</office:change-info>
<text:p/>
<text:p>Hello</text:p>
<text:p>World!</text:p>
<text:p/>
</text:deletion>
</text:changed-region>
Элемент изменения формата отражает любые изменения в атрибутах форматирования. Область, в которой произошли изменения, отмечается элементами начала и конца изменения.
<define name="text-changed-region-content" combine="choice">
<element name="text:format-change">
<ref name="office-change-info"/>
</element>
</define>
Примечание — элемент изменения формата не содержит фактических изменений.
4.6.6 Информация об изменениях
править
Информация об изменениях содержит метаинформацию о том, кто сделал изменения и когда. Она также используется для электронных таблиц, в соответствии с описанием в разделе 12.3 (Метаданные отслеживания изменений).
Три элемента отмечают начало и конец области изменений.
- Элемент начала изменений —
<text:change-start>
.
Этот элемент отмечает начало области с содержимым, где текст был вставлен или был изменен формат.
- Элемент окончания изменений —
<text:change-end>
.
Этот элемент отмечает конец области с содержимым, где текст был вставлен или был изменен формат.
- Элемент позиции изменений —
<text:change>
.
Это элемент отмечает позицию в пустой области, где текст был удален.
Все три элемента имеют атрибуты, определяющие идентификатор области, к которой они относятся.
<define name="change-marks">
<choice>
<element name="text:change">
<ref name="change-mark-attr"/>
</element>
<element name="text:change-start">
<ref name="change-mark-attr"/>
</element>
<element name="text:change-end">
<ref name="change-mark-attr"/>
</element>
</choice>
</define>
<define name="change-mark-attr">
<attribute name="text:change-id">
<ref name="IDREF"/>
</attribute>
</define>
Некоторые текстовые элементы нуждаются в предварительном объявлении прежде, чем они могут быть использованы. Например, переменные поля требуют, чтобы используемые переменные были объявлены в начале документа. Эти объявления собраны в начале текстового документа. Такие объявления необязательны. Детальное описание таких объявлений доступно в соответствующем разделе.
Поддерживаются следующие текстовые объявления:
- объявление переменной — эти объявления используются для переменных полей (см. раздел 6.3.1);
- объявление поля пользователя — эти объявления используются для полей определяемых пользователем (см. раздел 6.3.5);
- объявление последовательности — эти объявления используются для последовательных полей (см. раздел 6.3.8);
- DDE-ссылки — эти объявления используются для DDE-полей и DDE-разделов (см. разделы 6.6.9 и 4.4.3, соответственно);
- файл с автоматическими метками — это объявление используется для формирования алфавитных указателей (см. раздел 7.8.2).
<define name="text-decls">
<optional>
<element name="text:variable-decls">
<zeroOrMore>
<ref name="text-variable-decl"/>
</zeroOrMore>
</element>
</optional>
<optional>
<element name="text:sequence-decls">
<zeroOrMore>
<ref name="text-sequence-decl"/>
</zeroOrMore>
</element>
</optional>
<optional>
<element name="text:user-field-decls">
<zeroOrMore>
<ref name="text-user-field-decl"/>
</zeroOrMore>
</element>
</optional>
<optional>
<element name="text:dde-connection-decls">
<zeroOrMore>
<ref name="text-dde-connection-decl"/>
</zeroOrMore>
</element>
</optional>
<optional>
<ref name="text-alphabetical-index-auto-mark-file"/>
</optional>
</define>
|
Это произведение не охраняется авторским правом. В соответствии со статьёй 1259 Гражданского кодекса Российской Федерации не являются объектами авторских прав официальные документы государственных органов и органов местного самоуправления муниципальных образований, в том числе законы, другие нормативные акты, судебные решения, иные материалы законодательного, административного и судебного характера, официальные документы международных организаций, а также их официальные переводы; государственные символы и знаки (флаги, гербы, ордена, денежные знаки и тому подобное), а также символы и знаки муниципальных образований; произведения народного творчества (фольклор), не имеющие конкретных авторов; сообщения о событиях и фактах, имеющие исключительно информационный характер (сообщения о новостях дня, программы телепередач, расписания движения транспортных средств и тому подобное).
|
|
|