Перетворити 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**
get_Font()->set_Bold(true)
Italic
*italic text*
get_Font()->set_Italic(true)
Strikethrough
~Strikethrough text~
get_Font()->set_StrikeThrough(true)

Ми використовуємо стиль символів з іменем, яке починається зі слова InlineCode, за яким слідує необов’язкова точка (.) та кілька зворотних міток (`) для елемента InlineCode. Якщо пропущено кілька зворотних міток, то за замовчуванням буде використовуватися одна зворотна мітка.

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]"), заснований на стилі “Заголовок N”.
Якщо (N > = 2), то буде використано “Heading 2”, інакше “Heading 1”.
Допускається використання будь-якого суфікса, але Aspose.Words імпортер використовує цифри “1” і “2” відповідно.
Indented Code get_ParagraphFormat->set_StyleName(u"IndentedCode[some suffix]")
Fenced Code
``` c#
if ()
then
else
```
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()
марковані списки можуть бути трьох типів. Вони розрізняються тільки в форматі нумерації самого першого рівня. Це: ‘-’, ‘+’ або ‘*’ відповідно.
OrderedList
1. 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.

Дивіться також