TopMovable TypeRSS > RSSリーダーの本文表示の違いを探る(その1)
2005年1月27日

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

Posted at January 27,2005 7:30 PM
Category:[3.121-ja, RSS]
Tag:[, ]

昨年末、「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;
}
Posted by yujiro
関連記事
人気エントリー
トラックバックURL


コメント

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

タグがエントリ中に入っているブログと、入っていないブログがありますが、この違いはどこで生じるものなのでしょうか。

[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だと思います。
質問の趣旨から少し外れますがの辺りに関連の詳細を記していますので参考になれば幸いです。

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

*必須



お知らせ:2008年5月現在、多忙のため、7月頃までコメントを速やかに回答できない状態が続きます。ご質問の内容によっては回答が7月以降になる可能性がありますので、予めご了承ください。

太字 イタリック アンダーライン ハイパーリンク 引用

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

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

Now loading...
Entries of this Category
QRcode

現在停止中です
携帯電話からこのQRcodeを撮影することで携帯用URLを取得することができます

URI for cellular phones
ギターに入った猫
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

loading ...
BlogPeople
Now loading...
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
クリエイティブ・コモンズ・ライセンス
Powered by
Movable Type 4.1
 
List Me!