RSSリーダーの本文表示の違いを探る(その1)
昨年末、「MyBlogListリーダー等のRSSリーダーの本文表示でHTMLタグが表示される場合があります(注:現在は改善されているようです)がどうしてですか?」という質問の回答です。色々調べてみたとろ結構面白い結果となりましたので連載ものでいってみます。
MyBlogListリーダーで本文にHTMLタグが含まれるのはその仕様に依存すると思われますが、HTMLタグが本文に付与されることについては、少なくとも Movable Typeについてはその機能によるものです。
具体的には、本文中にHTMLタグまたはHTMLエンティティ(らしきもの)が存在する場合、文章全体がCDATAセクションという
- <![CDATA[ ~ ]]>
というもので括られます("~"に本文が入ります)。これで括ることによって文章にどのような文字が含まれていても適正なXMLデータとして扱われますので、一切加工されずそのまま保存されるという仕組みになっています。
RSSリーダーはRSSフィード(index.rdf/index.xml等)を参照します。下記に Movable Type でひとつだけエントリーしたRSS1.0フィードの index.rdf を示します。上は本文にHTMLエンティティを含まないもの、下は含んだ(ここでは"<"と">")ものです。青字部分と赤字部分がそれぞれ対象となる部分です。
index.rdf(本文にHTMLエンティティを含まない)
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:admin="http://webns.net/mvcb/"
xmlns:cc="http://web.resource.org/cc/"
xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://~/">
<title>First Weblog</title>
<link>http://~/</link>
<description></description>
<dc:language>ja</dc:language>
<dc:creator></dc:creator>
<dc:date>2005-01-27T17:39:25+09:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=3.121-ja" />
<items>
<rdf:Seq><rdf:li rdf:resource="http://~/archives/2005/01/post.html" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://~/archives/2005/01/post.html">
<title>てすと</title>
<link>http://~/archives/2005/01/post.html</link>
<description>本文にHTMLエンティティを含んでいません。本文にHTMLエンティティを含んでい...</description>
<dc:subject></dc:subject>
<dc:creator>Melody</dc:creator>
<dc:date>2005-01-27T17:39:25+09:00</dc:date>
</item>
</rdf:RDF>
index.rdf(本文にHTMLエンティティを含む)
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:admin="http://webns.net/mvcb/"
xmlns:cc="http://web.resource.org/cc/"
xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://~/">
<title>First Weblog</title>
<link>http://~/</link>
<description></description>
<dc:language>ja</dc:language>
<dc:creator></dc:creator>
<dc:date>2005-01-27T17:39:25+09:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=3.121-ja" />
<items>
<rdf:Seq><rdf:li rdf:resource="http://~/archives/2005/01/post.html" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://~/archives/2005/01/post.html">
<title>てすと</title>
<link>http://~/archives/2005/01/post.html</link>
<description><![CDATA[本文に<b>HTMLエンティティ</b>を含んでいます。...]]></description>
<dc:subject></dc:subject>
<dc:creator>Melody</dc:creator>
<dc:date>2005-01-27T17:39:25+09:00</dc:date>
</item>
</rdf:RDF>
仮にHTMLタグが含まれていれば、
<description><![CDATA[本文に<b>HTMLエンティティ</b>を含んでいます。...]]></description>
となります。最初からHTMLタグを例に扱った方がわかりやすいのですが、扱えない理由があります。これについては後ほど明らかにしたいと思います。
参考までに、変換処理を実際に行っている
- lib/MT/Util.pm
のソース(抜粋)を掲載しておきます。
my %Map = ('&' => '&', '"' => '"', '<' => '<', '>' => '>', '\'' => ''');
my $RE = join '|', keys %Map;
sub encode_xml {
my($str, $nocdata) = @_;
$nocdata ||= MT::ConfigMgr->instance->NoCDATA;
if (!$nocdata && $str =~ m/
<[^>]+> ## HTML markup
| ## or
&(?:(?!(\#([0-9]+)|\#x([0-9a-fA-F]+))).*?);
## something that looks like an HTML entity.
/x) {
## If ]]> exists in the string, encode the > to >.
$str =~ s/]]>/]]>/g;
$str = '<![CDATA[' . $str . ']]>';
} else {
$str =~ s!($RE)!$Map{$1}!g;
}
$str;
}
- Movable Type でコメント用 RSS フィードを出力する
- RSSリーダーの本文表示の違いを探る(その3:NoCDATAの利用)
- RSSリーダーの本文表示の違いを探る(その2)
- Feed Validator警告除去(Onclick属性削除プラグイン)
こんにちは。エントリ内容と違うのですが、気になったことがありますので、コメント欄に書かせていただきます。
小粋空間サマよりのテンプレートを使われているブログサマで、<p>タグがエントリ中に入っているブログと、入っていないブログがありますが、この違いはどこで生じるものなのでしょうか。
途中変になってしまったので、再び。
「Pタグ」がエントリ中に入っているブログと、そうでないブログがある・・。ということを質問したかったのです。
コメント欄を汚してしまい申し訳ございません。
>愛子さん
こんにちは。
Pタグは、エントリー作成画面下にある「テキストフォーマット」のボックスで「改行を挿入する」ではなく「なし」を選択すれば挿入されなくなります。ただしBRタグも挿入されなくなります。
Pタグのみを挿入しないようにする場合は、Movable Typeの
lib/MT/Util.pm
の265行目辺りにある html_text_transform というプログラムに含まれている
$p = "<p>$p</p>";
を
#$p = "<p>$p</p>";
とすればOKだと思います。
質問の趣旨から少し外れますが
エントリーにpタグとbrタグが入る仕組み(その1:コード解析)
エントリーにpタグとbrタグが入る仕組み(その2:blockquoteにbrタグを挿入)
の辺りに関連の詳細を記していますので参考になれば幸いです。