There are several solutions to the problem of HTML templates in C++: solutions but i like none of them.
The main reason is that all of them define a custom set of tags (each one different than the other>) and I am quite lazy and I would rather avoid the effort of learning what basically is a new language. Another problem with this approach is that this new language is quite limited: the library has to provide you with all the functions you might need for processing your data.
Compare this with PHP or JSP where you have a full grown language to work with and you are allowed functions and arbitrary code. I would like to have something similar.
In the following you can find my solution, it is little more than a proof of concept. For the impatients, you can download the .h here.
Update: I just discovered my solution is basically what Ajax Pages and EJS do, the difference is I parse the template in C++ and process it in a Javascript engine, while they work entirely in Javascript.
In the Qt framework you have a Javascript engine (QScriptEngine), why not use it? The idea is simple: you take a template like this (jsp, or php style):
<div><?=name?></div> <? if(birthdate) { ?> Born on: <?=birthdate?> <? } ?>
and turn it into something like this:
function() { var str = ""; str += "<div>" str += name; str += "</div>"; if(birthdate) { str += "Born on: "; str += birthdate; } return str; }
Once we have it as a Javascript function is trivial to evauate and call using QScriptEngine.
Here is the definition of the jtemplate class that does all of this it is just a .h file and you can download it here
class JTemplate { public: JTemplate(QScriptEngine *e = NULL): engine(e) {} void setTemplate(QString tpl); bool loadFromFile(QString path); QString apply(QScriptValue &variables); protected: QScriptEngine *engine; QScriptValue code; //the function created out QString js; void preprocess(QString tpl); QString escape(QString s); };
QScriptEngine *engine = new QScriptEngine; JTemplate tpl(engine); tpl.loadFromFile("mytemplate.tpl"); QScriptValue vars = engine->newObject(); vars.setProperty("name", "Mario Rossi"); vars.setProperty("birthday", "27 January 1972"); QString result = tpl.apply(vars);
In the template you can use only the variables provided through vars.
I bet there is a way (I didn't even look) to have PHP or JAVA embedded into your applications, but sinve I already use Qt I find this more convenient