ترجمه 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 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-.NET
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Make the text Bold.
builder.Font.Bold = 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-.NET
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Make the text Italic.
builder.Font.Italic = true;
builder.Writeln("This text will be Italic");
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 شروع می شود و به دنبال آن یک نقطه اختیاری (.) و تعدادی بکتیک (`) برای ویژگی InlineCode وجود دارد. اگر تعدادی بکتیک از قلم افتاده باشد، به طور پیش فرض از یک بکتیک استفاده می شود.

ویژگی 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-.NET
// 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.Document.Styles.Add(StyleType.Character, "InlineCode");
builder.Font.Style = inlineCode1BackTicks;
builder.Writeln("Text with InlineCode style with 1 backtick");
// There will be 3 backticks.
Style inlineCode3BackTicks = builder.Document.Styles.Add(StyleType.Character, "InlineCode.3");
builder.Font.Style = 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-.NET
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
// Insert image.
Shape shape = new Shape(builder.Document, ShapeType.Image);
shape.WrapType = WrapType.Inline;
shape.ImageData.SourceFullName = "/attachment/1456/pic001.png";
shape.ImageData.Title = "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-.NET
// 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-.NET
// 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.Font.Bold = false;
builder.Font.Italic = false;
builder.ParagraphFormat.StyleName = "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 به ترتیب از اعداد “1” و “2” استفاده می کند
 // 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]”
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
Style indentedCode = builder.Document.Styles.Add(StyleType.Paragraph, "IndentedCode");
builder.ParagraphFormat.Style = indentedCode;
builder.Writeln("This is an indented code");
Fenced Code
``` c#
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-.NET
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
Style fencedCode = builder.Document.Styles.Add(StyleType.Paragraph, "FencedCode");
builder.ParagraphFormat.Style = fencedCode;
builder.Writeln("This is an fenced code");
Style fencedCodeWithInfo = builder.Document.Styles.Add(StyleType.Paragraph, "FencedCode.C#");
builder.ParagraphFormat.Style = 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، … استفاده می کند. در صورت نقل قول های تو در تو
تودرتو از طریق سبک های ارثی تعریف می شود
 // 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
لیست های گلوله شده با استفاده از شماره گذاری پاراگراف نشان داده می شوند:
ListFormat.ApplyBulletDefault()
می تواند 3 نوع لیست گلوله ای وجود داشته باشد. آنها فقط در قالب شماره گذاری سطح اول متفاوت هستند. اینها به ترتیب عبارتند از: ‘-’، ‘+’ یا ‘*’
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// Use a document builder to add content to the document.
DocumentBuilder builder = new DocumentBuilder();
builder.ListFormat.ApplyBulletDefault();
builder.ListFormat.List.ListLevels[0].NumberFormat = "-";
builder.Writeln("Item 1");
builder.Writeln("Item 2");
builder.ListFormat.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 نشانگر قالب عددی وجود داشته باشد: ‘.’ و ‘)’. نشانگر پیش فرض ‘.’ است
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"); 

جداول

Aspose.Words همچنین اجازه می دهد تا جداول را به DOM ترجمه کنید، همانطور که در زیر نشان داده شده است:

ویژگی Markdown Aspose.Words
Table
“الف
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"); 

همچنین ببینید