dovector wiki command.
vector join table wiki inline function.
}
/*DOC:
+===setvector===
+ (setvector ARRAY_LIST VECTOR_OF_VECTOR [ARRAY_LIST VECTOR_OF_VECTOR]...) -> LAST_VALUE
+
+*/
+//#AFUNC setvector ml_setvector
+//#WIKIFUNC setvector
+MNode* ml_setvector (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ MNodePtr ans;
+
+ while (arg) {
+ MNodePtr v1;
+ v1 = eval (arg->car (), mlenv);
+ nextNode (arg);
+ if (arg) {
+ ans = eval (arg->car (), mlenv);
+ nextNode (arg);
+ } else {
+ ans = NULL;
+ }
+ MNode* a1 = v1 ();
+ MNode* a2 = ans ();
+ if (isCons (a1)) {
+ std::vector<ustring> vars;
+ boost::ptr_vector<MNodePtr> vals;
+ boost::ptr_vector<MNodePtr>::iterator b, e;
+ while (isCons (a1)) {
+ vars.push_back (to_string (a1->car ()));
+ MNodePtr* p = new MNodePtr;
+ vals.push_back (p);
+ *p = newMNode_vector ();
+ nextNode (a1);
+ }
+ if (isNil (a2)) {
+ } else if (isVector (a2)) {
+ size_t i;
+ size_t m = a2->vectorSize ();
+ for (i = 0; i < m; ++ i) {
+ MNode* a3 = a2->vectorGet (i);
+ size_t j;
+ for (b = vals.begin (), e = vals.end (), j = 0; b < e; ++ b, ++ j) {
+ if (isNil (a3)) {
+ (*b) ()->vectorPush (NULL);
+ } else {
+ (*b) ()->vectorPush (a3->vectorGet (j));
+ }
+ }
+ }
+ } else if (isCons (a2)) {
+ while (isCons (a2)) {
+ MNode* a3 = a2->car ();
+ for (b = vals.begin (), e = vals.end (); b < e; ++ b) {
+ if (isCons (a3)) {
+ (*b) ()->vectorPush (a3->car ());
+ } else {
+ (*b) ()->vectorPush (NULL);
+ }
+ nextNode (a3);
+ }
+ nextNode (a2);
+ }
+ } else {
+ throw (ustring (CharConst ("wrong type of value")));
+ }
+ size_t i, n;
+ for (i = 0, n = vars.size (); i < n; ++ i) {
+ mlenv->setVar (vars[i], vals[i] ());
+ }
+ } else {
+ throw (ustring (CharConst ("wrong type of parameter")));
+ }
+ }
+ return mlenv->retval = ans ();
+}
+
+/*DOC:
===setevar===
(setevar VARIABLE ...) -> VARIABLE
MNodePtr p;
while (arg) {
-// a = eval_str (arg->car (), mlenv);
p = eval (arg->car (), mlenv);
a = to_string (p ());
nextNode (arg);
MNode* ml_setvar (MNode* cell, MlEnv* mlenv);
MNode* ml_setarray (MNode* cell, MlEnv* mlenv);
+MNode* ml_setvector (MNode* cell, MlEnv* mlenv);
MNode* ml_setevar (MNode* cell, MlEnv* mlenv);
MNode* ml_let (MNode* cell, MlEnv* mlenv);
MNode* ml_getvar (MNode* cell, MlEnv* mlenv);
/* ============================================================ */
/*DOC:
+===$dovector===
+ $dovector:''VAR1'',''VAR2'',...[:''INDEX_VAR'']
+ ...
+ $enddovector
+
+ベクタ''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enddovectorまでのブロックを繰り返し実行する。
+ブロックの中で変数''VAR1'', ...に代入した値は,配列に書き戻されない。
+ベクタの長さが異なる場合は,ベクタ''VAR1''の長さに揃えられる。
+''INDEX_VAR''を指定すると,配列のインデックス番号を変数''INDEX_VAR''に代入して,ブロックを実行する。
+
+*/
+//#WIKICMD $dovector $enddovector wc_dovector
+void wc_dovector (WikiLine* wl, WikiFormat* wiki) {
+ WikiMotor motor (wl->begin, wl->end, wiki);
+ WikiMotorObjVec objv;
+ WikiMotorObjVecVec args;
+ std::vector<ustring> lv;
+ boost::ptr_vector<MNodePtr> lvv;
+ ustring iv;
+ int i, n, iu, it;
+ MNodePtr h;
+ ustring s;
+ MNode* t;
+
+#ifdef WIKIREPEATPROTECT
+ if (wiki->protectMode && ! wl->fsuper) {
+#ifdef DEBUG
+ std::cerr << "(wiki):(protected)\n";
+#endif /* DEBUG */
+ return;
+ }
+#endif
+
+#ifdef DEBUG
+ std::cerr << "(wiki):" << ustring (wl->begin0, wl->end) << "\n";
+#endif /* DEBUG */
+ motor.compile (objv);
+ objv.splitCharA (':', args);
+ if (args.size () == 1 || args.size () == 2) {
+ WikiMotorObjVecVec v;
+ args[0]->splitCharA (',', v);
+ for (int i = 0; i < v.size (); i ++) {
+ s = clipWhite (v[i]->textOut (wiki));
+ t = wiki->getVar (s);
+ if (isVector (t)) {
+ lv.push_back (s);
+ lvv.push_back (new MNodePtr);
+ lvv.back () = t;
+ } else {
+ wiki->errorMsg.append (CharConst ("$dovector: bad value type.\n"));
+ }
+ }
+ if (args.size () == 2) {
+ iv = clipWhite (args[1]->textOut (wiki));
+ }
+ } else {
+ wiki->errorMsg.append (CharConst ("$dovector: wrong number of parameters.\n"));
+ }
+ iu = lv.size ();
+ if (iu > 0) {
+ n = lvv[0] ()->vectorSize ();
+ for (i = 0; i < n; ++ i) {
+ for (it = 0; it < iu; ++ it) {
+ wiki->mlenv->setVar (lv[it], lvv[it] ()->vectorGet (i));
+ }
+ if (iv.size () > 0) {
+ h = newMNode_num (i);
+ wiki->mlenv->setVar (iv, h ());
+ }
+ do_linevec (wl->block, wiki);
+ }
+ for (it = 0; it < iu; ++ it) {
+ wiki->mlenv->setVar (lv[it], lvv[it] ());
+ }
+ }
+}
+
+/* ============================================================ */
+/*DOC:
===$block===
$block:''EXPR''
...
if (wl->block) {
ustring sexp (wl->end + 1, wl->block->back ().end + 1);
-// std::cerr << "[" << sexp << "]\n";
#ifdef DEBUG
std::cerr << "(wiki): $evalblock\n";
#endif /* DEBUG */
}
if (args.size () >= 1) {
AutoInclCount autoIncl (wiki->mlenv);
- ustring text = wiki->getVar (args[0]);
+ ustring text = wiki->getVar_string (args[0]);
WikiLine::linevec bl;
wiki->headbase += hn;
wiki->pass1 (text, &bl, super);
void wc_repeat (WikiLine* wl, WikiFormat* wiki);
void wc_doarray (WikiLine* wl, WikiFormat* wiki);
+void wc_dovector (WikiLine* wl, WikiFormat* wiki);
void wc_block (WikiLine* wl, WikiFormat* wiki);
void wc_setvar (WikiLine* wl, WikiFormat* wiki);
void wc_eval (WikiLine* wl, WikiFormat* wiki);
out->out_raw (CharConst (">\n"));
if (attrib.fdefault)
- u = wiki->getVar (name);
+ u = wiki->getVar_string (name);
#ifdef DEBUG2
std::cerr << "u:" << u << uLF;
#endif /* DEBUG */
{form:POST:''URL''
...
}
-// {form:POST:id=form1:class=formclass:post.hml
-// {form:POST:post.hml:id=form1:class=formclass
{form:POST:''URL'':target=''TargetWindow'':id=''ID'':class=''ClassName''
...
}
int WikiFormat::pass1_1 (Splitter& sp, ustring* elseword, ustring* endword, WikiLine::linevec* block, uiterator* elsebegin0, uiterator* elsebegin, uiterator* elseend, bool fsuper) {
uiterator b, e, t, u, v;
-// umatch m;
-// static uregex re_wikicmdsep ("(:)|([ \t]+$)");
while (sp.next ()) {
b = sp.begin ();
if (matchSkip (b, e, CharConst (kComment))) {
// comment
} else if (b != e && b[0] == kWikiCmd) {
-// if (usearch (b, e, m, re_wikicmdsep)) {
-// t = b;
-// u = m[0].first;
-// v = m[0].second;
t = b;
u = b;
if (findCmdSep (u, e, v)) {
} else {
-// t = b;
u = e;
v = e;
}
for (i = 1; i <= n; i ++) {
e.append (mlenv->getAry (name, i));
}
- return e ();
+ return mlenv->retval = e ();
}
MNode* WikiFormat::evalVar (const ustring& name) {
objv.eval (ans, this);
}
-//MNode* WikiFormat::buildArgs (WikiMotorObjVecVec::const_iterator b, WikiMotorObjVecVec::const_iterator e, bool dumpmode) {
MNode* WikiFormat::buildArgs (WikiMotorObjVecVec::const_iterator b, WikiMotorObjVecVec::const_iterator e) {
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))));
- ans.append ((*b)->toMNode (this));
- }
-// }
+ for (; b < e; b ++) {
+ ans.append ((*b)->toMNode (this));
+ }
return ans.release ();
}
virtual void outputClass (MotorOutput* out, std::vector<ustring>& classes);
virtual void outputSubmitScript (MotorOutput* out, const char* name, size_t len, const ustring& onclick, bool scriptcut);
virtual void outputNum (MotorOutput* out, const char* name, size_t len, int val);
- virtual ustring getVar (const ustring& name) {
+ virtual MNode* getVar (const ustring& name) {
+ return mlenv->getVar (name);
+ };
+ virtual ustring getVar_string (const ustring& name) {
return mlenv->getVar_string (name);
};
- virtual ustring getAry (const ustring& name, size_t i) {
+ virtual ustring getAry_string (const ustring& name, size_t i) {
return mlenv->getAry_string (name, i);
};
virtual size_t getArySize (const ustring& name) {
};
virtual MNode* arrayToTexp (const ustring& name);
virtual MNode* evalVar (const ustring& name);
-// virtual MNode* buildArgs (WikiMotorObjVecVec::const_iterator b, WikiMotorObjVecVec::const_iterator e, bool dumpmode = false);
virtual MNode* buildArgs (WikiMotorObjVecVec::const_iterator b, WikiMotorObjVecVec::const_iterator e);
virtual void logLispFunctionError (const ustring& msg, const ustring& cmd);
};
wiki->errorMsg.append (param->dump()).append (CharConst (": bad parameter.\n"));
}
+static bool outamp_opt (MotorOutputWiki& o, int opt, const ustring& val) {
+ switch (opt) {
+ case '/':
+ o.outamp_br (val);
+ break;
+ case '~':
+ o.outamp_nw (val);
+ break;
+ case ',':
+ o.outamp_c3 (val);
+ break;
+// case '^':
+// o.outamp_wbr (val);
+// break;
+ default:
+ return false;
+ }
+ return true;
+}
+
/* ============================================================ */
/*DOC:
===強制改行===
if (args->size () >= 2)
opt = (*args)[1]->textOut (wiki);
- val = fixUTF8 (wiki->getVar (var));
+ val = fixUTF8 (wiki->getVar_string (var));
if (opt.length () > 0) {
if (opt.length () == 1) {
- switch (opt[0]) {
- case '/':
- o.outamp_br (val);
- break;
- case '~':
- o.outamp_nw (val);
- break;
- case ',':
- o.outamp_c3 (val);
- break;
-// case '^':
-// o.outamp_wbr (val);
-// break;
- default:
- return false;
- }
+ return outamp_opt (o, opt[0], val);
} else {
return false;
}
/*DOC:
===配列展開===
[[getarray:NAME]]
+ [[string-join:TEXT:NAME]]
*/
//#WIKILINE getarray wl_getarray
bool wl_getarray (WikiMotorObjVecVec* args, WikiMotorObjVec& out, WikiFormat* wiki) {
MotorOutputWiki o (out);
ustring var;
+
+ if (args->size () == 0 || args->size () > 1)
+ return false;
+ var = (*args)[0]->textOut (wiki);
+ o.outamp (fixUTF8 (dump_to_texp (wiki->arrayToTexp (var))));
+
+ return true;
+}
+
+/*DOC:
+===ベクタ展開===
+ [[vector:NAME:i]]
+ [[vector:NAME:i:/]]
+ [[vector:NAME:i:~]]
+ [[vector:NAME:i:,]]
+ [[join:TEXT:NAME]]
+
+*/
+//#WIKILINE vector wl_vector
+bool wl_vector (WikiMotorObjVecVec* args, WikiMotorObjVec& out, WikiFormat* wiki) {
+ MotorOutputWiki o (out);
+ ustring var;
ustring val;
+ size_t i;
+ ustring opt;
+ MNodePtr e;
+
+ if (args->size () < 2 || args->size () > 3)
+ return false;
+ var = (*args)[0]->textOut (wiki);
+ i = to_int32 ((*args)[1]->textOut (wiki));
+ if (args->size () == 3)
+ opt = (*args)[2]->textOut (wiki);
+ e = wiki->getVar (var);
+ if (e ()) {
+ e = e ()->vectorGet (i);
+ val = fixUTF8 (to_string (e ()));
+ switch (opt.length ()) {
+ case 0:
+ o.outamp (val);
+ break;
+ case 1:
+ return outamp_opt (o, opt[0], val);
+ default:
+ return false;
+ }
+ }
+
+ return true;
+}
+
+//#WIKILINE join wl_join
+bool wl_join (WikiMotorObjVecVec* args, WikiMotorObjVec& out, WikiFormat* wiki) {
+ MotorOutputWiki o (out);
+ ustring sep;
+ ustring var;
+ MNodePtr val;
size_t i, n;
- MNodeList e;
+ ustring ans;
- if (args->size () == 0 || args->size () > 1)
+ if (args->size () != 2)
+ return false;
+ sep = (*args)[0]->textOut (wiki);
+ var = (*args)[1]->textOut (wiki);
+ val = wiki->getVar (var);
+ if (isCons (val ())) {
+ MNode* a = val ();
+ i = 0;
+ while (isCons (a)) {
+ if (i > 0)
+ ans.append (sep);
+ ans.append (to_string (a->car ()));
+ nextNode (a);
+ ++ i;
+ }
+ o.outamp (fixUTF8 (ans));
+ } else if (isVector (val ())) {
+ n = val ()->vectorSize ();
+ for (i = 0; i < n; ++ i) {
+ if (i > 0)
+ ans.append (sep);
+ ans.append (to_string (val ()->vectorGet (i)));
+ }
+ o.outamp (fixUTF8 (ans));
+ }
+ return true;
+}
+
+/*DOC:
+===テーブル展開===
+ [[table:NAME:i]]
+ [[table:NAME:i:/]]
+ [[table:NAME:i:~]]
+ [[table:NAME:i:,]]
+
+*/
+//#WIKILINE table wl_table
+bool wl_table (WikiMotorObjVecVec* args, WikiMotorObjVec& out, WikiFormat* wiki) {
+ MotorOutputWiki o (out);
+ ustring var;
+ ustring val;
+ ustring key;
+ ustring opt;
+ MNodePtr e;
+
+ if (args->size () < 2 || args->size () > 3)
return false;
var = (*args)[0]->textOut (wiki);
-#if 0
- n = wiki->mlenv->getArySize (var);
- for (i = 1; i <= n; i ++) {
- e.append (wiki->mlenv->getAry (var, i));
+ key = (*args)[1]->textOut (wiki);
+ if (args->size () == 3)
+ opt = (*args)[2]->textOut (wiki);
+ e = wiki->getVar (var);
+ if (e ()) {
+ e = e ()->tableGet (key);
+ val = fixUTF8 (to_string (e ()));
+ switch (opt.length ()) {
+ case 0:
+ o.outamp (val);
+ break;
+ case 1:
+ return outamp_opt (o, opt[0], val);
+ default:
+ return false;
+ }
}
- val = fixUTF8 (dump_to_sexp (e ()));
- o.outamp (val);
-#endif
- o.outamp (fixUTF8 (dump_to_texp (wiki->arrayToTexp (var))));
return true;
}
attrib.output (&html);
if (! novalue) {
if (attrib.pdefault) {
- wiki->outputName (&html, CharConst ("value"), wiki->getVar (name), false);
+// wiki->outputName (&html, CharConst ("value"), wiki->getVar (name), false);
+ wiki->outputName (&html, CharConst ("value"), wiki->getVar_string (name), false);
} else {
wiki->outputName (&html, CharConst ("value"), arg2->textOut (wiki), false);
}
attrib.onclick.append (attrib.script);
text = arg2->htmlOut (wiki);
- if (attrib.pdefault && wiki->getVar (name) == value)
+ if (attrib.pdefault && wiki->getVar_string (name) == value)
attrib.pchecked = true;
if (text.length () > 0)
html.out_raw (CharConst ("<label>"));
attrib.output (&html);
html.out_raw (CharConst (">"));
if (attrib.pdefault) {
- html.out_toHTML (wiki->getVar (name));
+ html.out_toHTML (wiki->getVar_string (name));
} else {
html.out_toText (arg2->htmlOut (wiki));
}
b ++;
if (b < e) {
t = (*b)->textOut (wiki);
- out.push_back (WikiMotorObjPtr (new WikiMotorObjText (omitCtrl (zeroPad (n, wiki->getVar (t))))));
+ out.push_back (WikiMotorObjPtr (new WikiMotorObjText (omitCtrl (zeroPad (n, wiki->getVar_string (t))))));
return true;
}
}
if (b < e) {
val = (*b)->textOut (wiki);
- val = wiki->getVar (val);
+ val = wiki->getVar_string (val);
if (val.length () > 0) {
tm = strtol (val);
if (arg2->size () > 0)
bool wl_getvar (WikiMotorObjVecVec* args, WikiMotorObjVec& out, WikiFormat* wiki);
bool wl_getarray (WikiMotorObjVecVec* args, WikiMotorObjVec& out, WikiFormat* wiki);
+bool wl_vector (WikiMotorObjVecVec* args, WikiMotorObjVec& out, WikiFormat* wiki);
+bool wl_join (WikiMotorObjVecVec* args, WikiMotorObjVec& out, WikiFormat* wiki);
+bool wl_table (WikiMotorObjVecVec* args, WikiMotorObjVec& out, WikiFormat* wiki);
bool wl_italic (WikiMotorObjVec* arg2, WikiMotorObjVec& out, WikiFormat* wiki);
bool wl_bold (WikiMotorObjVec* arg2, WikiMotorObjVec& out, WikiFormat* wiki);
bool wl_bolditalic (WikiMotorObjVec* arg2, WikiMotorObjVec& out, WikiFormat* wiki);
/* ============================================================ */
void WikiMotorObjVar::eval (WikiMotorObjVec& ans, const WikiMotorObjPtr* self, WikiFormat* wiki) {
- ustring val = fixUTF8 (wiki->getVar (name));
+ ustring val = fixUTF8 (wiki->getVar_string (name));
MotorOutputWiki o (ans);
switch (vopt) {
}
ustring WikiMotorObjVar::textOut (WikiFormat* wiki) {
-// return fixUTF8 (omitCtrl (wiki->getVar (name)));
- return fixUTF8 (wiki->getVar (name));
+ return fixUTF8 (wiki->getVar_string (name));
}
ustring WikiMotorObjVar::htmlOut (WikiFormat* wiki) {
-// ustring val = fixUTF8 (omitCtrl (wiki->getVar (name)));
- ustring val = fixUTF8 (wiki->getVar (name));
+ ustring val = fixUTF8 (wiki->getVar_string (name));
MotorOutputString o;
switch (vopt) {
/* ============================================================ */
void WikiMotorObjCond::eval (WikiMotorObjVec& ans, const WikiMotorObjPtr* self, WikiFormat* wiki) {
- ustring v = wiki->getVar (name);
+ ustring v = wiki->getVar_string (name);
ustring val = value.textOut (wiki);
bool c = (v == val);
WikiMotorObjVec* o;
}
ustring WikiMotorObjCond::textOut (WikiFormat* wiki) {
- ustring v = wiki->getVar (name);
+ ustring v = wiki->getVar_string (name);
ustring val = value.textOut (wiki);
bool c = (v == val);
}
ustring WikiMotorObjCond::htmlOut (WikiFormat* wiki) {
- ustring v = wiki->getVar (name);
+ ustring v = wiki->getVar_string (name);
ustring val = value.textOut (wiki);
bool c = (v == val);