Siguiente: Método de trabajo Superior: RTHC: Libertad para el Anterior: El programa conversor |
Para alcanzar la pretensión inicial de máxima reutilización, las clases que ocultaran la complejidad del RTF tenían que ser fáciles de usar, a la vez que reflejaran fielmente la estructura de los documentos RTF. Y además, pretendíamos que libFreeRTF fuera fácil de extender y modificar.
Hemos utilizado patrones de diseño comunes [3], explotado los genéricos estándares de C++ (STL) [4], y hemos empleado la notación UML [5] para representar la arquitectura. Este diseño basado en objetos y patrones comunes garantiza legibilidad y un corto tiempo de aprendizaje para un desarrollador que se enfrente por vez primera con RTHC.
libFreeRTF es básicamente un conjunto de clases para almacenar y construir un árbol que representa a un documento RTF. El árbol pretende abstraer la estructura de RTF, convirtiendo cada palabra de control en un nodo. Algunos elementos de RTF se resisten a la abstracción, como ocurre con las referencias cruzadas y las listas.
En los casos en los que la complejidad nos prohibía encapsular ciertas propiedades en nodos específicos, se optó por documentar en la medida de lo posible3 esos casos, para ayudar al programador.
El árbol RTF tiene que ser sencillo de recorrer, y las operaciones efectuadas en los recorridos han de ser independientes de la estructura interna del árbol, ya que se debe permitir cualquier recorrido imaginable. Esto se soluciona con el patrón de diseño <<visitante>>, que consiste en definir por un lado un conjunto de operaciones y por otro los tipos de nodos que puede tener el árbol. Estos dos conjuntos son en realidad jerarquías de clases, en los que cada una es una operación o un tipo de nodo.
En definitiva, la arquitectura del componente libFreeRTF queda como una clase RTFTree que almacena en memoria un documento en formato RTF, una clase RTFParser que construye árboles RTFTree dado un fichero de texto enriquecido, una jerarquía de clases RTFContents, compuesta por las clases de nodos que se pueden guardar en un árbol RTFTree, y una jerarquía de visitantes RTFVisitor, que llevan a cabo cierta operación sobre el árbol, como mostrar su estructura, contar el número de caracteres, traducirlo a otro formato, etc.
La clase RTFTree es la que guarda todo el contenido de un documento RTF, y da una interfaz limpia tanto para construirlo (cosa que hará RTFParser) como para recorrerlo (el trabajo de los descendientes de RTFVisitor). Básicamente, se compone de la información encontrada en la cabecera, que afecta a todo el documento, y de un puntero de tipo RTFContents*, que apunta a los nodos del árbol.
Es la jerarquía de clases de los entes que pueden formar parte de un documento RTF: desde RTFText para texto llano, hasta RTFRow para guardar filas de una tabla, o RTFSpecialChar para los símbolos dados como valores hexadecimales de cierta tabla de caracteres. Los métodos encontrados en esta clase están orientados a la construcción del árbol y a su recorrido.
Esta clase es responsable de recorrer el fichero RTF para codificar en un árbol toda la información. Ofrece un método público para construir árboles RTFTree a partir de un flujo de datos del que leer un documento RTF (newTree). Esta clase se apoya en un analizador léxico, generado con flex++, que es quien realmente recibe el flujo de datos y devuelve los diferentes símbolos léxicos.
Fue en la implementación de esta clase donde se encontraron todos los fallos de la documentación, las omisiones, y demás dificultades relacionadas directamente con las especificaciones RTF.
Es la jerarquía que permite producir resultados una vez que disponemos de un árbol RTF. La clase raíz, RTFVisitor, define operaciones virtuales que manipulan (visitan) cada uno de los distintos tipos de nodos del árbol, por ejemplo visitRTFText(), visitRTFStar(), visitRTFPard(), etc. El programador puede definir clases derivadas de RTFVisitor que implementen comportamientos diferentes para estas operaciones y, en consecuencia, toda la variedad imaginable de aplicaciones sobre un árbol RTF: generar HTML, descubrir errores, extraer estadísticas...
La biblioteca libFreeRTF proporciona tres clases visitantes: RTFDebugVisitor, que muestra una representación en texto de la estructura del árbol; RTFPlainTextVisitor, que traduce a texto sin formato el documento original; RTFHTMLVisitor, que traduce a HTML y es el corazón de la aplicación RTHC.
En principio, todas las clases visitantes deberían ser adaptadas si se añade un nuevo tipo de nodo a RTFTree, pero tal y como está implementado, sólo hace falta reescribir código en la clase base, proporcionando una nueva operación con un comportamiento por defecto. Con ello se aumenta la reusabilidad de la biblioteca.
En esta línea, no debería ser difícil implementar un conversor a la emergente norma XML. Por su similitud con HTML, se puede aprovechar gran parte de la clase RTFHTMLVisitor.
Otras aplicaciones que pueden resolverse con esta técnica son: un programa que construya índices o tablas de contenido; utilidades de línea de órdenes que devuelvan estadísticas de los documentos. Incluso es planteable hacer un conversor de RTF a RTF: dado que los RTF generados por el propio Word de Microsoft contienen bastante información redundante, se puede hacer un visitante que <<embellezca>> el RTF original y lo convierta en algo más manejable.
El formato RTF puede estar sujeto a modificaciones a capricho de la empresa propietaria. El proyecto RTHC trata de facilitar la adaptación a estos cambios por dos vías: primero, gracias a una documentación que aclara los aspectos más oscuros de las especificaciones de Microsoft; segundo, gracias a que libFreeRTF es una biblioteca abierta y gratuita, que queda a disposición de la comunidad para que evolucione. La mayoría de los cambios futuros en el formato RTF sólo requerirán intervenir en el árbol y el analizador. Los visitantes existentes pueden ser reutilizados casi sin cambios.
El formato nativo de Word es prácticamente una representación binaria de RTF. Por ello, con leves cambios en el analizador sintáctico, se puede disponer de los servicios de RTHC para manejar documentos Word.