root/lang/xyzzy/hatena-bookmark-star-viewer/site-lisp/hatena-bookmark-star-viewer.l @ 7719

Revision 7719, 6.5 kB (checked in by miyamuko, 5 years ago)

lang/xyzzy/hatena-bookmark-star-viewer: support meta bookmark.

  • Property svn:mime-type set to text/plain; charset=shift_jis
Line 
1; -*- mode: lisp; package: hatena-bookmark-star-viewer -*-
2
3;;; hatena-bookmark-star-viewer.l --- Hatena Bookmark & Star viewer
4;;
5;; Copyright (c) 2008 MIYAMUKO Katsuyuki.
6;;
7;; Author: MIYAMUKO Katsuyuki <miyamuko@gmail.com>
8;; Version: 0.1
9;; Keywords: hatena, star, bookmark
10;;
11;; Permission is hereby granted, free of charge, to any person obtaining
12;; a copy of this software and associated documentation files (the
13;; "Software"), to deal in the Software without restriction, including
14;; without limitation the rights to use, copy, modify, merge, publish,
15;; distribute, sublicense, and/or sell copies of the Software, and to
16;; permit persons to whom the Software is furnished to do so, subject to
17;; the following conditions:
18;;
19;; The above copyright notice and this permission notice shall be
20;; included in all copies or substantial portions of the Software.
21;;
22;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26;; LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27;; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28;; WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
30;;; Commentary:
31;;
32;; * カーソル下の URI のはてなブックマークコメント、はてなスターを表示します。
33;;
34;; * clickable-uri を使っているので、NetInstaller からインストールしてください。
35;;
36;; * 使い方
37;;
38;;   - URI の上で C-c i
39;;
40
41
42;;; Code:
43
44(in-package :lisp)
45
46(require "clickable-uri")
47(require "hatena-star/api")
48(require "xml-http-request")
49(require "json")
50
51(defpackage :hatena-bookmark-star-viewer
52  (:use
53   :lisp :editor
54
55   :hatena-star.api
56   :xml-http-request
57   :json
58   ))
59(use-package :hatena-bookmark-star-viewer :user)
60
61
62(in-package :hatena-bookmark-star-viewer)
63
64(export '(show-current-link-hatena-star-and-bookmark
65          ))
66
67(defmacro puts (fmt &rest args)
68  `(format t ,fmt ,@args))
69
70(defmacro $ (item alist)
71  `(cdr (assoc ,item ,alist :test 'equal)))
72
73(defmacro invoke-later (dt &body body)
74  `(start-timer ,dt #'(lambda () ,@body) t))
75(setf (get 'invoke-later 'ed::lisp-indent-hook) '1)
76
77(defmacro with-render-buffer ((buffer) &body body)
78  (let ((gbuffer (gensym)))
79    `(let ((,gbuffer ,buffer))
80       (when (and ,gbuffer (not (deleted-buffer-p ,gbuffer)))
81         (with-output-to-buffer (,gbuffer (point-max))
82           (progn ,@body))
83         (refresh-screen)
84         ))))
85(setf (get 'with-render-buffer 'ed::lisp-indent-hook) 'with-output-to-buffer)
86
87(defun show-current-link-hatena-star/bookmark ()
88  (interactive)
89  (let ((*clickable-uri-open-command-alist*
90         (acons "^https?://" #'show-hatena-star/bookmark-later nil))
91        (*clickable-uri-keep-focus* nil))
92    (clickable-uri-open)))
93(global-set-key '(#\C-c #\i) 'show-current-link-hatena-star/bookmark)
94
95
96(defun show-hatena-star/bookmark-later (uri)
97  (let* ((uri (remove-query-string uri))
98         (bookmark (xhr-get-future (hatena-bookmark-entry-json-uri uri)
99                                   :key 'xhr-response-text))
100         (b (get-buffer-create "*Hatena:Star/Bookmark*")))
101    (erase-buffer b)
102    (setup-temp-buffer b)
103    (set-buffer-fold-width t b)
104    (hatena-star-get-entry uri :callback
105                           #'(lambda (star)
106                               (render-hatena-star/bookmark b uri star bookmark)))
107    (unless (get-buffer-window b)
108      (split-window (- (truncate (/ (window-height) 2))))
109      (set-buffer b))))
110
111(defun render-hatena-star/bookmark (buffer uri entry bookmark)
112  (invoke-later 0.1
113    (render-star uri entry buffer)
114    (render-bookmark uri bookmark buffer)))
115
116(defun render-star (uri entry buffer)
117  (with-render-buffer (buffer)
118    (puts "----------------------------------------------------------------------\n")
119    (puts "~A の~%" uri)
120    (if (not entry)
121        (puts "☆の数: 0~%~%")
122      (progn
123        (puts "☆の数: ~D~%~%" (hatena-star-stars-count entry))
124        (dolist (star (hatena-star-stars-by-user entry :list-quote t))
125          (multiple-value-bind (name quote count)
126              (hatena-star-star-values star)
127            (if count
128                (progn
129                  (puts "~@20A" name)
130                  (puts (make-sequence 'string count :initial-element #\☆)))
131              (puts name))
132            (puts "\n")
133            (dolist (q quote)
134              (puts "~20A「~A」\n" "" q))))
135        (puts "\n")))))
136
137(defun render-bookmark (uri future buffer)
138  (let ((bookmark (xhr-future-value future :timeout 0)))
139    (if (not bookmark)
140        (invoke-later 0.5
141          (render-bookmark uri future buffer))
142      (with-render-buffer (buffer)
143        (puts "----------------------------------------------------------------------\n")
144        (puts "~A の~%" uri)
145        (let ((bookmark (json-decode bookmark :strict nil)))
146          (puts "はてなブックマーク数: ~A~%~%" (or ($ "count" bookmark) "0"))
147          (dolist (b ($ "bookmarks" bookmark))
148            (puts "~A ~A ~{[~A]~}~A~%"
149                  ($ "timestamp" b) ($ "user" b)
150                  ($ "tags" b) ($ "comment" b)))
151          (puts "\n")
152          (when (and ($ "count" bookmark) (string/= ($ "count" bookmark) "0"))
153            (invoke-later 0.5
154              (render-bookmark (hatena-bookmark-entry-uri uri)
155                               (xhr-get-future (hatena-bookmark-entry-json-uri (hatena-bookmark-entry-uri uri))
156                                               :key 'xhr-response-text)
157                               buffer)))
158          )))))
159
160(defun remove-query-string (uri)
161  uri)
162;  (substitute-string uri "\\?.*$" ""))
163
164(defun hatena-bookmark-entry-uri (uri)
165  (concat "http://b.hatena.ne.jp/entry/" uri))
166
167(defun hatena-bookmark-entry-json-uri (uri)
168  (concat "http://b.hatena.ne.jp/entry/json/" uri))
169
170(defun bookmark-permalink (boomkark)
171  (let ((eid (cdr (assoc "eid" bookmark :test 'equal))))
172    (mapcar #'(lambda (b)
173                (format nil "http://b.hatena.ne.jp/~A/~A#bookmark-~A"
174                        (cdr (assoc "user" b :test 'equal))
175                        (remove #\/ (subseq (cdr (assoc "timestamp" b :test 'equal)) 0 10))
176                        eid))
177            (cdr (assoc "bookmarks" bookmark :test 'equal)))))
178
179
180(provide "hatena-bookmark-star-viewer")
181
182;;; hatena-bookmark-star-viewer.l ends here
Note: See TracBrowser for help on using the browser.