Fortschritte des Tntnet-Witzard

Standard

Aktuell arbeite ich an dem webbasierten Wizard-Tool für Tntnet-Projekte. Wie vor einiger Zeit in dem Artikel „Proof of concept für ein alternatives Build-System für Tntnet“ angekündigt, habe ich das Build-Tool reinimplementiert, und zwar in Python. Ausschlaggebend war die Erfahrung, dass mein Ruby-Code unter RHEL6/CentOS6 nicht so einfach zum Laufen zu bekommen ist. Das führte dazu, dass ich meinen Tntnet-Wizard nicht auf den Server übersetzen und installieren konnte. Die Reimplementierung ging einigermaßen zügig,  hat mich jedoch trotzdem einige Tage Zeit gekostet.

Mit dem eigentlichen Programm bin ich jetzt soweit, dass man den Kern einer Tntnet-Application zusammenklicken und herunterladen kann. Derzeit arbeite ich daran, das der Projekt-Kern durch Komponenten erweitert werden kann. Dies soll ebenfalls graphisch über eine Weboberfläche gehen. Wenn der Schritt fertig ist, plane ich eine GitHub-Unterstützung zu intrigieren. So das man Code aus GitHub in das Programm laden, neue Komponenten hinzufügen, den generierten Code herunterladen, den Code in der IDE, die man sonst verwendet, erneut prüfen und wieder in GitHub commiten.

Das Buildtool, das ich mir gebaut habe, heißt Tntmake und ist hier zu bekommen: https://github.com/OlafRadicke/tntmake

Das Tool zum Generieren von Tntnet-Projekten trägt den Namen Tntwebwizard und ist hier zu finden: https://github.com/OlafRadicke/tntwebwizard

Tntmake verwende ich seit ein paar Wochen und es arbeitet (für meine Zwecke) sehr gut. Woran ich mir ein bisschen die Zähne ausgerissenen habe, war das Thema „uppercase in c++„. In dem Artikel umlautproblemen in Tntnet-Applicationen mit Hilfe von cxxtools aus dem weg gehen habe ich bereits festgestellt, dass meine Funktion, die aus Kleinbuchstaben Großbuchstaben machen soll, mit Umlauten nicht funktioniert. Jetzt fand ich mich an dem Punkt wieder, dass ich für meinen Tntwebwizard erneut eine Funktion brauchte, die Strings in uppercase formatiert.

Also habe ich versucht das Problem mit cxxtools::toupper() zu lösen. Es ist, mir leider nicht gelungen. Mangels Dokumentation habe ich nicht herausgefunden, ob und wie es geht. Ich habe mir die Headerdateien von der Classe cxxtools::Char angeschaut und zwei Stunden herumprobiert, jedoch keine Lösung gefunden. Mir ist es zwar gelungen, alle Zeichen in Großbuchstaben umzuwandeln, ohne dass die Umlaute zerbrechen, aber die Umlaute werden leider nicht in Großbuchstaben umgewandelt. Ein“ä“ bleibt ein „ä“ und wird nicht zu einem „Ä“.

Der Code sieht so aus:


#include <cxxtools/utf8codec.h>
#include <cxxtools/string.h>
#include <cxxtools/char.h>
[...]
01| std::string NewModelData::toUpper( std::string _mixedString ){
02|     std::ostringstream upperString;
03|     cxxtools::String lastLetter;
04|     cxxtools::String uMixedString = cxxtools::Utf8Codec::decode( _mixedString );
05|     for ( cxxtools::String::size_type i=0;
06|         i < uMixedString.length();
07|         ++i
08|     ){
09|         upperString << cxxtools::toupper(uMixedString[i]);
10|     }
11|     return upperString.str();
12| }

Dann habe ich nach einer Lösung mit reinem C++Standard-Libs gesucht, und bin dann auf diese kompakte Lösung gekommen:


01| std::string toUpper( std::string _mixedString ){
02|     std::ostringstream upperString;
03|     std::locale loc;
04|     for (std::string::size_type i=0; i<_mixedString.length(); ++i)
05|         upperString << std::toupper(_mixedString[i],loc);
06|     return upperString.str();
07| }

Die String-Verarbeitung in C++ ist immer ziemlich krampfig, zwar nicht ganz so schlimm wie in C, aber trotzdem unbefriedigend. Die cxxtools bringen hier leider auch keine befriedigenden Lösung.

Ich habe gesehen, dass es wohl noch eine Lösung mit Boost gibt. Allerdings würde ich die Abhängigkeit zu Boost gerne vermeiden. Vielleicht komme ich noch auf eine andere Lösung, dann werde ich es berichten.


Creative Commons Lizenzvertrag