if (fx && (wf = wiki->env->wikienv->wikiCmd.getVar (name))) {
WikiMotorObjVecVec argsv;
MNodePtr vargs;
- WikiMotorObjVecVec::const_iterator b, e;
objv2.splitCharA (':', argsv);
- b = argsv.begin ();
- e = argsv.end ();
- vargs = wiki->buildArgs (b, e);
+ vargs = wiki->buildArgs (argsv.begin (), argsv.end ());
{
MotorOutputString out;
MotorOutput* back = wiki->env->output;
}
bool WikiAttrib1::checkScript (WikiMotorObjVec& vec, ustring& scr, bool& ferr) {
- ustring name;
- WikiMotorObjVec v2;
- WikiMotorObjVec args0;
- WikiMotorObjVec v3;
- MNode* wf;
-
- if (vec.splitChar_keyword ('(', name, v2)
- && v2.splitChar (')', args0, v3)
- && (wf = wiki->env->wikienv->wikiLink.getVar (name))) {
- WikiMotorObjVecVec args;
- MNodeList vargs;
- MotorOutputString out2;
- MotorOutput* back = wiki->env->output;
- WikiMotorObjVec* v;
- MNodePtr node;
- int i;
-
- args0.splitCharA (',', args);
- for (i = 0; i < args.size (); i ++) {
- v = args[i].get ();
- vargs.append (newMNode_str (new ustring (v->textOut (wiki))));
- }
- wiki->env->output = &out2;
- try {
- node = execDefun (wiki->env->mlenv, wf, vargs (), name);
- } catch (ustring& msg) {
- wiki->logLispFunctionError (msg, vec.dump ());
- ferr = true;
- }
- wiki->env->output = back;
- scr.append (out2.ans);
+ bool f = false;
+ int i;
+ ustring u;
+ for (i = 0; i < vec.size () && vec[i]->type == WikiMotorObj::wiki_funcLink; i ++) {
+ WikiMotorObjFuncLink* fn = WikiMotorObjFuncLink_type (&*vec[i]);
+ u = fn->execDefunArgs (wiki);
// XXX: 末尾の空白を除去し,セミコロンを確認する。
- return true;
- } else {
+ scr.append (u);
+ f = true;
}
+ if (f)
+ return true;
+
return false;
}
return objv.htmlOut (this);
}
-MNode* WikiFormat::buildArgs (WikiMotorObjVecVec::const_iterator& b, WikiMotorObjVecVec::const_iterator e) {
+MNode* WikiFormat::buildArgs (WikiMotorObjVecVec::const_iterator b, WikiMotorObjVecVec::const_iterator e, bool dumpmode) {
+ MNodeList ans;
+
+ if (dumpmode) {
+ for (; b < e; b ++) {
+ ans.append (newMNode_str (new ustring ((*b)->dump ())));
+ }
+ } else {
+ for (; b < e; b ++) {
+ ans.append (newMNode_str (new ustring ((*b)->textOut (this))));
+ }
+ }
+
+ return ans.release ();
+#if 0
MNode* ans = NULL;
MNode* a;
}
}
return ans;
+#endif
}
void WikiFormat::logLispFunctionError (const ustring& msg, const ustring& cmd) {
BlockDF,
BlockDiv,
BlockForm,
+ BlockData,
BlockHR,
} blockType;
typedef enum {
virtual void output (MotorOutput* out);
};
+class WikiBlockData: public WikiBlock {
+ public:
+ ustring name;
+ ustring text;
+
+ WikiBlockData (WikiFormat* w): WikiBlock (BlockData, w) {};
+ virtual ~WikiBlockData () {};
+
+ virtual bool nextLine (uiterator b, uiterator e);
+ virtual void addLine (uiterator b, uiterator e);
+ virtual void output (MotorOutput* out);
+};
+
class WikiBlockHR: public WikiBlock {
public:
WikiBlockHR (WikiFormat* w): WikiBlock (BlockHR, w) {};
virtual size_t getArySize (const ustring& name) {
return getArySize (name);
};
- virtual MNode* buildArgs (WikiMotorObjVecVec::const_iterator& b, WikiMotorObjVecVec::const_iterator e);
+ virtual MNode* buildArgs (WikiMotorObjVecVec::const_iterator b, WikiMotorObjVecVec::const_iterator e, bool dumpmode = false);
virtual void logLispFunctionError (const ustring& msg, const ustring& cmd);
};
}
/* ============================================================ */
+ustring WikiMotorObjFunc1::execDefunArgs (WikiFormat* wiki) {
+ MNodePtr vargs;
+ AutoInclCount autoIncl (wiki->env->mlenv);
+
+ autoIncl.inc ();
+ vargs = buildArgs (arg.textOut (wiki));
+// vargs = buildArgs (arg.dump ());
+ return execDefun (vargs (), wiki);
+}
+
ustring WikiMotorObjFunc1::textOut (WikiFormat* wiki) {
if (func) {
MotorOutputString o;
return dump ();
}
} else {
- MNodePtr vargs;
- AutoInclCount autoIncl (wiki->env->mlenv);
-
- autoIncl.inc ();
- vargs = buildArgs (arg.textOut (wiki));
- return execDefun (vargs (), wiki);
+ return execDefunArgs (wiki);
}
}
return dump ();
}
} else {
- MNodePtr vargs;
- AutoInclCount autoIncl (wiki->env->mlenv);
-
- autoIncl.inc ();
- vargs = buildArgs (arg.textOut (wiki));
- ustring text = execDefun (vargs (), wiki);
+ ustring text = execDefunArgs (wiki);
return wiki->wikiMotor (text.begin (), text.end ());
}
}
}
/* ============================================================ */
+ustring WikiMotorObjFuncM::execDefunArgs (WikiFormat* wiki) {
+ MNodePtr vargs;
+ AutoInclCount autoIncl (wiki->env->mlenv);
+
+ autoIncl.inc ();
+ vargs = wiki->buildArgs (arg.begin (), arg.end ());
+// vargs = wiki->buildArgs (arg.begin (), arg.end (), true);
+ return execDefun (vargs (), wiki);
+}
+
ustring WikiMotorObjFuncM::textOut (WikiFormat* wiki) {
if (func) {
MotorOutputString o;
return dump ();
}
} else {
- MNodePtr vargs;
- AutoInclCount autoIncl (wiki->env->mlenv);
-
- autoIncl.inc ();
- WikiMotorObjVecVec::const_iterator b = arg.begin ();
- vargs = wiki->buildArgs (b, arg.end ());
- return execDefun (vargs (), wiki);
+ return execDefunArgs (wiki);
}
}
return dump ();
}
} else {
- MNodePtr vargs;
- WikiMotorObjVecVec::const_iterator b = arg.begin ();
- AutoInclCount autoIncl (wiki->env->mlenv);
-
- autoIncl.inc ();
- vargs = wiki->buildArgs (b, arg.end ());
- ustring text = execDefun (vargs (), wiki);
+ ustring text = execDefunArgs (wiki);
return wiki->wikiMotor (text.begin (), text.end ());
}
}
}
/* ============================================================ */
+ustring WikiMotorObjFuncM2::execDefunArgs (WikiFormat* wiki) {
+ MNodePtr vargs;
+ AutoInclCount autoIncl (wiki->env->mlenv);
+
+ autoIncl.inc ();
+ vargs = new MNode;
+// vargs ()->set_car (newMNode_str (new ustring (arg2.textOut (wiki))));
+ vargs ()->set_car (newMNode_str (new ustring (arg2.dump ())));
+ vargs ()->set_cdr (wiki->buildArgs (arg.begin (), arg.end ()));
+// vargs ()->set_cdr (wiki->buildArgs (arg.begin (), arg.end (), true));
+ return execDefun (vargs (), wiki);
+}
+
ustring WikiMotorObjFuncM2::textOut (WikiFormat* wiki) {
if (func) {
MotorOutputString o;
return dump ();
}
} else {
- MNodePtr vargs;
- WikiMotorObjVecVec::const_iterator b = arg.begin ();
- AutoInclCount autoIncl (wiki->env->mlenv);
-
- autoIncl.inc ();
- vargs = new MNode;
- vargs ()->set_car (newMNode_str (new ustring (arg2.textOut (wiki))));
- vargs ()->set_cdr (wiki->buildArgs (b, arg.end ()));
- return execDefun (vargs (), wiki);
+ return execDefunArgs (wiki);
}
}
return dump ();
}
} else {
- MNodePtr vargs;
- WikiMotorObjVecVec::const_iterator b = arg.begin ();
- AutoInclCount autoIncl (wiki->env->mlenv);
-
- autoIncl.inc ();
- vargs = new MNode;
- vargs ()->set_car (newMNode_str (new ustring (arg2.textOut (wiki))));
- vargs ()->set_cdr (wiki->buildArgs (b, arg.end ()));
- ustring text = execDefun (vargs (), wiki);
+ ustring text = execDefunArgs (wiki);
return wiki->wikiMotor (text.begin (), text.end ());
}
}
}
/* ============================================================ */
+ustring WikiMotorObjFuncLink::execDefunArgs (WikiFormat* wiki) {
+ MNodePtr vargs;
+ AutoInclCount autoIncl (wiki->env->mlenv);
+
+ autoIncl.inc ();
+ vargs = wiki->buildArgs (arg.begin (), arg.end ());
+ return execDefun (vargs (), wiki);
+}
+
+ustring WikiMotorObjFuncLink::textOut (WikiFormat* wiki) {
+ ustring ans;
+ ans.append (CharConst ("[[")).append (name);
+ for (int i = 0; i < arg.size (); i ++) {
+ ans.append (uColon).append (arg[i]->dump ());
+ }
+ ans.append (CharConst ("]]"));
+ return ans;
+}
+
+ustring WikiMotorObjFuncLink::dump () {
+ ustring ans;
+ ans.append (CharConst ("[[")).append (name);
+ for (int i = 0; i < arg.size (); i ++) {
+ ans.append (uColon).append (arg[i]->dump ());
+ }
+ ans.append (CharConst ("]]"));
+ return ans;
+}
+
+/* ============================================================ */
ustring WikiMotorObjSelect::textOut (WikiFormat* wiki) {
ustring v = wiki->getVar (name);
ustring val = value.textOut (wiki);
}
sp.shiftCursor ();
return true;
+ } else if ((wd = wiki->env->wikienv->wikiLink.getVar (name))) {
+ WikiMotorObjFuncLink* obj = new WikiMotorObjFuncLink (name, wd);
+ out.push_back (WikiMotorObjPtr (obj));
+ while (1) {
+ WikiMotorObjVecPtr vec (new WikiMotorObjVec);
+ obj->arg.push_back (vec);
+ compile (*vec, TMATCH_CKET | TMATCH_COLN);
+ if (sp.match (re_wiki1_colon)) { // :
+ } else {
+ break;
+ }
+ }
+ sp.shiftCursor ();
+ return true;
} else {
return false;
}
wiki_func1,
wiki_funcM,
wiki_funcM2,
+ wiki_funcLink,
wiki_select,
wiki_deleted,
} type;
WikiMotorObjFunc1 (const ustring& fn, WikiCmdTableSupport::wikifunc_t* fp): WikiMotorObjFunc (wiki_func1, fn, fp) {};
WikiMotorObjFunc1 (const ustring& fn, MNode* fp): WikiMotorObjFunc (wiki_func1, fn, fp) {};
virtual ~WikiMotorObjFunc1 () {};
+ virtual ustring execDefunArgs (WikiFormat* wiki);
virtual ustring textOut (WikiFormat* wiki);
virtual ustring htmlOut (WikiFormat* wiki);
virtual ustring dump ();
WikiMotorObjFuncM (const ustring& fn, WikiCmdTableSupport::wikifunc_t* fp): WikiMotorObjFunc (wiki_funcM, fn, fp) {};
WikiMotorObjFuncM (const ustring& fn, MNode* fp): WikiMotorObjFunc (wiki_funcM, fn, fp) {};
virtual ~WikiMotorObjFuncM () {};
+ virtual ustring execDefunArgs (WikiFormat* wiki);
virtual ustring textOut (WikiFormat* wiki);
virtual ustring htmlOut (WikiFormat* wiki);
virtual ustring dump ();
WikiMotorObjFuncM2 (const ustring& fn, WikiCmdTableSupport::wikifunc_t* fp): WikiMotorObjFunc (wiki_funcM2, fn, fp) {};
WikiMotorObjFuncM2 (const ustring& fn, MNode* fp): WikiMotorObjFunc (wiki_funcM2, fn, fp) {};
virtual ~WikiMotorObjFuncM2 () {};
+ virtual ustring execDefunArgs (WikiFormat* wiki);
virtual ustring textOut (WikiFormat* wiki);
virtual ustring htmlOut (WikiFormat* wiki);
virtual ustring dump ();
};
+class WikiMotorObjFuncLink: public WikiMotorObjFunc {
+ public:
+ WikiMotorObjVecVec arg;
+
+ WikiMotorObjFuncLink (const ustring& fn, WikiCmdTableSupport::wikifunc_t* fp): WikiMotorObjFunc (wiki_funcLink, fn, fp) {};
+ WikiMotorObjFuncLink (const ustring& fn, MNode* fp): WikiMotorObjFunc (wiki_funcLink, fn, fp) {};
+ virtual ~WikiMotorObjFuncLink () {};
+ virtual ustring execDefunArgs (WikiFormat* wiki);
+ virtual ustring textOut (WikiFormat* wiki);
+ virtual ustring dump ();
+};
+inline WikiMotorObjFuncLink* WikiMotorObjFuncLink_type (WikiMotorObj* obj) {
+ assert (obj->type == WikiMotorObj::wiki_funcLink);
+ return (WikiMotorObjFuncLink*)obj;
+}
+
class WikiMotorObjSelect: public WikiMotorObj {
public:
ustring name;