kiyoka.2008_11_06 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2008_11
5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
5

[OldType][Kahua][RSS] RSS feedの本文をHTML全文配信にした

5

RSS feedのdescriptionをHTML全文配信に

5

(kiyoka.2008_06_15 RSSのdescritptionを概要配信にするか全文配信にするか論争)で概要配信でとりあえず良いのでは無いかと書いたが、結局全文配信にした。

5

きっかけはGoogle Readerだった。

5

最近Google Readerを使い始めたのだが、imgタグも入ったHTMLの全文配信が便利ということがわかった。

5
 本ブログのRSS feedをGoogleReaderで見た画面
5
 2988547409_fe36dfae0b
5

調べてみると、はてなダイアリーもHTMLで全文配信していることがわかった。

5

Geekが使うBlogエンジンはこっちが主流になりつつあるということか。

5

OldTypeはGeekがターゲットなのでそちらに合わせておいて間違い無いだろう。

5

 

5

KahuaでHTML入りのRSS 2.0を配信するには

5

CDATAでくくる必要があると思っていたが、その必要は無かった。

5

こんなコードで、RSS 2.0がfeedできる。

5

 

5
;; define elements for RSS 2.0
5
(define-elements channel rss description lastBuildDate docs generator item pubDate author guid atom:link)
5
5
;; get-rss entry
5
(define (gen-rss/ base-url index-page entry-pages)
5
  (let* ((wikiname       (name-of index-page))
5
         (entry-pages    (if (null? entry-pages)
5
                             (list index-page)
5
                             entry-pages))
5
         (build-date-utc
5
          (last
5
           (sort
5
            (map
5
             (lambda (e)
5
               (utc-of
5
                (get-latest-log
5
                 (timeline-of e))))
5
             entry-pages))))
5
         (build-date-utc
5
          (- build-date-utc (* 60 5))))  ;; build date is 5 minutes ago from latest entry
5
    (rss/ (@/ (version "2.0")
5
              (xmlns:atom "http://www.w3.org/2005/Atom"))
5
          (channel/
5
           (atom:link/
5
            (@/ (href (string-append base-url "get-rss/" wikiname))
5
                (rel  "self")
5
                (type "application/rss+xml")))
5
           (title/                (string-append wikiname "::" (oldtype-first-line index-page)))
5
           (link/                 (string-append base-url "show-page/" wikiname))
5
           (description/          (oldtype-first-line index-page))
5
           (lastBuildDate/        (oldtype:utc->RFC822-date-string build-date-utc))
5
           (docs/                 "http://blogs.law.harvard.edu/tech/rss")
5
           (generator/            (string-append "OldType version " *oldtype-version*))
5
           (map/
5
            (lambda (e)
5
              (let* ((timeline (timeline-of e))
5
                     (lineno   (- (last (get-latest-lines timeline)) 5))
5
                     (uri      
5
                      (string-append base-url "show-page/" (uri-encode-string (name-of e))
5
                                     (if (< 1 lineno)
5
                                         (string-append "#" (number->string lineno))
5
                                         ""))))
5
                (item/
5
                 (title/            (string-append (name-of e) "::" (oldtype-first-line e)))
5
                 (description/
5

ポイントはココ。

5

<pre></pre>で囲んでHTML化している。

5

KahuaがRSSを出力する段階では、descriptionの中身はエスケープされているので< >は &lt; &gt;の様に実態参照に変換されるが、Google ReaderやSafariブラウザ、はてなRSSではちゃんとHTMLのタグとして認識される。

5
                  (string-append
5
                   "<pre>"
5
                   (string-join (get-rich-list e) "\n")
5
                   "</pre>"))
5
                 (link/             uri)
5
                 (guid/             uri)
5
                 (pubDate/          (oldtype:utc->RFC822-date-string
5
                                     (utc-of
5
                                      (get-latest-log timeline))))
5
                 (author/       (committer-of (get-latest-log timeline))))))
5
            entry-pages)
5
           ))))
5
5
5
(define-entry (get-rss wikiname)
5
  (let1 oldtype-page (oldtype:load-page (kahua-site-root) wikiname)
5
        (when/ oldtype-page
5
               (gen-rss/ 
5
                (format "http://~a/" (oldtype:get-arguments 'fqdn))
5
                oldtype-page
5
                (filter-map
5
                 (lambda (x)
5
                   (oldtype:load-page (kahua-site-root) (cdr x)))
5
                 (get-rss-entry-pages oldtype-page))))))
5

 

5

KahuaでRSS feedにCDATAで括ったHTMLを挿入する方法

5

とはいっても、ココログ等のように、RSSの本文をCDATAで括ってHTMLのタグがエスケープされないように配慮しているサービスも存在する。

5

理由は不明。昔はこのようにしないとちゃんとHTMLとして認識しないRSSリーダーがあったのかも知れない。

5

いつか、CDATAにしたい場合があるかも知れないので、一応そのやりかたをメモしておく。

5

下記の方法はKahua 1.0.7.1で動作したが、将来のKahuaでも動作するとは限らないので注意。

5

 

5
define-elementsで no-escape/ タグを定義しておく
5
;; define elements for RSS 2.0
5
(define-elements channel rss description lastBuildDate docs generator item pubDate author guid atom:link no-escape)
5

 

5
no-escape ノードを実装する
5
 このコードは Khau 1.0.7.1のserver.scmでコメントアウトされていたコード。
5
 自分のkahua アプリケーションのソースコード上で定義する。
5
;; Added no-esacpe element to Kahua framework
5
(define-element no-escape (attrs auxs contents context cont)
5
  (cont (list (apply make-no-escape-text-element contents))
5
        context))
5

ちなみに、no-escapeが一度実装されたが、思いなおしてコメントアウトされた経緯はcut-seaさんのページGaucheFest:cut-seaEXTに情報がある。たぶんコレだと思う。

5

 

5
RSSのdescriptionの箇所をno-escape/ で括ってエスケープされないようにする
5
                 (description/
5
                  (no-escape/
5
                   (string-append
5
                    "<![CDATA[<pre>"
5
                    (regexp-replace-all #/\]\]>/ 
5
                                        (string-join (get-plain-list e) "\n")
5
                                        "")
5
                    "</pre>]]>")))
5

 

5

...comment disabled...