X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsubst.c;h=ab4edce38692746f02a8a89f06cd0ab4ba8f9637;hb=01dab5c387efaa597377d1264e832474f30a754b;hp=6c80802c220f47fbd70a494d8e693b9e0ff002bf;hpb=156d3eaa1b5d85cb70a79046bd874ab832df6ff1;p=citadel.git diff --git a/webcit/subst.c b/webcit/subst.c index 6c80802c2..ab4edce38 100644 --- a/webcit/subst.c +++ b/webcit/subst.c @@ -43,6 +43,7 @@ const char EmptyStr[]=""; #define SV_PREEVALUATED 6 + /* * Dynamic content for variable substitution in templates */ @@ -485,7 +486,6 @@ void GetTemplateTokenString(StrBuf *Target, long *len) { StrBuf *Buf; -/// WCTemplputParams SubTP; if (N >= TP->Tokens->nParameters) { LogTemplateError(Target, @@ -679,6 +679,7 @@ void StrBufAppendTemplate(StrBuf *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; @@ -695,10 +696,10 @@ void StrBufAppendTemplate(StrBuf *Target, 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; @@ -758,7 +759,7 @@ void StrBufAppendTemplateStr(StrBuf *Target, break; */ default: - StrBufAppendBufPlain(Target, Source, 0, 0); + StrBufAppendBufPlain(Target, Source, -1, 0); } } @@ -1203,10 +1204,10 @@ WCTemplateToken *NewTemplateSubstitute(StrBuf *Buf, } 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; @@ -1526,8 +1527,7 @@ int LoadTemplateDir(const StrBuf *DirName, HashList *big, const StrBuf *BaseKey) 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 @@ -1845,7 +1845,7 @@ const StrBuf *ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, WCTemplputParams done = 1; } else { - int TokenRc; + int TokenRc = 0; StrBufAppendBufPlain( Target, pData, @@ -1984,6 +1984,7 @@ typedef struct _HashIterator { RetrieveHashlistFunc GetHash; HashDestructorFunc Destructor; SubTemplFunc DoSubTemplate; + FilterByParamFunc Filter; } HashIterator; void RegisterITERATOR(const char *Name, long len, @@ -1992,6 +1993,7 @@ void RegisterITERATOR(const char *Name, long len, RetrieveHashlistFunc GetHash, SubTemplFunc DoSubTempl, HashDestructorFunc Destructor, + FilterByParamFunc Filter, CtxType ContextType, CtxType XPectContextType, int Flags) @@ -2005,6 +2007,7 @@ void RegisterITERATOR(const char *Name, long len, It->GetHash = GetHash; It->DoSubTemplate = DoSubTempl; It->Destructor = Destructor; + It->Filter = Filter; It->ContextType = ContextType; It->XPectContextType = XPectContextType; It->Flags = Flags; @@ -2158,6 +2161,13 @@ void tmpl_iterate_subtmpl(StrBuf *Target, WCTemplputParams *TP) } 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); } @@ -2532,9 +2542,6 @@ void tmpl_do_tabbed(StrBuf *Target, WCTemplputParams *TP) } 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));