]> code.citadel.org Git - citadel.git/blobdiff - webcit/subst.c
* new token to put in the actual filename (just works when debugging enabled)
[citadel.git] / webcit / subst.c
index fbbb6b8e108f0653a3d10fd453c80f581d19c678..a4a8edea2d7f601b82fa2ab94a80b925c00b39ae 100644 (file)
@@ -66,7 +66,7 @@ typedef struct _WCTemplate {
 
 typedef struct _HashHandler {
        ContextFilter Filter;
-
+       WCPreevalFunc PreEvalFunc;
        WCHandlerFunc HandlerFunc;
 }HashHandler;
 
@@ -104,6 +104,7 @@ const char *CtxNames[]  = {
        "Context FLOORS",
        "Context ITERATE",
        "Context ICAL",
+       "Context DavNamespace",
        "Context UNKNOWN"
 };
 
@@ -178,8 +179,11 @@ void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplpu
                return;
 */
        WCC = WC;
-       if (WCC == NULL)
-               return;
+       if (WCC == NULL) {
+               FreeStrBuf(&Info);
+               FreeStrBuf(&Error);
+               return; 
+       }
 
        Header = NewStrBuf();
        if (TP->Tokens != NULL) 
@@ -285,6 +289,7 @@ void RegisterNS(const char *NSName,
                int nMinArgs, 
                int nMaxArgs, 
                WCHandlerFunc HandlerFunc, 
+               WCPreevalFunc PreevalFunc,
                int ContextRequired)
 {
        HashHandler *NewHandler;
@@ -296,6 +301,7 @@ void RegisterNS(const char *NSName,
        NewHandler->Filter.ContextType = ContextRequired;
        NewHandler->Filter.ControlContextType = CTX_NONE;
 
+       NewHandler->PreEvalFunc = PreevalFunc;
        NewHandler->HandlerFunc = HandlerFunc;  
        Put(GlobalNS, NSName, len, NewHandler, NULL);
 }
@@ -763,7 +769,7 @@ void GetTemplateTokenString(StrBuf *Target,
        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);
@@ -850,7 +856,7 @@ void GetTemplateTokenString(StrBuf *Target,
 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);
@@ -1069,6 +1075,9 @@ void StrBufAppendTemplate(StrBuf *Target,
        case 'J':
                StrECMAEscAppend(Target, Source, NULL);
          break;
+       case 'K':
+               StrHtmlEcmaEscAppend(Target, Source, NULL, 0, 0);
+         break;
        case 'U':
                StrBufUrlescAppend(Target, Source, NULL);
                break;
@@ -1343,6 +1352,8 @@ WCTemplateToken *NewTemplateSubstitute(StrBuf *Buf,
                        else {
                                NewToken->PreEval = Handler;
                                NewToken->Flags = SV_PREEVALUATED;              
+                               if (Handler->PreEvalFunc != NULL)
+                                       Handler->PreEvalFunc(NewToken);
                        }
                }
                break;
@@ -1505,7 +1516,11 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
                /** Find one <? > */
                pos = (-1);
                for (; pch < pE; pch ++) {
-                       if ((*pch=='<')&&(*(pch + 1)=='?'))
+                       if ((*pch=='<')&&(*(pch + 1)=='?') &&
+                           !((pch == pS) && /* we must ommit a <?xml */
+                             (*(pch + 2) == 'x') && 
+                             (*(pch + 3) == 'm') && 
+                             (*(pch + 4) == 'l')))                          
                                break;
                        if (*pch=='\n') Line ++;
                }
@@ -1881,9 +1896,27 @@ typedef struct _iteratestruct {
        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;
@@ -1904,14 +1937,13 @@ void tmpl_iterate_subtmpl(StrBuf *Target, WCTemplputParams *TP)
        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,
@@ -2587,19 +2619,25 @@ int ConditionalLongVector(StrBuf *Target, WCTemplputParams *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);
@@ -2617,6 +2655,9 @@ InitModule_SUBST
        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