OSDN Git Service

Change Wiki link script function.
authorvisor <visor@users.sourceforge.jp>
Sun, 4 Apr 2010 12:41:51 +0000 (21:41 +0900)
committervisor <visor@users.sourceforge.jp>
Sun, 4 Apr 2010 12:41:51 +0000 (21:41 +0900)
wiki/wikicmd.cc
wiki/wikiformat.cc
wiki/wikiformat.h
wiki/wikimotor.cc
wiki/wikimotor.h

index 627962f..a17949a 100644 (file)
@@ -419,12 +419,9 @@ void  wc_call_defun (WikiLine* wl, WikiFormat* wiki) {
     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;
index 6a4c05c..1a6408c 100644 (file)
@@ -188,41 +188,19 @@ bool  WikiAttrib1::readAttrib (WikiMotorObjVecVec::const_iterator&b, const WikiM
 }
 
 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;
 }
 
@@ -2334,7 +2312,21 @@ ustring  WikiFormat::wikiMotor (uiterator b, uiterator e) {
     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;
 
@@ -2347,6 +2339,7 @@ MNode*  WikiFormat::buildArgs (WikiMotorObjVecVec::const_iterator& b, WikiMotorO
        }
     }
     return ans;
+#endif
 }
 
 void  WikiFormat::logLispFunctionError (const ustring& msg, const ustring& cmd) {
index 715866c..ebecb63 100644 (file)
@@ -278,6 +278,7 @@ class  WikiBlock {
        BlockDF,
        BlockDiv,
        BlockForm,
+       BlockData,
        BlockHR,
     }  blockType;
     typedef enum {
@@ -554,6 +555,19 @@ class  WikiBlockForm: public WikiBlockComplex {
     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) {};
@@ -665,7 +679,7 @@ class  WikiFormat {
     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);
 };
 
index ff44fd2..bb9a4d5 100644 (file)
@@ -709,6 +709,16 @@ ustring  WikiMotorObjFunc::execDefun (MNode* vargs, WikiFormat* wiki) {
 }
 
 /* ============================================================ */
+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;
@@ -719,12 +729,7 @@ ustring  WikiMotorObjFunc1::textOut (WikiFormat* wiki) {
            return dump ();
        }
     } else {
-       MNodePtr  vargs;
-       AutoInclCount  autoIncl (wiki->env->mlenv);
-
-       autoIncl.inc ();
-       vargs = buildArgs (arg.textOut (wiki));
-       return execDefun (vargs (), wiki);
+       return execDefunArgs (wiki);
     }
 }
 
@@ -738,12 +743,7 @@ ustring  WikiMotorObjFunc1::htmlOut (WikiFormat* 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 ());
     }
 }
@@ -755,6 +755,16 @@ ustring  WikiMotorObjFunc1::dump () {
 }
 
 /* ============================================================ */
+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;
@@ -765,13 +775,7 @@ ustring  WikiMotorObjFuncM::textOut (WikiFormat* wiki) {
            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);
     }
 }
 
@@ -785,13 +789,7 @@ ustring  WikiMotorObjFuncM::htmlOut (WikiFormat* 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 ());
     }
 }
@@ -807,6 +805,19 @@ ustring  WikiMotorObjFuncM::dump () {
 }
 
 /* ============================================================ */
+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;
@@ -817,15 +828,7 @@ ustring  WikiMotorObjFuncM2::textOut (WikiFormat* 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 ()));
-       return execDefun (vargs (), wiki);
+       return execDefunArgs (wiki);
     }
 }
 
@@ -839,15 +842,7 @@ ustring  WikiMotorObjFuncM2::htmlOut (WikiFormat* 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 ());
     }
 }
@@ -866,6 +861,36 @@ ustring  WikiMotorObjFuncM2::dump () {
 }
 
 /* ============================================================ */
+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);
@@ -1116,6 +1141,20 @@ bool  WikiMotor::compile_4 (WikiMotorObjVec& out, const ustring& name) {
        }
        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;
     }
index af88a82..899dfe3 100644 (file)
@@ -70,6 +70,7 @@ class  WikiMotorObj {
        wiki_func1,
        wiki_funcM,
        wiki_funcM2,
+       wiki_funcLink,
        wiki_select,
        wiki_deleted,
     }  type;
@@ -202,6 +203,7 @@ class  WikiMotorObjFunc1: public WikiMotorObjFunc {
     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 ();
@@ -214,6 +216,7 @@ class  WikiMotorObjFuncM: public WikiMotorObjFunc {
     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 ();
@@ -227,11 +230,28 @@ class  WikiMotorObjFuncM2: public WikiMotorObjFunc {
     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;