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.
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
Publicar un comentario