Vertaal Markdown Na Dokument Objek Model (DOM)

Om die inhoud en formatering van’n dokument programmaties te lees, te manipuleer en te verander, moet jy dit vertaal na die Aspose.Words Document Object Model (DOM).

In teenstelling met Word-dokumente, voldoen Markdown nie aan die DOM wat in Die Aspose.Words Dokument Voorwerp Model (DOM) artikel. Aspose.Words bied egter sy eie meganisme vir die vertaling van Markdown dokumente na DOM en terug, sodat ons suksesvol kan werk met hul elemente soos teks opmaak, tabelle, koptekste, en ander.

Hierdie artikel verduidelik hoe die verskillende markdown kenmerke vertaal kan word in Aspose.Words DOM en terug na Markdown formaat.

Kompleksiteit Van Vertaling Markdown – DOM – Markdown

Die grootste probleem van hierdie meganisme is nie net om Markdown te vertaal na DOM nie, maar ook om die omgekeerde transformasie te doen om die dokument terug te stoor na Markdown formaat met minimale verlies. Daar is elemente, soos meervlak aanhalingstekens, waarvoor die omgekeerde transformasie nie triviaal is nie.

Ons vertaling enjin kan gebruikers nie net om te werk met komplekse elemente in’n bestaande Markdown dokument, maar ook om hul eie dokument te skep in Markdown formaat met die oorspronklike struktuur van nuuts af. Om verskeie elemente te skep, moet jy style met spesifieke name gebruik volgens sekere reëls wat later in hierdie artikel beskryf word. Sulke style kan programmaties geskep word.

Algemene Vertaalbeginsels

Ons gebruik Font formatering vir inline blokke. Wanneer daar geen direkte ooreenstemming is vir’n Markdown kenmerk in Aspose.Words DOM nie, gebruik ons’n karakterstyl met’n naam wat begin met’n paar spesiale woorde.

Vir houerblokke gebruik ons styl oorerwing om geneste Markdown kenmerke aan te dui. In hierdie geval, selfs wanneer daar geen geneste kenmerke is nie, gebruik ons ook paragraafstyle met’n naam wat van’n paar spesiale woorde begin.

Bullet en bestel lyste is houer blokke in Markdown sowel. Hul nes is verteenwoordig in DOM op dieselfde manier as vir alle ander houer blokke met behulp van styl erfenis. Daarbenewens het lyste in DOM egter ooreenstemmende nommeropmaak in lysstyl of paragraafopmaak.

Inlyn Blokke

Ons gebruik Font formatering wanneer ons Bold, Italic of Strikethrough inline markdown funksies vertaal.

Markdown kenmerk Aspose.Words
Bold
**bold text**
Font.Bold = true
Italic
*italic text*
Font.Italic = true
Strikethrough
~Strikethrough text~
Font.StrikeThrough = true
 // Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();

// Make the text Strikethrough.
builder.Font.Strikethrough = true;
builder.Writeln("This text will be Strikethrough"); 

