ブログ カレンダー

« « 2024 4月 » »
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4

カテゴリ一覧

アーカイブ

最新のエントリ

最新のコメント

最新のトラックバック

趣味のブログ - d3blog の rss/rdf/atom フィードのハック

d3blog の rss/rdf/atom フィードのハック

カテゴリ : 
XOOPS
執筆 : 
OhYeah! 2010.10.26 22:54
 「d3blog の Atom フィード」のコメントで書いた、エンティティを定義する方法でも若干問題があることが判明しました。
 ひとつは、IE8 では DTD 付きのフィードを表示できないことです。エンティティは DTD で定義するしかないので、IE8 ではどうやっても atom を表示できません。もうひとつは、rss/rdf でも <description>...</description> 中に xml の組み込みエンティティ以外の html 特殊文字があるとエラーになってしまうことです。
 んなわけで、結局 rss.php, rdf.php, atom.php をハックして、html 特殊文字を &#nnn; に変換することで対処することにしました。
 変換ルーチンは rss/rdf/atom ともに使用するので、trust パス側の include/functions.php に置いておきます。一番最後の
}
?>

の直前に、下記を追加します。
 ちなみに、このコードは参考 URL の numeric_entities をほとんどそのまま使用しています。違いは、&quot; は組み込みエンティティなので、またシングルクォートもこの段階では変換する必要がないので、ENT_NOQUOTES フラグを使用していること、組み込みエンティティの &amp; &lt; &gt; は変換する必要がないので unset していることだけです。
 なお、このサイトはデータベースも internal_encoding も UTF-8 なのでこれで問題ありませんが、データベースや internal_encoding が EUC-JP の場合は、$char のエンコーディング変換が必要かも…。
    function d3blog_convEntities($string){
        $mapping = array();
        foreach (get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES) as $char => $entity){
            $mapping[$entity] = '&#' . ord($char) . ';';
        }
        unset($mapping['&amp;']);
        unset($mapping['&lt;']);
        unset($mapping['&gt;']);
        return str_replace(array_keys($mapping), $mapping, $string);
    }

参考 URL: http://php.net/manual/ja/function.get-html-translation-table.php

 あとは、trust パス側の main ディレクトリにある rss.php, rdf.php, atom.php で html 特殊文字の変換が必要な変数をアサインする行で d3blog_convEntities をコールすれば OK です。

 rss.php は、
        $item['description'] = xoops_convert_encoding($entry->pingExcerpt());
の行を
        $item['description'] = xoops_convert_encoding(d3blog_convEntities($entry->pingExcerpt()));
にします。

 rdf.php は、
        $item['description'] = xoops_convert_encoding($entry->pingExcerpt());
の行を
        $item['description'] = xoops_convert_encoding(d3blog_convEntities($entry->pingExcerpt()));
        $item['contents'] = xoops_convert_encoding(d3blog_convEntities($entry->renderContents()));
にします。
 1行目だけ書き換えれば OK なんですが、2行目は <content:encoded> で全文配信するためのしかけです。main_rdf.xml テンプレートの
  	<description><{$entry.description}></description>
の直下に、
  	<content:encoded><![CDATA[<{$entry.contents}>]]></content:encoded>
を追加すると、全文配信が可能になります。

 atom.php は、修正が必要な行が3行あります。
    $feed['meta_copyright'] = xoops_convert_encoding($myts->htmlSpecialChars($xoopsConfigMetaFooter['meta_copyright']));
        $item['contents'] = xoops_convert_encoding($entry->renderContents(false));
        $item['contentsStripped'] = xoops_convert_encoding($entry->renderContents());
の行をそれぞれ
    $feed['meta_copyright'] = xoops_convert_encoding($myts->htmlSpecialChars(d3blog_convEntities($xoopsConfigMetaFooter['meta_copyright'])));
        $item['contents'] = xoops_convert_encoding(d3blog_convEntities($entry->renderContents(false)));
        $item['contentsStripped'] = xoops_convert_encoding(d3blog_convEntities($entry->renderContents()));
に書き換えます。
 d3blog-1.08 をお使いの方は、main_atom.xml テンプレートの
<!DOCTYPE feed [
      <!ENTITY lt "&#38;#60;">
      <!ENTITY gt "&#62;">
      <!ENTITY amp "&#38;#38;">
      <!ENTITY apos "&#39;">
      <!ENTITY quot "&#34;">
      <!ENTITY nbsp "&#160;">
      <!ENTITY copy "&#169;">
]>
を削除してください。

トラックバック

トラックバックpingアドレス http://www.o-ya.net/modules/d3blog/tb.php/44

コメント一覧