Estreno hoy una nueva sección de documentación sobre la librería NRtfTree. Esto era algo que tenía un poco olvidado desde hace tiempo y que ya era hora de solucionar.

Para ello, he reorganizado un poco la información que ya existía sobre la librería y la he ampliado con nuevos apartados sobre los distintos modos de funcionamiento, las opciones de carga de documentos RTF, la navegación y búsqueda de nodos, y la creación y eliminación de nuevos elementos en el árbol RTF, todo ello describiendo los recursos proporcionados por NRtfTree y aportando algunos ejemplos prácticos.

Me quedan pendientes de completar los apartados sobre generación de documentos con RtfDocument, y la combinación o fusión de documentos RTF mediante RtfMerge. Os informaré convientemente cuando ya estén disponibles éstos últimos apartados.

Espero que os sea útil.

,
Mientras sigo trabajando en la próxima versión de NRtfTree y en la puesta al día de JRtfTree, hoy os hago llegar una aportación de Grijandermore, que ha traducido la librería NRtfTree al lenguaje Visual Basic .Net (vbNRtfTree).
Aunque esta traducción no era técnicamente necesaria dado que NRtfTree puede ser utilizada directamente desde cualquier lenguaje .Net (siempre bajo el .Net Framework 2.0 o superior), sí que puede ser interesante para aquellos que queráis modificarla o simplemente consultar su funcionamiento y prefiráis o tengáis más soltura con VB.Net que con C#.
Se trata de una traducción completa de la versión 0.3.xxxx.1 de NRtfTree. Es una versión no oficial de la librería, por lo que no ha sido revisada al 100%, pero sí puedo decir que pasa todas las pruebas unitarias de la última versión de NRtfTree.
Además, un aporte añadido es que Grijandermore además de traducir a VB.Net el código de la librería, también ha realizado una traducción al inglés de todos los comentarios y documentación, por lo que puede ser de gran ayuda a todos los usuarios y colaboradores del proyecto no conocedores del castellano.
En definitiva, un recurso más a la mano de todos los interesados en NRtfTree.
Podéis acceder a la página de traducciones no oficiales de NRtfTree para descargar los fuentes de esta versión.

Mientras sigo trabajando en la próxima versión de NRtfTree y en la puesta al día de JRtfTree, hoy os hago llegar una aportación de Terence L. Wallace (Arkitech EBC Corporation), que ha traducido la librería NRtfTree al lenguaje Visual Basic .Net (vbNRtfTree).

Aunque esta traducción no era técnicamente necesaria dado que NRtfTree puede ser utilizada directamente desde cualquier lenguaje .Net (siempre bajo el .Net Framework 2.0 o superior), sí que puede ser interesante para aquellos que queráis modificarla o simplemente consultar su funcionamiento y prefiráis o tengáis más soltura con VB.Net que con C#.

Se trata de una traducción completa de la versión 0.3.3503 de NRtfTree. Es una versión no oficial de la librería, por lo que no tendrá soporte por mi parte ni ha sido revisada al 100%, aunque sí puedo decir que pasa todas las pruebas unitarias de la última versión de NRtfTree.

Además, un aporte añadido es que Terence, además de traducir a VB.Net el código de la librería, también ha realizado una traducción al inglés de todos los comentarios y documentación, por lo que puede ser de gran ayuda a todos los usuarios y colaboradores del proyecto no conocedores del castellano.

En definitiva, un recurso más a la mano de todos los interesados en NRtfTree.

Podéis acceder a la página de versiones no oficiales de NRtfTree para descargar los fuentes de esta versión.

, , , , , , ,

Tras un enorme parón en la actividad del blog debido a diversas circunstancias que han obligado a ello, retomamos el ritmo con una buena noticia.

La librería NRtfTree ha llegado, según estadísticas de Sourceforge, a las 5.000 descargas. Nunca pensé que un proyecto de propósito tan súmamente específico como NRtfTree podría generar “tanto” interés. Claro está que unos pocos miles de descargas no son nada en comparación con los grandes proyectos de código libre, pero sí resulta un número importante para algo que comenzó como una simple librería auxiliar para un pequeño proyecto personal.

Como curiosidad, separando las descargas por versión de la librería, tenemos los siguientes datos:

Versión Descargas
v0.2.0 347
v0.2.1 1606
v0.3.0 3107

