S-JIS[2009-02-03/2009-02-06] 変更履歴

htlexタスク タグ属性操作サンプル

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>

namevalueデフォルトでは大文字小文字を無視して比較します)


属性値に「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="&lt;">
					<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="&quot;" />
					</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のnamerepattrの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="&lt;">
					<newtag>
						<delattr name="text" />
						<delattr name="bgcolor" />
						<addattr preSkip=" "
							newName="style" newLet="=" newQuote="&quot;"
							newValue="color: #000000; background-color: #c0c0c0" />
					</newtag>
				</ctag>
			</htconv>
		</htlex>
	</target>

ctagでtagoという条件(タグ開きの記号が「<」)を入れているのは、name="body"だけでcattrも何も無い場合、終了タグ「</body>」も置換対象になってしまうからです。
そうなると、text属性やbgcolor属性はそもそも存在しないので削除(delattr)といっても何も行われないだけですが、
addattrによってstyle属性は追加されてしまうのです(爆)


htlexタスクへ戻る / 自作ソフトへ戻る / 技術メモへ行く
メールの送信先:ひしだま