PowerBuilder

PowerBuilder 2025 R2: Renderizado Dinámico de Diagramas con Mermaid

AutorLuis Avilan
Publicado
PowerBuilder 2025 R2: Renderizado Dinámico de Diagramas con Mermaid, artículo de Luis Avilan
PB

0 visualizaciones

Cómo integrar Mermaid.js en tus aplicaciones PowerBuilder para generar diagramas al vuelo utilizando el control WebBrowser y Data URIs, sin depender de archivos temporales.

Detalles

Introducción

La visualización de procesos, arquitecturas y flujos de datos es fundamental en el software empresarial. Herramientas como Mermaid.js permiten definir diagramas (como flujogramas, diagramas de secuencia, Gantt, etc.) utilizando una sintaxis basada en texto simple. Integrar esta capacidad directamente en PowerBuilder enriquece la experiencia del usuario y facilita la generación dinámica de gráficos a partir de datos estructurados.

El proyecto Demo_uso_mermaid_pb demuestra cómo encapsular la lógica de Mermaid.js en un objeto no visual (NVO) y mostrar el resultado instantáneamente en un control WebBrowser. Todo esto se logra generando URIs de datos (Data URIs) codificadas en Base64, eliminando la necesidad de crear, gestionar y limpiar archivos temporales HTML en el disco del cliente.

El valor técnico de esta solución radica en su limpieza y portabilidad: el NVO construye el HTML necesario, lo convierte a Base64 y lo inyecta directamente en el control WebBrowser, garantizando una ejecución rápida y sin rastros en el sistema de archivos.

Ventana principal del demo: captura de sintaxis Mermaid y renderizado en tiempo real en el control WebBrowser.

Arquitectura del demo

El proyecto mantiene una estructura simple con responsabilidades bien definidas:

Flujo de ejecución completo

• El usuario ingresa o edita la sintaxis de texto de Mermaid en el control mle_sintaxis.

• Al presionar el botón Renderizar, la ventana captura el texto y crea una instancia de nvo_manejador_mermaid.

• Se invoca el método of_generar_archivo_html pasando el código Mermaid como argumento.

• El NVO construye un documento HTML completo en memoria, que incluye la biblioteca Mermaid desde un CDN y el código del diagrama.

• El documento HTML se convierte a un Blob con codificación UTF-8 y se codifica en Base64 utilizando CoderObject.

• El NVO devuelve una cadena con el formato Data URI: data:text/html;charset=utf-8;base64,....

• La ventana llama a la función Navigate del control wb_visor (WebBrowser) utilizando el URI generado, mostrando el gráfico instantáneamente.

Paso 1: Interfaz de usuario e interacción

En el evento clicked del botón, el código recoge el texto de entrada, invoca el NVO y se encarga de la navegación del WebBrowser. Es un proceso directo y sincrónico.

1event clicked;
2nvo_manejador_mermaid lnvo_mermaid
3String ls_codigo, ls_uri
4
5// Obtener el codigo escrito por el usuario
6ls_codigo = mle_sintaxis.Text
7
8IF Trim(ls_codigo) = "" THEN
9 MessageBox("Aviso", "Por favor ingresa la sintaxis de Mermaid.")
10 RETURN
11END IF
12
13// Instanciar el NVO y generar la URI
14lnvo_mermaid = CREATE nvo_manejador_mermaid
15ls_uri = lnvo_mermaid.of_generar_archivo_html(ls_codigo)
16DESTROY lnvo_mermaid
17
18// Renderizar en el control WebBrowser
19IF ls_uri <> "" THEN
20 wb_visor.Navigate(ls_uri)
21ELSE
22 MessageBox("Error", "No se pudo generar la URI local.")
23END IF
24end event

Paso 2: Generación del documento HTML dinámico

La magia reside en la función of_generar_archivo_html del objeto nvo_manejador_mermaid. En lugar de escribir a un archivo físico, construimos una estructura HTML en una variable String. Se incluye el script de Mermaid desde un CDN (https://cdn.jsdelivr.net/npm/mermaid@9/dist/mermaid.min.js) y se llama a mermaid.initialize() para renderizar los div con clase mermaid.

1String ls_html
2
3// 1. Definir la plantilla HTML con el CDN de Mermaid
4ls_html = "<!DOCTYPE html><html><head><meta charset='utf-8'>"
5ls_html += "<style>body { font-family: sans-serif; background-color: #f9f9f9; padding: 20px; }</style>"
6ls_html += "<script src='https://cdn.jsdelivr.net/npm/mermaid@9/dist/mermaid.min.js'></script>"
7ls_html += "<script>mermaid.initialize({startOnLoad:true});</script>"
8ls_html += "</head><body>"
9ls_html += "<h3>Diagrama Mermaid</h3>"
10ls_html += "<div class='mermaid'>" + as_codigo_mermaid + "</div>"
11ls_html += "</body></html>"

Paso 3: Conversión a Base64 y Data URI

Para evitar la manipulación de archivos temporales (que puede provocar problemas de permisos, bloqueos de antivirus o fragmentación en disco), el código transforma la cadena HTML a un objeto de tipo Blob utilizando EncodingUTF8!. A continuación, utiliza el objeto nativo CoderObject de PowerBuilder para generar una representación en Base64.

1String ls_base64
2Blob lblb_html
3CoderObject lnv_coder
4
5// 2. Codificar en Base64 para usar Data URI (evita crear archivos locales)
6lnv_coder = CREATE CoderObject
7lblb_html = Blob(ls_html, EncodingUTF8!)
8ls_base64 = lnv_coder.Base64Encode(lblb_html)
9DESTROY lnv_coder
10
11// 3. Retornar la URL de datos
12Return "data:text/html;charset=utf-8;base64," + ls_base64

Extensibilidad: Galería y personalización de temas

El NVO también ofrece una función adicional, of_generar_galeria_html, pensada para construir reportes o galerías que agrupen múltiples diagramas. Este enfoque demuestra la flexibilidad de Mermaid, inyectando hojas de estilo personalizadas para un tema oscuro, fuentes como Segoe UI e integrando iconos mediante Font Awesome.

Se configura Mermaid de forma explícita al inicializarlo, pasando variables de tema que ajustan los colores al estilo deseado, lo que permite a las aplicaciones PowerBuilder integrar diagramas de manera armónica con su propia estética visual (modo oscuro, colores corporativos).

Aplicaciones prácticas

• Visualización de Procesos: Transformar dinámicamente el estado de un registro de base de datos en un diagrama de flujo interactivo sin depender de costosos componentes de terceros.

• Documentación en línea: Mostrar relaciones entre entidades (ERD) generadas directamente a partir del esquema consultado.

• Seguimiento de Tareas: Representar cronogramas o Diagramas de Gantt calculados a partir de los DataWindows en ejecución.

• Reportes modernos: Embeber la salida Data URI en reportes para su eventual exportación como PDF enriquecido o HTML interactivo.

Conclusión

La combinación del control WebBrowser de PowerBuilder 2025 R2, CoderObject y el esquema de Data URIs abre una ventana muy poderosa de integración con bibliotecas JavaScript modernas como Mermaid.js.

Demo_uso_mermaid_pb establece una base arquitectónica sólida y reutilizable: aislando la lógica de composición HTML en un NVO, simplificamos el código de nuestras ventanas y abrimos la puerta a implementaciones mucho más avanzadas donde los gráficos se generan al vuelo basados en el estado de la aplicación, sin sacrificar rendimiento ni llenar de residuos el sistema operativo.