Преобразовать 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.strike_through = True |
|
Мы используем стиль символов с именем, которое начинается со слова InlineCode
, за которым следует необязательная точка (.)
и несколько обратных меток (`)
для элемента InlineCode
. Если пропущено несколько обратных меток, то по умолчанию будет использоваться одна обратная метка.
Markdown особенность | Aspose.Words |
---|---|
InlineCode**inline code** |
Font.style_name = "InlineCode[.][N]" |
|
|
Autolink<scheme://domain.com> <email@domain.com> |
Класс FieldHyperlink. |
|
|
Link[link text](url) [link text](<url>"title") [link text](url 'title') [link text](url (title)) |
Тот самый FieldHyperlink |
|
|
Image![](url) ![alt text](<url>"title") ![alt text](url ‘title’) ![alt text](url (title)) |
Класс Shape. |
|
Контейнерные блоки
Документ представляет собой последовательность блоков-контейнеров, таких как заголовки, абзацы, списки, цитаты и другие. Блоки-контейнеры можно разделить на 2 класса: конечные блоки и сложные контейнеры. Конечные блоки могут содержать только встроенное содержимое. Сложные контейнеры, в свою очередь, могут содержать другие блоки контейнеров, включая конечные блоки.
Листовые блоки
В таблице ниже приведены примеры использования конечных блоков Markdown в Aspose.Words:
Markdown особенность | Aspose.Words | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
HorizontalRule----- |
Это простой абзац с соответствующей формой HorizontalRule: DocumentBuilder.insert_horizontal_rule() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ATX Heading# H1, ## H2, ### H3… |
ParagraphFormat.style_name = "Heading N" , где (1<= N <= 9).Это переводится во встроенный стиль и должно точно соответствовать указанному шаблону (суффиксы и префиксы не допускаются). В противном случае это будет просто обычный абзац с соответствующим стилем. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Setext Heading=== (if Heading level 1),--- (if Heading level 2) |
ParagraphFormat.style_name = "SetextHeading[some suffix]" , основанный на стиле "Heading N" .Если (N >= 2), то будет использоваться "Heading 2" , в противном случае "Heading 1" .Допускается использование любого суффикса, но импортер Aspose.Words использует цифры “1” и “2” соответственно. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Indented Code | ParagraphFormat.style_name = "IndentedCode[some suffix]" |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Fenced Code
|
ParagraphFormat.style_name = "FencedCode[.][info string]" Значения [.] и [info string] являются необязательными. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Сложные контейнеры
В таблице ниже приведены примеры использования Markdown сложных контейнеров в Aspose.Words:
Markdown особенность | Aspose.Words |
---|---|
Quote> quote, >> nested quote |
ParagraphFormat.style_name = "Quote[some suffix]" Суффикс в названии стиля необязателен, но Aspose.Words импортер использует упорядоченные номера 1, 2, 3, …. в случае вложенных кавычек. Вложенность определяется с помощью унаследованных стилей. |
|
|
BulletedList- Item 1 - Item 2 - Item 2a - Item 2b |
Маркированные списки представлены с использованием нумерации абзацев: ListFormat.apply_bullet_default() Маркированные списки могут быть трех типов. Они различаются только в формате нумерации самого первого уровня. Это: '-' , '+' или '*' соответственно. |
|
|
OrderedList1. Item 1 2. Item 2 1) Item 2a 2) Item 2b |
Упорядоченные списки представлены с использованием нумерации абзацев: ListFormat.apply_number_default() Может быть 2 маркера числового формата: '.' и ')' . По умолчанию используется маркер '.' . |
|
Таблицы
Aspose.Words также позволяет преобразовать таблицы в DOM, как показано ниже:
Markdown особенность | Aspose.Words |
---|---|
Table а\ | b -\ | - `c\ | д' | классы Table, Row и Cell. | |
|
|