snownews

開発者さま向け - Mobile Link Discovery 対応について - はてなダイアリー日記の影響で、snownews ではてなダイアリーを使っている日記の冒頭を見た後、全体を見ようと外部ブラウザを開こうとしても、できなくなった。
取得した RSS に下のようなフィルタをかけることにする。

#!/bin/sh
exec sed '/<xhtml:link/d'

追記:RSS が元に戻ったのでフィルタもなくす

追記

snownews の Mobile Link Discovery 対策 patch を作った

tdiary-2.1.4 の RSS にも含まれるようになったので、カッとなってやった。何時間もかかったけど。

モバイル版へのリンクとして <xhtml:link rel="alternate" media="handheld" .../> が含まれていると、 snownews は <link>...</link> と同じように解釈してしまう。 その結果、各記事へのリンクが上書きされてしまい、ブラウザで記事を開けなくなる。

そこで、Mobile Link Discovery のタグを無視するように、namespace prefix がついている link タグは無視するようにしてみた。(RSS 1.0 だけ)

patch を当てる前に、空白8個は TAB に変えて下さい。

diff -ur snownews-1.5.7/xmlparse.c snownews-1.5.7-new/xmlparse.c
--- snownews-1.5.7/xmlparse.c        2005-06-05 18:50:22.000000000 +0900
+++ snownews-1.5.7-new/xmlparse.c        2006-06-04 01:15:30.953125000 +0900
@@ -45,6 +45,11 @@
 /* Wird w臧rend des Parsens aufgerufen, falls wir auf ein <channel> Element
    treffen. Die Funktion gibt ein neues Struct f den Newsfeed zurk. */
 
+int hasprefix(xmlNodePtr node)
+{
+        return node!=NULL && node->ns!=NULL && node->ns->prefix!=NULL && xmlStrcmp(node->ns->prefix,"")!=0;
+}
+
 void parse_rdf10_channel(struct feed * feed, xmlDocPtr doc, xmlNodePtr node) {
         xmlNodePtr cur;
         
@@ -93,7 +98,9 @@
                         }
                 }
                 else if (xmlStrcmp(cur->name, "link") == 0) {
-                        feed->link = xmlNodeListGetString(doc, cur->children, 1);
+                        if(!hasprefix(cur)){
+                                feed->link = xmlNodeListGetString(doc, cur->children, 1);
+                        }
                         /* Remove trailing newline */
                         if (feed->link != NULL) {
                                 if (strlen(feed->link) > 1) {
@@ -223,7 +230,9 @@
                         }
 /* link */
                 } else if (xmlStrcmp(cur->name, "link") == 0) {
-                        item->data->link = xmlNodeListGetString(doc, cur->children, 1);
+                        if(!hasprefix(cur)){
+                                item->data->link = xmlNodeListGetString(doc, cur->children, 1);
+                        }
                         /* Remove trailing newline */
                         if (item->data->link != NULL) {
                                 if (strlen(item->data->link) > 1) {