]> code.citadel.org Git - citadel.git/blobdiff - webcit/subst.c
+ add =() subtemplates for params
[citadel.git] / webcit / subst.c
index 28afdebc850c96d350fd8684f0c31f9914794f66..215527a6185bbba3b1ebf3e9eb111d6be47ab45f 100644 (file)
@@ -537,6 +537,7 @@ void GetTemplateTokenString(WCTemplputParams *TP,
                            long *len)
 {
        StrBuf *Buf;
+       WCTemplputParams SubTP;
 
        if (TP->Tokens->nParameters < N) {
                lprintf(1, "invalid token. this shouldn't have come till here.\n");
@@ -569,6 +570,18 @@ void GetTemplateTokenString(WCTemplputParams *TP,
                *Value = _(TP->Tokens->Params[N]->Start);
                *len = strlen(*Value);
                break;
+       case TYPE_SUBTEMPLATE:
+               memset(&SubTP, 0, sizeof(WCTemplputParams *));
+               SubTP.Context = TP->Context;
+               SubTP.ContextType = TP->ContextType;
+               Buf = NewStrBuf();
+               DoTemplate(TKEY(N), Buf, &SubTP);
+               *Value = ChrPtr(Buf);
+               *len = StrLength(Buf);
+               /* we can't free it here, so we put it into the subst so its discarded later on. */
+               SVPUTBuf(TKEY(N), Buf, 0);
+               break;
+
        default:
                break;
 /*/todo log error */
@@ -733,6 +746,9 @@ void StrBufAppendTemplate(StrBuf *Target,
        case 'X':
                StrEscAppend(Target, Source, NULL, 0, 0);
                break;
+       case 'J':
+         StrECMAEscAppend(Target, Source, NULL);
+         break;
        default:
                StrBufAppendBuf(Target, Source, 0);
        }
@@ -768,7 +784,7 @@ TemplateParam *GetNextParameter(StrBuf *Buf, const char **pCh, const char *pe, W
        const char *pchs, *pche;
        TemplateParam *Parm = (TemplateParam *) malloc(sizeof(TemplateParam));
        char quote = '\0';
-       
+       int ParamBrace = 0;
 
        Parm->Type = TYPE_STR;
 
@@ -781,20 +797,42 @@ TemplateParam *GetNextParameter(StrBuf *Buf, const char **pCh, const char *pe, W
        if (*pch == ':') {
                Parm->Type = TYPE_PREFSTR;
                pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
        }
        else if (*pch == ';') {
                Parm->Type = TYPE_PREFINT;
                pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
        }
        else if (*pch == '_') {
                Parm->Type = TYPE_GETTEXT;
                pch ++;
-               if (*pch == '(')
+               if (*pch == '(') {
                        pch ++;
+                       ParamBrace = 1;
+               }
        }
        else if (*pch == 'B') {
                Parm->Type = TYPE_BSTR;
                pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
+       }
+       else if (*pch == '=') {
+               Parm->Type = TYPE_SUBTEMPLATE;
+               pch ++;
+               if (*pch == '(') {
+                       pch ++;
+                       ParamBrace = 1;
+               }
        }
 
 
@@ -832,7 +870,7 @@ TemplateParam *GetNextParameter(StrBuf *Buf, const char **pCh, const char *pe, W
                        Parm->Start = pchs;
                        Parm->len = pche - pchs;
                        pch ++; /* move after trailing quote */
-                       if ((Parm->Type = TYPE_GETTEXT) && (*pch == ')')) {
+                       if (ParamBrace && (*pch == ')')) {
                                pch ++;
                        }
 
@@ -1799,7 +1837,8 @@ void RegisterSortFunc(const char *name, long len,
        Put(SortHash, name, len, NewSort, DestroySortStruct);
 }
 
-CompareFunc RetrieveSort(WCTemplputParams *TP, const char *OtherPrefix, 
+CompareFunc RetrieveSort(WCTemplputParams *TP, 
+                        const char *OtherPrefix, long OtherPrefixLen,
                         const char *Default, long ldefault, long DefaultDirection)
 {
        int isdefault = 0;
@@ -1810,13 +1849,19 @@ CompareFunc RetrieveSort(WCTemplputParams *TP, const char *OtherPrefix,
        
        if (havebstr("SortBy")) {
                BSort = sbstr("SortBy");
+               if (OtherPrefix == NULL) {
+                       set_room_pref("sort", NewStrBufDup(BSort), 0);
+               }
+               else {
+                       set_X_PREFS(HKEY("sort"), OtherPrefix, OtherPrefixLen, NewStrBufDup(BSort), 0);
+               }
        }
        else { /** Try to fallback to our remembered values... */
                if (OtherPrefix == NULL) {
                        BSort = get_room_pref("sort");
                }
                else {
-                       /*TODO: nail prefprepend to sort, and lookup this! */
+                       BSort = get_X_PREFS(HKEY("sort"), OtherPrefix, OtherPrefixLen);
                }
                if (BSort != NULL)
                        putbstr("SortBy", NewStrBufDup(BSort));
@@ -1852,7 +1897,7 @@ CompareFunc RetrieveSort(WCTemplputParams *TP, const char *OtherPrefix,
                        SortOrder = StrTol(Buf);
                }
                else {
-                       /* TODO: nail prefprepend to sort, and lookup this! */
+                       BSort = get_X_PREFS(HKEY("SortOrder"), OtherPrefix, OtherPrefixLen);
                }
 
                if (Buf == NULL)
@@ -1894,7 +1939,7 @@ ConstStr SortNextOrder[] = {
 };
 
 
-int GetSortMetric(WCTemplputParams *TP, SortStruct **Next, SortStruct **Param, long *SortOrder)
+int GetSortMetric(WCTemplputParams *TP, SortStruct **Next, SortStruct **Param, long *SortOrder, int N)
 {
        int bSortError = eNOT_SPECIFIED;
        const StrBuf *BSort;
@@ -1911,13 +1956,19 @@ int GetSortMetric(WCTemplputParams *TP, SortStruct **Next, SortStruct **Param, l
        if (havebstr("SortBy")) {
                BSort = sbstr("SortBy");
                bSortError = eINVALID_PARAM;
+               if ((*Param)->PrefPrepend == NULL) {
+                       set_room_pref("sort", NewStrBufDup(BSort), 0);
+               }
+               else {
+                       set_X_PREFS(HKEY("sort"), TKEY(N), NewStrBufDup(BSort), 0);
+               }
        }
        else { /** Try to fallback to our remembered values... */
                if ((*Param)->PrefPrepend == NULL) {
                        BSort = get_room_pref("sort");
                }
                else {
-                       BSort = NULL;/* TODO: nail prefprepend to sort, and lookup this! */
+                       BSort = get_X_PREFS(HKEY("sort"), TKEY(N));
                }
        }
 
@@ -1936,7 +1987,7 @@ int GetSortMetric(WCTemplputParams *TP, SortStruct **Next, SortStruct **Param, l
                        *SortOrder = StrTol(get_room_pref("SortOrder"));
                }
                else {
-                       *SortOrder = 0;/* TODO: nail prefprepend to sort, and lookup this! */
+                       *SortOrder = StrTol(get_X_PREFS(HKEY("SortOrder"), TKEY(N)));
                }
        }
        if (*SortOrder > 2)
@@ -1953,7 +2004,7 @@ void tmplput_SORT_ICON(StrBuf *Target, WCTemplputParams *TP)
        SortStruct *Param;
        const ConstStr *SortIcon;
 
-       switch (GetSortMetric(TP, &Next, &Param, &SortOrder)){
+       switch (GetSortMetric(TP, &Next, &Param, &SortOrder, 2)){
        case eNO_SUCH_SORT:
                 LogTemplateError(
                         Target, "Sorter", ERR_PARM1, TP,
@@ -1982,7 +2033,7 @@ void tmplput_SORT_NEXT(StrBuf *Target, WCTemplputParams *TP)
        SortStruct *Next;
        SortStruct *Param;
 
-       switch (GetSortMetric(TP, &Next, &Param, &SortOrder)){
+       switch (GetSortMetric(TP, &Next, &Param, &SortOrder, 2)){
        case eNO_SUCH_SORT:
                 LogTemplateError(
                         Target, "Sorter", ERR_PARM1, TP,                                  
@@ -2008,7 +2059,7 @@ void tmplput_SORT_ORDER(StrBuf *Target, WCTemplputParams *TP)
        SortStruct *Next;
        SortStruct *Param;
 
-       switch (GetSortMetric(TP, &Next, &Param, &SortOrder)){
+       switch (GetSortMetric(TP, &Next, &Param, &SortOrder, 2)){
        case eNO_SUCH_SORT:
                 LogTemplateError(
                         Target, "Sorter", ERR_PARM1, TP,
@@ -2113,9 +2164,9 @@ InitModule_SUBST
 (void)
 {
        memset(&NoCtx, 0, sizeof(WCTemplputParams));
-       RegisterNamespace("SORT:ICON", 1, 1, tmplput_SORT_ICON, CTX_NONE);
-       RegisterNamespace("SORT:ORDER", 1, 1, tmplput_SORT_ORDER, CTX_NONE);
-       RegisterNamespace("SORT:NEXT", 1, 1, tmplput_SORT_NEXT, CTX_NONE);
+       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);