}
+void GetTemplateTokenString(WCTemplateToken *Tokens,
+ int N,
+ const char **Value,
+ long *len)
+{
+ StrBuf *Buf;
+
+ if (Tokens->nParameters < N) {
+ *Value = "";
+ *len = 0;
+ return;
+ }
+
+ switch (Tokens->Params[N]->Type) {
+
+ case TYPE_STR:
+ *Value = Tokens->Params[N]->Start;
+ *len = Tokens->Params[N]->len;
+ break;
+ case TYPE_BSTR:
+ Buf = (StrBuf*) SBstr(Tokens->Params[N]->Start,
+ Tokens->Params[N]->len);
+ *Value = ChrPtr(Buf);
+ *len = StrLength(Buf);
+ break;
+ case TYPE_PREFSTR:
+ get_PREFERENCE(
+ Tokens->Params[N]->Start,
+ Tokens->Params[N]->len,
+ &Buf);
+ *Value = ChrPtr(Buf);
+ *len = StrLength(Buf);
+ break;
+ case TYPE_LONG:
+ case TYPE_PREFINT:
+ break; ///todo: string to text?
+ case TYPE_GETTEXT:
+ *Value = _(Tokens->Params[N]->Start);
+ *len = strlen(*Value);
+ break;
+ default:
+ break;
+//todo log error
+ }
+}
+
+
+
/**
* \brief Print the value of a variable
* \param keyname get a key to print
TemplateParam *Parm = (TemplateParam *) malloc(sizeof(TemplateParam));
char quote = '\0';
+
+ Parm->Type = TYPE_STR;
+
/* Skip leading whitespaces */
while ((*pch == ' ' )||
(*pch == '\t')||
(*pch == '\r')||
(*pch == '\n')) pch ++;
+
+ if (*pch == ':') {
+ Parm->Type = TYPE_PREFSTR;
+ pch ++;
+ }
+ else if (*pch == ';') {
+ Parm->Type = TYPE_PREFINT;
+ pch ++;
+ }
+ else if (*pch == '_') {
+ Parm->Type = TYPE_GETTEXT;
+ pch ++;
+ }
+ else if (*pch == 'B') {
+ Parm->Type = TYPE_BSTR;
+ pch ++;
+ }
+
+
if (*pch == '"')
quote = '"';
else if (*pch == '\'')
if (quote != '\0') {
pch ++;
pchs = pch;
- Parm->Type = TYPE_STR;
while (pch <= pe &&
((*pch != quote) ||
( (pch > pchs) && (*(pch - 1) == '\\'))
Token->Params[4]->len,
0);
}
+ else {
+ lprintf(1, "Conditional [%s] (in '%s' line %ld); needs at least 6 Params![%s]\n",
+ Token->Params[0]->Start,
+ ChrPtr(pTmpl->FileName),
+ Token->Line,
+ ChrPtr(Token->FlatToken));
+ StrBufAppendPrintf(
+ Target,
+ "<pre>\nConditional [%s] (in '%s' line %ld); needs 6 Params!\n[%s]\n</pre>\n",
+ Token->Params[0]->Start,
+ ChrPtr(pTmpl->FileName),
+ Token->Line,
+ ChrPtr(Token->FlatToken));
+ }
break;
case SV_SUBTEMPL:
if (Token->nParameters == 1)
int ContextRequired)
{
ConditionalStruct *Cond = (ConditionalStruct*)malloc(sizeof(ConditionalStruct));
+ Cond->PlainName = Name;
Cond->nParams = nParams;
Cond->CondF = CondF;
Cond->ContextRequired = ContextRequired;
Put(Conditionals, Name, len, Cond, NULL);
}
+
+void tmplput_ContextString(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrBufAppendTemplate(Target, nArgs, Tokens, Context, ContextType, (StrBuf*)Context, 0);
+}
+int ConditionalContextStr(WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrBuf *TokenText = (StrBuf*) Context;
+ const char *CompareToken;
+ long len;
+
+ GetTemplateTokenString(Tokens, 2, &CompareToken, &len);
+ return strcmp(ChrPtr(TokenText), CompareToken) == 0;
+}
+
+
void tmpl_do_boxed(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
{
+ StrBuf *Headline;
if (nArgs == 2) {
- StrBuf *Headline = NewStrBuf();
- DoTemplate(Tokens->Params[1]->Start,
- Tokens->Params[1]->len,
- Headline,
- Context,
- ContextType);
- SVPutBuf("BOXTITLE", Headline, 0);
+ if (Tokens->Params[1]->Type == TYPE_STR) {
+ Headline = NewStrBuf();
+ DoTemplate(Tokens->Params[1]->Start,
+ Tokens->Params[1]->len,
+ Headline,
+ Context,
+ ContextType);
+ }
+ else {
+ const char *Ch;
+ long len;
+ GetTemplateTokenString(Tokens,
+ 1,
+ &Ch,
+ &len);
+ Headline = NewStrBufPlain(Ch, len);
+ }
}
- DoTemplate(HKEY("beginbox"), Target, Context, ContextType);
+ DoTemplate(HKEY("beginbox"), Target, Headline, CTX_STRBUF);
DoTemplate(Tokens->Params[0]->Start,
Tokens->Params[0]->len,
Target,
DoTemplate(HKEY("endbox"), Target, Context, ContextType);
}
+
void tmpl_do_tabbed(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
{
StrBuf **TabNames;
InitModule_SUBST
(void)
{
+ RegisterNamespace("CONTEXTSTR", 0, 1, tmplput_ContextString, CTX_STRBUF);
RegisterNamespace("ITERATE", 2, 100, tmpl_iterate_subtmpl, CTX_NONE);
RegisterNamespace("DOBOXED", 1, 2, tmpl_do_boxed, CTX_NONE);
RegisterNamespace("DOTABBED", 2, 100, tmpl_do_tabbed, CTX_NONE);
RegisterConditional(HKEY("COND:SUBST"), 3, ConditionalVar, CTX_NONE);
+ RegisterConditional(HKEY("COND:CONTEXTSTR"), 3, ConditionalContextStr, CTX_STRBUF);
}
/*@}*/