(in-package :your-awesome-app)
(require "hatena-star/api")
(use-package :hatena-star.api)
;; RKS (ログインセッションごとに固有の ID, add/delete で必要)
(defvar *rks* nil)
;; はてなスターカウント API
(let ((blog (hatena-star-get-blog "http://d.hatena.ne.jp/hatenastar/")))
...)
;; エントリと RKS の取得
(multiple-value-bind (entries rks)
(hatena-star-get-entries '("http://d.hatena.ne.jp/hatenastar/20071129/1196290565"
"http://d.hatena.ne.jp/hatenastar/20071124/1195896789"
"http://d.hatena.ne.jp/hatenastar/20071115/1195092449"))
(setf *rks* rks)
(your-cool-show-hatena-star-entry
(mapcar #'(lambda (entry)
;; ☆が多くて省略されていたら再取得
(if (hatena-star-stars-all-p entry)
entry
(hatena-star-get-entry (hatena-star-entry-uri entry))))
entries)))
;; コメントの追加
(when (hatena-star-entry-can-comment-p entry)
(hatena-star-add-comment (hatena-star-entry-uri entry)
*rks*
:title title
:body (read-string "コメント: ")))
;; 選択文字列を引用して☆の追加
(let ((title "ほげほげ")
(quote (selection-start-end (s e) (buffer-substring s e))))
(let ((r (hatena-star-add-star (hatena-star-entry-uri entry)
*rks* :title title :quote quote)))
(cond ((null r)
(values nil nil)) ; ☆追加失敗
((string= quote (hatena-star-star-quote r))
(values t t)) ; ☆追加 + 引用成功
(t
(values t nil))))) ; ☆追加成功 + 引用失敗
;; ☆の削除 (指定された entry の star を削除)
(when (hatena-star-deletable-p (hatena-star-star-name star))
(hatena-star-delete-star (hatena-star-entry-uri entry)
*rks*
:name (hatena-star-star-name star)
:quote (hatena-star-star-quote star)))
hatena-star は はてなスター API を xyzzy から実行するためのライブラリです。
以下のことができます。
xml-http-request を使っているので非同期にはてなスター API を実行できます。
アーカイブをダウンロードします。
<URL:http://miyamuko.s56.xrea.com/xyzzy/archives/hatena-star.zip>
hatena-star は以下のモジュールに依存しています。別途インストールしてください。
hatena-star は以下のパッケージを利用しています。
hatena-star.api
nickname はありません。
hatena-star.api:*hatena-star-base-uri*hatena-star.ui:*hatena-star-default-star-char*hatena-star-make-stars-string などの関数で STAR-CHAR を省略した場合に利用する charcter です。
デフォルトは #\★ です。
hatena-star.ui:*hatena-star-default-star-color*hatena-star-stars-insert で☆を描画するときの色です。
デフォルトは (:foreground 11) です。
hatena-star.ui:*hatena-star-inner-count-min*hatena-star-stars-insert で☆を描画するときに、省略形式にする最小の☆の数です。
デフォルトは 16 です。
なし。
なし。
なし。
BLOG-INFOBLOG-INFO はブログのはてなスター情報を保持します。 BLOG-INFO は hatena-star-get-blog で取得します。
BLOG-INFO からは以下の関数で情報を取得できます。
ENTRY-INFOENTRY-INFO はブログエントリのはてなスター情報を保持します。 ENTRY-INFO は hatena-star-get-entries または hatena-star-get-entry で取得します。
ENTRY-INFO からは以下の情報を取得できます。
STAR-LISTSTAR-LIST はブログエントリの STAR-INFO のリストです。 STAR-LIST は hatena-star-entry-stars で取得します。
STAR-LIST からは以下の情報を取得できます。
STAR-INFOSTAR-INFO はブログエントリの☆の情報を保持します。 STAR-INFO は STAR-LIST の要素です。
STAR-INFO からは以下の情報を取得できます。
COMMENT-INFOCOMMENT-INFO はブログエントリのコメントを保持します。 COMMENT-INFO は hatena-star-entry-comments で取得します。
COMMENT-INFO からは以下の情報を取得できます。
hatena-star.api:hatena-star-get-blog BLOG-URI &KEY SINCE NOMSG CALLBACK FUTURE指定された BLOG-URI のブログのはてなスター情報を取得します。
BLOG-INFO を返します。
例:
(let ((blog (hatena-star-get-blog "http://d.hatena.ne.jp/hatenastar/")))
(msgbox "~Aの☆は~D個です。~%~A"
(hatena-star-blog-title blog)
(hatena-star-blog-star-count blog)
(hatena-star-blog-uri blog)))
NOMSG に non-nil を指定するとメッセージを出力しません。
nil の場合メッセージ領域に通信状態を表示します。 デフォルトは nil です。
SINCE には送信時の If-Modified-Since ヘッダを指定します。
SINCE には以下の値を指定できます。
CALLBACK を指定すると非同期通信を行います。
はてなスター数の取得に成功した場合はブログ情報が CALLBACK の引数に指定し呼び出します。
失敗した場合は文字列が渡されます。
FUTURE に non-nil を指定した場合は xml-http-request の Future オブジェクトを返します。
Future オブジェクトから情報取得するには以下の関数を使用します。
hatena-star.api:hatena-star-blog-uri BLOG-INFOhatena-star.api:hatena-star-blog-title BLOG-INFOhatena-star.api:hatena-star-blog-star-count BLOG-INFOhatena-star.api:hatena-star-get-entries PERMALINK-LIST &KEY SINCE NOMSG CALLBACK FUTURE指定された PERMALINK-LIST に付けられた はてなスターの情報を取得します。
ENTRY-INFO と RKS (閲覧者情報) 多値で返します。
例:
(defvar *rks* nil)
(multiple-value-bind (entry rks)
(hatena-star-get-entries "http://d.hatena.ne.jp/hatenastar/20071129/1196290565")
(setf *rks* rks)
(msgbox "~A~%~D" rks (hatena-star-stars-count entry)))
(multiple-value-bind (entries _)
(hatena-star-get-entries '("http://d.hatena.ne.jp/hatenastar/20071129/1196290565"
"http://d.hatena.ne.jp/hatenastar/20071124/1195896789"
"http://d.hatena.ne.jp/hatenastar/20071115/1195092449"
"http://d.hatena.ne.jp/jkondo/20080130/1201642779"))
(dolist (entry entries)
(msgbox "~D: ~A"
(hatena-star-stars-count entry)
(hatena-star-entry-uri entry))))
☆が 15 個以上付いたエントリは☆の情報が省略され、 一部の情報 (最初の☆、間の☆の数、最後の☆) しか取得できません。
すべての☆を取得したい場合はさらに hatena-star-get-entry を呼び出す必要があります。
PERMALINK-LIST には複数のエントリの permalink をリストで指定します。
取得したいエントリが一つしかない場合は、その permalink を文字列で指定してもかまいません (要素が一つのリストにする必要はありません)。
hatena-star.api:hatena-star-get-entry ENTRY-OR-PERMALINK &KEY SINCE NOMSG CALLBACK FUTURE指定されたエントリに付いたはてなスターのエントリ情報を取得します。
ENTRY-INFO を返します。
この API で取得した場合、「最初の☆、間の☆の数、最後の☆」形式の省略はされません。
hatena-star.api:hatena-star-entry-can-comment-p ENTRY-INFOhatena-star.api:hatena-star-entry-uri ENTRY-INFOhatena-star.api:hatena-star-entry-stars ENTRY-INFOエントリから☆リストを取得します。
STAR-LIST を返します。
例:
(let* ((e (hatena-star-get-entry "http://d.hatena.ne.jp/hatenastar/20070707/1184453490"))
(stars (hatena-star-entry-stars e)))
(with-output-to-temp-buffer ("*Hatena:Star*")
(format t "☆の数: ~D~%~A~%~%"
(hatena-star-stars-count stars)
(hatena-star-entry-uri e))
(dolist (star stars)
(multiple-value-bind (name quote _)
(hatena-star-star-values star)
(format t "~A「~A」~%" name (or quote ""))))))
☆のリストは省略されることがあります。
☆が 15 個以上付いている場合は、「最初の☆、間の☆の数、最後の☆」 だけしか情報を取得できません。
間の☆の情報がほしい場合は hatena-star-get-entry を使う必要があります。
この形式の省略形かどうかは hatena-star-stars-inner-count-p で判定できます。
15 未満の場合はすべての情報を取得可能です。
すべての情報が取得可能かどうかは hatena-star-stars-all-p で判定できます。
☆が 300 個以上付いている場合は、ユーザごとに星の数が集約されます。
各ユーザが付けた星の数は hatena-star-star-count で取得できます。
この形式の省略形かどうかは hatena-star-stars-by-user-p で判定できます。
300 未満の場合はすべての情報を取得可能です。
hatena-star-stars-all-p で判定できます。
hatena-star.api:hatena-star-entry-comments ENTRY-INFOエントリに付いたコメントをリストで返します。
コメントからは以下の情報を取得できます。
hatena-star.api:hatena-star-comment-name COMMENT-INFOhatena-star.api:hatena-star-comment-body COMMENT-INFOhatena-star.api:hatena-star-comment-values COMMENT-INFOhatena-star.api:hatena-star-stars-all-p ENTRY-OR-STARS☆のリストが一切省略されていないなら t を返します。
エントリ情報と☆リストの両方を指定できます。
hatena-star.api:hatena-star-stars-by-user-p ENTRY-OR-STARS☆のリストが☆をつけたユーザごとに集約されているなら t を返します。
エントリ情報と☆リストの両方を指定できます。
hatena-star.api:hatena-star-stars-inner-count-p ENTRY-OR-STARS☆のリストが(最初の☆、間の☆の数、最後の☆)のみの場合 t を返します。
エントリ情報と☆リストの両方を指定できます。
hatena-star.api:hatena-star-stars-by-user ENTRY-OR-STARS &KEY LIST-QUOTE☆のリストをユーザごとに集約します。 この関数は hatena-star-get-entry で取得した☆リストを、☆の数にかかわらずに集約形式にしたい場合に利用します。
LIST-QUOTE が non-nil の場合、引用文をリストで返します。 nil の場合は最初の引用文のみを返します。
デフォルトは nil です。
☆が 300 個を超える場合は最初からユーザごとに集約されています。
(高速化のため) すでに集約されていて LIST-QUOTE が nil の場合は引数をそのまま返します。 LIST-QUOTE が non-nil の場合は、リストにして返します。
※注意※ よって、以下のコードは引用文をリストで返します。
(let ((stars (hatena-star-stars-by-user stars :list-quote t))) (hatena-star-stars-by-user stars :list-quote nil))
エントリ情報と☆リストの両方を指定できます。
hatena-star.api:hatena-star-stars-inner-count-values ENTRY-OR-STARS☆のリストから(最初の☆、間の☆の数、最後の☆)を多値で取得します。
hatena-star-stars-inner-count-p が nil でも上記形式で取得できます。
エントリ情報と☆リストの両方を指定できます。
hatena-star.api:hatena-star-stars-count ENTRY-OR-STARShatena-star.api:hatena-star-star-name STAR-INFOhatena-star.api:hatena-star-star-quote STAR-INFOhatena-star.api:hatena-star-star-count STAR-INFO☆をつけた人ごとの☆の個数を返します。
300 以上の☆がついたエントリ( hatena-star-stars-by-user-p が t を返す)の場合のみ値を返します。
☆の数が 300 未満の場合は nil を返します。
hatena-star.api:hatena-star-star-values STAR-INFOhatena-star.api:hatena-star-add-star ENTRY-OR-PERMALINK RKS &KEY NOMSG CALLBACK FUTURE TOKEN TITLE QUOTE指定されたエントリに☆をつけます。
実際につけた☆の STAR-INFO を返します。
TOKEN にはサイト固有の識別子を指定します。
なくてもいいみたいです。
QUOTE には☆の引用文字列を指定します。
元のページに含まれていない文字列を指定することはできません。 指定した場合、引用文字列なしで☆が付きます。
正しく引用できたかどうかは戻り値で分かります。
hatena-star.api:hatena-star-add-comment ENTRY-OR-PERMALINK RKS &KEY CALLBACK FUTURE TITLE BODY指定された URI にコメントをつけます。 コメントはスターフレンドにしかつけられません。
COMMENT-INFO を返します。
hatena-star.api:hatena-star-deletable-p NAME-OR-STAR &KEY CALLBACK FUTURE指定したユーザの☆を削除できる場合 t を返します。
基本的には自分の NAME の場合のみ t を返すはずです。 はてなにログインしていない場合は自分の NAME でも nil を返します(たぶん)。
hatena-star.api:hatena-star-delete-star ENTRY-OR-PERMALINK RKS &KEY CALLBACK FUTURE NAME QUOTE STAR指定したエントリに付いた☆を削除します。
成功した場合は t を、失敗した場合は nil を返します。
STAR には STAR-INFO を指定します。
指定した STAR が他のユーザの☆なら削除できません。
NAME と QUOTE は文字列でユーザ名と引用文を指定します。
NAME は省略可能です。省略した場合は自分の☆が対象になります。 QUOTE を省略した場合は引用文なしの☆が対象になります。
例:
;; example.com に付けた自分の☆を一個削除
(hatena-star-delete-star "http://example.com/" *rks*)
;; example.com に "example" を引用して付けた自分の☆を一個削除
(hatena-star-delete-star "http://example.com/" *rks* :quote "foo")
;; example.com に付いている自分の☆を全部削除
(multiple-value-bind (entry rks)
(hatena-star-get-entry "http://example.com/")
(dolist (star (hatena-star-entry-stars entry))
(when (hatena-star-deletable-p star) ; 手抜き。。。deletable-p の結果はキャッシュすべき
(hatena-star-delete-star entry rks :star star))))hatena-star.api:hatena-star-future-p OBJhatena-star.api:hatena-star-future-completed-p FUTUREhatena-star.api:hatena-star-future-value FUTURE &REST OPTIONS指定された Future オブジェクトから結果を取得します。 リクエストが完了していない場合は完了を待ち合わせます。
引数の詳細は
xml-http-request
の xhr-future-value を参照してください。
hatena-star.api:hatena-star-version本ライブラリのバージョンを返します。 バージョンは major.minor.teeny という形式です。
それぞれの番号は必ず 1 桁にするので、以下のように比較することができます
(if (string<= "1.1.0" (hatena-star-version))
'(1.1.0 以降で有効な処理)
'(1.1.0 より前のバージョンでの処理))hatena-star.ui:hatena-star-make-stars-string COUNT &KEY STAR-CHAR INNER INNER-MIN指定された COUNT 数の☆を文字列で返します。
例:
(hatena-star-make-stars-string 15) "★★★★★★★★★★★★★★★" (hatena-star-make-stars-string 16 :star-char #\☆) "☆14☆" (hatena-star-make-stars-string 4 :inner-min 5) "★★★★" (hatena-star-make-stars-string 5 :inner-min 5) "★3★" (hatena-star-make-stars-string 3 :inner t) "★1★"
INNER が non-nil の場合、INNER-MIN の値にかかわらず省略形式で返します。 ただし、COUNT が 2 以下の場合は省略形式にはなりません。
デフォルトは nil です。
INNER-MIN には省略形式にする最小の数を指定します。 ☆の数が INNER-MIN より少ない場合は省略形式にはなりません。
デフォルトは *hatena-star-inner-count-min* です。
hatena-star.ui:hatena-star-stars-to-string ENTRY-OR-STARS &KEY STAR-CHARhatena-star.ui:hatena-star-stars-insert ENTRY-OR-STARS &KEY TAG STAR-CHAR COLORCOLOR には☆の色を指定します。詳細は set-text-attribute を参照してください。
デフォルトは *hatena-star-default-star-color* で指定します。
なし。
カーソル下の URL のはてなスター情報をバッファに表示するサンプル。 URL の取得に clickable-uri をトリッキーに使ってます。
(require "clickable-uri")
(require "hatena-star/api")
(use-package :hatena-star.api)
(defun show-hatena-star-entry (entry)
(when entry
(macrolet ((puts (fmt &rest args)
`(insert (format nil ,fmt ,@args))))
(with-output-to-temp-buffer ("*Hatena:Star*")
(puts "☆の数: ~D~%~A~%~%"
(hatena-star-stars-count entry)
(hatena-star-entry-uri entry))
(dolist (star (hatena-star-entry-stars entry))
(multiple-value-bind (name quote count)
(hatena-star-star-values star)
(puts name)
(when count
(puts " (~D)" count))
(when quote
(indent-to 30)
(puts " 「~A」" quote))
(puts "\n")))
(goto-char (point-min))
(refresh-screen)))))
(defun show-hatena-star-uri-later (uri)
(hatena-star-get-entry uri :callback #'show-hatena-star-entry))
(defun show-current-link-hatena-star ()
(interactive)
(let ((*clickable-uri-open-command-alist*
(acons "^https?://" #'show-hatena-star-uri-later nil))
(*clickable-uri-keep-focus* nil))
(clickable-uri-open)))
(global-set-key '(#\C-c #\s) 'show-current-link-hatena-star)
みやむこ かつゆき (<URL:mailto:miyamuko@gmail.com>)
hatena-star は MIT/X ライセンスに従って本ソフトウェアを使用、再配布することができます。
See hatena-star/docs/MIT-LICENSE for full license.
hatena-star 1.1.1 リリース!
hatena-star 1.1.0 リリース!
hatena-star 1.0.3 リリース!
hatena-star 1.0.2 リリース!
星の省略が変な形式になる場合があるのに対応。
普通は (("naoya" "hoge") 10 ("jkondo" "hoge")) となるが、 最初の☆がない場合 (10 ("jkondo" "")) があった。
hatena-star 1.0.1 リリース!
hatena-star 1.0.0 リリース!
hatena-star 0.1.0 リリース!
このリリースは人柱er 向けプレビューです (ときどき xyzzy がクラッシュするので)。