Khalid Hsu's blog

Posted Fri 19 October 2012

用emacs写点点博客(续)

终于做完了多到变态又毫无意义的数据库作业。
好了,贴些代码,忘记所有的不快。
上次我用emacs写点点博客时候用两个bash脚本,然后干脆修改一下,合并成一个,代码如下

#!/bin/bash
self="$0"
pushd "$(dirname -- $self)">/dev/null

ddlog()
{
    #username pwds out_cookie_file
    curl -c $3 http://www.diandian.com/login -d "account=$1&password=$2&persistent=1"
}

ddgetfrmkey()
{
    #cookiefile bgaddr out_put_ddfrmkey
    curl http://www.diandian.com/dianlog/$2/new/text  -b $1 |grep DDformKey|cut -d"'" -f 2 >$3
}

ddpost()
{
    #cookiefile bgaddr ddfrmkey  postfile
    cookiefile=$1;  bgaddr=$2; ddfrmkey=$3; postfile=$4
    ddcfg="$postfile.dd"
    tags=`cat $ddcfg|grep -v \#|grep tags` #has = !
    uri=`cat $ddcfg|grep -v \#|grep uri` # has = !
    formKey=`cat $ddfrmkey`
    markdownbody=$(python -c "import urllib; print urllib.quote(open('$postfile').read())")
    curl -b $cookiefile  http://www.diandian.com/dianlog/$bgaddr/new/text -d "formKey=$formKey&title=&markdownContent=$markdownbody&$uri&$tags&privacy=0&setTop=false&creativeCommonsEnable=true&creativeCommonsType=by_nc_sa&syncToWeibo=false&syncToQqWeibo=false&syncToDouban=false&syncToQzone=false&syncToRenren=false&syncToFacebook=false&syncToTwitter=false&syncToFlickr=false"

}

function showerr()
{
    echo err!
}

case $1 in  
    -l | --log-in)  
        ddlog $2 $3 $4
        ;;  
    -g | --get-fk)  
        ddgetfrmkey $2 $3 $4
        ;;
    -p | --post)  
        ddpost $2 $3 $4 $5
        ;; 
    *)  
        showerr
        ;;  
esac  

再贴一段调用该bash脚本的elisp,代码如下

;;ddemacs
;;by Khalid Hsu
;;2012.10.17

(defvar dd-sh "~/bash/dd-foo.sh");;path of the bash script
(defvar dd-dir "~/.diandian");;dir for saving cookie and formkey
(defvar dd-acc "khalidhsu@gmail.com")
(defvar dd-pwd nil);;just leave it nil
(defvar dd-blog-addrs '("khalidhsu"  "anotherblog"))
(defvar dd-cfg-ext ".dd")
(defvar dd-cookie-file nil);;just leave it nil

(defun dd-select-blog(blog-list)
  "Before U post."
  (let ((blog-list-in-list
         (mapcon 'list blog-list))
        (ret nil))
    (while (or (not ret)
               (= 0 (length ret)))
      (setq ret (completing-read
                 "Select a blog:"
                 blog-list-in-list nil t (car blog-list))))
    ret))

(defun dd-check-dir()
  "Before U login"
  (if (not (file-readable-p
            (directory-file-name dd-dir)))
      (make-directory dd-dir)))

(defun dd-save-cookie()
  ;;#username pwds out_cookie_file
  (shell-command (format "bash %s -l %s %s %s" dd-sh
                         dd-acc dd-pwd dd-cookie-file)))

(defun dd-save-formkey()
  ;;#cookiefile bgaddr out_put_ddfrmkey
  (mapc '(lambda (x)
           (shell-command
            (format "bash %s -g %s %s %s" dd-sh
                    dd-cookie-file x (expand-file-name
                                      x dd-dir))))
        dd-blog-addrs))

(defun dd-login()
  (interactive)
  (dd-init)
  (dd-check-dir)
  (setq dd-pwd (read-passwd "Password:"))
  (dd-save-cookie)
  (dd-save-formkey)
  (message "Done."))

(defun dd-post()
  "To post the dd article."
  (interactive)
  (dd-init)
  (save-buffer t)
  (let ((ddbuf (buffer-file-name (current-buffer)))
        target-bg
        target-bg-frmk
        ddcfgf ;;.dd
        post-cmd)
    (if  (string-suffix-p  dd-cfg-ext ddbuf)
        (setq ddbuf (substring ddbuf 0 -3)));;in case the user got it wrong
    (setq ddcfgf (concat ddbuf dd-cfg-ext))
    (if (not (file-readable-p ddcfgf) )
        (progn (dd-cfg)
               (message "Finish the dd cfg first!"))
      ;;else part: all-fine
      (setq target-bg (dd-select-blog dd-blog-addrs))
      (setq target-bg-frmk (expand-file-name target-bg dd-dir))
      ;;#cookiefile bgaddr ddfrmkey  postfile
      (setq post-cmd
            (format "bash %s -p %s %s %s %s" dd-sh
                    dd-cookie-file  target-bg target-bg-frmk ddbuf ))
      (m-eshell)
      (insert post-cmd))))

(defun dd-cfg()
  "To write the dd cfg file."
  (interactive)
  (save-buffer t)
  (let ((postname (i-get-buf-base-name (current-buffer))))
    (find-file (concat (buffer-file-name
                        (current-buffer)) dd-cfg-ext))
    (if (> (+ (point-min) 10) (point-max))
        (progn
          (delete-region (point-min) (point-max))
          (insert "[ddcfg]\n")
          (insert "tags=\n")
          (insert (concat "#uri=post%2F"
                          (format-time-string "%Y-%m-%d")
                          "%2F" postname "\n"))
          (save-buffer t)))))

(defun dd-init()
  "Exec-ed by the func of 'login' and 'post'."
  (interactive)
  (setq dd-cookie-file
        (expand-file-name "ddcookie"
                          dd-dir)))

(defalias 'ddp 'dd-post)
(defalias 'ddc 'dd-cfg)
(defalias 'ddl 'dd-login)

(provide 'dd-emacs)

关键的是bash代码,而elisp写了这么多,只是为了我自己用起来更舒服。 这里比较特别的地方是,由于我喜欢给文章加上标签和发布链接等信息,而又不想污染markdown文档,所以,对于每篇要发表的文章X,我都用额外的一个文件X.dd来记录附加信息。 该文件格式如。

[ddcfg]
tags=emacs,diandian,折腾
#uri=post%2F2012-10-17%2Fddemacs2

tags是要加入的标签,uri是自定义发布的链接,加了#号在前就是注释掉。 所以每次发布文章前,执行

M-x ddc RET  

来填写附加的信息。然后

M-x ddp RET

就发布到博客中。 当然,如果是第一次使用或者是cookie失效了,就先

M-x ddl RET

来获取cookie和formkey等。

Category: 2012-10
Tags: emacs diandian

Comments