Library: Assessment and plan for a text templating engine

Conducted an extended investigation regarding text templating
and the library solutions available and still maintained today.

The conclusion is
 * there are some mature and widely used solutions available for C++
 * all of these are considered a mismatch for the task at hand,
   which is to generate Gnuplot scripts for test data visualisation

Points of contention
 * all solutions offer a massive feature set, oriented towards web content generation
 * all solutions provide their own structured data type or custom property-tree framework

**Decision** 🠲  better to write a minimalistic templating engine from scratch rather
This commit is contained in:
Fischlurch 2024-03-18 22:32:49 +01:00
parent d3fda114f8
commit af1f549190
6 changed files with 660 additions and 3 deletions

72
src/lib/gnuplot-gen.hpp Normal file
View file

@ -0,0 +1,72 @@
/*
GNUPLOT-GEN.hpp - setup for simplified data visualisation via Gnuplot
Copyright (C) Lumiera.org
2024, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file gnuplot-gen.hpp
** Preconfigured setup for data visualisation with Gnuplot.
** The visualisation tool [gnuplot] allows for simple data visualisation
** in various formats, integrated into a *NIX commandline work environment.
**
** The namespace lib::gnuplot_gen provides ....
**
** @todo 3/2024 this is an initial draft, shaped by the immediate need to visualise
** [measurement data](\ref vault::gear::test::SchedulerStress_test) collected
** while testing the new [Scheduler](\ref scheduler.hpp) implementation.
**
** ## Usage
** TBW
** - blah
** - blubb
**
** @see GnuplotGen_test
** @see SchedulerStress_test
** @see text-template.hpp
** [gnuplot]: https://booooooooooooo
*/
#ifndef LIB_GNUPLOT_GEN_H
#define LIB_GNUPLOT_GEN_H
//#include "lib/format-util.hpp"
#include "lib/text-template.hpp"
//#include "lib/util.hpp"
//#include <utility>
//#include <sstream>
//#include <string>
//#include <vector>
namespace lib {
namespace gnuplot_gen { ///< preconfigured setup for Gnuplot data visualisation
// using util::toString;
// using util::isnil;
// using std::string;
// using std::move;
}} // namespace lib::gnuplot_gen
#endif /*LIB_GNUPLOT_GEN_H*/

55
src/lib/text-template.hpp Normal file
View file

@ -0,0 +1,55 @@
/*
TEXT-TEMPLATE.hpp - minimalistic text substitution engine
Copyright (C) Lumiera.org
2024, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file text-template.hpp
** A minimalistic text templating engine with flexible data binding.
**
** @todo WIP-WIP-WIP 3/2024
** @see TextTemplate_test
** @see gnuplot-gen.hpp
** @see SchedulerStress_test
*/
#ifndef LIB_TEXT_TEMPLATE_H
#define LIB_TEXT_TEMPLATE_H
#include "lib/error.hpp"
//#include "lib/util.hpp"
//#include <cmath>
//#include <limits>
//#include <stdint.h>
//#include <boost/rational.hpp>
namespace lib {
// using Rat = boost::rational<int64_t>;
// using boost::rational_cast;
// using std::abs;
}// namespace lib
#endif /*LIB_TEXT_TEMPLATE_H*/

View file

@ -414,12 +414,17 @@ return: 0
END
TEST "HashGenerator_test" HashGenerator_test <<END
PLANNED "generate a Gnuplot diagram" GnuplotGen_test <<END
return: 0
END
TEST "HashIndexed_test" HashIndexed_test <<END
TEST "generate hash values" HashGenerator_test <<END
return: 0
END
TEST "verify indexing by hash" HashIndexed_test <<END
return: 0
END
@ -775,6 +780,11 @@ return: 0
END
PLANNED "text template substitution" TextTemplate_test <<END
return: 0
END
TEST "tuple sequence utils" UtilTuple_test <<END
return: 0
END

View file