Ons gebruik’n karakter styl met’n naam wat begin van die woord InlineCode, gevolg deur’n opsionele punt (.) en’n aantal backticks (`) vir die InlineCode funksie. As’n aantal backticks gemis word, dan sal een backtick gebruik word by verstek.

Markdown kenmerk Aspose.Words
InlineCode
**inline code**
Font.StyleName = "InlineCode[.][N]"
Autolink
<scheme://domain.com>
<email@domain.com>
Die FieldHyperlink klas.
Link
[link text](url)
[link text](<url>"title")
[link text](url 'title')
[link text](url (title))
Die FieldHyperlink klas.
Image
![](url)
![alt text](<url>"title")
![alt text](url ‘title’)
![alt text](url (title))
Die Shape klas.

Houerblokke

‘n dokument is’n reeks houerblokke soos opskrifte, paragrawe, lyste, aanhalings en ander. Container blokke kan verdeel word in 2 klasse: Blaar blokke en Komplekse Houers. Blaarblokke kan slegs inline inhoud bevat. Komplekse houers kan op hul beurt ander houerblokke bevat, insluitend Blaarblokke.

Blaarblokke

Die tabel hieronder toon voorbeelde van die gebruik van Markdown Blaarblokke in Aspose.Words:

Markdown kenmerk Aspose.Words
HorizontalRule
-----
Dit is’n eenvoudige paragraaf met’n ooreenstemmende HorizontalRule vorm:
DocumentBuilder.InsertHorizontalRule()
ATX Heading
# H1, ## H2, ### H3…
ParagraphFormat.StyleName = "Heading N", waar (1<= N <= 9).
Dit word in’n ingeboude styl vertaal en moet presies van die gespesifiseerde patroon wees (geen agtervoegsels of voorvoegsels word toegelaat nie).
Andersins sal dit net’n gewone paragraaf met’n ooreenstemmende styl wees.
Setext Heading
=== (if Heading level 1),
--- (if Heading level 2)
ParagraphFormat.StyleName = "SetextHeading[some suffix]", gebaseer op "Heading N" styl.
As (n >= 2), dan sal "Heading 2" gebruik word, anders sal "Heading 1".
Enige agtervoegsel word toegelaat, maar Aspose.Words invoerder gebruik getalle “1” en “2” onderskeidelik.
 // Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();

builder.ParagraphFormat.StyleName = "Heading 1";
builder.Writeln("This is an H1 tag");

// Reset styles from the previous paragraph to not combine styles between paragraphs.
builder.Font.Bold = false;
builder.Font.Italic = false;

Style setexHeading1 = builder.Document.Styles.Add(StyleType.Paragraph, "SetextHeading1");
builder.ParagraphFormat.Style = setexHeading1;
builder.Document.Styles["SetextHeading1"].BaseStyleName = "Heading 1";
builder.Writeln("Setext Heading level 1");

builder.ParagraphFormat.Style = builder.Document.Styles["Heading 3"];
builder.Writeln("This is an H3 tag");

// Reset styles from the previous paragraph to not combine styles between paragraphs.
builder.Font.Bold = false;
builder.Font.Italic = false;

Style setexHeading2 = builder.Document.Styles.Add(StyleType.Paragraph, "SetextHeading2");
builder.ParagraphFormat.Style = setexHeading2;
builder.Document.Styles["SetextHeading2"].BaseStyleName = "Heading 3";

// Setex heading level will be reset to 2 if the base paragraph has a Heading level greater than 2.
builder.Writeln("Setext Heading level 2"); 
Indented Code ParagraphFormat.StyleName = "IndentedCode[some suffix]"
Fenced Code
``` c#
if ()
then
else
```
ParagraphFormat.StyleName = "FencedCode[.][info string]"
die [.] en [info string] is opsioneel.

Komplekse Houers

Die tabel hieronder toon voorbeelde van die gebruik van Markdown Komplekse Houers in Aspose.Words:

Markdown kenmerk Aspose.Words
Quote
> quote,
>> nested quote
ParagraphFormat.StyleName = "Quote[some suffix]"
die agtervoegsel in styl naam is opsioneel, maar Aspose.Words invoerder gebruik die geordende getalle 1, 2, 3, …. in die geval van geneste aanhalings.
Die nes word gedefinieer deur die oorgeërfde style.
 // 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.ParagraphFormat.StyleName = "Quote";
builder.Writeln("Blockquote");

// Create styles for nested levels through style inheritance.
Style quoteLevel2 = builder.Document.Styles.Add(StyleType.Paragraph, "Quote1");
builder.ParagraphFormat.Style = quoteLevel2;
builder.Document.Styles["Quote1"].BaseStyleName = "Quote";
builder.Writeln("1. Nested blockquote"); 
BulletedList
- Item 1
- Item 2
- Item 2a
- Item 2b
Bullet lyste word verteenwoordig met behulp van paragraaf nommering:
ListFormat.ApplyBulletDefault()
Daar kan 3 tipes van koeëllyste wees. Hulle is slegs diff in’n nommering formaat van die heel eerste vlak. Dit is: ‘-’, ‘+’ of ‘*’ onderskeidelik.
OrderedList
1. Item 1
2. Item 2
1) Item 2a
2) Item 2b
Geordende lyste word verteenwoordig deur paragraafnommering te gebruik:
ListFormat.ApplyNumberDefault()
Daar kan 2 getal formaat merkers wees: ‘.’ en ‘)’. Die standaard merker is ‘.’.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

builder.ListFormat.ApplyBulletDefault();
builder.ListFormat.List.ListLevels[0].NumberFormat = $"{(char) 0}.";
builder.ListFormat.List.ListLevels[1].NumberFormat = $"{(char) 1}.";

builder.Writeln("Item 1");
builder.Writeln("Item 2");

builder.ListFormat.ListIndent();

builder.Writeln("Item 2a");
builder.Writeln("Item 2b"); 

Tabelle

Aspose.Words laat ook toe om tabelle te vertaal in DOM, soos hieronder getoon:

Markdown kenmerk Aspose.Words
Table
a|b
-|-
c|d
Table, Row en Cell klasse.
 // 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"); 

Sien Ook