📄 template.cpp
字号:
#include "Template.h"Template::Template() : ObjectContainer(TEMPLATE) { }Template::~Template() { map<string,TemplateObject *>::iterator i=childs.begin(); while(i!=childs.end()) { delete i->second; i++; } childs.clear();}void Template::add(const string &name,const string &val) { TemplateVariable *t = new TemplateVariable(val); childs[name]=t;}void Template::add(const string &name,int val) { TemplateVariable *t = new TemplateVariable(val); childs[name]=t;}void Template::add(const string &name,double val) { TemplateVariable *t = new TemplateVariable(val); childs[name]=t;}void Template::add(const string &name,DataSet *val) { childs[name]=val;}void Template::parse(char *t_name,FILE *out=stdout) { TmplTag t; t.args["filename"]=t_name; doTemplate(0,this,t,true,out);}TemplateObject *Template::getVal(const string &key) { if(strict) { map<string,TemplateObject *>::const_iterator ci=childs.find(key); if(ci==childs.end()) throw TemplateError("Error: '"+key+"' not defined in this scope"); } return childs[key];}bool Template::hasKey(const string &key) { map<string,TemplateObject *>::const_iterator ci=childs.find(key); if(ci==childs.end()) { return false; } else { return true; }}#define SET_GENERAL_HANDLERS(p) \do { \ p->addHandler("include",doTemplate); \ p->addHandler("variable",doVariable);\ p->addHandler("dataset",doDataSet); \ p->addHandler("if",doIf); \} while (0) void doVariable(TemplateContainer *tmpl,TemplateObject *cur,TmplTag &tag,bool active,FILE *out) { if(!active) return;try { //We'll get template error if strict here and val is not exist... TemplateObject *t=dynamic_cast<ObjectContainer *>(cur)->getVal(tag.args["name"]); if(t) { if(t->getType()!=VARIABLE) throw ParserError("Cannot cast to variable",tag); } else return; fputs(dynamic_cast<TemplateVariable *>(t)->getVal().c_str(),out);} catch (TemplateError err) { throw ParserError(err.getError(),tag);} catch (...) { throw ParserError("Unknow exception raised",tag);}}void doTemplate(TemplateContainer *tmpl,TemplateObject *cur,TmplTag &tag,bool active,FILE *out) { if(!active) return; string f_name=tag.args["filename"]; if(f_name[0]!='/') { f_name=tmpl->getTemplateDir()+"/"+f_name; } TemplateContainer *t = new TemplateContainer(f_name.c_str()); Parser *p = new Parser(t,cur,"",out); SET_GENERAL_HANDLERS(p); p->setActive(true); p->parse(); delete p; delete t;}void doDataSet(TemplateContainer *tmpl,TemplateObject *cur,TmplTag &tag,bool active,FILE *out) {try { if(!active) { Parser *p=new Parser(tmpl,0,"dataset",out); p->setActive(false); SET_GENERAL_HANDLERS(p); p->parse(); delete p; return; }} catch(TemplateError err) { throw ParserError(err.getError(),tag);}try { TemplateObject *t=dynamic_cast<ObjectContainer *>(cur)->getVal(tag.args["name"]); if(t) { if(t->getType()!=DATASET) throw ParserError("Cannot cast to dataset",tag); } else { // skip it .. Parser *p=new Parser(tmpl,0,"dataset",out); p->setActive(false); SET_GENERAL_HANDLERS(p); p->parse(); delete p; return; } DataSet *d=dynamic_cast<DataSet *>(t); int begin=tmpl->getCurrent(); Parser *p=new Parser(tmpl,d,"dataset",out); SET_GENERAL_HANDLERS(p); if(!(d->getSize())) { p->setActive(false); p->parse(); } else { p->setActive(active); for(int i=0;i<d->getSize();i++) { d->setCurrentRow(i); if(i==0) d->add("FIRST","true"); if(i==d->getSize()-1) d->add("LAST","true"); if(i>0 && i<(d->getSize()-1)) d->add("INNER","true"); tmpl->setCurrent(begin); p->parse(); } } delete p;} catch(TemplateError err) { throw ParserError(err.getError(),tag);}}void doIf(TemplateContainer *tmpl,TemplateObject *cur,TmplTag &tag,bool active,FILE *out) { string expression=tag.args["expr"]; Parser *p=new Parser(tmpl,cur,"if",out); SET_GENERAL_HANDLERS(p); if(!active) { p->setActive(false); } else if(expression[0]=='!') { expression=expression.substr(1); if(!dynamic_cast<ObjectContainer *>(cur)->hasKey(expression)) { p->setActive(true); } else { p->setActive(false); } } else { if(dynamic_cast<ObjectContainer *>(cur)->hasKey(expression)) { p->setActive(true); } else { p->setActive(false); } } p->parse(); delete p; return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -