typedef struct _HashHandler {
ContextFilter Filter;
-
+ WCPreevalFunc PreEvalFunc;
WCHandlerFunc HandlerFunc;
}HashHandler;
int nMinArgs,
int nMaxArgs,
WCHandlerFunc HandlerFunc,
+ WCPreevalFunc PreevalFunc,
int ContextRequired)
{
HashHandler *NewHandler;
NewHandler->Filter.ContextType = ContextRequired;
NewHandler->Filter.ControlContextType = CTX_NONE;
+ NewHandler->PreEvalFunc = PreevalFunc;
NewHandler->HandlerFunc = HandlerFunc;
Put(GlobalNS, NSName, len, NewHandler, NULL);
}
StrBuf *Buf;
WCTemplputParams SubTP;
- if (TP->Tokens->nParameters < N) {
+ if (N >= TP->Tokens->nParameters) {
LogTemplateError(Target,
"TokenParameter", N, TP,
"invalid token %d. this shouldn't have come till here.\n", N);
long GetTemplateTokenNumber(StrBuf *Target, WCTemplputParams *TP, int N, long dflt)
{
long Ret;
- if (TP->Tokens->nParameters < N) {
+ if (N >= TP->Tokens->nParameters) {
LogTemplateError(Target,
"TokenParameter", N, TP,
"invalid token %d. this shouldn't have come till here.\n", N);
case 'J':
StrECMAEscAppend(Target, Source, NULL);
break;
+ case 'K':
+ StrHtmlEcmaEscAppend(Target, Source, NULL, 0, 0);
+ break;
case 'U':
StrBufUrlescAppend(Target, Source, NULL);
break;
else {
NewToken->PreEval = Handler;
NewToken->Flags = SV_PREEVALUATED;
+ if (Handler->PreEvalFunc != NULL)
+ Handler->PreEvalFunc(NewToken);
}
}
break;
int LastN;
}IterateStruct;
-void tmpl_iterate_subtmpl(StrBuf *Target, WCTemplputParams *TP)
+int preeval_iterate(WCTemplateToken *Token)
{
+ WCTemplputParams TPP;
+ WCTemplputParams *TP;
void *vIt;
+
+ memset(&TPP, 0, sizeof(WCTemplputParams));
+ TP = &TPP;
+ TP->Tokens = Token;
+ if (!GetHash(Iterators, TKEY(0), &vIt)) {
+ LogTemplateError(
+ NULL, "Iterator", ERR_NAME, TP,
+ "not found");
+ return 0;
+ }
+ Token->Preeval2 = vIt;
+ return 1;
+}
+
+void tmpl_iterate_subtmpl(StrBuf *Target, WCTemplputParams *TP)
+{
HashIterator *It;
HashList *List;
HashPos *it;
memset(&Status, 0, sizeof(IterateStruct));
memcpy (&SubTP, &TP, sizeof(WCTemplputParams));
- if (!GetHash(Iterators, TKEY(0), &vIt)) {
+ It = (HashIterator*) TP->Tokens->Preeval2;
+ if (It == NULL) {
LogTemplateError(
Target, "Iterator", ERR_PARM1, TP, "Unknown!");
return;
}
- It = (HashIterator*) vIt;
-
if (TP->Tokens->nParameters < It->AdditionalParams + 2) {
LogTemplateError(
Target, "Iterator", ERR_PARM1, TP,
return 0;
}
+
+void tmplput_CURRENT_FILE(StrBuf *Target, WCTemplputParams *TP)
+{
+ StrBufAppendTemplate(Target, TP, TP->Tokens->FileName, 0);
+}
+
void
InitModule_SUBST
(void)
{
memset(&NoCtx, 0, sizeof(WCTemplputParams));
- RegisterNamespace("SORT:ICON", 1, 2, tmplput_SORT_ICON, CTX_NONE);
- RegisterNamespace("SORT:ORDER", 1, 2, tmplput_SORT_ORDER, CTX_NONE);
- RegisterNamespace("SORT:NEXT", 1, 2, tmplput_SORT_NEXT, CTX_NONE);
- 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);
- RegisterNamespace("LONGVECTOR", 1, 1, tmplput_long_vector, CTX_LONGVECTOR);
+ RegisterNamespace("SORT:ICON", 1, 2, tmplput_SORT_ICON, NULL, CTX_NONE);
+ RegisterNamespace("SORT:ORDER", 1, 2, tmplput_SORT_ORDER, NULL, CTX_NONE);
+ RegisterNamespace("SORT:NEXT", 1, 2, tmplput_SORT_NEXT, NULL, CTX_NONE);
+ RegisterNamespace("CONTEXTSTR", 0, 1, tmplput_ContextString, NULL, CTX_STRBUF);
+ RegisterNamespace("ITERATE", 2, 100, tmpl_iterate_subtmpl, preeval_iterate, CTX_NONE);
+ RegisterNamespace("DOBOXED", 1, 2, tmpl_do_boxed, NULL, CTX_NONE);
+ RegisterNamespace("DOTABBED", 2, 100, tmpl_do_tabbed, NULL, CTX_NONE);
+ RegisterNamespace("LONGVECTOR", 1, 1, tmplput_long_vector, NULL, CTX_LONGVECTOR);
RegisterConditional(HKEY("COND:SUBST"), 3, ConditionalVar, CTX_NONE);
RegisterConditional(HKEY("COND:CONTEXTSTR"), 3, ConditionalContextStr, CTX_STRBUF);
RegisterConditional(HKEY("COND:LONGVECTOR"), 4, ConditionalLongVector, CTX_LONGVECTOR);
RegisterControlNS(HKEY("ITERATE:ODDEVEN"), 0, 0, tmplput_ITERATE_ODDEVEN, CTX_ITERATE);
RegisterControlNS(HKEY("ITERATE:KEY"), 0, 0, tmplput_ITERATE_KEY, CTX_ITERATE);
RegisterControlNS(HKEY("ITERATE:N"), 0, 0, tmplput_ITERATE_LASTN, CTX_ITERATE);
+ RegisterNamespace("CURRENTFILE", 0, 1, tmplput_CURRENT_FILE, NULL, CTX_NONE);
+
+
}
void