はてブを整理した
なんとなく、はてブのタグを toLowerCase したいなーと前々から思っていて、昨日はてなブックマークAtomAPI を見たのだけれど、update がないわけですよ。create, delete はあっても。書いてないだけで実は使えたりして?と思いつつ、一度 Atom 形式でエクスポートして、XSLT で toLowerCase して、インポートしてみたのだけれど、変わらない。
u2l.xsl
<?xml version="1.0" encoding="shift_jis"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://purl.org/atom/ns#" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" > <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="no" indent="yes" media-type="application/xml" /> <xsl:variable name="upper">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> <xsl:variable name="lower">abcdefghijklmnopqrstuvwxyz</xsl:variable> <xsl:strip-space elements="*" /> <xsl:template match="*"> <xsl:copy> <xsl:copy-of select="@*" /> <xsl:apply-templates /> </xsl:copy> </xsl:template> <xsl:template match="dc:subject"> <xsl:copy> <xsl:value-of select="translate(., $upper, $lower)" /> </xsl:copy> </xsl:template> </xsl:stylesheet>
じゃ一回全部消せばいんじゃね?とか思って、entry 要素なしの Atom 送りつけたけど、予想通りダメ。仕方ないから XSLT, Perl で書いた。
del.xsl
<?xml version="1.0" encoding="shift_jis"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://purl.org/atom/ns#" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" > <xsl:output method="text" encoding="utf-8" omit-xml-declaration="yes" indent="no" media-type="text/plain" /> <xsl:strip-space elements="*" /> <xsl:template match="/">#!/usr/local/bin/perl use strict; use warnings; use XML::Atom::Entry; use XML::Atom::Client; my $api = XML::Atom::Client->new; $api->username('kageroh_'); $api->password('********'); my $entry = XML::Atom::Entry->new; <xsl:apply-templates /> </xsl:template> <xsl:template match="atom:entry/atom:link[@type='application/x.atom+xml']">$api->deleteEntry('<xsl:value-of select="@href" />') or die $api->errstr; </xsl:template> <xsl:template match="atom:id | atom:issued | atom:name | atom:summary | atom:title | dc:*" /> </xsl:stylesheet>
del.pl
#!/usr/local/bin/perl use strict; use warnings; use XML::Atom::Entry; use XML::Atom::Client; my $api = XML::Atom::Client->new; $api->username('kageroh_'); $api->password('********'); my $entry = XML::Atom::Entry->new; $api->deleteEntry('http://b.hatena.ne.jp/atom/edit/2119879') or die $api->errstr; ...
で、エクスポートしておいた Atom をインポート。そしたら 120 ブクマ減りまして。それなのに "完了しました" とか誇らしげに成功メッセージが出まして。「バギィだぜ……」と愚痴りながら diff とったら、文書出現順で或る entry 以降が全部無視されてる。理由はわからない。仕方なく新規 post ということで、また XSLT, Perl を。
add.xsl
<?xml version="1.0" encoding="shift_jis"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://purl.org/atom/ns#" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" > <xsl:output method="text" encoding="utf-8" omit-xml-declaration="yes" indent="no" media-type="text/plain" /> <xsl:strip-space elements="*" /> <xsl:template match="/">#!/usr/local/bin/perl use strict; use warnings; use XML::Atom::Entry; use XML::Atom::Client; my $api = XML::Atom::Client->new; $api->username('kageroh_'); $api->password('********'); my $entry; my $link = XML::Atom::Link->new; <xsl:apply-templates /> </xsl:template> <xsl:template match="atom:entry/atom:link[@rel='related']"> $link->rel('related'); $link->type('<xsl:value-of select="@type" />'); $link->href('<xsl:value-of select="@href" />'); $entry = XML::Atom::Entry->new; $entry->add_link($link); $entry->summary('<xsl:for-each select="following-sibling::dc:subject">[<xsl:value-of select="." />]</xsl:for-each>'); $api->createEntry('http://b.hatena.ne.jp/atom/post', $entry) or die $api->errstr; </xsl:template> <xsl:template match="atom:id | atom:issued | atom:name | atom:summary | atom:title | dc:*" /> </xsl:stylesheet>
add.pl
#!/usr/local/bin/perl use strict; use warnings; use XML::Atom::Entry; use XML::Atom::Client; my $api = XML::Atom::Client->new; $api->username('kageroh_'); $api->password('********'); my $entry; my $link = XML::Atom::Link->new; $link->rel('related'); $link->type('text/html'); $link->href('http://www.wireshark.org/'); $entry = XML::Atom::Entry->new; $entry->add_link($link); $entry->summary('[tcp][tool]'); $api->createEntry('http://b.hatena.ne.jp/atom/post', $entry) or die $api->errstr; ...
どうにか数が合いました。あと、日本語タグも英字にしたくて、それは手動でしこしこやった。
あ、ただのメモです。ツッコミは歓迎ですけども。
Perl だけで書けるのでしょうけど、私は Perl 片言なので。
せめてサブルーチン使えよって感じですね。直さない \(^o^)/