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