Превод Markdown до Document Object Model (DOM)

За да четете, манипулирате и променяте съдържанието и форматирането на документ, трябва да го преведете на Aspose.Words Document Object Model (DOM).

За разлика от Word документи, Markdown не съответства на DOM описани в Aspose.Words Document Object Model (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 ~ ~ inline markdown особености.

Markdown функция Aspose.Words
Bold
{1}
Font.Bold = true
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Make the text Bold.
builder.getFont().setBold(true);
builder.writeln("This text will be Bold");
Italic
*italic text*
Font.Italic = true
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Make the text Italic.
builder.getFont().setItalic(true);
builder.writeln("This text will be Italic");
Strikethrough
~Strikethrough text~
Font.StrikeThrough = true
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Make the text Strikethrough.
builder.getFont().setStrikeThrough(true);
builder.writeln("This text will be Strikethrough");

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

Markdown функция Aspose.Words
InlineCode
{1}
Font.StyleName = “InlineCode[.][N]”
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Number of backticks is missed, one backtick will be used by default.
Style inlineCode1BackTicks = builder.getDocument().getStyles().add(StyleType.CHARACTER, "InlineCode");
builder.getFont().setStyle(inlineCode1BackTicks);
builder.writeln("Text with InlineCode style with 1 backtick");
// There will be 3 backticks.
Style inlineCode3BackTicks = builder.getDocument().getStyles().add(StyleType.CHARACTER, "InlineCode.3");
builder.getFont().setStyle(inlineCode3BackTicks);
builder.writeln("Text with InlineCode style with 3 backtick");
Autolink
<scheme://domain.com>
<email@domain.com>
На FieldHyperlink Клас
Link
{1}
{2}
{3}
{4})
На FieldHyperlink Клас
Image
{1}
{2}
{3}
{4})
На Shape Клас
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Insert image.
Shape shape = new Shape(builder.getDocument(), ShapeType.IMAGE);
shape.setWrapType(WrapType.INLINE);
shape.getImageData().setSourceFullName("/attachment/1456/pic001.png");
shape.getImageData().setTitle("title");
builder.insertNode(shape);

Блокове за контейнери

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

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

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

Markdown функция Aspose.Words
HorizontalRule
-----
Това е прост параграф със съответстваща хоризонтална форма на правило:
DocumentBuilder.InsertHorizontalRule()
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Insert horizontal rule.
builder.insertHorizontalRule();
ATX Heading
# H1, ## H2, ### H3…
ParagraphFormat.StyleName = "Heading N", където (1 <= N <= 9).
Това се превежда в вграден стил и трябва да бъде точно на посочения модел (не са позволени наставки или представки).
В противен случай това ще бъде просто обикновен параграф със съответния стил
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new 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.getFont().setBold(false);
builder.getFont().setItalic(false);
builder.getParagraphFormat().setStyleName("Heading 1");
builder.writeln("This is an H1 tag");
Setext Heading
=== (ако е посочено ниво 1),
--- (ако е определено ниво 2)
ParagraphFormat.StyleName = “SetextHeading[some suffix]”, въз основа на ‘Heading N’ стил.
Ако (N >= 2) тогава ‘Heading 2’ ще се използва, в противен случай ‘Heading 1’.
Всяка наставка е позволена, но Aspose.Words Вносителят използва съответно номерата год
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
builder.getParagraphFormat().setStyleName("Heading 1");
builder.writeln("This is an H1 tag");
// Reset styles from the previous paragraph to not combine styles between paragraphs.
builder.getFont().setBold(false);
builder.getFont().setItalic(false);
Style setexHeading1 = builder.getDocument().getStyles().add(StyleType.PARAGRAPH, "SetexHeading1");
builder.getParagraphFormat().setStyle(setexHeading1);
builder.getDocument().getStyles().get("SetexHeading1").setBaseStyleName("Heading 1");
builder.writeln("Setex Heading level 1");
builder.getParagraphFormat().setStyle(builder.getDocument().getStyles().get("Heading 3"));
builder.writeln("This is an H3 tag");
// Reset styles from the previous paragraph to not combine styles between paragraphs.
builder.getFont().setBold(false);
builder.getFont().setItalic(false);
Style setexHeading2 = builder.getDocument().getStyles().add(StyleType.PARAGRAPH, "SetexHeading2");
builder.getParagraphFormat().setStyle(setexHeading2);
builder.getDocument().getStyles().get("SetexHeading2").setBaseStyleName("Heading 3");
// Setex heading level will be reset to 2 if the base paragraph has a Heading level greater than 2.
builder.writeln("Setex Heading level 2");
Indented Code ParagraphFormat.StyleName = “IndentedCode[some suffix]”
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
Style indentedCode = builder.getDocument().getStyles().add(StyleType.PARAGRAPH, "IndentedCode");
builder.getParagraphFormat().setStyle(indentedCode);
builder.writeln("This is an indented code");
Fenced Code
``` java
if ()
then
else
```
ParagraphFormat.StyleName = “FencedCode[.][info string]”
На [.] както и [info string] са по избор
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
Style fencedCode = builder.getDocument().getStyles().add(StyleType.PARAGRAPH, "FencedCode");
builder.getParagraphFormat().setStyle(fencedCode);
builder.writeln("This is an fenced code");
Style fencedCodeWithInfo = builder.getDocument().getStyles().add(StyleType.PARAGRAPH, "FencedCode.C#");
builder.getParagraphFormat().setStyle(fencedCodeWithInfo);
builder.writeln("This is a fenced code with info string");

