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) {