ترجمة Markdown لتوثيق نموذج الكائن (DOM)

لقراءة محتوى المستند وتنسيقه ومعالجتها وتعديله برمجيا، تحتاج إلى ترجمته إلى نموذج كائن المستند Aspose.Words (DOM).

على عكس مستندات ورد، 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**
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. إذا فات عدد من العلامات الخلفية، فسيتم استخدام علامة خلفية واحدة افتراضيا.

Markdown ميزة Aspose.Words
InlineCode
**inline code**
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
[نص الرابط](url)
[نص الرابط](<url>"title")
[نص الرابط](url 'title')
[نص الرابط](url (title))
فئة FieldHyperlink.
Image
![](/words/java/translate-markdown-to-document-object-model/url)
![نص بديل](/words/java/translate-markdown-to-document-object-model/<url>"title")
![نص بديل](/words/java/translate-markdown-to-document-object-model/url ‘title’)
![نص بديل](/words/java/translate-markdown-to-document-object-model/url (title))
فئة 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
-----
هذه فقرة بسيطة ذات شكل 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<= ن <= 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
=== (if Heading level 1),
--- (if Heading level 2)
ParagraphFormat.StyleName = "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-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
<br/>if ()<br/>then<br/>else<br/>```
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 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 أنواع من القوائم النقطية. هم فقط فرق في تنسيق ترقيم من المستوى الأول. هذه هي: ‘-’، ‘+’ أو ‘*’ على التوالي.
// 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
a|b
-|-
c|d
Table، Row و Cell الطبقات.
// 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");

أنظر أيضا