Traduire Markdown en Document Object Model (DOM)

Pour lire, manipuler et modifier par programme le contenu et le formatage d’un document, vous devez le traduire au format Aspose.Words Document Object Model (DOM).

Contrairement aux documents Word, Markdown n’est pas conforme au DOM décrit dans l’article Aspose.Words Document Object Model (DOM). Cependant, Aspose.Words fournit son propre mécanisme pour traduire les documents Markdown vers DOM et inversement, afin que nous puissions travailler avec succès avec leurs éléments tels que le formatage du texte, les tableaux, les en-têtes et autres.

Cet article explique comment les différentes fonctionnalités de markdown peuvent être traduites en Aspose.Words DOM et renvoyées au format Markdown.

Complexité de la traduction Markdown – DOM – Markdown

La principale difficulté de ce mécanisme n’est pas seulement de traduire Markdown en DOM, mais également d’effectuer la transformation inverse: sauvegarder le document au format Markdown avec une perte minimale. Il existe des éléments, comme les guillemets multiniveaux, pour lesquels la transformation inverse n’est pas anodine.

Notre moteur de traduction permet aux utilisateurs non seulement de travailler avec des éléments complexes d’un document Markdown existant, mais également de créer leur propre document au format Markdown avec la structure originale à partir de zéro. Pour créer divers éléments, vous devez utiliser des styles avec des noms spécifiques selon certaines règles décrites plus loin dans cet article. De tels styles peuvent être créés par programme.

Principes communs de traduction

Nous utilisons le formatage Font pour les blocs en ligne. Lorsqu’il n’y a pas de correspondance directe pour une fonctionnalité Markdown dans Aspose.Words DOM, nous utilisons un style de caractère avec un nom qui commence par des mots spéciaux.

Pour les blocs conteneurs, nous utilisons l’héritage de style pour désigner les fonctionnalités Markdown imbriquées. Dans ce cas, même lorsqu’il n’y a pas de fonctionnalités imbriquées, nous utilisons également des styles de paragraphe dont le nom commence par des mots spéciaux.

Les listes à puces et ordonnées sont également des blocs conteneurs dans Markdown. Leur imbrication est représentée dans DOM de la même manière que pour tous les autres blocs conteneurs utilisant l’héritage de style. Cependant, en outre, les listes dans DOM ont un formatage de nombres correspondant, soit en style de liste, soit en format de paragraphe.

Blocs en ligne

Nous utilisons le formatage Font lors de la traduction des fonctionnalités Bold, Italic ou Strikethrough markdown en ligne.

Fonctionnalité Markdown 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"); 

Nous utilisons un style de caractère avec un nom qui commence par le mot InlineCode, suivi d’un point (.) facultatif et d’un certain nombre de backticks (`) pour la fonctionnalité InlineCode. Si un certain nombre de backticks sont manqués, alors un backtick sera utilisé par défaut.

Fonctionnalité Markdown Aspose.Words
InlineCode
{1}
Font.StyleName = “InlineCode[.][N]”
Autolink
<scheme://domain.com>
<email@domain.com>
La classe FieldHyperlink
Link
{1}
{2}
{3}
{4})
La classe FieldHyperlink
Image
{1}
{2}
{3}
{4})
La classe Shape

Blocs de conteneurs

Un document est une séquence de blocs conteneurs tels que des titres, des paragraphes, des listes, des citations et autres. Les blocs conteneurs peuvent être divisés en 2 classes: les blocs feuilles et les conteneurs complexes. Les blocs feuilles ne peuvent contenir que du contenu en ligne. Les conteneurs complexes, à leur tour, peuvent contenir d’autres blocs de conteneurs, notamment des blocs Leaf.

Blocs de feuilles

Le tableau ci-dessous montre des exemples d’utilisation des blocs Markdown Leaf dans Aspose.Words:

Fonctionnalité Markdown Aspose.Words
HorizontalRule
-----
Il s’agit d’un simple paragraphe avec une forme HorizontalRule correspondante:
DocumentBuilder.InsertHorizontalRule()
ATX Heading
# H1, ## H2, ### H3…
ParagraphFormat.StyleName = "Heading N", où (1≤ N ≤ 9).
Ceci est traduit dans un style intégré et doit être exactement du modèle spécifié (aucun suffixe ou préfixe n’est autorisé).
Sinon, ce sera juste un paragraphe normal avec un style correspondant
Setext Heading
=== (si titre niveau 1),
--- (si titre niveau 2)
ParagraphFormat.StyleName = “SetextHeading[some suffix]”, basé sur le style ‘Heading N’.
Si (N ≥ 2), alors ‘Heading 2’ sera utilisé, sinon ‘Heading 1’.
Tout suffixe est autorisé, mais l’importateur Aspose.Words utilise respectivement les nombres “1” et “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]”
Fenced Code
``` c#
if ()
then
else
```
ParagraphFormat.StyleName = “FencedCode[.][info string]”
Le [.] et le [info string] sont facultatifs

Conteneurs complexes

Le tableau ci-dessous montre des exemples d’utilisation de conteneurs complexes Markdown dans Aspose.Words:

Fonctionnalité Markdown Aspose.Words
Quote
> quote,
>> nested quote
ParagraphFormat.StyleName = “Quote[some suffix]”
Le suffixe dans le nom du style est facultatif, mais l’importateur Aspose.Words utilise les nombres ordonnés 1, 2, 3,…. en cas de guillemets imbriqués.
L’imbrication est définie via les styles hérités
 // 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
Les listes à puces sont représentées à l’aide de la numérotation des paragraphes:
ListFormat.ApplyBulletDefault()
Il peut y avoir 3 types de listes à puces. Ils ne diffèrent que par un format de numérotation du tout premier niveau. Ce sont respectivement: ‘-’, ‘+’ ou ‘*’
OrderedList
1. Item 1
2. Item 2
1) Item 2a
2) Item 2b
Les listes ordonnées sont représentées à l’aide de la numérotation des paragraphes:
ListFormat.ApplyNumberDefault()
Il peut y avoir 2 marqueurs de format numérique: ‘.’ et ‘)’. Le marqueur par défaut est ‘.’
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"); 

les tables

Aspose.Words permet également de traduire des tableaux en DOM, comme indiqué ci-dessous:

Fonctionnalité Markdown Aspose.Words
Table
un | b
-|-
c|d
Classes Table, Row et Cell
 // 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"); 

Voir également