#define SV_PREEVALUATED 6
+
/*
* Dynamic content for variable substitution in templates
*/
long *len)
{
StrBuf *Buf;
-/// WCTemplputParams SubTP;
if (N >= TP->Tokens->nParameters) {
LogTemplateError(Target,
char EscapeAs = ' ';
if ((FormatTypeIndex < TP->Tokens->nParameters) &&
+ (TP->Tokens->Params[FormatTypeIndex] != NULL) &&
(TP->Tokens->Params[FormatTypeIndex]->Type == TYPE_STR) &&
(TP->Tokens->Params[FormatTypeIndex]->len >= 1)) {
pFmt = TP->Tokens->Params[FormatTypeIndex]->Start;
break;
case 'J':
StrECMAEscAppend(Target, Source, NULL);
- break;
+ break;
case 'K':
StrHtmlEcmaEscAppend(Target, Source, NULL, 0, 0);
- break;
+ break;
case 'U':
StrBufUrlescAppend(Target, Source, NULL);
break;
break;
*/
default:
- StrBufAppendBufPlain(Target, Source, 0, 0);
+ StrBufAppendBufPlain(Target, Source, -1, 0);
}
}
}
break;
case SV_GETTEXT:
- if (NewToken->nParameters !=1) {
+ if ((NewToken->nParameters < 1) || (NewToken->nParameters > 2)) {
LogTemplateError(
NULL, "Gettext", ERR_NAME, &TP,
- "requires exactly 1 parameter, you gave %d params",
+ "requires 1 or 2 parameter, you gave %d params",
NewToken->nParameters);
NewToken->Flags = 0;
break;
char *MinorPtr;
#ifdef _DIRENT_HAVE_D_NAMLEN
- d_namelen = filedir_entry->d_namelen;
-
+ d_namelen = filedir_entry->d_namlen;
#else
d_namelen = strlen(filedir_entry->d_name);
#endif
done = 1;
}
else {
- int TokenRc;
+ int TokenRc = 0;
StrBufAppendBufPlain(
Target, pData,
}
+
+StrBuf *textPlainType;
/**
* \brief Display a variable-substituted template
* \param templatename template file to load
{
syslog(LOG_WARNING, "Can't to load a template with empty name!\n");
StrBufAppendPrintf(Target, "<pre>\nCan't to load a template with empty name!\n</pre>");
- return NULL;
+ return textPlainType;
}
if (!GetHash(StaticLocal, templatename, len, &vTmpl) &&
!GetHash(Static, templatename, len, &vTmpl)) {
- syslog(LOG_WARNING, "didn't find Template [%s] %ld %ld\n", templatename, len , (long)strlen(templatename));
+ StrBuf *escapedString = NewStrBufPlain(NULL, len);
+
+ StrHtmlEcmaEscAppend(escapedString, NULL, templatename, 1, 1);
+ syslog(LOG_WARNING, "didn't find Template [%s] %ld %ld\n", ChrPtr(escapedString), len , (long)strlen(templatename));
StrBufAppendPrintf(Target, "<pre>\ndidn't find Template [%s] %ld %ld\n</pre>",
- templatename, len,
+ ChrPtr(escapedString), len,
(long)strlen(templatename));
+ WC->isFailure = 1;
#if 0
dbg_PrintHash(Static, PrintTemplate, NULL);
PrintHash(Static, VarPrintTransition, PrintTemplate);
#endif
- return NULL;
+ FreeStrBuf(&escapedString);
+ return textPlainType;
}
if (vTmpl == NULL)
- return NULL;
+ return textPlainType;
return ProcessTemplate(vTmpl, Target, TP);
}
RetrieveHashlistFunc GetHash;
HashDestructorFunc Destructor;
SubTemplFunc DoSubTemplate;
+ FilterByParamFunc Filter;
} HashIterator;
void RegisterITERATOR(const char *Name, long len,
RetrieveHashlistFunc GetHash,
SubTemplFunc DoSubTempl,
HashDestructorFunc Destructor,
+ FilterByParamFunc Filter,
CtxType ContextType,
CtxType XPectContextType,
int Flags)
It->GetHash = GetHash;
It->DoSubTemplate = DoSubTempl;
It->Destructor = Destructor;
+ It->Filter = Filter;
It->ContextType = ContextType;
It->XPectContextType = XPectContextType;
It->Flags = Flags;
/** Ok, its us, lets see in which direction we should sort... */
(havebstr("SortOrder"))) {
int SortOrder;
- SortOrder = LBSTR("SortOrder");
+ SortOrder = lbstr("SortOrder");
if (SortOrder != 0)
DetectGroupChange = 1;
}
}
while (GetNextHashPos(List, it, &Status.KeyLen, &Status.Key, &vContext)) {
if ((Status.n >= StartAt) && (Status.n <= StopAt)) {
+
+ if ((It->Filter != NULL) &&
+ !It->Filter(Status.Key, Status.KeyLen, vContext, Target, TP))
+ {
+ continue;
+ }
+
if (DetectGroupChange && Status.n > 0) {
Status.GroupChange = SortBy->GroupChange(vContext, vLastContext);
}
StrBufAppendBufPlain(Target, Ctx->Key, Ctx->KeyLen, 0);
}
+void tmplput_ITERATE_N_DIV(StrBuf *Target, WCTemplputParams *TP)
+{
+ IterateStruct *Ctx = CTX(CTX_ITERATE);
+ long div;
+ long divisor = GetTemplateTokenNumber(Target, TP, 0, 1);
+///TODO divisor == 0 -> log error exit
+ div = Ctx->n / divisor;
+ StrBufAppendPrintf(Target, "%ld", div);
+}
-void tmplput_ITERATE_LASTN(StrBuf *Target, WCTemplputParams *TP)
+void tmplput_ITERATE_N(StrBuf *Target, WCTemplputParams *TP)
{
IterateStruct *Ctx = CTX(CTX_ITERATE);
StrBufAppendPrintf(Target, "%d", Ctx->n);
return Ctx->LastN;
}
+int conditional_ITERATE_ISMOD(StrBuf *Target, WCTemplputParams *TP)
+{
+ IterateStruct *Ctx = CTX(CTX_ITERATE);
+
+ long divisor = GetTemplateTokenNumber(Target, TP, 2, 1);
+ long expectRemainder = GetTemplateTokenNumber(Target, TP, 3, 0);
+
+ return Ctx->n % divisor == expectRemainder;
+}
+
/*-----------------------------------------------------------------------------
}
StackContext (TP, &SubTP, &TS, CTX_TAB, 0, NULL);
{
-//// TODO jetzt memcpy (&SubTP, TP, sizeof(WCTemplputParams));
-// SubTP.Filter.ControlContextType = ;
-
StrTabbedDialog(Target, nTabs, TabNames);
for (i = 0; i < ntabs; i++) {
memset(&TS, 0, sizeof(tab_struct));
/** Ok, its us, lets see in which direction we should sort... */
if (havebstr("SortOrder")) {
- SortOrder = LBSTR("SortOrder");
+ SortOrder = lbstr("SortOrder");
}
else { /** Try to fallback to our remembered values... */
StrBuf *Buf = NULL;
/** Ok, its us, lets see in which direction we should sort... */
if (havebstr("SortOrder")) {
- *SortOrder = LBSTR("SortOrder");
+ *SortOrder = lbstr("SortOrder");
}
else { /** Try to fallback to our remembered values... */
if ((*Param)->PrefPrepend == NULL) {
RegisterConditional("COND:ITERATE:FIRSTN", 2,
conditional_ITERATE_FIRSTN,
CTX_ITERATE);
+ RegisterConditional("COND:ITERATE:ISMOD", 3,
+ conditional_ITERATE_ISMOD,
+ CTX_ITERATE);
RegisterNamespace("ITERATE:ODDEVEN", 0, 0, tmplput_ITERATE_ODDEVEN, NULL, CTX_ITERATE);
RegisterNamespace("ITERATE:KEY", 0, 0, tmplput_ITERATE_KEY, NULL, CTX_ITERATE);
- RegisterNamespace("ITERATE:N", 0, 0, tmplput_ITERATE_LASTN, NULL, CTX_ITERATE);
+ RegisterNamespace("ITERATE:N", 0, 0, tmplput_ITERATE_N, NULL, CTX_ITERATE);
+ RegisterNamespace("ITERATE:N:DIV", 1, 1, tmplput_ITERATE_N_DIV, NULL, CTX_ITERATE);
RegisterNamespace("CURRENTFILE", 0, 1, tmplput_CURRENT_FILE, NULL, CTX_NONE);
RegisterNamespace("DEF:STR", 1, 1, tmplput_DefStr, NULL, CTX_NONE);
RegisterNamespace("DEF:VAL", 1, 1, tmplput_DefVal, NULL, CTX_NONE);
ServerStartModule_SUBST
(void)
{
+ textPlainType = NewStrBufPlain(HKEY("text/plain"));
LocalTemplateCache = NewHash(1, NULL);
TemplateCache = NewHash(1, NULL);
-
GlobalNS = NewHash(1, NULL);
Iterators = NewHash(1, NULL);
Conditionals = NewHash(1, NULL);
ServerShutdownModule_SUBST
(void)
{
+ FreeStrBuf(&textPlainType);
+
DeleteHash(&TemplateCache);
DeleteHash(&LocalTemplateCache);
-
+
DeleteHash(&GlobalNS);
DeleteHash(&Iterators);
DeleteHash(&Conditionals);