Hace un día o dos, mi editor empezó a mostrar una barra amarilla resaltando la línea actual.
Entonces pensé... ¿no sería más útil tener una barra similar que te siga en el PDF?
De esa manera, cuando estás en una determinada línea, inmediatamente se puede ver adonde estás en la salida. Lindo, no?
Acá hay un video mostrándolo:
Lamentablemente no es perfecto, y probablemente nunca lo sea por culpa de algunas limitaciones de docutils, pero está bastante bueno!
Éste es un video de como se ve ahora, después de afeitar algunos yaks (perdón por mi inglés, Escribo mucho inglés, pero nunca hablo inglés. Y perdón por no hacer una versión en castellano):
Como pueden ver, la aplicación básica está más o menos completa, aún si le faltan las "amenidades" que harían que valga la pena usarla (como buscar? Y guardar? ;-)
Tiene un gran problema: no puedo publicarla todavía.
¿Porqué? Porque necesito usar poppler desde PyQt, y el código que encontré para hacerlo no tiene licencia (ver el código).
Estoy trtando de contactar al autor (Rajeev J Sebastian), así que tal vez haya novedades pronto.
Apenas se aclare ese punto, el widget PDF es un post en sí mismo, porque está bueno, si lo puedo decir yo mismo.
EXTRA: Ese binding ahora está bajo licencia MIT, gracias a Rajeev Sebastian!
Para mi segunda pila de pelo de yak: convertir QPlainTextEdit en un widget de edición aceptable para programadores.
A medida que el trabajo avanzaba en mi editor de rst2pdf (de paso: necesito un nombre!), se volvió evidente que la parte de la interface en la que el usuario pasa más tiempo es un simple par de editores de texto.
Qt viene con un widget para eso, por supuesto, llamado QPlainTextEdit. Sin embargo, es muy, muy malo para prpgramadores.
Éstos son mis requerimientos mínimos:
Resaltado de sintaxis para dos lenguajes: restructured text y javascript. Este yak ya está afeitado.
Números de línea.
Resaltar la línea actual.
Resaltar errores cuando tiene sentido (por ejemplo, en el stylesheet)
Una forma de lograr esto sería descartar QPlainTextEdit y usar QSciScintilla que es la base para el editor de código en eric y (en otra versión) para scite.
Sin embargo, sufro un bug en QSciScintilla, donde no puedo escribir ¡caracteres con acento!. Sin eso el castellano es imposible, y el bug parece tener como dos años, así que ... no va.
¿Entonces, logré esos features? ¡Sí!
Acá está el video (sí, me volví adicto a hacer estos, ya que qt-reordmydesktop lo hace demasiado fácil ;-):
La base para esto es el ejemplo Code Editor que viene con Qt mismo, más un poquito de trabajo.
Primero, porté Code Editor de C++ a Python, que fué fácil y llevó solo unos minutos. Eso se encargó de los puntos 2 y 3.
Entonces enchufé el resaltado de sintaxis, que era el punto 1.
¿Y que pasó con la validación de javascript en tiempo real? Fácil usando simplejson. Hay que correr esto cada vez que se quiere validar (yo lo corro en cada tecla que se presiona).
Hay que reemplazar self.ui.style.toPlainText por el nombre de tu widget, por supuesto:
defvalidateStyle(self):style=unicode(self.ui.style.toPlainText())#no point in validating an empty stringifnotstyle.strip():returnpos=Nonetry:json.loads(style)exceptValueError,e:s=str(e)printsifs=='No JSON object could be decoded':pos=0elifs.startswith('Expecting '):pos=int(s.split(' ')[-1][:-1])else:print'UNKNOWN ERROR'# This makes a red bar appear in the line# containing position posself.ui.style.highlightError(pos)
highlightError(pos) almacena pos en el Code Editor, qie dibuja una barra roja en esa linea, de la misma forma que resalta la linea actual.
Empecé tratando de hacer un editor de hojas de estilo para rst2pdf (ver aquí).
Una cosa lleva a otra, y ahora tengo por lo menos tres mini-proyectos interesantes por culpa de ése.
El de hoy: (ab)usar pygments como resaltador genérico de sintaxis en una interface Qt.
¿Porqué pygments? Porque es el único resaltador de reStructured Text que encontré. ¡Eso es probablemente porque el reSt es muy difícil de resaltar!
Hasta adonde sé esta es la primera vez que alguien hizo andar pygments para esto, en una ventana editable. Y hay muy buenos motivos para eso:
Es puro python, tal vez uno espera que sea demasiado lento.
No hace lexing parcial ni progresivo, hay que "lexear" todo el texto junto (de nuevo, eso puede parecer muy lento)
Tiene una API orientada a archivos, genera un archivo con todo el texto formateado adentro, y para esta clase de uso se necesita acceder a datos "del medio" solamente.
Y, por supuesto, resulta que funciona bastante bien, como se ve en este video:
Lección del día: las computadoras ahora son rápidas.
También puede llegar a ser útil, por ejemplo, como una forma de probar cambios de stylesheet, haciendo rst2pdf más fácil de usar.
Después de un par de horas de hacking tranquilo... no está nada mal. Implementé el (rústico) visor PDF usando un binding python/poppler/Qt que encontré en google, la interface es PyQt.
Acá está el video:
Una nota: el video lo grabé usado qt-recordmydesktop, y ese programa es genial. Fue facilísimo de hacer.
No creo que funcione muy bien con documentos largos, pero el manual de rst2pdf (unas 25 páginas) se procesa en 5 segundos.