Ante esto no puedo más que dar las gracias a todos los que han colaborado aportanto ideas, nuevas funcionalidades, y reportando errores, tareas más que importantes a la hora de evolucionar un proyecto de este tipo.

Espero de aquí en adelante tener el tiempo necesario para seguir mejorando NRtfTree, y sobre todo espero seguir contando con el apoyo de los que colaboráis habitualmente con el proyecto.

, , ,

Three weeks ago we released the second beta of NRtfTree 0.3. Since then, we have fixed some bugs you reported and we have been preparing the final release of the library. Today we release NRtfTree 0.3 Final with the following changes since last beta:

  • Added a new test project (NUnit).
  • Version numbering scheme updated to “major.minor.build.revision”.
  • SimpleDemo project updated to console application.
  • Removed redundant code in RtfLex.
  • ImageNode ScaleX and ScaleY properties returned incorrect values.
  • RtfTreeNode.Rtf property inserted incorrect blank spaces when MergeSpecialCharacters property is true.
  • RtfTree.Text property returned non-document-text characters in images, objects and field nodes.
  • New method RtfTreeNode.SelectSingleChildGroup().

You can get complete information about NRtfTree versions in NRtfTree Changelog.

Download NRtfTree 0.3 now!

, , ,

Cumpliendo con otro de los objetivos como programador marcados para este año 2009, la versión final de la librería NRtfTree 0.3 contará por fin con una batería de pruebas automatizadas que garanticen al máximo su calidad y faciliten las pruebas de regresión de próximas versiones.

En esta ocasión he utilizado NUnit como framework de pruebas, simplemente por ser el que conozco más de cerca, aunque prometo echar un vistazo a MbUnit como muchos me habéis propuesto. Como información adicional, para comprobar la cobertura de las pruebas utilizo NCover, y para la integración de ambos con Visual Studio dispongo del fantástico plugin TestDriven.Net, todas ellas herramientas gratuitas y/o de código libre, o al menos con licencias personales disponibles con estas características.

Para NRtfTree he tenido que hacer lo que nunca se debería hacer, al menos por costumbre, y es nada más y nada menos que escribir los casos de prueba a posteriori, o dicho de otra forma, después de escribir el código que se va a probar. Pero bueno, en algún momento tenía que hacerlo si quería añadir pruebas para el código ya existente. A partir de esta versión retomaré ya la dinámica clásica y recomendada de escribir los test antes que el código.

La versión final 0.3, cuya publicación es inminente, contará en principio con una batería de unos 50 casos de prueba, que cubren, según NCover, un 92% del código existente. Para empezar no está mal, y queda cubierta la práctica totalidad de la funcionalidad de la librería. De cualquier forma, en próximas versiones pretendo cubrir el resto de pequeños detalles que han quedado fuera de las pruebas actuales.

El proyecto de pruebas se incluirá en el mismo paquete que el código fuente de la librería y se podrá descargar desde la página de descargas de NRtfTree.

, , , , , ,

Los números de versión de la librería NRtfTree es algo que no se había tenido demasiado definido en versiones anteriores. A partir de la versión 0.3 queremos cambiar también este hecho y homogeneizar un poco estos números de versión, tanto para las versiones internas como para las releases públicas. Y para ello se ha elegido el formato tradicional propuesto por MSDN (“major.minor.build.revision”) formado por cuatro componentes:

  • major: Versión principal de la librería.
  • minor: Versión secundaria de la librería.
  • build: Versión de compilación, generado automáticamente como el número de días transcurridos desde el 1 de enero de 2000.
  • revision: Número de revisión, generado automáticamente como el número de segundos transcurridos desde la media noche (hora local) dividido entre dos.

Para NRtfTree mantendré la versión principal a cero hasta estar completamente satisfecho con su funcionalidad básica y su rendimiento. Mientras tanto, la versión secundaria me permitirá distinguir entre versiones con cambios relevantes, y la versión de compilación se utilizará tan sólo para versiones púramente correctoras y para versiones preliminares. Por último, el número de revisión tan sólo se utilizará para control interno, por lo que normalmente ni siquiera se hará referencia a él.

, ,

