Перевести 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 или Зачеркнутых встроенных функций markdown.
Markdown особенность | Aspose.Words |
---|---|
Bold**bold text** |
get_Font()->set_Bold(true) |
Italic*italic text* |
get_Font()->set_Italic(true) |
Strikethrough~Strikethrough text~ |
get_Font()->set_StrikeThrough(true) |
Мы используем стиль символов с названием, которое начинается со слова InlineCode
, за которым следует необязательная точка (.)
и несколько обратных знаков (`)
for the ` Функция встроенного кода. Если пропущено несколько обратных ссылок, то по умолчанию будет использоваться одна обратная ссылка.
Markdown особенность | Aspose.Words |
---|---|
InlineCode**inline code** |
get_Font()->set_StyleName(u"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::InsertHorizontalRule() |
ATX Heading# H1, ## H2, ### H3… |
get_ParagraphFormat()->set_StyleName(u"Heading N") , где (1<= N <= 9).Это переводится во встроенный стиль и должно точно соответствовать указанному шаблону (суффиксы и префиксы не допускаются). В противном случае это будет просто обычный абзац с соответствующим стилем. |
Setext Heading=== (if Heading level 1),--- (if Heading level 2) |
get_ParagraphFormat->set_StyleName(u"SetextHeading[some suffix]") , основанный на стиле "Heading N" .Если (N >= 2), то будет использовано "Heading 2" , в противном случае "Heading 1" .Допускается использование любого суффикса, но импортер Aspose.Words использует цифры “1” и “2” соответственно. |
Indented Code | get_ParagraphFormat->set_StyleName(u"IndentedCode[some suffix]") |
Fenced Code
|
get_ParagraphFormat()->set_StyleName(u"FencedCode[.][info string]") Значения [.] и [info string] являются необязательными. |
Сложные контейнеры
В таблице ниже приведены примеры использования Markdown сложных контейнеров в Aspose.Words:
Markdown особенность | Aspose.Words |
---|---|
Quote> quote, >> nested quote |
get_ParagraphFormat()->set_StyleName(u"Quote[some suffix]") Суффикс в названии стиля необязателен, но Aspose.Words импортер использует упорядоченные номера 1, 2, 3, …. в случае вложенных кавычек. Вложенность определяется с помощью унаследованных стилей. |
BulletedList- Item 1 - Item 2 - Item 2a - Item 2b |
Маркированные списки представлены с использованием нумерации абзацев:get_ListFormat()->ApplyBulletDefault() Маркированных списков может быть 3 типов. Они различаются только в формате нумерации самого первого уровня. Это: ‘-’ , ‘+’ или ‘*’ соответственно. |
OrderedList1. Item 1 2. Item 2 1) Item 2a 2) Item 2b |
Упорядоченные списки представлены с использованием нумерации абзацев:get_ListFormat()->ApplyNumberDefault() Могут быть маркеры числового формата 2: ‘.’ и ‘)’. По умолчанию используется маркер ‘.’. |
Таблицы
Aspose.Words также позволяет переводить таблицы в DOM, как показано ниже:
Markdown особенность | Aspose.Words |
---|---|
Table a|b -|- c|d |
классы Table, Row и Cell. |