Por supuesto, una cosa lleva a otra y se está empezando a parecer más a un procesador de texto que a otra cosa, pero ... que pasó con el editor de stylesheets?
Claro, se puede usar la solapa "Style" y editar como quieras, pero no es exactamente amigable para todo el mundo.
Así que vamos a hacer uno. Acá está el video del estado actual:
Esto es tal vez 1/20 del editor de estilos, pero por lo menos el diálogo está hecho, y la mayor parte del trabajo remanente es enganchar widgets, que es fácil con designer.
¿Qué es un bookrest? Es una cosa en la que se apoya un libro abierto.
¿Porqué Bookrest? Porque espero que algún día alguien tenga libros abiertos en Bookrest. Además termina con "rest", que es la abreviatura preferida de reStructured Text.
¿Y qué es la vista "outline"? Es un arbol interactivo con la estructura del documento.
Como siempre, veamos el video:
El procesamiento en egundo plano se hace usando el extraordinario módulo multiprocessing de la biblioteca standard de python.
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.