Seguimos avanzando con el proyecto NRtfTree. Ha pasado ya una semana desde la publicación de la segunda beta de NRtfTree 0.3.0, y la buena noticia [o la mala, según se mire] es que tan sólo me habéis reportado un par de errores que ya están corregidos para la versión final. Por si a alguien le resulta útil los voy comentando ya:

  • La propiedad Text de la clase RtfTree devolvía como parte del texto el contenido de las imágenes, objetos y campos del documento RTF.
  • Para dejar coherente el conjunto de métodos disponibles en la clase RtfTreeNode se ha añadido el método SelectSingleChildGroup(), que se había olvidado en la versión anterior.

Además de estos dos errores, también he actualizado ya el proyecto de ejemplo SimpleDemo, que ahora se ha convertido en una aplicación de consola. El motivo de esta decisión es hacer la vida más fácil a aquellos que quieran ejecutarlo en Linux sobre la plataforma Mono, sin tener que utilizar las clases de Windows Forms.

Todos estos cambios ya se encuentran en el repositorio de Subversion del proyecto, por si alguien quiere descargar la versión actualizada de los fuentes antes de la publicación oficial.

Dejaremos todavía reposar una semana más la beta 2 antes de publicar la versión definitiva, y a partir de ahí a pensar ya en la próxima versión.

Gracias a todos los que habéis colaborado reportando errores o aportando nuevas ideas.

, ,

I’ve just published the second beta of NRtfTree 0.3.0.

You can review all the new features and changes of this new version at this post, or you can visit the new changelog section of NRtfTree.

One of the most important features of NRtfTree 0.3.0 beta 2 is a great performance improvement. You can read about this new feature at this post I wrote some days ago.

If you are new to NRtfTree you can also read the new FAQ and Examples sections.

Download now the new version of NRtfTree!

, , ,

Since first public version, the objective of every new release of NRtfTree was to add new funtionality to the library. In NRtfTree 0.3.0 we also want to improve performance.

The main bottleneck in NRtfTree was the RTF lexer component (RtfLex class). While analyzing source code we dicovered two main problems:

  1. Each token define and initialize its own StringBuilder object to load keywords, parameters and text.
  2. The lexer Peek and Read the same characters repeatedly.

Both problems has been fixed in versión 0.3.0 beta2. RtfLex now define StringBuilder objects at class level and initialize them setting its lengh to 0 every time it starts a new token, and some methods has been rewriten to read characters only once.

This two simple changes result in a great performace improvement. In our tests, the load time of a simple RTF document (1.3mb, text only) was significantly reduced:

Load Time

Document Load Time

Yes, the chart is correct. Load time is now over 100 times faster.

Memory allocation has been improved too. In previous versions, each RTF tree node initialized its child node list, even if it had no children at all. In NRtfTree 0.3.0 beta2, only group nodes creates its children list (if node type is not GROUP, ChildNodes property is set to null).

In our tests, memory allocated by a simple RTF document tree (1.3mb, text only) was reduced in about 20%:

Object Created Beta1 Memory Beta1 Created Beta2 Memory Beta2
RtfTreeNode 23353 934120 23353 934120
RtfNodeCollection 23353 280236 2460 29520
RtfToken 25812 0 25812 0
RtfLex 1 12 1 12
RtfTree 1 32 1 32
, ,

A new versión of NRtfTree library will be released in a few days. Now it’s time to talk about some of the features of this new version (NRtfTree 0.3.0 beta2).

First of all, let’s review the most significant features of beta1:

  • New license: LGPL.
  • New class RtfDocument to easily create Rtf documents.
  • New property MergeSpecialCharacters to merge adjacent text and control nodes (special characters).
  • New property Text to get plain text from RTF documents.
  • New methods to select nodes.
  • New methods to work with node lists.

NRtfTree 0.3.0 beta2 will include significant enhancements:

  • New class RtfMerger to merge RTF documents (Thanks to Fabio Borghi).
  • New format options in RtfDocument. Now you can set document margins, paragraph indentation and text alignment.
  • Stylesheet table support.
  • New methods to select group nodes.
  • New methods to search and replace text in text nodes.
  • Performance greatly improved.

Beta 2 will fix some bugs too:

  • Corrected StringBuilder initialization to avoid out of memory exception.
  • RtfFontTable access by \f keyword parameter, not by index.
  • Some RTF code generation errors (blank spaces, special characters…).

You can get a detailed changelog in NRtfTree Changelog.

,