Комплексни контейнери

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

Markdown функция Aspose.Words
Quote
> quote,
>> nested quote
ParagraphFormat.StyleName = “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-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// By default a document stores blockquote style for the first level.
builder.getParagraphFormat().setStyleName("Quote");
builder.writeln("Blockquote");
// Create styles for nested levels through style inheritance.
Style quoteLevel2 = builder.getDocument().getStyles().add(StyleType.PARAGRAPH, "Quote1");
builder.getParagraphFormat().setStyle(quoteLevel2);
builder.getDocument().getStyles().get("Quote1").setBaseStyleName("Quote");
builder.writeln("1. Nested blockquote");
BulletedList
- Item 1
- Item 2
- Item 2a
- Item 2b
Списък с куршуми се представя чрез номериране на параграф:
ListFormat.ApplyBulletDefault()
Може да има 3 вида списъци с куршуми. Те са само diff в номерационен формат на първото ниво. Това са: ‘-’, ‘+’ или ‘*’ съответно
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
builder.getListFormat().applyBulletDefault();
builder.getListFormat().getList().getListLevels().get(0).setNumberFormat("-");
builder.writeln("Item 1");
builder.writeln("Item 2");
builder.getListFormat().listIndent();
builder.writeln("Item 2a");
builder.writeln("Item 2b");
OrderedList
1. Item 1
2. Item 2
1) Item 2a
2) Item 2b
Поръчаните списъци се представят чрез номериране на параграф:
ListFormat.ApplyNumberDefault()
Може да има 2 маркери формат номер: гот. и) Подразбиращият се маркер е..
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.getListFormat().applyBulletDefault();
builder.getListFormat().getList().getListLevels().get(0).setNumberFormat(MessageFormat.format("{0}.", (char)0));
builder.getListFormat().getList().getListLevels().get(1).setNumberFormat(MessageFormat.format("{0}.", (char)1));
builder.writeln("Item 1");
builder.writeln("Item 2");
builder.getListFormat().listIndent();
builder.writeln("Item 2a");
builder.writeln("Item 2b");

Таблици

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

Markdown функция Aspose.Words
Table
год
b<br />-
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Add the first row.
builder.insertCell();
builder.writeln("a");
builder.insertCell();
builder.writeln("b");
// Add the second row.
builder.insertCell();
builder.writeln("c");
builder.insertCell();
builder.writeln("d");

Вижте също