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

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV

Analizador Léxico