S-JIS[2009-02-03/2009-02-06] 変更履歴
htlexタスクを使ってタグの属性を操作(検索・置換)するサンプルです。
「style」という属性名を使っている全タグを検索する例です。
<?xml version="1.0" encoding="Shift_JIS"?> <project name="HtHtmlLexer sample" default="find" basedir="."> <typedef resource="htlex.typedef.properties" classpath="htlexer.jar" /> <property name="html" location="C:\temp\lexer\from" /> <property name="todir" location="C:\temp\lexer\to" /> <target name="find"> <htlex> <fileset dir="${html}"> <include name="**/*.html" /> </fileset> <htconv encoding="MS932" logMatch="info"> <ctag> <cattr name="style" /> </ctag> </htconv> </htlex> </target> </project>
「<meta http-equiv="Content-Type" 〜>」という属性名・属性値を持つmetaタグを検索する例です。
<target name="find"> <htlex> <fileset dir="${html}"> <include name="**/*.html" /> </fileset> <htconv encoding="MS932" logMatch="info"> <ctag name="meta"> <cattr name="http-equiv" value="content-type" /> </ctag> </htconv> </htlex> </target>
(nameやvalueはデフォルトでは大文字小文字を無視して比較します)
属性値に「hishidama」が含まれているタグを検索する例です。
<target name="find"> <htlex> <fileset dir="${html}"> <include name="**/*.html" /> </fileset> <htconv encoding="MS932" logMatch="info"> <ctag> <cattr value="hishidama" valueMatch="find" /> </ctag> </htconv> </htlex> </target>
scriptの開始タグから、「language」「type」属性が両方とも無いものを検索する例です。[2009-02-06]
<target name="find"> <htlex> <fileset dir="${html}"> <include name="**/*.html" /> </fileset> <htconv encoding="MS932" logMatch="info"> <ctag name="script" tago="<"> <not><cattr name="language" /></not> <not><cattr name="type" /></not> </ctag> </htconv> </htlex> </target>
tagoを指定しているのは、終了タグ「</script>」も属性を持たないので、検索結果に入ってしまう為です。
つまりタグ開き(TAGO)が「<」のタグだけを拾うことにより、終了タグ(TAGOが「</」)を除外しています。
全ての属性名(およびタグ名)を小文字に置換する例です。
<target name="case"> <htlex todir="${todir}"> <fileset dir="${html}"> <include name="**/*.html" /> </fileset> <htconv encoding="MS932" logWriteFile="warn"> <ctag> <newtag newNameCase="lower"> <repattr newNameCase="lower" /> </newtag> </ctag> </htconv> </htlex> </target>
newtagではタグ名の大文字小文字の変換を指定し、repattrには属性名の変換を指定しています。
→タグ名だけ変換する例
metaタグのhttp-equivの属性値を、先頭は大文字、他は小文字にする例です。[2009-02-04]
(つまり、「http-equiv="content-type"
」を「http-equiv="Content-Type"
」にする)
<htconv encoding="MS932" logWriteFile="warn"> <ctag name="meta"> <newtag> <repattr name="http-equiv" newValueCase="proper" /> </newtag> </ctag> </htconv>
属性値をダブルクォーテーションでくくる例です。
<target name="quote"> <htlex todir="${todir}"> <fileset dir="${html}"> <include name="**/*.html" /> </fileset> <htconv encoding="MS932" logWriteFile="warn"> <ctag> <cattr let="=" /> <newtag> <repattr newQuote=""" /> </newtag> </ctag> </htconv> </htlex> </target>
cattrでの条件に、代入記号を入れています。つまり、「属性名=」という、何らかの属性値を代入している属性が対象となります。
(逆に言えば、属性値を代入していない属性は対象外です)
属性値を単純にダブルクォーテーションでくくると、属性値の内容そのものの中にダブルクォーテーションがあった場合は困ったことになります。
その可能性がある場合は、repattrにnewValueHtmlEscapeも指定すると、属性値をHTMLエスケープします。
bodyタグのbgcolor属性が「silver」の場合に「#c0c0c0」に変更する例です。
<target name="replace"> <htlex todir="${todir}"> <fileset dir="${html}"> <include name="**/*.html" /> </fileset> <htconv encoding="MS932" logWriteFile="warn"> <ctag name="body"> <cattr name="bgcolor" value="silver" /> <newtag> <repattr name="bgcolor" newValue="#c0c0c0" /> </newtag> </ctag> </htconv> </htlex> </target>
cattrのnameとrepattrのnameの両方にbgcolorという条件を指定していて重複しているような気もしますが、必要です。
cattrの方は置換対象となるタグを指定する為のものであり、repattrはそのタグの中で実際に置換する属性を指定するものだからです。
例えば以下のように、cattrとrepattrで別の条件を指定することが出来ます。
(bgcolorにsilverという値があった場合にtextをblackに変更する例)
<htconv encoding="MS932" logWriteFile="warn"> <ctag name="body"> <cattr name="bgcolor" value="silver" /> <newtag> <repattr name="text" newValue="black" /> </newtag> </ctag> </htconv>
また、条件タイプ(and・or・not)を使って複数の条件を指定することも出来ますし、複数の属性をまとめて置換することも出来ます。
<htconv encoding="MS932" logWriteFile="warn"> <ctag name="body"> <and> <cattr name="bgcolor" value="silver" /> <cattr name="text" value="black" /> </and> <newtag> <repattr name="bgcolor" newValue="#c0c0c0" /> <repattr name="text" newValue="#000000" /> </newtag> </ctag> </htconv>
bodyタグのtext属性とbgcolor属性を削除し、style属性(style="〜"
)を追加する例です。
<target name="del-add"> <htlex todir="${todir}"> <fileset dir="${html}"> <include name="**/*.html" /> </fileset> <htconv encoding="MS932" logWriteFile="warn"> <ctag name="body" tago="<"> <newtag> <delattr name="text" /> <delattr name="bgcolor" /> <addattr preSkip=" " newName="style" newLet="=" newQuote=""" newValue="color: #000000; background-color: #c0c0c0" /> </newtag> </ctag> </htconv> </htlex> </target>
ctagでtagoという条件(タグ開きの記号が「<」)を入れているのは、name="body"だけでcattrも何も無い場合、終了タグ「</body>」も置換対象になってしまうからです。
そうなると、text属性やbgcolor属性はそもそも存在しないので削除(delattr)といっても何も行われないだけですが、
addattrによってstyle属性は追加されてしまうのです(爆)