<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xml:lang="ja-JP">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="stylesheet" type="text/css" href="../style.css" />
<title>Tripletail::HtmlFilter - HTMLのパースと書き換え</title>
<link rel="index" href="./" />
<link rel="up" href="../" />
</head>
<body>
<div class="pod_title_block">
Tripletail::HtmlFilter - HTMLのパースと書き換え
</div>
<!-- Begin TABLE_OF_CONTENTS -->
<div class="pod_toc">
<p>
<strong><span class="pod_lang">TABLE OF CONTENTS</span></strong>
</p>
<ul>
<li><a href="#NAME">
<span class="pod_lang">NAME
</span></a>
</li>
<li><a href="#SYNOPSIS">
<span class="pod_lang">SYNOPSIS
</span></a>
</li>
<li><a href="#DESCRIPTION">
<span class="pod_lang">DESCRIPTION
</span></a>
<ul>
<li><a href="#METHODS">
<span class="pod_lang">METHODS
</span></a>
<ul>
<li><a href="#Tripletail::HtmlFilter">
<span class="pod_lang">Tripletail::HtmlFilter
</span></a>
</li>
<li><a href="#Tripletail::HtmlFilter::Context">
<span class="pod_lang">Tripletail::HtmlFilter::Context
</span></a>
</li>
<li><a href="#Tripletail::HtmlFilter::ElementBase">
<span class="pod_lang">Tripletail::HtmlFilter::ElementBase
</span></a>
</li>
<li><a href="#Tripletail::HtmlFilter::Element">
<span class="pod_lang">Tripletail::HtmlFilter::Element
</span></a>
</li>
<li><a href="#Tripletail::HtmlFilter::Text">
<span class="pod_lang">Tripletail::HtmlFilter::Text
</span></a>
</li>
<li><a href="#Tripletail::HtmlFilter::Comment">
<span class="pod_lang">Tripletail::HtmlFilter::Comment
</span></a>
</li>
</ul>
</li>
<li><a href="#Xe3X82Xb5Xe3X83Xb3Xe3X83X97Xe3X83Xab">
<span class="pod_lang">サンプル
</span></a>
<ul>
<li><a href="#Xe3X82Xb3Xe3X83XbcXe3X83X89">
<span class="pod_lang">コード
</span></a>
</li>
<li><a href="#Xe5XaeX9fXe8Xa1X8cXe7Xb5X90Xe6X9eX9c">
<span class="pod_lang">実行結果
</span></a>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#SEE_ALSO">
<span class="pod_lang">SEE ALSO
</span></a>
</li>
</ul>
</div>
<!-- End TABLE_OF_CONTENTS -->
<!-- Begin CONTENT -->
<!-- =encoding utf-8 -->
<hr />
<h1><a id="NAME">
<span class="pod_lang">NAME
</span></a></h1>
<p>
<span class="pod_lang">Tripletail::HtmlFilter - HTMLのパースと書き換え
</span>
</p>
<hr />
<h1><a id="SYNOPSIS">
<span class="pod_lang">SYNOPSIS
</span></a></h1>
<pre class="pod_verbatim"><code> my $filter = $TL->newHtmlFilter(
interest => ['form', 'textarea'],
);
$filter->set($html);
while (my ($context, $elem) = $filter->next) {
...
}
print $filter->toStr;</code></pre>
<hr />
<h1><a id="DESCRIPTION">
<span class="pod_lang">DESCRIPTION
</span></a></h1>
<h2><a id="METHODS">
<span class="pod_lang">METHODS
</span></a></h2>
<h3><a id="Tripletail::HtmlFilter">
<span class="pod_lang">Tripletail::HtmlFilter
</span></a></h3>
<dl>
<dt><a id="new"><span class="pod_lang">new
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $TL->newHtmlFilter(%options)</code></pre>
<p>
<span class="pod_lang">フィルタオブジェクトを作る。オプションは以下の通り:
</span>
</p>
<dl>
<dt><a id="interest"><span class="pod_lang">interest
</span></a></dt>
<dd>
<p>
<span class="pod_lang">要素名、もしくは要素名にマッチする正規表現を要素とする配列。
正規表現の場合は <code class="pod_iseq_C">qr//</code> でコンパイルしなければならない。
マッチしなかった要素はスキップされる。省略可能。
</span>
</p>
<p>
<span class="pod_lang">注意: 要素が文字列の場合は大文字小文字を無視した比較がされるが、
正規表現で同じ動作をさせるには qr/h\d/i のように i フラグを
付けなければならない。
</span>
</p>
</dd>
<dt><a id="track"><span class="pod_lang">track
</span></a></dt>
<dd>
<p>
<span class="pod_lang">要素名、もしくは要素名にマッチする正規表現を要素とする配列。
正規表現の場合は <code class="pod_iseq_C">qr//</code> でコンパイルしなければならない。
マッチした要素は、その子要素内で取り出す事が出来る。省略可能。
</span>
</p>
<p>
<span class="pod_lang">注意: 要素が文字列の場合は大文字小文字を無視した比較がされるが、
正規表現で同じ動作をさせるには qr/h\d/i のように i フラグを
付けなければならない。
</span>
</p>
</dd>
<dt><a id="filter_text"><span class="pod_lang">filter_text
</span></a></dt>
<dd>
<p>
<span class="pod_lang">真なら要素内のテキスト部分も検出する。
</span>
</p>
</dd>
<dt><a id="filter_comment"><span class="pod_lang">filter_comment
</span></a></dt>
<dd>
<p>
<span class="pod_lang">真ならコメントも検出する。
</span>
</p>
</dd>
<dt><a id="my_bootstrap"><span class="pod_lang">my_bootstrap
</span></a></dt>
<dd>
<p>
<span class="pod_lang">内部メソッド
</span>
</p>
</dd>
</dl>
</dd>
<dt><a id="set"><span class="pod_lang">set
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $filter->set($html)</code></pre>
<p>
<span class="pod_lang">パース対象のHTMLを設定する。
</span>
</p>
</dd>
<dt><a id="toStr"><span class="pod_lang">toStr
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> my $html = $filter->toStr()</code></pre>
<p>
<span class="pod_lang">フィルタリング結果のHTMLを文字列で返す。
</span>
</p>
</dd>
<dt><a id="next"><span class="pod_lang">next
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> my ($context, $elem) = $filter->next;</code></pre>
<p>
<span class="pod_lang">次の要素/テキスト/コメントを取り出す。
戻り値は二つで、最初の項目は <a href="#Tripletail::HtmlFilter::Context">"Tripletail::HtmlFilter::Context"</a> 、
次の項目は <a href="#Tripletail::HtmlFilter::ElementBase">"Tripletail::HtmlFilter::ElementBase"</a> のオブジェクトである。
</span>
</p>
</dd>
</dl>
<h3><a id="Tripletail::HtmlFilter::Context">
<span class="pod_lang">Tripletail::HtmlFilter::Context
</span></a></h3>
<dl>
<dt><a id="newElement"><span class="pod_lang">newElement
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $context->newElement($name)</code></pre>
<p>
<span class="pod_lang">指定された要素名を持つ <a href="#Tripletail::HtmlFilter::Element">"Tripletail::HtmlFilter::Element"</a> を作成して返す。
</span>
</p>
</dd>
<dt><a id="newText"><span class="pod_lang">newText
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $context->newText($str)</code></pre>
<p>
<span class="pod_lang">指定された内容を持つ <a href="#Tripletail::HtmlFilter::Text">"Tripletail::HtmlFilter::Text"</a> を作成して返す。
</span>
</p>
</dd>
<dt><a id="newComment"><span class="pod_lang">newComment
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $context->newComment($str)</code></pre>
<p>
<span class="pod_lang">指定された内容を持つ <a href="#Tripletail::HtmlFilter::Comment">"Tripletail::HtmlFilter::Comment"</a> を作成して返す。
</span>
</p>
</dd>
<dt><a id="in"><span class="pod_lang">in
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> my $element = $context->in($name)</code></pre>
<p>
<span class="pod_lang">現在の文脈が、指定された名前を持つ要素の中であれば、その要素を返す。
要素の中であるとは、現在の要素がその要素の子孫であるか、その要素内に
含まれるテキストやコメントである場合を云う。
</span>
</p>
</dd>
<dt><a id="add"><span class="pod_lang">add
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $context->add($elem)
$context->add('text')</code></pre>
<p>
<span class="pod_lang">新たな要素を、現在の要素の直後に挿入する。
引数は文字列または <a href="#Tripletail::HtmlFilter::ElementBase">"Tripletail::HtmlFilter::ElementBase"</a> でなければならない。
<code class="pod_iseq_C">$context->add('text')</code> は
<code class="pod_iseq_C">$context->add($context->newText('text'))</code> と同値である。
</span>
</p>
</dd>
<dt><a id="delete"><span class="pod_lang">delete
</span></a></dt>
<dd>
<p>
<span class="pod_lang">現在の要素を削除する。
</span>
</p>
</dd>
</dl>
<h3><a id="Tripletail::HtmlFilter::ElementBase">
<span class="pod_lang">Tripletail::HtmlFilter::ElementBase
</span></a></h3>
<p>
<span class="pod_lang">このクラスは以下のクラスの親クラスである。
</span>
</p>
<dl>
<dt><a id="X_"><span class="pod_lang"><a href="#Tripletail::HtmlFilter::Element">"Tripletail::HtmlFilter::Element"</a>
</span></a></dt>
<dd>
</dd>
<dt><a id="X__00"><span class="pod_lang"><a href="#Tripletail::HtmlFilter::Text">"Tripletail::HtmlFilter::Text"</a>
</span></a></dt>
<dd>
</dd>
<dt><a id="X__01"><span class="pod_lang"><a href="#Tripletail::HtmlFilter::Comment">"Tripletail::HtmlFilter::Comment"</a>
</span></a></dt>
<dd>
</dd>
</dl>
<dl>
<dt><a id="isElement"><span class="pod_lang">isElement
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $elem->isElement()</code></pre>
<p>
<span class="pod_lang"><a href="#Tripletail::HtmlFilter::Element">"Tripletail::HtmlFilter::Element"</a> のインスタンスであれば1を返す。
</span>
</p>
</dd>
<dt><a id="isText"><span class="pod_lang">isText
</span></a></dt>
<dd>
<p>
<span class="pod_lang"><a href="#Tripletail::HtmlFilter::Text">"Tripletail::HtmlFilter::Text"</a> のインスタンスであれば1を返す。
</span>
</p>
</dd>
<dt><a id="isComment"><span class="pod_lang">isComment
</span></a></dt>
<dd>
<p>
<span class="pod_lang"><a href="#Tripletail::HtmlFilter::Comment">"Tripletail::HtmlFilter::Comment"</a> のインスタンスであれば1を返す。
</span>
</p>
</dd>
</dl>
<h3><a id="Tripletail::HtmlFilter::Element">
<span class="pod_lang">Tripletail::HtmlFilter::Element
</span></a></h3>
<dl>
<dt><a id="name"><span class="pod_lang">name
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $elem->name()
$elem->name($new_name)</code></pre>
<p>
<span class="pod_lang">要素名を返す。引数が与えられた場合は要素名を変更する。
元の要素名が大文字であった場合には、この関数も大文字で返す事に注意。
</span>
</p>
</dd>
<dt><a id="parse"><span class="pod_lang">parse
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $elem->parse('<foo bar="111" baz="222">')</code></pre>
<p>
<span class="pod_lang">文字列で渡されたHTML要素をパースして、要素名と属性を置き換える。
</span>
</p>
</dd>
<dt><a id="attr"><span class="pod_lang">attr
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $elem->attr($key)
$elem->attr($key => $value)</code></pre>
<p>
<span class="pod_lang">指定された属性名を持つ属性があれば、その値を返す。
引数が二つ指定された場合は、指定された属性値を書換える。
属性名の大文字小文字は保存されるが、検索時には区別されない。
</span>
</p>
</dd>
<dt><a id="attrList"><span class="pod_lang">attrList
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> my @attrs = $elem->attrList()</code></pre>
<p>
<span class="pod_lang">存在する全ての属性名を配列で返す。
</span>
</p>
</dd>
<dt><a id="end"><span class="pod_lang">end
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $elem->end()
$elem->end('checked')</code></pre>
<p>
<span class="pod_lang">属性値の存在しない属性名があれば返す。値が指定された場合は、その値を設定する。
input要素の"checked"等、またXHTMLの空要素 "/" が該当する。
</span>
</p>
</dd>
<dt><a id="tail"><span class="pod_lang">tail
</span></a></dt>
<dd>
<p>
<span class="pod_lang">end の別名。
</span>
</p>
</dd>
<dt><a id="toStr_00"><span class="pod_lang">toStr
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $str = $elem->toStr</code></pre>
<p>
<span class="pod_lang">要素を文字列化する。この要素が文字列をパースして作られたものである時は、
パースした文字列の属性の順序が保存される。
</span>
</p>
</dd>
</dl>
<h3><a id="Tripletail::HtmlFilter::Text">
<span class="pod_lang">Tripletail::HtmlFilter::Text
</span></a></h3>
<dl>
<dt><a id="str"><span class="pod_lang">str
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $elem->str()
$elem->str($string)</code></pre>
<p>
<span class="pod_lang">テキストの内容を返す。値が指定された場合は、内容を置き換える。
</span>
</p>
</dd>
<dt><a id="toStr_01"><span class="pod_lang">toStr
</span></a></dt>
<dd>
<p>
<span class="pod_lang">テキストの内容を返す。
</span>
</p>
</dd>
</dl>
<h3><a id="Tripletail::HtmlFilter::Comment">
<span class="pod_lang">Tripletail::HtmlFilter::Comment
</span></a></h3>
<dl>
<dt><a id="str_00"><span class="pod_lang">str
</span></a></dt>
<dd>
<pre class="pod_verbatim"><code> $elem->str()
$elem->str($string)</code></pre>
<p>
<span class="pod_lang">コメントの内容を返す。"<!-- -->"は付かない。
値が指定された場合は内容を置き換える。文字列が"--"を含んでいてはならない。
</span>
</p>
</dd>
<dt><a id="toStr_02"><span class="pod_lang">toStr
</span></a></dt>
<dd>
<p>
<span class="pod_lang">"<!-- -->"を付けた内容を返す。
</span>
</p>
</dd>
</dl>
<h2><a id="Xe3X82Xb5Xe3X83Xb3Xe3X83X97Xe3X83Xab">
<span class="pod_lang">サンプル
</span></a></h2>
<h3><a id="Xe3X82Xb3Xe3X83XbcXe3X83X89">
<span class="pod_lang">コード
</span></a></h3>
<pre class="pod_verbatim"><code> # フィルタの準備
my $filt = $TL->newHtmlFilter(
# a, form, b要素のみ検出する。bは閉じタグも見る。それ以外は見ない。
interest => [qw(^a$ form /?b)], # 正規表現の配列
# select, option要素の場合は、その要素内で$context->in('select')を呼ぶ事で
# Tripletail::HtmlFilter::Elementのオブジェクトを得る事が出来る。
track => [qw(select option)], # 正規表現の配列
# 真ならタグ以外の部分も見る。コメントは別扱い。
filter_text => 1,
# 真ならコメントの部分も見る。
filter_comment => 1,
);
# フィルタに通すHTMLを設定
$filt->set(q{
<form>
<select>
<a href="http://example.com/" target="_new">foo</a>
<b>bold</b>
<option></option>
</select>
<!-- this is a comment -->
</form>});
while (my ($context, $elem) = $filt->next) {
if ($elem->isElement) {
if ($elem->name eq 'a') {
# <select>要素の中なら、href属性を書換える
if ($context->in('select')) {
$elem->attr(href => 'http://ymir.jp/');
}
}
elsif ($elem->name eq 'form') {
# form要素の開始直後に別の要素を挿入
my $hidden = $context->newElement('input');
$hidden->attr(name => 'foo');
$hidden->attr(type => 'hidden');
$hidden->end('/'); # <input name="foo" type="hidden" />を作る
$context->add($hidden);
}
elsif ($elem->name eq 'b' or $elem->name eq '/b') {
# b要素は消す。
$context->delete;
}
}
elsif ($elem->isText) {
if ($context->in('option')) {
# <option>の中なら書換える
$context->delete;
$context->add('AAAAA'); # テキストを追加。
# $context->add($context->newText('AAAAA')); と等価。
# 同時にこのテキストの親であるoption要素に属性を追加する。
$context->in('option')->attr(foo => 'bar');
}
}
elsif ($elem->isComment) {
# コメントは全て消す。
$context->delete;
}
}
# フィルタリング結果を出力する
print $filt->toStr, "\n";</code></pre>
<h3><a id="Xe5XaeX9fXe8Xa1X8cXe7Xb5X90Xe6X9eX9c">
<span class="pod_lang">実行結果
</span></a></h3>
<pre class="pod_verbatim"><code> <form><input name="foo" type="hidden" />
<select>
<a href="http://ymir.jp/" target="_new">foo</a>
bold
<option foo="bar">AAAAA</option>
</select>
</form></code></pre>
<hr />
<h1><a id="SEE_ALSO">
<span class="pod_lang">SEE ALSO
</span></a></h1>
<p>
<span class="pod_lang"><a href=".././Tripletail.html">Tripletail</a>
</span>
</p>
<!-- End CONTENT -->
<div class="pod_title_block">
Tripletail::HtmlFilter - HTMLのパースと書き換え
</div>
<!-- Begin INDEX -->
<hr />
<h1><a id="INDEX"><span class="pod_lang">INDEX</span></a></h1>
<div class="pod_idx_outer">
<ul class="pod_idx">
<li><a href="#X__01">"Tripletail::HtmlFilter::Comment"</a></li>
<li><a href="#X_">"Tripletail::HtmlFilter::Element"</a></li>
<li><a href="#X__00">"Tripletail::HtmlFilter::Text"</a></li>
<li><a href="#DESCRIPTION">DESCRIPTION</a></li>
<li><a href="#METHODS">METHODS</a></li>
<li><a href="#NAME">NAME</a></li>
<li><a href="#SEE_ALSO">SEE ALSO</a></li>
<li><a href="#SYNOPSIS">SYNOPSIS</a></li>
<li><a href="#Tripletail::HtmlFilter">Tripletail::HtmlFilter</a></li>
<li><a href="#Tripletail::HtmlFilter::Comment">Tripletail::HtmlFilter::Comment</a></li>
<li><a href="#Tripletail::HtmlFilter::Context">Tripletail::HtmlFilter::Context</a></li>
<li><a href="#Tripletail::HtmlFilter::Element">Tripletail::HtmlFilter::Element</a></li>
<li><a href="#Tripletail::HtmlFilter::ElementBase">Tripletail::HtmlFilter::ElementBase</a></li>
<li><a href="#Tripletail::HtmlFilter::Text">Tripletail::HtmlFilter::Text</a></li>
<li><a href="#add">add</a></li>
<li><a href="#attr">attr</a></li>
<li><a href="#attrList">attrList</a></li>
<li><a href="#delete">delete</a></li>
<li><a href="#end">end</a></li>
<li><a href="#filter_comment">filter_comment</a></li>
<li><a href="#filter_text">filter_text</a></li>
<li><a href="#in">in</a></li>
<li><a href="#interest">interest</a></li>
<li><a href="#isComment">isComment</a></li>
<li><a href="#isElement">isElement</a></li>
<li><a href="#isText">isText</a></li>
<li><a href="#my_bootstrap">my_bootstrap</a></li>
<li><a href="#name">name</a></li>
<li><a href="#new">new</a></li>
<li><a href="#newComment">newComment</a></li>
<li><a href="#newElement">newElement</a></li>
<li><a href="#newText">newText</a></li>
<li><a href="#next">next</a></li>
<li><a href="#parse">parse</a></li>
<li><a href="#set">set</a></li>
<li><a href="#str_00">str</a></li>
<li><a href="#tail">tail</a></li>
<li><a href="#toStr_02">toStr</a></li>
<li><a href="#track">track</a></li>
<li><a href="#Xe3X82Xb3Xe3X83XbcXe3X83X89">コード</a></li>
<li><a href="#Xe3X82Xb5Xe3X83Xb3Xe3X83X97Xe3X83Xab">サンプル</a></li>
<li><a href="#Xe5XaeX9fXe8Xa1X8cXe7Xb5X90Xe6X9eX9c">実行結果</a></li>
</ul>
</div>
<!-- End INDEX -->
<div class="pod_title_block">
Tripletail::HtmlFilter - HTMLのパースと書き換え
</div>
</body>
</html>