From: visor Date: Wed, 22 Apr 2015 11:55:46 +0000 (+0900) Subject: noperform wiki command. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=8ba44cd61cf3c4e44d3457d221ed7a9309181862;p=hmh%2Fhhml.git noperform wiki command. --- diff --git a/wiki/wikicmd.cc b/wiki/wikicmd.cc index fee9331..11b4227 100644 --- a/wiki/wikicmd.cc +++ b/wiki/wikicmd.cc @@ -101,18 +101,21 @@ void wc_repeat (WikiLine* wl, WikiFormat* wiki) { /* ============================================================ */ /*DOC: -===$doarray=== - $doarray:''VAR1'',''VAR2'',...[:''INDEX_VAR''] +===$iteratearray=== + $iteratearray:''VAR1'',''VAR2'',...[:''INDEX_VAR''] ... - $enddoarray + [$noperform] + ... + $enditerate -配列''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enddoarrayまでのブロックを繰り返し実行する。 +配列''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enditerateまでのブロックを繰り返し実行する。 ブロックの中で変数''VAR1'', ...に代入した値は,配列に書き戻される。 配列の長さが異なる場合は,配列''VAR1''の長さに揃えられる。 ''INDEX_VAR''を指定すると,配列のインデックス番号を変数''INDEX_VAR''に代入して,ブロックを実行する。 */ -//#WIKICMD $doarray $enddoarray wc_doarray +//#WIKICMD $doarray $noperform $enddoarray wc_doarray +//#WIKICMD $iteratearray $noperform $enditerate wc_doarray void wc_doarray (WikiLine* wl, WikiFormat* wiki) { WikiMotor motor (wl->begin, wl->end, wiki); WikiMotorObjVec objv; @@ -145,44 +148,55 @@ void wc_doarray (WikiLine* wl, WikiFormat* wiki) { iv = clipWhite (args[1]->textOut (wiki)); } } else { - wiki->errorMsg.append (CharConst ("$doarray: wrong number of parameters.\n")); + wiki->errorMsg.append (CharConst ("$iteratearray: wrong number of parameters.\n")); } iu = lv.size (); if (iu > 0) { n = wiki->mlenv->getArySize (lv[0]); - for (i = 1; i <= n; i ++) { - for (it = 0; it < iu; it ++) { - wiki->mlenv->setVar (lv[it], wiki->mlenv->getAry (lv[it], i)); - } - if (iv.size () > 0) { - h = newMNode_num (i); - wiki->mlenv->setVar (iv, h ()); + if (n > 0) { + for (i = 1; i <= n; i ++) { + for (it = 0; it < iu; it ++) { + wiki->mlenv->setVar (lv[it], wiki->mlenv->getAry (lv[it], 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->setAry (lv[it], i, wiki->mlenv->getVar (lv[it])); + } } - do_linevec (wl->block, wiki); for (it = 0; it < iu; it ++) { - wiki->mlenv->setAry (lv[it], i, wiki->mlenv->getVar (lv[it])); + wiki->mlenv->setArySize (lv[it], n); } + } else { + if (wl->block2 && wl->block2->block) + do_linevec (wl->block2->block, wiki); } - for (it = 0; it < iu; it ++) { - wiki->mlenv->setArySize (lv[it], n); - } + } else { + if (wl->block2 && wl->block2->block) + do_linevec (wl->block2->block, wiki); } } /* ============================================================ */ /*DOC: -===$dovector=== - $dovector:''VAR1'',''VAR2'',...[:''INDEX_VAR''] +===$iteratevector=== + $iteratevector:''VAR1'',''VAR2'',...[:''INDEX_VAR''] + ... + [$noperform] ... - $enddovector + $enditerate -ベクタ''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enddovectorまでのブロックを繰り返し実行する。 +ベクタ''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enditerateまでのブロックを繰り返し実行する。 ブロックの中で変数''VAR1'', ...に代入した値は,配列に書き戻されない。 ベクタの長さが異なる場合は,ベクタ''VAR1''の長さに揃えられる。 ''INDEX_VAR''を指定すると,配列のインデックス番号を変数''INDEX_VAR''に代入して,ブロックを実行する。 */ -//#WIKICMD $dovector $enddovector wc_dovector +//#WIKICMD $dovector $noperform $enddovector wc_dovector +//#WIKICMD $iteratevector $noperform $enditerate wc_dovector void wc_dovector (WikiLine* wl, WikiFormat* wiki) { WikiMotor motor (wl->begin, wl->end, wiki); WikiMotorObjVec objv; @@ -221,45 +235,56 @@ void wc_dovector (WikiLine* wl, WikiFormat* wiki) { lvv.back () = t; } else if (isNil (t)) { } else { - wiki->errorMsg.append (CharConst ("$dovector: bad value type.\n")); + wiki->errorMsg.append (CharConst ("$iteratevector: 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")); + wiki->errorMsg.append (CharConst ("$iteratevector: 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 (n > 0) { + 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); } - if (iv.size () > 0) { - h = newMNode_num (i); - wiki->mlenv->setVar (iv, h ()); + for (it = 0; it < iu; ++ it) { // 書き戻す + wiki->mlenv->setVar (lv[it], lvv[it] ()); } - do_linevec (wl->block, wiki); - } - for (it = 0; it < iu; ++ it) { // 書き戻す - wiki->mlenv->setVar (lv[it], lvv[it] ()); + } else { + if (wl->block2 && wl->block2->block) + do_linevec (wl->block2->block, wiki); } + } else { + if (wl->block2 && wl->block2->block) + do_linevec (wl->block2->block, wiki); } } /* ============================================================ */ /*DOC: -===$dotable=== - $dotable:''VARKEY'',''VARVAL'':''TABLEVAR'' +===$iteratetable=== + $iteratetable:''VARKEY'',''VARVAL'':''TABLEVAR'' ... - $enddotable + [$noperform] + ... + $enditerate -テーブル''TABLEVAR''の各要素のキーと値ををそれぞれ変数''VAR1'', ''VAR2''に代入しながら,$enddotableまでのブロックを繰り返し実行する。 +テーブル''TABLEVAR''の各要素のキーと値ををそれぞれ変数''VAR1'', ''VAR2''に代入しながら,$enditerateまでのブロックを繰り返し実行する。 */ -//#WIKICMD $dotable $enddotable wc_dotable +//#WIKICMD $dotable $doperform $enddotable wc_dotable +//#WIKICMD $iteratetable $doperform $enditerate wc_dotable void wc_dotable (WikiLine* wl, WikiFormat* wiki) { WikiMotor motor (wl->begin, wl->end, wiki); WikiMotorObjVec objv; @@ -283,7 +308,7 @@ void wc_dotable (WikiLine* wl, WikiFormat* wiki) { motor.compile (objv); objv.splitCharA (':', args); if (args.size () != 2) { - wiki->errorMsg.append (CharConst ("$dovector: wrong number of parameters.\n")); + wiki->errorMsg.append (CharConst ("$iteratetable: wrong number of parameters.\n")); return; } WikiMotorObjVecVec v; @@ -295,16 +320,21 @@ void wc_dotable (WikiLine* wl, WikiFormat* wiki) { s = clipWhite (args[1]->textOut (wiki)); tbl = wiki->getVar (s); if (! isTable (tbl ())) { - wiki->errorMsg.append (CharConst ("$dovector: bad value type.\n")); + wiki->errorMsg.append (CharConst ("$iteratetable: bad value type.\n")); return; } MotorVar::iterator b = tbl ()->table->begin (); MotorVar::iterator t = tbl ()->table->end (); - for (; b != t; ++ b) { - wiki->mlenv->setVar (vkey, newMNode_str (new ustring ((*b).first))); // テーブルのキーは、文字列 - wiki->mlenv->setVar (vval, (*b).second ()); - do_linevec (wl->block, wiki); + if (b != t) { + for (; b != t; ++ b) { + wiki->mlenv->setVar (vkey, newMNode_str (new ustring ((*b).first))); // テーブルのキーは、文字列 + wiki->mlenv->setVar (vval, (*b).second ()); + do_linevec (wl->block, wiki); + } + } else { + if (wl->block2 && wl->block2->block) + do_linevec (wl->block2->block, wiki); } }