Markdown'i Document Object Model'ye (DOM) çevir

Bir belgenin içeriğini ve biçimlendirmesini programlı olarak okumak, değiştirmek ve değiştirmek için onu Aspose.Words Document Object Model’ye (DOM) çevirmeniz gerekir.

Markdown, Word belgelerinin aksine, Aspose.Words Document Object Model (DOM) makalesinde açıklanan DOM’ye uymuyor. Ancak Aspose.Words, Markdown belgelerini DOM’ye ve geriye çevirmek için kendi mekanizmasını sağlar, böylece metin biçimlendirmesi, tablolar, başlıklar ve diğerleri gibi öğeleriyle başarılı bir şekilde çalışabiliriz.

Bu makalede, çeşitli markdown özelliklerinin Aspose.Words DOM’e ve tekrar Markdown biçimine nasıl çevrilebileceği açıklanmaktadır.

Markdown – DOM – Markdown Çevirisinin Karmaşıklığı

Bu mekanizmanın ana zorluğu yalnızca Markdown’i DOM’ye çevirmek değil, aynı zamanda ters dönüşümü de yapmaktır; yani belgeyi minimum kayıpla tekrar Markdown formatına kaydetmektir. Çok düzeyli tırnak işaretleri gibi ters dönüşümün önemsiz olmadığı öğeler vardır.

Çeviri motorumuz, kullanıcıların yalnızca mevcut bir Markdown belgesindeki karmaşık öğelerle çalışmasına değil, aynı zamanda orijinal yapıyla sıfırdan Markdown formatında kendi belgelerini oluşturmalarına da olanak tanır. Çeşitli öğeler oluşturmak için bu makalenin ilerleyen kısımlarında açıklanan belirli kurallara göre belirli adlara sahip stiller kullanmanız gerekir. Bu tür stiller programlı olarak oluşturulabilir.

Ortak Çeviri İlkeleri

Satır içi bloklar için Font formatını kullanıyoruz. Aspose.Words DOM’de bir Markdown özelliğinin doğrudan karşılığı olmadığında, bazı özel kelimelerden başlayan bir isme sahip karakter stili kullanırız.

Konteyner blokları için, iç içe geçmiş Markdown özelliklerini belirtmek üzere stil mirasını kullanırız. Bu durumda iç içe geçmiş özellikler olmasa bile adı bazı özel kelimelerden başlayan paragraf stillerini de kullanıyoruz.

Madde işaretli ve sıralı listeler Markdown’te de kapsayıcı bloklardır. Yuvalanmaları, stil kalıtımını kullanan diğer tüm konteyner bloklarıyla aynı şekilde DOM’de temsil edilir. Bununla birlikte, ek olarak, DOM’deki listeler, liste stilinde veya paragraf biçiminde karşılık gelen sayı biçimlendirmesine sahiptir.

Satır İçi Bloklar

Bold, Italic veya Strikethrough satır içi markdown özelliklerini çevirirken Font formatını kullanırız.

Markdown özelliği Aspose.Words
Bold
{1}
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"); 

InlineCode özelliği için InlineCode kelimesinden başlayan bir isme ve ardından isteğe bağlı bir nokta (.)‘ye ve bir dizi geri tırnak (`)‘ine sahip bir karakter stili kullanırız. Bir dizi geri tıklama kaçırılırsa, varsayılan olarak bir geri tıklama kullanılacaktır.

Markdown özelliği Aspose.Words
InlineCode
{1}
Font.StyleName = “InlineCode[.][N]”
Autolink
<scheme://domain.com>
<email@domain.com>
FieldHyperlink sınıfı
Link
{1}
{2}
{3}
{4})
FieldHyperlink sınıfı
Image
{1}
{2}
{3}
{4})
Shape sınıfı

Konteyner Blokları

Belge, başlıklar, paragraflar, listeler, alıntılar ve diğerleri gibi bir dizi kapsayıcı bloktan oluşur. Konteyner blokları 2 sınıfa ayrılabilir: Yaprak bloklar ve Kompleks Konteynerler. Yaprak blokları yalnızca satır içi içerik içerebilir. Karmaşık kaplar ise Yaprak bloklar dahil diğer kap bloklarını içerebilir.

Yaprak Blokları

Aşağıdaki tablo Aspose.Words’de Markdown Yaprak bloklarının kullanımına ilişkin örnekleri göstermektedir:

Markdown özelliği Aspose.Words
HorizontalRule
-----
Bu, karşılık gelen HorizontalRule şekline sahip basit bir paragraftır:
DocumentBuilder.InsertHorizontalRule()
ATX Heading
# H1, ## H2, ### H3…
ParagraphFormat.StyleName = "Heading N", burada (1≤ N ≤ 9).
Bu, yerleşik bir stile dönüştürülür ve tam olarak belirtilen modelde olmalıdır (hiçbir sonek veya öneklere izin verilmez).
Aksi takdirde, karşılık gelen stile sahip sıradan bir paragraf olacaktır
Setext Heading
=== (Başlık düzeyi 1 ise),
--- (Başlık düzeyi 2 ise)
ParagraphFormat.StyleName = “SetextHeading[some suffix]”, ‘Heading N’ stilini temel alır.
(N ≥ 2) ise ‘Heading 2’ kullanılacaktır, aksi takdirde ‘Heading 1’ kullanılacaktır.
Herhangi bir son eke izin verilir, ancak Aspose.Words içe aktarıcısı sırasıyla “1” ve “2” rakamlarını kullanır
 // 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]”
[.] ve [info string] isteğe bağlıdır

Karmaşık Konteynerler

Aşağıdaki tablo Aspose.Words’de Markdown Karmaşık Kapsayıcıların kullanımına ilişkin örnekleri göstermektedir:

Markdown özelliği Aspose.Words
Quote
> quote,
>> nested quote
ParagraphFormat.StyleName = “Quote[some suffix]”
Stil adındaki son ek isteğe bağlıdır, ancak Aspose.Words içe aktarıcısı 1, 2, 3, … sıralı sayıları kullanır. iç içe geçmiş tırnaklar durumunda.
Yuvalama, devralınan stillerle tanımlanır
 // 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
Madde işaretli listeler paragraf numaralandırması kullanılarak temsil edilir:
ListFormat.ApplyBulletDefault()
3 tip madde imli liste olabilir. Bunlar yalnızca ilk düzeyin numaralandırma biçiminde farklılık gösterir. Bunlar: sırasıyla ‘-’, ‘+’ veya ‘*’
OrderedList
1. Item 1
2. Item 2
1) Item 2a
2) Item 2b
Sıralı listeler paragraf numaralandırması kullanılarak temsil edilir:
ListFormat.ApplyNumberDefault()
2 sayı biçimi işaretçisi olabilir: ‘.’ Ve ‘)’. Varsayılan işaretleyici ‘.‘dir
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"); 

Tablolar

Aspose.Words ayrıca aşağıda gösterildiği gibi tabloların DOM’ye çevrilmesine de olanak tanır:

Markdown özelliği Aspose.Words
Table
‘bir
b<br />-
 // 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"); 

Ayrıca bakınız