Skip to content
2010/10/20 / highmt

wp-emacsいれてみた

emacsからWordPressに投稿してみる、ということでWebloggerModeを導入。
いろんな場所にいろんな名前で公開されているようですが、
http://www.emacswiki.org/emacs/WebloggerMode
ここからたどれるものが最新っぽい。
http://code.google.com/p/wp-emacs/ にあるものはかなり古い。

最初その古い方ででいろいろはまった結果、
以下のような感じでとりあえず投稿までこぎつけた。
参考にしたのはこのあたり:
http://www.emacswiki.org/emacs/WebloggerMode (たぶんここの説明がいちばん
新しいものをもとにしている)
http://tonecolor.wordpress.com/tag/emacs/
http://recently.sakura.ne.jp/wp/2009/06/01/229
http://www.moongift.jp/2009/05/wp-emacs/ (はなぜか空っぽ)

  • ダウンロードする
    svn co http://wp-emacs.googlecode.com/svn/trunk/ wp-emacs-read-only
    は古いバージョンなので
    http://www.emacswiki.org/emacs/WebloggerMode から たどって
    xml-rpc.el と weblogger.el をとってくる。

  • 接続設定する
    M-x weblogger-setup-weblog RET
    URLをきかれるので
    http://<ユーザ名>.wordpress.com/xmlrpc.php
    といれる。
    (この xmlprc.php が最初わからなかった。
    http://www.emacswiki.org/emacs/WebloggerMode にちゃんと載っている。)
    その後、ユーザ名とパスワードを答える。
    最後に、接続設定の名前を聞かれるのでデフォルトのまま default とする。

  • 接続設定が終了すると .emacs.el の custom-set-variables に設定が
    書き込まれるが、あやまってパスワードが “” で保存されてしまい、
    emacsを立ち上げ直して weblogger-start-entry したときに、
    「誤ったログイン/パスワードの組み合わせ。」とかいわれてしまうので、
    nilに変更しておく。

  • M-x weblogger-start-entry とする
    emacs起動直後はパスワードがキャッシュされていないので
    パスワードを聞かれる。

  • むかーしのメール編集みたいな画面(というかmml-modeとかだし)が
    出てくるので適当に編集。

C-c C-d でローカルにドラフトを保存。
バッファが切り替わっちゃうので、バッファ切り替えするか、
weblogger-start-entry後にC-c C-pするかして続きが書ける。
C-c C-c で下書きモードで送信。
癖で C-x C-s とかやると公開されちゃうんで注意。

C-c C-n とか C-c C-p とかで記事を移動できる。
おかしいなと思ったら、M-gでサーバと同期できる。

http://code.google.com/p/wp-emacs/ に置いてあるバージョン(1.2+パッチ)では、
htmlのタグを使うとエスケープされてしまうけど、最新のバージョン(1.4.5)では
タグとかもちゃんと使える。

暇なときにいろいろ見てみるかなぁ。

広告

3件のコメント

  1. highmt / 1月 20 2011 08:13

    カテゴリまわりとか日付まわりとかのパッチ。
    どこかのパッチを参考にしたのだけれど、すいません記録してません。

    diff -ur _orig/weblogger.el _new/weblogger.el
    --- _orig/weblogger.el	Wed Oct 20 03:30:29 2010
    +++ _new/weblogger.el	Fri Oct 22 03:19:46 2010
    @@ -272,6 +272,11 @@
       :group 'weblogger
       :type 'hook)
     
    +(defcustom weblogger-datecreated-timezone (cadr (current-time-zone))
    +  "Time zone to parse datecreated field"
    +  :group 'weblogger
    +  :type 'string)
    +
     (defvar weblogger-entry-list nil
       "List of weblog entries that we know about. Chronological
     order, with newest first.")
    @@ -670,9 +675,11 @@
     available."
       (interactive "P")
       (if prompt (weblogger-weblog-id prompt))
    +  ;; (unless weblogger-entry-ring
    +  ;;   (setq weblogger-entry-ring (make-ring weblogger-max-entries-in-ring))
    +  ;;   (ring-insert weblogger-entry-ring (list (cons "content" ""))))
       (unless weblogger-entry-ring
    -    (setq weblogger-entry-ring (make-ring weblogger-max-entries-in-ring))
    -    (ring-insert weblogger-entry-ring (list (cons "content" ""))))
    +    (weblogger-fetch-entries))
       (when (assoc "entry-id" (ring-ref weblogger-entry-ring 0))
         (ring-insert weblogger-entry-ring (list (cons "content" ""))))
       (setq weblogger-ring-index 0)
    @@ -702,9 +709,8 @@
     				    (url-host (url-generic-parse-url
                                                    weblogger-server-url)))))
     		    (list "Date"
    -                          (format-time-string "%d %b %Y %H:%M:%S %z"
    -                                              (caddr (assoc "dateCreated"
    -                                                            entry))))
    +                          (format-time-string "%Y-%m-%d %H:%M:%S %z"
    +                                               (caddr (assoc "dateCreated" entry))))
     		    (list "In-Reply-To"
     			  (let ((hold nil))
     			    (mapc
    @@ -717,7 +723,12 @@
     		    (list "X-TextType"
     			  (cdr (assoc "texttype" entry)))
     		    (list "Subject" title)
    -		    (list "Keywords" (cdr (assoc "tags" entry)))
    +                    (list "Keywords" (let ((cats (cdr (assoc "categories" entry))))
    +                                       (when (> (length cats) 0)
    +                                         (mapconcat
    +                                          (lambda (p) p)
    +                                          cats ", "))))
    +		    (list "Summary" (cdr (assoc "mt_keywords" entry)))
                                             ; Note that the blogger API on
                                             ; blogger.com is depcrated and
                                             ; broken on this element.
    @@ -733,6 +744,15 @@
         (when body-line
           (insert mail-header-separator "\n"))))
     
    +(defun weblogger-utc-to-local-time (time)
    +  (if time
    +      (time-subtract time (weblogger-datecreated-timezone-time))
    +    ;; (current-time)
    +    ))
    +
    +(defun weblogger-datecreated-timezone-time ()
    +  (seconds-to-time (* 60 (timezone-zone-to-minute weblogger-datecreated-timezone))))
    +
     (defun weblogger-send-entry (&optional arg)
       "Send but not publish the current entry.  With optional
     argument, prompts for the weblog to use."
    @@ -1274,7 +1294,10 @@
     	(authorName  (cdr (assoc-string "authorname" response t)))
     	(userid      (cdr (assoc-string "userid" response t)))
     	(title       (cdr (assoc-string "title" response t)))
    -	(dateCreated (cdr (assoc-string "datecreated" response t)))
    +	;; (dateCreated (cdr (assoc-string "datecreated" response t)))
    +        (dateCreated (let ((fv (cdr (assoc-string "datecreated" response t))))
    +                       (if fv
    +                           (list (car fv) (weblogger-utc-to-local-time (cadr fv))))))
     	(content          (assoc-string "content" response))
     	(trackbacks  (cdr (assoc-string "mt_tb_ping_urls" response t)))
     	(textType
    @@ -1283,6 +1306,7 @@
     	(description      (assoc-string "description" response t))
     	(extended         (assoc-string "mt_text_more" response t))
     	(tags        (cdr (assoc-string "mt_tags" response t)))
    +	(mt_keywords        (cdr (assoc-string "mt_keywords" response t)))
             (categories  (cdr (assoc-string "categories" response t))))
     
         (cond (content
    @@ -1341,8 +1365,8 @@
     			(cons "url"          url))
     		      (when dateCreated
     			(cons "dateCreated"  dateCreated))
    -		      (when tags
    -			(cons "tags"   tags))
    +		      (when mt_keywords
    +			(cons "mt_keywords"   mt_keywords))
     		      (when categories
     			(cons "categories"   categories))
     		      (when textType
    @@ -1368,10 +1392,10 @@
                (cons "link" (cdr (assoc "url" entry))))
              (when (cdr (assoc "content" entry))
                (cons "description" (cdr (assoc "content" entry))))
    -         (when (cdr (assoc "tags" entry))
    -           (cons "mt_tags" (cdr (assoc "tags" entry))))
              (when (cdr (assoc "categories" entry))
    -           (cons "categories" (cdr (assoc "categories" entry)))))))
    +           (cons "categories" (cdr (assoc "categories" entry))))
    +         (when (cdr (assoc "mt_keywords" entry))
    +           (cons "mt_keywords" (cdr (assoc "mt_keywords" entry)))))))
     
     (defun weblogger-server-userid ()
       "Get information on user."
    @@ -1448,11 +1472,18 @@
     	   (cons "dateCreated"
                      (list :datetime (date-to-time
                                       (message-fetch-field "Date"))))
    +	   ;; (cons "dateCreated"
    +           ;;       (list :datetime (weblogger-utc-to-local-time
    +           ;;                        (date-to-time (message-fetch-field "Date")))))
     	   (cons "texttype"      (message-fetch-field "X-TextType"))
     	   (cons "url"           (message-fetch-field "X-Url"))
     	   (cons "title"     (or (message-fetch-field "Subject")
     				 weblogger-default-title))
    -	   (cons "tags" (message-fetch-field "Keywords"))
    +           (cons "categories" (vconcat (or (message-tokenize-header
    +                                            (message-fetch-field "Keywords") ", ")
    +                                           weblogger-default-categories)))
    +	   (cons "mt_keywords" (message-fetch-field "Summary"))
    +
     	   (when (message-fetch-field "In-Reply-To")
                  (cons "trackbacks"
                        (or (message-tokenize-header
    diff -ur _orig/xml-rpc.el _new/xml-rpc.el
    --- _orig/xml-rpc.el	Wed Oct 20 03:29:13 2010
    +++ _new/xml-rpc.el	Fri Oct 22 00:20:31 2010
    @@ -380,6 +380,8 @@
        ((xml-rpc-value-datetimep value)
         `((value nil (dateTime.iso8601 nil ,(xml-rpc-datetime-to-string value)))))
        ;; list
    +   ((vectorp value)
    +    (xml-rpc-value-to-xml-list (append value nil)))
        ((xml-rpc-value-arrayp value)
         (let ((result nil)
               (xmlval nil))
    

Trackbacks

  1. EmacsからWordPressへwp-emacsで投稿する。 - redtower's memo
  2. EmacsからWordPressへwp-emacsで投稿する。 - redtower's memo

現在コメントは受け付けていません。

%d人のブロガーが「いいね」をつけました。