long *len)
{
StrBuf *Buf;
+ WCTemplputParams SubTP;
if (TP->Tokens->nParameters < N) {
lprintf(1, "invalid token. this shouldn't have come till here.\n");
*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 */
case 'X':
StrEscAppend(Target, Source, NULL, 0, 0);
break;
+ case 'J':
+ StrECMAEscAppend(Target, Source, NULL);
+ break;
default:
StrBufAppendBuf(Target, Source, 0);
}
const char *pchs, *pche;
TemplateParam *Parm = (TemplateParam *) malloc(sizeof(TemplateParam));
char quote = '\0';
-
+ int ParamBrace = 0;
Parm->Type = TYPE_STR;
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;
+ }
}
Parm->Start = pchs;
Parm->len = pche - pchs;
pch ++; /* move after trailing quote */
- if ((Parm->Type = TYPE_GETTEXT) && (*pch == ')')) {
+ if (ParamBrace && (*pch == ')')) {
pch ++;
}
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;
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));
SortOrder = StrTol(Buf);
}
else {
- /* TODO: nail prefprepend to sort, and lookup this! */
+ BSort = get_X_PREFS(HKEY("SortOrder"), OtherPrefix, OtherPrefixLen);
}
if (Buf == NULL)
};
-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;
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));
}
}
*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)
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,
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,
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,
(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);