Traducir Markdown a Modelo de Objetos de Documento (DOM)

Para leer, manipular y modificar mediante programación el contenido y el formato de un documento, debe traducirlo al Modelo de objetos de documento Aspose.Words (DOM).

A diferencia de los documentos de Word, Markdown no se ajusta a DOM descrito en el Aspose.Words Modelo de objetos de documento (DOM) artículo. Sin embargo, Aspose.Words proporciona su propio mecanismo para traducir Markdown documentos a DOM y viceversa, de modo que podamos trabajar con éxito con sus elementos, como formato de texto, tablas, encabezados y otros.

Este artículo explica cómo las diversas funciones markdown se pueden traducir al formato Aspose.Words DOM y de regreso al Markdown.

Complejidad de la Traducción Markdown – DOM – Markdown

La principal dificultad de este mecanismo no es solo traducir Markdown a DOM, sino también realizar la transformación inversa: guardar el documento nuevamente en formato Markdown con una pérdida mínima. Hay elementos, como las cotizaciones multinivel, para los que la transformación inversa no es trivial.

Nuestro motor de traducción permite a los usuarios no solo trabajar con elementos complejos en un documento Markdown existente, sino también crear su propio documento en formato Markdown con la estructura original desde cero. Para crear varios elementos, debe usar estilos con nombres específicos de acuerdo con ciertas reglas que se describen más adelante en este artículo. Dichos estilos se pueden crear mediante programación.

Principios Comunes de Traducción

Usamos formato Font para bloques en línea. Cuando no hay correspondencia directa para una característica Markdown en Aspose.Words DOM, usamos un estilo de carácter con un nombre que comienza con algunas palabras especiales.

Para los bloques contenedores, usamos herencia de estilo para denotar características Markdown anidadas. En este caso, incluso cuando no hay entidades anidadas, también usamos estilos de párrafo con un nombre que comienza con algunas palabras especiales.

Las listas ordenadas y con viñetas también son bloques contenedores en Markdown. Su anidamiento se representa en DOM de la misma manera que para todos los demás bloques contenedores que usan herencia de estilo. Sin embargo, además, las listas en DOM tienen un formato de número correspondiente en estilo de lista o formato de párrafo.

Bloques en Línea

Usamos el formato Font al traducir Bold, Italic o Strikethrough funciones markdown en línea.

Markdown característica 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");

Usamos un estilo de carácter con un nombre que comienza con la palabra InlineCode, seguido de un punto opcional (.) y una serie de comillas invertidas (`) para la función InlineCode. Si se omite un número de comillas invertidas, se utilizará una comilla invertida de forma predeterminada.

Markdown característica 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>
La clase FieldHyperlink.
Link
[texto del enlace](url)
[texto del enlace](<url>"title")
[texto del enlace](url 'title')
[texto del enlace](url (title))
La clase FieldHyperlink.
Image
![](/words/java/translate-markdown-to-document-object-model/url)
![texto alternativo](/words/java/translate-markdown-to-document-object-model/<url>"title")
![texto alternativo](/words/java/translate-markdown-to-document-object-model/url ‘title’)
![texto alternativo](/words/java/translate-markdown-to-document-object-model/url (title))
La clase 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);

Bloques de Contenedores

Un documento es una secuencia de bloques contenedores como encabezados, párrafos, listas, citas y otros. Los bloques contenedores se pueden dividir en 2 clases: Bloques de hojas y Contenedores complejos. Los bloques hoja solo pueden contener contenido en línea. Los recipientes complejos, a su vez, pueden contener otros bloques de recipientes, incluidos bloques de hojas.

Bloques de Hojas

La siguiente tabla muestra ejemplos del uso de Markdown Bloques hoja en Aspose.Words:

Markdown característica Aspose.Words
HorizontalRule
-----
Este es un párrafo simple con la forma HorizontalRule correspondiente:
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", donde (1<= N <= 9).
Esto se traduce en un estilo incorporado y debe ser exactamente del patrón especificado (no se permiten sufijos ni prefijos).
De lo contrario, será solo un párrafo normal con el estilo correspondiente.
// 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]", basado en el estilo' Encabezado N'.
Si (N > = 2), entonces se usará ‘Heading 2’, de lo contrario ‘Heading 1’.
Se permite cualquier sufijo, pero el importador Aspose.Words usa los números “1” y “2” respectivamente.
// 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");

Contenedores Complejos

La siguiente tabla muestra ejemplos del uso de Markdown Contenedores complejos en Aspose.Words:

Markdown característica Aspose.Words
Quote
> quote,
>> nested quote
ParagraphFormat.StyleName = "Quote[some suffix]"
El sufijo en el nombre del estilo es opcional, pero el importador Aspose.Words usa los números ordenados 1, 2, 3, …. en caso de citas anidadas.
El anidamiento se define a través de los estilos heredados.
// 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
Las listas con viñetas se representan mediante numeración de párrafos:
ListFormat.ApplyBulletDefault()
Puede haber 3 tipos de listas con viñetas. Solo difieren en un formato de numeración del primer nivel. Estos son: ‘-’, ‘+’ o ‘*’ respectivamente.
// 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
Las listas ordenadas se representan mediante numeración de párrafos:
ListFormat.ApplyNumberDefault()
Puede haber 2 marcadores de formato numérico: ‘.’ y ‘)’. El marcador predeterminado es ‘.’.
// 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");

Tablas

Aspose.Words también permite traducir tablas a DOM, como se muestra a continuación:

Markdown característica Aspose.Words
Table
a|b
-|-
c|d
Table, Row y Cell clases.
// 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");

Véase También