[OldType][Kahua][RSS] RSS feedの本文をHTML全文配信にした
RSS feedのdescriptionをHTML全文配信に
(kiyoka.2008_06_15 RSSのdescritptionを概要配信にするか全文配信にするか論争)で概要配信でとりあえず良いのでは無いかと書いたが、結局全文配信にした。
最近Google Readerを使い始めたのだが、imgタグも入ったHTMLの全文配信が便利ということがわかった。
本ブログのRSS feedをGoogleReaderで見た画面
調べてみると、はてなダイアリーもHTMLで全文配信していることがわかった。
Geekが使うBlogエンジンはこっちが主流になりつつあるということか。
OldTypeはGeekがターゲットなのでそちらに合わせておいて間違い無いだろう。
KahuaでHTML入りのRSS 2.0を配信するには
CDATAでくくる必要があると思っていたが、その必要は無かった。
;; define elements for RSS 2.0
(define-elements channel rss description lastBuildDate docs generator item pubDate author guid atom:link)
(define (gen-rss/ base-url index-page entry-pages)
(let* ((wikiname (name-of index-page))
(entry-pages (if (null? entry-pages)
(- build-date-utc (* 60 5)))) ;; build date is 5 minutes ago from latest entry
(rss/ (@/ (version "2.0")
(xmlns:atom "http://www.w3.org/2005/Atom"))
(@/ (href (string-append base-url "get-rss/" wikiname))
(type "application/rss+xml")))
(title/ (string-append wikiname "::" (oldtype-first-line index-page)))
(link/ (string-append base-url "show-page/" wikiname))
(description/ (oldtype-first-line index-page))
(lastBuildDate/ (oldtype:utc->RFC822-date-string build-date-utc))
(docs/ "http://blogs.law.harvard.edu/tech/rss")
(generator/ (string-append "OldType version " *oldtype-version*))
(let* ((timeline (timeline-of e))
(lineno (- (last (get-latest-lines timeline)) 5))
(string-append base-url "show-page/" (uri-encode-string (name-of e))
(string-append "#" (number->string lineno))
(title/ (string-append (name-of e) "::" (oldtype-first-line e)))
<pre></pre>で囲んでHTML化している。
KahuaがRSSを出力する段階では、descriptionの中身はエスケープされているので< >は < >の様に実態参照に変換されるが、Google ReaderやSafariブラウザ、はてなRSSではちゃんとHTMLのタグとして認識される。
(string-join (get-rich-list e) "\n")
(pubDate/ (oldtype:utc->RFC822-date-string
(get-latest-log timeline))))
(author/ (committer-of (get-latest-log timeline))))))
(define-entry (get-rss wikiname)
(let1 oldtype-page (oldtype:load-page (kahua-site-root) wikiname)
(format "http://~a/" (oldtype:get-arguments 'fqdn))
(oldtype:load-page (kahua-site-root) (cdr x)))
(get-rss-entry-pages oldtype-page))))))
KahuaでRSS feedにCDATAで括ったHTMLを挿入する方法
とはいっても、ココログ等のように、RSSの本文をCDATAで括ってHTMLのタグがエスケープされないように配慮しているサービスも存在する。
理由は不明。昔はこのようにしないとちゃんとHTMLとして認識しないRSSリーダーがあったのかも知れない。
いつか、CDATAにしたい場合があるかも知れないので、一応そのやりかたをメモしておく。
下記の方法はKahua 1.0.7.1で動作したが、将来のKahuaでも動作するとは限らないので注意。
define-elementsで no-escape/ タグを定義しておく
;; define elements for RSS 2.0
(define-elements channel rss description lastBuildDate docs generator item pubDate author guid atom:link no-escape)
このコードは Khau 1.0.7.1のserver.scmでコメントアウトされていたコード。
自分のkahua アプリケーションのソースコード上で定義する。
;; Added no-esacpe element to Kahua framework
(define-element no-escape (attrs auxs contents context cont)
(cont (list (apply make-no-escape-text-element contents))