miércoles, 1 de junio de 2016

Otro nuevo mini-proyecto: sinad

Uno de estos días se juntaron algunas condiciones que derivaron en otro nuevo proyecto. Algo pequeño, de escala similar al wxte. Es decir, una herramienta que armé para solucionarme un problema y que publico por si a alguien más le sirve o lo quiere tomar como punto de partida para otra cosa mejor. Se trata de un programita para generar una presentación (slides) en base a un archivo de texto. Lo empecé a usar para las presentaciones que hago para mis clases de programación. El gran objetivo de esta herramienta es independizar el contenido del formato o estilo visual, y creo que lo logra.

Todo empezó cuando quise utilizar los estilos de LibreOffice (LO). Me gusta muchísimo LO, es un gran ejemplo, siempre está mejorando, y fue por muchos años mi principal herramienta a la hora de hacer presentaciones. Hasta que decidí intentar usar el sistema de estilos de Impress. Lamentablemente, por mucho que me guste LO, la experiencia fue malísima.

Esta es la clase de cosas que suelo poner en las presentaciones, nada raro.
(estas capturas fueron generadas con la nueva herramienta)

Entonces decidí probar salir de lo WYSWYG y pasar a algo más "tipo" latex... pero no tan duro. Es decir, algo en lo que pueda escribir el contenido, indicarle que tome el estilo de algún template, y que la herramienta se encargue de generar lo que falta. Digo "pero no tanto" porque lo que realmente necesito es mucho más simple que el todopoderoso latex (no soy un experto en latex ni mucho menos).

Buscando encuentro que ya hay muchísimas herramientas como esta, la mayoría basada en html y bibliotecas gigantes en javascript como nodejs. No quiero escribir en html, prefiero algo más simple e independiente, como por ejemplo markdown. Hay herramientas que soportan marcados alternativos similares, pero digamos que por razones de filosofía personal que no van en este posts quería evitar nodejs, npm, y toda la maquinaria de server-side javascript y cia.

Por otro lado, recordemos que ya tengo una biblioteca C/C++ muy simple para markdown andando. Y sabiendo lo mucho que me gusta perder tiempo jugando a hacer mis herramientas, el hecho de que además era feriado, y algunas cositas más, caí en mi vicio de siempre: me puse a escribir mi propio conversor de markdown a slides html.

Hace un tiempo vi pasar esto por twitter, y me pareció una excelente excusa :)

Con lo que ya tenía, armar algo muy básico para probar fue cuestión de minutos. El mayor problema fue el esqueleto html para el slide. Ahí sí va un poquito de javascript para pasar de slide a slide. Y de html y js se muy poco. Pero luego tuve que empezar a aplicar parches en sundown. Armé un parche para definir spans con nombres de estilos arbitrarios, pero no encontré forma de que funcione dentro de un bloque de código (ningún estilo de markdown parece funcionar dentro del código). Y además, ¿cómo manejar las "animaciones" (las cosas que van apareciendo por partes)?

Esto cada vez requería más y más parches, así que corté por lo sano: dejé markdown y armé mi propio lenguaje de marcado. Mi lenguaje tiene solo 3 caracteres especiales: uno para introducir comandos, y dos para adornar partes con estilos arbitrarios. Tengo que admitir que parte de la simpleza del mecanismo la copié de tpp, una herramienta similar que parece genial (mientras no quieran agregar imágenes) pero que nunca usé (solo vi ejemplos en un video-demo en youtube).

300 lineas de código más tarde, el primer prototipo totalmente funcional estaba listo y el resultado me confirmaba que había sido una buena elección. Finalmente tengo una herramienta para tomar el contenido de un archivo de texto con este mecanismo de marcado súper simple y aún así bastante flexible. El estilo y la navegación quedan para una plantilla html+css+js que es totalmente independiente. Puedo cambiar plantilla y/o contenido sin que uno afecte al otro.

El contenido de una de las slides de la imagen anterior en mi nuevo formato.
Hay solo dos tipos de secuencias especiales: ##comando, y [[estilo:...]]

La interfaz es la linea de comandos, así que puedo tener un estilo para todas las presentaciones de una materia y, al cambiarlo, un comando simple en la terminal me actualiza todas mis clases automáticamente. Y como bonus, con la ayuda de un par de herramientas externas también puedo convertir el resultado a pdf.

Subí el proyecto a sourceforge para compartirlo, y armé una presentación a modo de introducción+ejemplo+manual+referencia all-in-one. El estilo actual sigue horrible, pero lo importante es que ahora es muy fácil de cambiar. No voy a mantener la herramienta más allá de lo que pueda necesitar agregarle para mis clases. Pero el código es simple y bastante prolijo, cualquiera puede mejorarlo. Y si alguien con más criterio que yo lo usa y se arma una mejor hoja de estilos, agradecería que la comparta.

4 comentarios:

  1. Se ve muy útil, por favor incluir compilación para windows, e interface en castellano

    ResponderEliminar
    Respuestas
    1. "No voy a mantener la herramienta más allá de lo que pueda necesitar agregarle para mis clases." Eso quiere decir que el autor no quiere invertir tiempo en incluir nada mas y si no lo hizo para Windows o en castellano no lo va a hacer. Dice explícitamente que si alguien le interesa usarlo o mejorarlo está el código para que se lo bajen y hagan las mejoras pertinentes.

      Eliminar
  2. gracias Anonimo por tu respuesta, espero que la respuesta de Pablo no sea la misma, pues me puede servir en mis clases a mi tambien y a muchos mas, las clases en la mayoria de latinoamerica son en español, ademas usamos en casi toda el mundo windows y muy pocos linux, debe ser muy facil compilarlo en windows ...

    ResponderEliminar
    Respuestas
    1. La herramienta se puede compilar en windows al primer intento, ya que no tiene dependencias para compilar. Sin embargo, solo va a funcionar el comando para generar los htmls, ya que los demás utilizan indirectamente algunas ordenes del shell u otras utilidades de gnu/linux que en windows serían diferentes. Por eso principalmente no subí un exe, porque para que ande todo le faltaría un poquito más de trabajo.

      Y el hecho de que la documentación o los argumentos de la linea de comandos estén en inglés no tiene nada que ver con el contenido de las presentaciones que genera, así que no veo que sea un problema.

      Tomé el inglés para el código porque es por lejos lo más razonable, y para la documentación para no escribir todo dos veces y abarcar lo más posible. De todas formas, lo importante de esa doc son los ejemplos, y creo se entienden igual más allá del idioma.

      Eliminar