@ -0,0 +1,136 @@
/*
GnuplotGen(Test) - verify the minimalistic text substitution engine
Copyright (C) Lumiera.org
2024, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
/** @file gnuplot-gen-test.cpp
** unit test \ref GnuplotGen_test
*/
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"///////////////////////TODO
#include "lib/gnuplot-gen.hpp"
#include "lib/format-cout.hpp"///////////////////////TODO
#include "lib/test/diagnostic-output.hpp"///////////////////////TODO
//#include <chrono>
//#include <array>
//using std::array;
namespace lib {
namespace test {
/***************************************************************************//**
* @test verify data visualisation by generated Gnuplot scripts
* - generate a simple pot
* - generate a scatter plot with regression line
* @see gnuplot-gen.hpp
* @see TextTemplate_test
*/
class GnuplotGen_test : public Test
{
virtual void
run (Arg)
{
simpeUsage();
verify_instantiation();
verify_keySubstituton();
verify_conditional();
verify_iteration();
verify_Map_binding();
verify_ETD_binding();
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
simpeUsage()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_instantiation()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_keySubstituton()
{
UNIMPLEMENTED ("nebbich");
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_conditional()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_iteration()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_Map_binding()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_ETD_binding()
{
}
};
LAUNCHER (GnuplotGen_test, "unit common");
}} // namespace lib::test

View file

@ -0,0 +1,139 @@
/*
TextTemplate(Test) - verify the minimalistic text substitution engine
Copyright (C) Lumiera.org
2024, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
/** @file text-template-test.cpp
** unit test \ref TextTemplate_test
*/
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"///////////////////////TODO
#include "lib/text-template.hpp"
#include "lib/format-cout.hpp"///////////////////////TODO
#include "lib/test/diagnostic-output.hpp"///////////////////////TODO
//#include <chrono>
//#include <array>
//using std::array;
namespace lib {
namespace test {
/***************************************************************************//**
* @test verify a minimalistic text substitution engine with flexible
* data binding, used for tool integration and script generation
* - cover the core parsing and templating functionality,
* using a direct binding
* - demonstrate the default-binding for a data map
* - cover the binding to Lumiera's »External Tree Description«
* @see text-template.hpp
* @see GnuplotGen_test
*/
class TextTemplate_test : public Test
{
virtual void
run (Arg)
{
simpeUsage();
verify_instantiation();
verify_keySubstituton();
verify_conditional();
verify_iteration();
verify_Map_binding();
verify_ETD_binding();
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
simpeUsage()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_instantiation()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_keySubstituton()
{
UNIMPLEMENTED ("nebbich");
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_conditional()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_iteration()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_Map_binding()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
*/
void
verify_ETD_binding()
{
}
};
LAUNCHER (TextTemplate_test, "unit common");
}} // namespace lib::test

View file

@ -54040,7 +54040,7 @@
</node>
<node CREATED="1448314834155" ID="ID_1725514536" MODIFIED="1557498707235" POSITION="right" TEXT="Integral">
<node CREATED="1448315011484" ID="ID_867104544" MODIFIED="1557498707235" TEXT="generisch">
<node CREATED="1448315015107" FOLDED="true" ID="ID_1900900399" MODIFIED="1561827465884" TEXT="JSON">
<node CREATED="1448315015107" FOLDED="true" ID="ID_1900900399" MODIFIED="1710706413766" TEXT="JSON">
<node CREATED="1448315031553" ID="ID_1177387568" MODIFIED="1518487921095" TEXT="parser">
<icon BUILTIN="button_ok"/>
<node CREATED="1448315067524" ID="ID_430746611" MODIFIED="1561827465890" TEXT="Libs">
@ -54178,6 +54178,10 @@
<icon BUILTIN="smily_bad"/>
</node>
</node>
<node CREATED="1710706000005" ID="ID_1914368036" LINK="https://github.com/nlohmann/json/releases" MODIFIED="1710706288076" TEXT="json.hpp von &#xbb;nlohmann&#xab;">
<node CREATED="1710706000005" ID="ID_1043657202" MODIFIED="1710706295443" TEXT="single-header Library"/>
<node CREATED="1710706000005" ID="ID_1587894889" MODIFIED="1710706350555" TEXT="bietet bequeme Schnittstelle und vertraute Syntax (geschachtelte Initialiser)"/>
</node>
</node>
<node CREATED="1448320959060" ID="ID_937046843" MODIFIED="1518487921096" TEXT="Entscheidung">
<icon BUILTIN="yes"/>
@ -112325,6 +112329,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710079820663" ID="ID_346209836" MODIFIED="1710079838390" TEXT="ein gnuplot-Skript generieren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710633755833" ID="ID_395770848" MODIFIED="1710633858137" TEXT="Grundlagen Gnuplot lernen">
<arrowlink COLOR="#425fc8" DESTINATION="ID_1898552649" ENDARROW="Default" ENDINCLINATION="-1042;110;" ID="Arrow_ID_1130805562" STARTARROW="None" STARTINCLINATION="-1030;94;"/>
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710079859600" ID="ID_1865864348" MODIFIED="1710079870844" TEXT="Skript aufbauen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710079895431" ID="ID_129580336" MODIFIED="1710079910502" TEXT="inline-CSV lesen">
@ -112337,6 +112345,243 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710704870063" ID="ID_668036945" MODIFIED="1710704880247" TEXT="brauche einen Text-Templating-Mechanismus">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1710704881573" ID="ID_1445716706" MODIFIED="1710723525643" TEXT="Suche bestehender L&#xf6;sungen">
<icon BUILTIN="info"/>
<icon BUILTIN="button_cancel"/>
<node CREATED="1710704994156" ID="ID_860782038" LINK="https://seznam.github.io/teng/index.html" MODIFIED="1710704998591" TEXT="TEng">
<node CREATED="1710705014841" ID="ID_1550307298" MODIFIED="1710705021611" TEXT="gibts in einer C++ und Python-Variante"/>
<node CREATED="1710705042389" ID="ID_484639453" MODIFIED="1710705073148" TEXT="&#xfc;bersetzt das Template in einen &quot;Bytecode&quot;"/>
<node CREATED="1710705076488" ID="ID_101216053" MODIFIED="1710705166665" TEXT="dieser wird mit einem Dictionary aufgerufen/interpretiertum Stream-Output zu generieren"/>
<node CREATED="1710705111714" ID="ID_1800292358" MODIFIED="1710705119845" TEXT="Instantiierungen werden gecached"/>
</node>
<node CREATED="1710707716849" ID="ID_263529308" MODIFIED="1710707739620" TEXT="Jinja for C++">
<node CREATED="1710707914321" ID="ID_1417275748" LINK="http://jinja.pocoo.org/docs/2.10/" MODIFIED="1710707918420" TEXT="Jinja-spec"/>
<node CREATED="1710705921224" ID="ID_696205988" LINK="https://github.com/pantor/inja" MODIFIED="1710705926587" TEXT="Inja">
<node CREATED="1710705949609" ID="ID_1707418934" MODIFIED="1710705962311" TEXT="inspiriert von Python-Jinja"/>
<node CREATED="1710705964611" ID="ID_664064383" MODIFIED="1710705974967" TEXT="header-only-C++ Lib">
<node CREATED="1710705976073" ID="ID_1483607068" LINK="#ID_1914368036" MODIFIED="1710706436488" TEXT="ben&#xf6;tigt json.hpp von &#xbb;nlohmann&#xab;">
<node CREATED="1710705976073" ID="ID_393095732" LINK="https://github.com/nlohmann/json/releases" MODIFIED="1710706463874" TEXT="single-header &#x27f6; Github"/>
</node>
<node CREATED="1710706892476" ID="ID_176597301" MODIFIED="1710706895296" TEXT="inja::render(&quot;Hello {{ name }}!&quot;, data);"/>
<node CREATED="1710706858009" ID="ID_1145372180" MODIFIED="1710706879210" TEXT="konkrete Escape-Syntax ist konfigurierbar"/>
<node CREATED="1710706927919" ID="ID_438851388" MODIFIED="1710706940409" TEXT="bietet Conditionals, Loops und diverse Funktionen"/>
<node CREATED="1710706978129" ID="ID_763497726" MODIFIED="1710706988554" TEXT="Erweiterbar durch Callbacks aus den Templates"/>
<node CREATED="1710707026049" ID="ID_1051155870" MODIFIED="1710707066246" TEXT="Baukasten-System: Templates k&#xf6;nnen andere Templates spezialisieren"/>
</node>
</node>
<node CREATED="1710707741086" ID="ID_29025632" LINK="https://jinja2cpp.github.io/" MODIFIED="1710707776632" TEXT="jinja2cpp">
<node CREATED="1710707820764" ID="ID_255008102" MODIFIED="1710707829577" TEXT="ist eine Library (nicht nur Header)"/>
<node CREATED="1710707842938" ID="ID_1894550434" MODIFIED="1710707860614" TEXT="hat weitere Build-Dependencies (Boost, nonstd-lib)"/>
<node CREATED="1710707935262" ID="ID_18378132" MODIFIED="1710707962134" TEXT="bindet nicht nur nlohmann/json.hpp ein, sondern untert&#xfc;tzt auch RapidJSON"/>
</node>
</node>
<node CREATED="1710707132282" ID="ID_735734035" MODIFIED="1710715361575" TEXT="Mustache">
<node CREATED="1710707172604" ID="ID_6244081" LINK="http://mustache.github.io/" MODIFIED="1710707282525" TEXT="Mustache: Standard for Logic-less Templates in many languages">
<node CREATED="1710716338801" ID="ID_35783282" MODIFIED="1710716349723" TEXT="stark auf HTML-Generierung ausgerichtet"/>
<node CREATED="1710716350360" ID="ID_1352200864" MODIFIED="1710716388451" TEXT="der Verzicht auf &#xbb;Logik&#xab; f&#xfc;hrt zu komplexen und nicht-intuitiven Konventionen f&#xfc;r die &#xbb;Tags&#xab;">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node CREATED="1710713362053" ID="ID_408642936" LINK="https://github.com/no1msd/mstch" MODIFIED="1710715375292" TEXT="alternativ: &#xe4;ltere Library-Impl f&#xfc;r C++">
<node CREATED="1710713414575" ID="ID_1654769239" MODIFIED="1710713424177" TEXT="8 Jahre alt; stale"/>
</node>
<node CREATED="1710715349398" ID="ID_1321414209" LINK="https://github.com/kainjow/Mustache" MODIFIED="1710715366460" TEXT="single-header-Impl">
<node CREATED="1710707472269" ID="ID_95859722" MODIFIED="1710715370647">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<pre http-equiv="content-type" content="text/html; charset=utf-8"><font size="1">mustache tmpl{&quot;Hello {{what}}!&quot;};
std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; std::en</font></pre>
</body>
</html></richcontent>
</node>
<node CREATED="1710712311722" ID="ID_850759528" MODIFIED="1710715370648" TEXT="Boost-Software-License"/>
<node CREATED="1710715381921" ID="ID_708726628" MODIFIED="1710715395806" TEXT="verwendet einen eigenen Datentyp `data`">
<node CREATED="1710715397135" ID="ID_780864870" MODIFIED="1710715729582" TEXT="dieser ist Set-artig"/>
<node CREATED="1710715730266" ID="ID_1018394030" MODIFIED="1710715731478" TEXT="kann aber auch mit Stream-Operatoren bef&#xfc;llt werden"/>
<node CREATED="1710715732193" ID="ID_305430417" MODIFIED="1710715750595" TEXT="und man kann per push_back verschachtelte data-Elemente einf&#xfc;gen"/>
<node CREATED="1710716062558" ID="ID_707555678" MODIFIED="1710716083129" TEXT="&#x27f9; das ist wieder eine art Property-Tree-Implementierung"/>
</node>
<node CREATED="1710715421940" ID="ID_591042079" MODIFIED="1710715802012" TEXT="keine Impl-spezifische Doku &#x2014; aber ausf&#xfc;hrliche Unit-Tests"/>
</node>
</node>
<node CREATED="1710717302655" ID="ID_1914789785" LINK="https://github.com/monsieurgustav/NLTemplate" MODIFIED="1710717309337" TEXT="NLTemplate">
<node CREATED="1710717329091" ID="ID_1830115018" MODIFIED="1710717338974" TEXT="sehr einfache Templating-Engine">
<node CREATED="1710717854509" ID="ID_1183544070" MODIFIED="1710717871927" TEXT="es gibt ein Memory und ein load-from-File-Backend"/>
<node CREATED="1710717872419" ID="ID_702499097" MODIFIED="1710717891220" TEXT="Daten werden per direkte Setter-Aufrufe gesetzt"/>
<node CREATED="1710717892082" ID="ID_1067981205" MODIFIED="1710717902627" TEXT="unterst&#xfc;tzt...">
<node CREATED="1710717903503" ID="ID_3384057" MODIFIED="1710717913169" TEXT="benannte Platzhalter"/>
<node CREATED="1710717915456" ID="ID_1570101634" MODIFIED="1710717929399" TEXT="repetitive Bl&#xf6;cke"/>
<node CREATED="1710717930068" ID="ID_1708254719" MODIFIED="1710717935206" TEXT="Include eines anderen Template"/>
</node>
</node>
<node CREATED="1710717342026" ID="ID_833003038" MODIFIED="1710717362314" TEXT="eine Translation-Unit, Std C++, keine Dependencies">
<node CREATED="1710718085279" ID="ID_1715695443" MODIFIED="1710718093278" TEXT="hat einen C++98-Branch"/>
<node CREATED="1710717954565" ID="ID_1704325174" MODIFIED="1710718082114" TEXT="Bugfixes per Pull-Request bis 2021(Master) / 2023(C++98-Branch)"/>
<node CREATED="1710718109287" ID="ID_1162941117" MODIFIED="1710718114622" TEXT="nur minimaler Unit-Test"/>
</node>
</node>
<node CREATED="1710718815833" ID="ID_1332684573" MODIFIED="1710718845044" TEXT="minimale L&#xf6;sung: Suchen &amp; Ersetzen">
<node CREATED="1710718846326" ID="ID_979621171" LINK="https://stackoverflow.com/a/2549643/444796" MODIFIED="1710718854047" TEXT="Beispiel-Impl auf Stackoverflow"/>
</node>
</node>
<node CREATED="1710722518998" ID="ID_1094579245" MODIFIED="1710723518690" TEXT="Einsch&#xe4;tzung der Lage">
<icon BUILTIN="yes"/>
<node CREATED="1710722529409" ID="ID_903585985" MODIFIED="1710722535951" TEXT="das Thema ist inh&#xe4;rent problematisch">
<node CREATED="1710722537931" ID="ID_1356842915" MODIFIED="1710722584276">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
dies ist eine Aufgabe, die in dynamischen Sprachen <i>nahezu magisch </i>l&#246;sbar ist
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1710722595051" ID="ID_91037039" MODIFIED="1710722648851" TEXT="in C++ dagegen gibt es keine Introspektion &#x27f9; Datenstruktur notwendig"/>
<node CREATED="1710722658547" ID="ID_1871115553" MODIFIED="1710722679188" TEXT="die meisten Autoren bauen dann auch ein Framework f&#xfc;r &#xbb;Property Trees&#xab;"/>
<node CREATED="1710722679984" ID="ID_477839689" MODIFIED="1710722694610" TEXT="und auf dieser Basis entsteht eine sekund&#xe4;re Skriptsprache"/>
<node CREATED="1710722702757" ID="ID_1263195600" MODIFIED="1710722732806" TEXT="zudem geht es oft um HTML-Templating &#x27f9; eigentlich ein &#xbb;CMS light&#xab;"/>
<node CREATED="1710723189604" ID="ID_1548111517" MODIFIED="1710723204409" TEXT="&#xbb;feature creep&#xab; erledigt den Rest...">
<icon BUILTIN="smiley-oh"/>
</node>
</node>
<node CREATED="1710722759245" ID="ID_623023889" MODIFIED="1710722803803" TEXT="viele angefangene L&#xf6;sungen &#x2014; und nur die komplexen L&#xf6;sungen sind am Leben geblieben"/>
<node CREATED="1710722819983" ID="ID_794248951" MODIFIED="1710722891560" TEXT="das C++ Komitee war weise genug, nichts Derartiges in die Standardlib aufzunehmen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
mir ist kein Vorschlag bekannt; vermutlich haben die Leute die gleiche Analyse vollzogen, wie ich sie hier grade mache
</p>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1710723149425" ID="ID_1846413761" MODIFIED="1710723514431">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
wenn man sich auf die <b>Essenz</b>&#160;beschr&#228;nkt, kann man es selber schreiben
</p>
</body>
</html></richcontent>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710723528262" ID="ID_1806943398" MODIFIED="1710723539822" TEXT="minimale Templating-Funktionalit&#xe4;t bereitstellen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1710723556427" ID="ID_967894122" MODIFIED="1710723653752" TEXT="Baukastensystem &#x2014; kein Framework">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710723662213" ID="ID_454325758" MODIFIED="1710723719430" TEXT="Ersetzung per ${Name}">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1710792595619" ID="ID_1847669087" MODIFIED="1710792697841" TEXT="m&#xf6;gliche weitere Features">
<icon BUILTIN="hourglass"/>
<node CREATED="1710792606209" ID="ID_1610911585" MODIFIED="1710792689754" TEXT="${if ID} ... ${else} ... ${end if ID}"/>
<node CREATED="1710792634661" ID="ID_584250278" MODIFIED="1710792681435" TEXT="${for ID} ... ${else} ... ${end for ID}"/>
</node>
<node CREATED="1710792708023" ID="ID_19059188" MODIFIED="1710792754654">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<b>Keinerlei</b>&#160;Annahmen &#252;ber die Datenypen
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710792755709" ID="ID_952834241" MODIFIED="1710792828516" TEXT="ein situativ-funktionales Daten-Binding">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710792833458" ID="ID_275925925" MODIFIED="1710792878693" TEXT="ein generischer Standard-Adapter f&#xfc;r map-artigen Zugriff">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710792883983" ID="ID_674930846" MODIFIED="1710793004552" TEXT="ein Adapter f&#xfc;r Lumiera ETD mit util::toString-Konvertierung">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793061549" ID="ID_896868325" MODIFIED="1710793066570" TEXT="Implementierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793071787" ID="ID_697532669" MODIFIED="1710793112825" TEXT="Rahmen in lib/text-template.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793119597" ID="ID_1328122626" MODIFIED="1710793127228" TEXT="Design">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793135490" ID="ID_1136896163" MODIFIED="1710793273169" TEXT="Binding">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793140948" ID="ID_1992696242" MODIFIED="1710793164256" TEXT="Schema f&#xfc;r Binding anlegen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793148025" ID="ID_1493105822" MODIFIED="1710793163688" TEXT="das Binding-callback-API definieren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793579630" ID="ID_1056577943" MODIFIED="1710793609484" TEXT="direktes &#x3bb;-Binding f&#xfc;r Test">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793178661" ID="ID_1043138581" MODIFIED="1710793271816" TEXT="Parser">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793274688" ID="ID_1785713892" MODIFIED="1710793282863" TEXT="RegExp - Iteration">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793301196" ID="ID_42591067" MODIFIED="1710793305367" TEXT="Basis-Tokens">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793189554" ID="ID_1486654440" MODIFIED="1710793220336" TEXT="Template-Processor">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793221783" ID="ID_2381771" MODIFIED="1710793242797" TEXT="Template-Definition">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793245457" ID="ID_1022549828" MODIFIED="1710793256443" TEXT="per ctor mit Raw-String">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793257202" ID="ID_1216732700" MODIFIED="1710793267357" TEXT="alternativer ctor zum Laden aus Datei">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793352301" ID="ID_1691061928" MODIFIED="1710793355254" TEXT="Bindings">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793356309" ID="ID_618241969" MODIFIED="1710793358557" TEXT="Map">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793367246" ID="ID_1695880616" MODIFIED="1710793369256" TEXT="ETD">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793091784" ID="ID_1970381008" MODIFIED="1710793100312" TEXT="TextTemplate_test">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793387393" ID="ID_413372443" MODIFIED="1710793391297" TEXT="simpeUsage">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793507744" ID="ID_1535977723" MODIFIED="1710793518661" TEXT="verify_instantiation">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793450480" ID="ID_703630650" MODIFIED="1710793457496" TEXT="verify_keySubstituton">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793458511" ID="ID_1365018556" MODIFIED="1710793492318" TEXT="verify_conditional">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793497322" ID="ID_1570698863" MODIFIED="1710793501637" TEXT="verify_iteration">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793522467" ID="ID_1713123157" MODIFIED="1710793546412" TEXT="verify_Map_binding">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793547451" ID="ID_778488140" MODIFIED="1710793552697" TEXT="verify_ETD_binding">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710079848190" ID="ID_227233521" MODIFIED="1710079870844" TEXT="Darstellung ausarbeiten">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710079926851" ID="ID_1457237228" MODIFIED="1710079939594" TEXT="Scatter-Plot">