return newMNode_str (new ustring (out.ans));
}
+/*DOC:
+===wiki-eval===
+ (wiki-eval ANY) -> ANY
+
+*/
+//#AFUNC wiki-eval ml_wiki_eval
+MNode* ml_wiki_eval (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ MNodePtr h;
+ std::vector<MNode*> params;
+
+ setParams (arg, 1, ¶ms, NULL, NULL, NULL);
+ h = eval (params[0], mlenv);
+ {
+ WikiFormat w (mlenv->env, false);
+ h = eval (h (), w.mlenv);
+ }
+ return mlenv->retval = h ();
+}
+
static ustring* wikivar (const ustring& name) {
ustring* ans = new ustring;
(defun-wiki-command FNAME (ARGS...) BLOCK...) -> NIL
$FNAME:ARGS:...
+===defun-wiki-command2===
+ (defun-wiki-command FNAME (ARGS...) BLOCK...) -> NIL
+ $FNAME:ARGS:...
+
*/
//#AFUNC defun-wiki-command ml_defun_wiki_command
+//#AFUNC defun-wiki-command2 ml_defun_wiki_command2
MNode* ml_defun_wiki_command (MNode* cell, MlEnv* mlenv) {
ustring name;
MNode* sexp = NULL;
return NULL;
}
+MNode* ml_defun_wiki_command2 (MNode* cell, MlEnv* mlenv) {
+ ustring name;
+ MNode* sexp = NULL;
+
+ checkDefun (cell->cdr (), name, sexp);
+ mlenv->env->wikienv->wikiCmd2.setVar (name, newLambda (sexp));
+
+ return NULL;
+}
+
/*DOC:
===get-wiki-command===
(get-wiki-command NAME) -> LAMBDA
MNode* ml_wiki (MNode* cell, MlEnv* mlenv);
MNode* ml_wiki_string (MNode* cell, MlEnv* mlenv);
+MNode* ml_wiki_eval (MNode* cell, MlEnv* mlenv);
MNode* ml_wikivar (MNode* cell, MlEnv* mlenv);
MNode* ml_wikivar_ary (MNode* cell, MlEnv* mlenv);
MNode* ml_set_wikivar (MNode* cell, MlEnv* mlenv);
MNode* ml_defun_wiki_inline2 (MNode* cell, MlEnv* mlenv);
MNode* ml_defun_wiki_link (MNode* cell, MlEnv* mlenv);
MNode* ml_defun_wiki_command (MNode* cell, MlEnv* mlenv);
+MNode* ml_defun_wiki_command2 (MNode* cell, MlEnv* mlenv);
MNode* ml_get_wiki_command (MNode* cell, MlEnv* mlenv);
MNode* ml_wiki_guestuser_function (MNode* cell, MlEnv* mlenv);
MNode* ml_guestuser_function (MNode* cell, MlEnv* mlenv);
}
/* ============================================================ */
-static void call_defun_wikicmd (ustring& name, MNode* wf, WikiMotorObjVec& objv2, WikiLine* wl, WikiFormat* wiki) {
+static void op_call_defun_wikicmd (ustring& name, MNode* wf, WikiMotorObjVec& objv2, WikiLine* wl, WikiFormat* wiki, int version) {
WikiMotorObjVecVec argsv;
MNodePtr vargs;
wiki->env->output = &out;
bcell = wiki->env->mlenv->currentCell;
wiki->env->mlenv->currentCell = NULL;
+ if (version == 2) {
+ ustring data;
+ if (wl->block)
+ wldump (data, wl->block);
+ vargs = newMNode_cons (newMNode_str (new ustring (data)), vargs ());
+ }
try {
node = execDefun (wiki->env->mlenv, wf, vargs (), name);
} catch (ustring& msg) {
}
}
+static void call_defun_wikicmd (ustring& name, MNode* wf, WikiMotorObjVec& objv2, WikiLine* wl, WikiFormat* wiki) {
+ op_call_defun_wikicmd (name, wf, objv2, wl, wiki, 1);
+}
+
+static void call_defun_wikicmd2 (ustring& name, MNode* wf, WikiMotorObjVec& objv2, WikiLine* wl, WikiFormat* wiki) {
+ op_call_defun_wikicmd (name, wf, objv2, wl, wiki, 2);
+}
+
static void call_defun_macro (ustring& name, WikiMacro* mf, WikiMotorObjVec& objv2, WikiLine* wl, WikiFormat* wiki) {
WikiMotorObjVecVec argsv;
objv.splitChar_keyword (':', name, objv2);
if (wiki->protectMode && ! wl->fsuper && ! wiki->env->wikienv->wikiGuestFunc.get (name))
fx = false;
-
if (fx && (wf = wiki->env->wikienv->wikiCmd.getVar (name))) { // Wiki Command
call_defun_wikicmd (name, wf, objv2, wl, wiki);
+ } else if (fx && (wf = wiki->env->wikienv->wikiCmd2.getVar (name))) { // Wiki Command2
+ call_defun_wikicmd2 (name, wf, objv2, wl, wiki);
} else if ((mf = wiki->env->wikienv->wikiMacro.getVar (name))) { // Wiki Macro. macroは誰でも実行できる。
// std::cerr << "macro:" << name << "\n";
call_defun_macro (name, mf, objv2, wl, wiki);
class WikiEnv {
public:
- MotorVar wikiFunc2;
- MotorVar wikiFunc;
- MotorVar wikiLink;
- MotorVar wikiCmd;
+ MotorVar wikiFunc2; // inline2 function
+ MotorVar wikiFunc; // inline function
+ MotorVar wikiLink; // link command
+ MotorVar wikiCmd; // wiki command
+ MotorVar wikiCmd2; // wiki command2
MacroVar wikiMacro;
MotorSet wikiGuestFunc;
#define kWikiDIV_e '}'
#define kWikiHR '-'
#define kWikiCmd '$'
+#define uWikiCmd "$"
#define uP "<p>"
#define uPe "</p>\n"
// nonblock
}
return true;
+ } else if (t < u && *t == kWikiCmd) {
+ bool fx = true;
+ MNode* wf;
+ ustring name (t + 1, u); // '$'を取り除く
+ if (protectMode && ! fsuper && ! env->wikienv->wikiGuestFunc.get (name))
+ fx = false;
+ if (fx && (wf = env->wikienv->wikiCmd2.getVar (name))) { // Wiki Command
+ ustring endword;
+ endword.assign (CharConst (uWikiCmd "end")).append (name); // $end...
+ block->push_back (wl = new WikiLine (b, e, fsuper));
+ wl->fn = wc_call_defun;
+ wl->block = new WikiLine::linevec;
+ rc = pass1_1 (sp, NULL, &endword, wl->block, NULL, NULL, NULL, fsuper);
+ if (rc == 0) {
+ // no end line error
+ if (endword.length () > 0) {
+ errorMsg.append (CharConst ("no matcing \"")).append (endword).append (CharConst ("\".\n"));
+ }
+ } else if (rc == 2) {
+ assert (wl->block2 == NULL);
+ wl->block2 = new WikiLine (sp.begin (), sp.end (), false);
+ }
+ return true;
+ }
}
return false;