Convertir Markdown a HTML en Java

Conversión de un documento en formato Markdown a HTML usando la biblioteca commonmark-java diseñada para tal propósito, crearemos una GUI usando JavaFX, por un lado tendremos un TextArea donde escribiremos el texto y del otro lado se mostrará el correspondiente texto convertido.

Conversión de Markdown a HTML

Para realizar la conversión nos apoyaremos en la librería commonmark-java, para utilizarla en un proyecto Gradle requerimos añadir la siguiente dependencias:

dependencies {
    def commonmarkVersion = '0.9.0'
    
    compile 'com.atlassian.commonmark:commonmark:' + commonmarkVersion
    compile 'com.atlassian.commonmark:commonmark-ext-autolink:' + commonmarkVersion
    compile 'com.atlassian.commonmark:commonmark-ext-gfm-strikethrough:' + commonmarkVersion
    compile 'com.atlassian.commonmark:commonmark-ext-gfm-tables:' + commonmarkVersion
    compile 'com.atlassian.commonmark:commonmark-ext-heading-anchor:' + commonmarkVersion
    compile 'com.atlassian.commonmark:commonmark-ext-ins:' + commonmarkVersion
    compile 'com.atlassian.commonmark:commonmark-ext-yaml-front-matter:' + commonmarkVersion
}

La GUI es simple, se compone de un contenedor SplitPane el cual maneja dos TextArea en su interior, uno para el texto markdown y otro para el html, el código para convertir lo agregaremos luego.

public class MarkdownFXMain extends Application {

    @Override
    public void start(Stage primaryStage) {

        Font font = Font.font("Consolas", 16);
        
        TextArea markdown = new TextArea();
        markdown.setFont(font);
        markdown.setWrapText(true);

        TextArea html = new TextArea();
        html.setEditable(false);
        html.setFont(font);
        html.setWrapText(true);

        markdown.textProperty().addListener((p, o, text) -> { ... });

        SplitPane root = new SplitPane(markdown, html);

        Scene scene = new Scene(root);

        primaryStage.setWidth(730);
        primaryStage.setHeight(292);
        primaryStage.setTitle("Markdown to HTML - JavaFX");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

Para programar la conversión cada vez que escribimos un nuevo código vamos a suscribirnos a la notificación de cambio de texto, usando el Listener de la propiedad textProperty() del control TextArea, el código es el siguiente:

markdown.textProperty().addListener((p, o, text) -> {

    List<Extension> ext = new ArrayList<>();
    ext.add(TablesExtension.create());

    Parser parser = Parser.builder().extensions(ext).build();
    Node root = parser.parse(text);

    HtmlRenderer htmlRenderer = HtmlRenderer.builder().extensions(ext).build();
    String htmlText = htmlRenderer.render(root);

    html.setText(htmlText);
});

Necesitamos crear un objeto Parser para el texto Markdown , usaremos el método parse() para analizar el texto y obtener la representación en memoria del mismo.

Parser parser = Parser.builder().extensions(ext).build();
Node root = parser.parse(text);

Con el objeto HtmlRenderer convertimos a HTML, para ello disponemos del método render().

HtmlRenderer htmlRenderer = HtmlRenderer.builder().extensions(ext).build();
String htmlText = htmlRenderer.render(root);

Usando el método extensions() en ambos casos activamos la extensiones, estas nos permiten extender la sintaxis del Markdown, por ejemplo, con TablesExtension podremos crear tablas con la siguiente sintaxis:

| Item     | Value | Qty   |
| :------- | ----: | :---: |
| Computer | $1600 |  5    |
| Phone    | $12   |  12   |
| Pipe     | $1    |  234  |

De este modo indicamos la alineación de las columnas, existen muchas otras extensiones, visita la documentación para mas información: http://commonmark.org/

Descargar código: markdown-to-html.zip

Comentarios

Temas relacionados

Entradas populares de este blog

Entrenar OpenCV en Detección de Objetos

Reconocimiento Facial

Detección de rostros

Conectar SQL Server con Java

Instalar OpenCV para Python en Windows