-/**
- * @defgroup subst Template processing functions
+/*
+ * Copyright (c) 1996-2013 by the citadel.org team
+ *
+ * This program is open source software. You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * subst template processing functions
*/
extern HashList *Conditionals;
#define TYPE_STR 1
#define TYPE_LONG 2
#define TYPE_PREFSTR 3
-#define TYPE_PREFINT 4
-#define TYPE_GETTEXT 5
-#define TYPE_BSTR 6
-#define TYPE_SUBTEMPLATE 7
-#define TYPE_INTDEFINE 8
+#define TYPE_ROOMPREFSTR 4
+#define TYPE_PREFINT 5
+#define TYPE_GETTEXT 6
+#define TYPE_BSTR 7
+#define TYPE_SUBTEMPLATE 8
+#define TYPE_INTDEFINE 9
#define MAXPARAM 25
#define IS_NUMBER(a) ((a == TYPE_LONG) || (a == TYPE_PREFINT) || (a == TYPE_INTDEFINE))
int nArgs;
WCTemplateToken *Tokens;
WCTemplputParams *Sub, *Super;
+ WCConditionalFunc ExitCtx;
+ long ExitCTXID;
};
ContextFilter Filter;
const char *PlainName;
WCConditionalFunc CondF;
+ WCConditionalFunc CondExitCtx;
} ConditionalStruct;
typedef void (*SubTemplFunc)(StrBuf *TemplBuffer, WCTemplputParams *TP);
typedef HashList *(*RetrieveHashlistFunc)(StrBuf *Target, WCTemplputParams *TP);
typedef void (*HashDestructorFunc) (HashList **KillMe);
-
+typedef int (*FilterByParamFunc)(const char* key, long len, void *Context, StrBuf *Target, WCTemplputParams *TP);
extern WCTemplputParams NoCtx;
const StrBuf *Source,
int FormatTypeIndex);
+void StrBufAppendTemplateStr(StrBuf *Target,
+ WCTemplputParams *TP,
+ const char *Source,
+ int FormatTypeIndex);
+
#define RegisterNamespace(a, b, c, d, e, f) RegisterNS(a, sizeof(a)-1, b, c, d, e, f)
/**
* @param len the token length so we don't have to measure it.
* @param nParams how many parameters does your conditional need on top of the default conditional parameters
* @param CondF your Callback to be called when the template is evaluated at runtime; return 0 or 1 to us please.
+ * @param ExitCtxCond if non-NULL, will be called after the area of the conditional is left behind.
* @param ContextRequired if your token requires a specific context, else say CTX_NONE here.
*/
-void RegisterConditional(const char *Name, long len,
- int nParams,
- WCConditionalFunc CondF,
- int ContextRequired);
+void RegisterContextConditional(const char *Name, long len,
+ int nParams,
+ WCConditionalFunc CondF,
+ WCConditionalFunc ExitCtxCond,
+ int ContextRequired);
+
+#define RegisterCtxConditional(Name, nParams, CondF, ExitCtxCond, ContextRequired) \
+ RegisterContextConditional(Name, sizeof(Name) -1, nParams, CondF, ExitCtxCond, ContextRequired)
+
+#define RegisterConditional(Name, nParams, CondF, ContextRequired) \
+ RegisterContextConditional(Name, sizeof(Name) -1, nParams, CondF, NULL, ContextRequired)
+
/**
* @ingroup subst
#define IT_NOFLAG 0
#define IT_FLAG_DETECT_GROUPCHANGE (1<<0)
-#define RegisterIterator(a, b, c, d, e, f, g, h, i) RegisterITERATOR(a, sizeof(a)-1, b, c, d, e, f, g, h, i)
+#define IT_ADDT_PARAM(n) 5 + n /* If you have AdditionalParams, use this macro to fetch them. */
+#define RegisterIterator(a, b, c, d, e, f, g, h, i) RegisterITERATOR(a, sizeof(a)-1, b, c, d, e, f, NULL, g, h, i)
+#define RegisterFilteredIterator(a, b, c, d, e, f, g, h, i, j) RegisterITERATOR(a, sizeof(a)-1, b, c, d, e, f, g, h, i, j)
void RegisterITERATOR(const char *Name, long len, /* Our identifier */
- int AdditionalParams, /* doe we use more parameters? */
+ int AdditionalParams, /* do we use more parameters? */
HashList *StaticList, /* pointer to webcit lifetime hashlists */
RetrieveHashlistFunc GetHash, /* else retrieve the hashlist by calling this function */
SubTemplFunc DoSubTempl, /* call this function on each iteration for svput & friends */
HashDestructorFunc Destructor, /* use this function to shut down the hash; NULL if its a reference */
+ FilterByParamFunc Filter, /* use this function if you want to skip items */
CtxType ContextType, /* which context do we provide to the subtemplate? */
CtxType XPectContextType, /* which context do we expct to be called in? */
int Flags);
-void StackContext(WCTemplputParams *Super,
- WCTemplputParams *Sub,
- void *Context,
- CtxType ContextType,
- int nArgs,
- WCTemplateToken *Tokens);
+void StackDynamicContext(WCTemplputParams *Super,
+ WCTemplputParams *Sub,
+ void *Context,
+ CtxType ContextType,
+ int nArgs,
+ WCTemplateToken *Tokens,
+ WCConditionalFunc ExitCtx,
+ long ExitCTXID);
+
+#define StackContext(Super, Sub, Context, ContextType, nArgs, Tokens) \
+ StackDynamicContext(Super, Sub, Context, ContextType, nArgs, Tokens, NULL, 0)
+
void UnStackContext(WCTemplputParams *Sub);