あーるPG - 社会人のデジタル生活

日曜プログラマになろうかなーと思った30代理系社会人の、キャリアアップや趣味(特にデジタル情報)の記録。らーめんとビールが好き。

grepの結果を場合分け置換する

//	^<ul>があればrank++, </ul>があればrank--, <li>はrankだけ' 'を追加.
gofiletop;
#rank = 0;
$temp = "";

searchdown "(<ul>|</ul>|<li>)", regular, nocasesense;	//do whileの1回目
while(result){
	$temp = gettext(seltopx, seltopy, selendx, selendy, 1);	//選択範囲の取得。deleteで消すので範囲保持.
	if (strstr($temp, "<ul>") >= 0){	//分岐.
		#rank = #rank + 1;
		delete;
	}
	else if (strstr($temp, "</ul>") >= 0){
		#rank = #rank - 1;
		delete;
	}
	else if (strstr($temp, "<li>") >= 0){
		#i = 0;
		delete;
		insert "\n";
		while (#i < #rank){
			insert " ";
			#i = #i + 1;
		}
	}
	gofiletop;	//逐一上まで戻る.
	searchdown "(<ul>|</ul>|<li>)", regular, nocasesense;	//do whileの2回目以降.
}

単に置換するだけならreplaceallfastを使えば早いのですが、HTMLのul階層構造を反映させて置換したい場合はulタグのランクを常に意識しなければならず、ランクによってliタグをどうするか決定しなければなりませんでした。
てこずった点は以下。久々だったので構文すら忘れていました。

  • do whileがないので、最初に一度やってwhileでまわすように変更。
  • forが無いので同様に変更。
  • ++が無いので変数に1足すのも面倒。
  • 正規表現検索結果を場合分け置換する場合は、検索結果をgettext()して保持しつつdeleteで消すのが楽そう。クリップボード経由でも可能かと思われる。
  • 比較にはstrstr()。行頭の場合0が返るので注意。
  • なんだかカーソルの位置の関係で連続してる部分が飛ばされるようなので、逐一gofiletopする