Преобразовать Markdown в объектную модель документа (DOM)

Чтобы программно считывать содержимое и форматирование документа, манипулировать им и изменять их, вам необходимо преобразовать его в объектную модель документа Aspose.Words (DOM).

В отличие от документов Word, Markdown не соответствует DOM, описанному в объектной модели документа Aspose.Words (DOM). статья. Однако Aspose.Words предоставляет свой собственный механизм для перевода документов Markdown в документы DOM и обратно, так что мы можем успешно работать с их элементами, такими как форматирование текста, таблицы, заголовки и другие.

В этой статье объясняется, как различные функции markdown могут быть переведены в формат Aspose.Words DOM и обратно в формат Markdown.

Сложность перевода Markdown – DOM – Markdown

Основная сложность этого механизма заключается не только в преобразовании Markdown в DOM, но и в выполнении обратного преобразования – сохранении документа обратно в формат Markdown с минимальными потерями. Существуют элементы, такие как многоуровневые кавычки, для которых обратное преобразование нетривиально.

Наш механизм перевода позволяет пользователям не только работать со сложными элементами в существующем документе Markdown, но и создавать свой собственный документ в формате Markdown с оригинальной структурой с нуля. Для создания различных элементов вам необходимо использовать стили с определенными названиями в соответствии с определенными правилами, описанными далее в этой статье. Такие стили могут быть созданы программно.

Общие принципы перевода

Мы используем форматирование Font для встроенных блоков. Когда нет прямого соответствия для элемента Markdown в Aspose.Words DOM, мы используем стиль символов с названием, которое начинается с некоторых специальных слов.

Для контейнерных блоков мы используем наследование стилей для обозначения вложенных объектов Markdown. В этом случае, даже если вложенных объектов нет, мы также используем стили абзацев с именами, которые начинаются с некоторых специальных слов.

Маркированные и упорядоченные списки также являются контейнерными блоками в Markdown. Их вложенность в DOM представлена таким же образом, как и для всех других контейнерных блоков, с использованием наследования стиля. Однако, кроме того, списки в DOM имеют соответствующее числовое оформление либо в виде списка, либо в виде абзаца.

Встроенные блоки

Мы используем форматирование Font при переводе Bold, Italic или Strikethrough встроенных функций markdown.

Markdown особенность Aspose.Words
Bold
**bold text**
Font.Bold = true
Italic
*italic text*
Font.Italic = true
Strikethrough
~Strikethrough text~
Font.StrikeThrough = true

Мы используем стиль символов с именем, начинающимся со слова InlineCode, за которым следует необязательная точка (.) и несколько обратных меток (`) для элемента InlineCode. Если пропущено несколько обратных меток, то по умолчанию будет использоваться одна обратная метка.

Markdown особенность Aspose.Words
InlineCode
**inline code**
Font.StyleName = "InlineCode[.][N]"
Autolink
<scheme://domain.com>
<email@domain.com>
Класс FieldHyperlink.
Link
[текст ссылки](url)
[текст ссылки](<url>"title")
[текст ссылки](url 'title')
[текст ссылки](url (title))
Класс FieldHyperlink.
Image
![](/words/java/translate-markdown-to-document-object-model/url)
![альтернативный текст](/words/java/translate-markdown-to-document-object-model/<url>"title")
![альтернативный текст](/words/java/translate-markdown-to-document-object-model/url ‘title’)
![альтернативный текст](/words/java/translate-markdown-to-document-object-model/url (title))
Класс Shape.

Контейнерные блоки

Документ представляет собой последовательность блоков-контейнеров, таких как заголовки, абзацы, списки, цитаты и другие. Блоки-контейнеры можно разделить на 2 класса: конечные блоки и сложные контейнеры. Конечные блоки могут содержать только встроенное содержимое. Сложные контейнеры, в свою очередь, могут содержать другие блоки контейнеров, включая конечные блоки.

Листовые блоки

В таблице ниже приведены примеры использования конечных блоков Markdown в Aspose.Words:

Markdown особенность Aspose.Words
HorizontalRule
-----
Это простой абзац с соответствующей формой HorizontalRule:
DocumentBuilder.InsertHorizontalRule()
ATX Heading
# H1, ## H2, ### H3…
ParagraphFormat.StyleName = "Heading N", где (1<= N <= 9).
Это переводится во встроенный стиль и должно точно соответствовать указанному шаблону (суффиксы и префиксы не допускаются).
В противном случае это будет просто обычный абзац с соответствующим стилем.
Setext Heading
=== (if Heading level 1),
--- (if Heading level 2)
ParagraphFormat.StyleName = "SetextHeading[some suffix]", основанный на стиле “Заголовок N”.
Если (N >= 2), то будет использоваться “Heading 2”, в противном случае “Heading 1”.
Допускается использование любого суффикса, но Aspose.Words импортер использует цифры “1” и “2” соответственно.
Indented Code
<br/>if ()<br/>then<br/>else<br/>```
ParagraphFormat.StyleName = "IndentedCode[some suffix]"

Сложные контейнеры

В таблице ниже приведены примеры использования Markdown сложных контейнеров в Aspose.Words:

Markdown особенность Aspose.Words
Quote
> quote,
>> nested quote
ParagraphFormat.StyleName = "Quote[some suffix]"
Суффикс в названии стиля необязателен, но Aspose.Words импортер использует упорядоченные номера 1, 2, 3, …. в случае вложенных кавычек.
Вложенность определяется с помощью унаследованных стилей.
BulletedList
- Item 1
- Item 2
- Item 2a
- Item 2b
Маркированные списки представлены с использованием нумерации абзацев:
ListFormat.ApplyBulletDefault()
Маркированные списки могут быть трех типов. Они различаются только в формате нумерации самого первого уровня. Это: ‘-’, ‘+’ или ‘*’ соответственно.
OrderedList
1. Item 1
2. Item 2
1) Item 2a
2) Item 2b
Упорядоченные списки представлены с использованием нумерации абзацев:
ListFormat.ApplyNumberDefault()
Может быть 2 маркера числового формата: ‘.’ и ‘)’. По умолчанию используется маркер ‘.’.

Таблицы

Aspose.Words также позволяет преобразовать таблицы в DOM, как показано ниже:

Markdown особенность Aspose.Words
Table
a|b
-|-
c|d
классы Table, Row и Cell.

Смотрите также