Webエンジニア susumuis の技術ブログ

このブログの内容は個人の見解であり、所属する組織の公式見解ではありません

Mayaaファイルを命名規則から一括作成するEmEditorマクロ

業務でMayaa使っています。
私が所属する開発チームでは、Mayaaのプロセッサとひもづけるid(m:id)に、一定の命名規則を持たせています。

ルールは以下の4種類しかありません。

  1. その場に値を出力する(m:writeプロセッサ):"〜_HERE"
  2. そのタグの属性を変化させる(m:echo, m:attribute):"〜_TAG"
  3. その要素を条件によって出し分ける(m:if):"IF_〜"
  4. その要素を繰り返す(m:for or m:forEach):"LOOP_〜"

このようにしておけば、仮に〜_HEREがm:writeではなく、m:insertであったとしても、テンプレートを書くデザイナーさんには同じように見えるので、よって上記4ルールで徹底運用しています。

さて、日々の業務を楽にするための努力は欠かしません。名前が規則に従っているなら、プログラムも自動生成できてしまうのではないか?

Mayaaは、テンプレートに定義されていないm:idを記述すると、警告で教えてくれる機能があります。

[WARN] EqualsIDInjectionResolver - the injection ID(IF_*******) is not found on the template, /xxx/yyy/zzz.xhtml#410.

この文字列をコピペして食べさせれば、.mayaaファイルの雛形を生成するEmEditorマクロを作りました。

document.selection.Replace(
	"[WARN] EqualsIDInjectionResolver - the injection ID(",
	"",
	eeFindNext | eeFindReplaceCase | eeFindReplaceEscSeq | eeReplaceAll);

document.selection.Replace(
	"\\) is not found on the template.*$",
	"",
	eeFindNext | eeFindReplaceCase | eeFindReplaceEscSeq | eeReplaceAll | eeFindReplaceRegExp);


document.selection.Replace(
	"^.*_HERE$",
	"\t<!-- を出力します。 -->\n"
	+ "\t<m:write m:id='\\0' value='${}' />",
	eeFindNext | eeFindReplaceCase | eeFindReplaceEscSeq | eeReplaceAll | eeFindReplaceRegExp);


document.selection.Replace(
	"^.*_TAG$",
	"\t<!-- します。属性が変化します。 -->\n"
	+ "\t<m:echo m:id='\\0'>\n"
	+ "\t\t<m:attribute name='' value='${}' />\n"
	+ "\t</m:echo>",
	eeFindNext | eeFindReplaceCase | eeFindReplaceEscSeq | eeReplaceAll | eeFindReplaceRegExp);

document.selection.Replace(
	"^IF.*$",
	"\t<!-- の時にのみ表示します。 -->\n"
	+ "\t<m:if m:id='\\0' test='${}'>\n"
	+ "\t\t<m:echo><m:doBody /></m:echo>\n"
	+ "\t</m:if>",
	eeFindNext | eeFindReplaceCase | eeFindReplaceEscSeq | eeReplaceAll | eeFindReplaceRegExp);


document.selection.Replace(
	"^LOOP.*$",
	"\t<!-- を繰り返します。 -->\n"
	+ "\t<m:for m:id='\\0'\n"
	+ "\t\t\tinit='${}'\n"
	+ "\t\t\ttest='${}'\n"
	+ "\t\t\tafter='${}'>\n"
	+ "\t\t<m:echo><m:doBody /></m:echo>\n"
	+ "\t</m:for>",
	eeFindNext | eeFindReplaceCase | eeFindReplaceEscSeq | eeReplaceAll | eeFindReplaceRegExp);

便利です!
自分だけですが。。。

問題なのは会社でEmEditorを愛用しているのが僕だけということです。。。秀丸マクロ?書けません!