RSSリーダーの本文表示の違いを探る(その1)

RSSリーダーの本文表示の違いを探る(その1)

Posted at January 27,2005 7:30 PM
Tag:[MovableType, RSS]

昨年末、「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エンティティを含まないもの、下は含んだ(ここでは"&lt;"と"&gt;")ものです。青字部分と赤字部分がそれぞれ対象となる部分です。

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[本文に&lt;b&gt;HTMLエンティティ&lt;/b&gt;を含んでいます。...]]></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 = ('&' => '&amp;', '"' => '&quot;', '&lt;' => '<', '&gt;' => '>', '\'' => '&apos;');
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;
}
関連記事
トラックバックURL


コメント

こんにちは。エントリ内容と違うのですが、気になったことがありますので、コメント欄に書かせていただきます。
小粋空間サマよりのテンプレートを使われているブログサマで、<p>タグがエントリ中に入っているブログと、入っていないブログがありますが、この違いはどこで生じるものなのでしょうか。

[1] Posted by 愛子 : January 30, 2005 2:06 PM

途中変になってしまったので、再び。
「Pタグ」がエントリ中に入っているブログと、そうでないブログがある・・。ということを質問したかったのです。
コメント欄を汚してしまい申し訳ございません。

[2] Posted by 愛子 : January 30, 2005 2:09 PM

>愛子さん
こんにちは。
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タグを挿入)

の辺りに関連の詳細を記していますので参考になれば幸いです。

[3] Posted by yujiro : January 30, 2005 3:18 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)