Преведи 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)
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto builder = System::MakeObject<DocumentBuilder>();
// Make the text Bold.
builder->get_Font()->set_Bold(true);
builder->Writeln(u"This text will be Bold");
Italic
*italic text*
get_Font()->set_Italic(true)
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto builder = System::MakeObject<DocumentBuilder>();
// Make the text Italic.
builder->get_Font()->set_Italic(true);
builder->Writeln(u"This text will be Italic");
Strikethrough
~Strikethrough text~
get_Font()->set_StrikeThrough(true)
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto builder = System::MakeObject<DocumentBuilder>();
// Make the text Strikethrough.
builder->get_Font()->set_StrikeThrough(true);
builder->Writeln(u"This text will be Strikethrough");

Използваме символен стил с име, което започва от думата InlineCode, последвано от незадължителна точка (.) и няколко бекстека (`) за функцията InlineCode. Ако се пропуснат няколко беклека, тогава по подразбиране ще се използва един беклик.

Markdown функция Aspose.Words
InlineCode
**inline code**
get_Font()->set_StyleName(u"InlineCode[.][N]")
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto builder = System::MakeObject<DocumentBuilder>();
// Number of backticks is missed, one backtick will be used by default.
auto inlineCode1BackTicks = builder->get_Document()->get_Styles->Add(StyleType::Character, u"InlineCode");
builder->get_Font()->set_Style(inlineCode1BackTicks);
builder->Writeln(u"Text with InlineCode style with 1 backtick");
// There will be 3 backticks.
auto inlineCode3BackTicks = builder->get_Document()->get_Styles->Add(StyleType::Character, u"InlineCode.3");
builder->get_Font()->set_Style(inlineCode3BackTicks);
builder->Writeln(u"Text with InlineCode style with 3 backtick");
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 клас.
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Insert image.
auto shape = System::MakeObject<Shape>(doc, ShapeType::Image);
shape->set_WrapType(WrapType::Inline);
shape->get_ImageData()->set_SourceFullName(u"/attachment/1456/pic001.png");
shape->get_ImageData()->set_Title(u"title");
builder->InsertNode(shape);

Контейнерни Блокове

Документът е поредица от контейнерни блокове, като например заглавия, параграфи, списъци, цитати и други. Контейнерните блокове могат да бъдат разделени на 2 класа: листни блокове и сложни контейнери. Листните блокове могат да съдържат само вградено съдържание. Сложните контейнери, от своя страна, могат да съдържат други контейнерни блокове, включително листни блокове.

Блокове Листа

Таблицата по-долу показва примери за използване на Markdown листни блокове в Aspose.Words:

Markdown функция Aspose.Words
HorizontalRule
-----
Това е прост абзац със съответстваща форма HorizontalRule:
DocumentBuilder::InsertHorizontalRule()
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto builder = System::MakeObject<DocumentBuilder>();
// Insert horizontal rule.
builder->InsertHorizontalRule();
ATX Heading
# H1, ## H2, ### H3…
get_ParagraphFormat()->set_StyleName(u"Heading N"), където (1<= Н <= 9).
Това е преведено във вграден стил и трябва да бъде точно на посочения модел (не се допускат наставки или представки).
В противен случай това ще бъде просто обикновен параграф със съответен стил.
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto builder = System::MakeObject<DocumentBuilder>();
// By default Heading styles in Word may have Bold and Italic formatting.
// If we do not want to be emphasized, set these properties explicitly to false.
builder->get_Font()->set_Bold(false);
builder->get_Font()->set_Italic(false);
builder->get_ParagraphFormat()->set_StyleName(u"Heading 1");
builder->Writeln(u"This is an H1 tag");
Setext Heading
=== (if Heading level 1),
--- (if Heading level 2)
get_ParagraphFormat->set_StyleName(u"SetextHeading[some suffix]"), въз основа на ‘заглавие и’ стил.
Ако (Н > = 2), тогава ще се използваHeading 2', в противен случай' Heading 1'.
Допуска се всяка наставка, но Aspose.Words вносителят използва съответно номера “1” и “2”.
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
builder->get_ParagraphFormat()->set_StyleName(u"Heading 1");
builder->Writeln(u"This is an H1 tag");
// Reset styles from the previous paragraph to not combine styles between paragraphs.
builder->get_Font()->set_Bold(false);
builder->get_Font()->set_Italic(false);
auto setexHeading1 = builder->get_Document()->get_Styles->Add(StyleType::Paragraph, u"SetextHeading1");
builder->get_ParagraphFormat()->set_Style(setexHeading1);
doc->get_Styles()->idx_get(u"SetextHeading1")->set_BaseStyleName(u"Heading 1");
builder->Writeln(u"Setext Heading level 1");
builder->get_ParagraphFormat()->set_Style(doc->get_Styles()->idx_get(u"Heading 3"));
builder->Writeln(u"This is an H3 tag");
// Reset styles from the previous paragraph to not combine styles between paragraphs.
builder->get_Font()->set_Bold(false);
builder->get_Font()->set_Italic(false);
auto setexHeading2 = builder->get_Document()->get_Styles->Add(StyleType::Paragraph, u"SetextHeading2");
builder->get_ParagraphFormat()->set_Style(setexHeading2);
doc->get_Styles()->idx_get(u"SetextHeading2")->set_BaseStyleName(u"Heading 3");
// Setex heading level will be reset to 2 if the base paragraph has a Heading level greater than 2.
builder->Writeln(u"Setext Heading level 2");
Indented Code get_ParagraphFormat->set_StyleName(u"IndentedCode[some suffix]")
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
auto indentedCode = builder->get_Document()->get_Styles->Add(StyleType::Paragraph, u"IndentedCode");
builder->get_ParagraphFormat()->set_StyleName(indentedCode);
builder->Writeln(u"This is an indented code");
Fenced Code
``` c#
if ()
then
else
```
get_ParagraphFormat()->set_StyleName(u"FencedCode[.][info string]")
[.] и [info string] са незадължителни.
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
auto fencedCode = builder->get_Document()->get_Styles->Add(StyleType::Paragraph, u"FencedCode");
builder->get_ParagraphFormat()->set_StyleName(fencedCode);
builder->Writeln(u"This is an fenced code");
auto fencedCodeWithInfo = builder->get_Document()->get_Styles->Add(StyleType::Paragraph, u"FencedCode.C#");
builder->get_ParagraphFormat()->set_StyleName(fencedCodeWithInfo);
builder->Writeln(u"This is a fenced code with 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, …. в случай на вложени цитати.
Гнезденето се определя чрез наследените стилове.
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// By default a document stores blockquote style for the first level.
builder->get_ParagraphFormat()->set_StyleName(u"Quote");
builder->Writeln(u"Blockquote");
// Create styles for nested levels through style inheritance.
auto quoteLevel2 = builder->get_Document()->get_Styles->Add(StyleType::Paragraph, u"Quote1");
builder->get_ParagraphFormat()->set_StyleName(quoteLevel2);
builder->get_Document()->get_Styles->idx_get(u"Quote1")->set_BaseStyleName(u"Quote");
builder->Writeln(u"1. Nested blockquote");
BulletedList
- Item 1
- Item 2
- Item 2a
- Item 2b
Списъците с водещи символи са представени с номериране на абзаци:
get_ListFormat()->ApplyBulletDefault()
може да има 3 вида списъци с водещи символи. Те са само различие в номериращ формат на първото ниво. Те са: ‘-’, ‘+’ или ‘*’ съответно.
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto builder = System::MakeObject<DocumentBuilder>();
builder->get_ListFormat()->ApplyBulletDefault();
builder->get_ListFormat()->get_List()->get_ListLevels()->idx_get(0)->set_NumberFormat(u"-");
builder->Writeln(u"Item 1");
builder->Writeln(u"Item 2");
builder->get_ListFormat()->ListIndent();
builder->Writeln(u"Item 2a");
builder->Writeln(u"Item 2b");
OrderedList
1. Item 1
2. Item 2
1) Item 2a
2) Item 2b
Подредените списъци се представят с номериране на абзаци:
get_ListFormat()->ApplyNumberDefault()
може да има 2 числови формат маркери: ‘.’ и ‘)’. Маркерът по подразбиране е ‘.’.
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto builder = System::MakeObject<DocumentBuilder>();
builder->get_ListFormat()->ApplyBulletDefault();
builder->get_ListFormat()->get_List()->get_ListLevels()->idx_get(0)->set_NumberFormat(System::String::Format(u"{0}.", (char16_t)0));
builder->get_ListFormat()->get_List()->get_ListLevels()->idx_get(1)->set_NumberFormat(System::String::Format(u"{0}.", (char16_t)1));
builder->Writeln(u"Item 1");
builder->Writeln(u"Item 2");
builder->get_ListFormat()->ListIndent();
builder->Writeln(u"Item 2a");
builder->Writeln(u"Item 2b");

Маси

Aspose.Words също така позволява да се преведат таблици в DOM, както е показано по-долу:

Markdown функция Aspose.Words
Table
a|b
-|-
c|d
Класове Table, Row и Cell.
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Use a document builder to add content to the document.
auto builder = System::MakeObject<DocumentBuilder>();
// Add the first row.
builder->InsertCell();
builder->Writeln(u"a");
builder->InsertCell();
builder->Writeln(u"b");
// Add the second row.
builder->InsertCell();
builder->Writeln(u"c");
builder->InsertCell();
builder->Writeln(u"d");

Вижте Също