zoukankan      html  css  js  c++  java
  • 使用org-mode写cnblogs博客

    使用org-mode写cnblogs博客

    使用org-mode写cnblogs博客

    1 下载

    https://github.com/yangwen0228/unimacs/tree/master/packages/vendor/cnblogs

    这个插件是下载的cnblogs , 但作者好像很久没有更新了,而我们org-mode更新之后,org-html-export-as-html的行为有些改变,不能使用异步的方式了,导致插件使用不了。所以需要把异步改为同步,另外需要把org-export-show-temporary-export-buffer设置为nil,即导出的临时buffer在后台不可见。

    (cons "description"
          (let ((org-export-show-temporary-export-buffer nil))
            (with-current-buffer (org-html-export-as-html nil nil nil nil nil)
              (let ((buf-str (cnblogs-replace-media-object-location
                              (buffer-substring-no-properties
                               (point-min) (point-max)))))
                (kill-buffer)
                buf-str))))
    

    具体的使用方法可以参加原作者的博客:

    http://www.cnblogs.com/Open_Source/archive/2012/09/14/2684897.html

    还有csophys的这两篇文章也写得很好:

    http://www.cnblogs.com/csophys/archive/2012/04/26/2471667.html#2542335

    http://www.cnblogs.com/csophys/archive/2012/11/16/2773812.html

    2 配置

    设置cnblogs的url和username,然后,Alt+x运行cnblogs-setup-blog,依次输入博客的名称(一般和用户名相同,比如我的是yangwen0228),用户名和密码就可以了。

    (use-package cnblogs
        :ensure nil
        :init
        (require 'cnblogs)
        (cnblogs-minor-mode t)
        ;; Run command: cnblogs-setup-blog to set up.
        (bind-keys ("C-c c p" . cnblogs-post)
                   ("C-c c n" . cnblogs-new-post)
                   ("C-c c e" . cnblogs-edit-post)
                   ("C-c c d" . cnblogs-delete-post))
        ;; Bugfix: error url-http-create-request: Multibyte text in HTTP request
        ;; @ http://www.cnblogs.com/yangwen0228/p/6238528.html
        (defun url-http-create-request (&optional ref-url)
          "Create an HTTP request for `url-http-target-url', referred to by REF-URL."
          (let* ((extra-headers)
                 (request nil)
                 (no-cache (cdr-safe (assoc "Pragma" url-http-extra-headers)))
                 (using-proxy url-http-proxy)
                 (proxy-auth (if (or (cdr-safe (assoc "Proxy-Authorization"
                                                      url-http-extra-headers))
                                     (not using-proxy))
                                 nil
                               (let ((url-basic-auth-storage
                                      'url-http-proxy-basic-auth-storage))
                                 (url-get-authentication url-http-proxy nil 'any nil))))
                 (real-fname (url-filename url-http-target-url))
                 (host (url-http--encode-string (url-host url-http-target-url)))
                 (auth (if (cdr-safe (assoc "Authorization" url-http-extra-headers))
                           nil
                         (url-get-authentication (or
                                                  (and (boundp 'proxy-info)
                                                       proxy-info)
                                                  url-http-target-url) nil 'any nil))))
            (if (equal "" real-fname)
                (setq real-fname "/"))
            (setq no-cache (and no-cache (string-match "no-cache" no-cache)))
            (if auth
                (setq auth (concat "Authorization: " auth "
    ")))
            (if proxy-auth
                (setq proxy-auth (concat "Proxy-Authorization: " proxy-auth "
    ")))
    
            ;; Protection against stupid values in the referrer
            (if (and ref-url (stringp ref-url) (or (string= ref-url "file:nil")
                                                   (string= ref-url "")))
                (setq ref-url nil))
    
            ;; We do not want to expose the referrer if the user is paranoid.
            (if (or (memq url-privacy-level '(low high paranoid))
                    (and (listp url-privacy-level)
                         (memq 'lastloc url-privacy-level)))
                (setq ref-url nil))
    
            ;; url-http-extra-headers contains an assoc-list of
            ;; header/value pairs that we need to put into the request.
            (setq extra-headers (mapconcat
                                 (lambda (x)
                                   (concat (car x) ": " (cdr x)))
                                 url-http-extra-headers "
    "))
            (if (not (equal extra-headers ""))
                (setq extra-headers (concat extra-headers "
    ")))
    
            ;; This was done with a call to `format'.  Concatenating parts has
            ;; the advantage of keeping the parts of each header together and
            ;; allows us to elide null lines directly, at the cost of making
            ;; the layout less clear.
            (setq request
                  (concat
                   ;; The request
                   (or url-http-method "GET") " "
                   (url-http--encode-string
                    (if using-proxy (url-recreate-url url-http-target-url) real-fname))
                   " HTTP/" url-http-version "
    "
                   ;; Version of MIME we speak
                   "MIME-Version: 1.0
    "
                   ;; (maybe) Try to keep the connection open
                   "Connection: " (if (or using-proxy
                                          (not url-http-attempt-keepalives))
                                      "close" "keep-alive") "
    "
                                      ;; HTTP extensions we support
                                      (if url-extensions-header
                                          (format
                                           "Extension: %s
    " url-extensions-header))
                                      ;; Who we want to talk to
                                      (if (/= (url-port url-http-target-url)
                                              (url-scheme-get-property
                                               (url-type url-http-target-url) 'default-port))
                                          (format
                                           "Host: %s:%d
    " (puny-encode-domain host)
                                           (url-port url-http-target-url))
                                        (format "Host: %s
    " (puny-encode-domain host)))
                                      ;; Who its from
                                      (if url-personal-mail-address
                                          (concat
                                           "From: " url-personal-mail-address "
    "))
                                      ;; Encodings we understand
                                      (if (or url-mime-encoding-string
                                              ;; MS-Windows loads zlib dynamically, so recheck
                                              ;; in case they made it available since
                                              ;; initialization in url-vars.el.
                                              (and (eq 'system-type 'windows-nt)
                                                   (fboundp 'zlib-available-p)
                                                   (zlib-available-p)
                                                   (setq url-mime-encoding-string "gzip")))
                                          (concat
                                           "Accept-encoding: " url-mime-encoding-string "
    "))
                                      (if url-mime-charset-string
                                          (concat
                                           "Accept-charset: "
                                           (url-http--encode-string url-mime-charset-string)
                                           "
    "))
                                      ;; Languages we understand
                                      (if url-mime-language-string
                                          (concat
                                           "Accept-language: " url-mime-language-string "
    "))
                                      ;; Types we understand
                                      "Accept: " (or url-mime-accept-string "*/*") "
    "
                                      ;; User agent
                                      (url-http-user-agent-string)
                                      ;; Proxy Authorization
                                      proxy-auth
                                      ;; Authorization
                                      auth
                                      ;; Cookies
                                      (when (url-use-cookies url-http-target-url)
                                        (url-http--encode-string
                                         (url-cookie-generate-header-lines
                                          host real-fname
                                          (equal "https" (url-type url-http-target-url)))))
                                      ;; If-modified-since
                                      (if (and (not no-cache)
                                               (member url-http-method '("GET" nil)))
                                          (let ((tm (url-is-cached url-http-target-url)))
                                            (if tm
                                                (concat "If-modified-since: "
                                                        (url-get-normalized-date tm) "
    "))))
                                      ;; Whence we came
                                      (if ref-url (concat
                                                   "Referer: " ref-url "
    "))
                                      extra-headers
                                      ;; Length of data
                                      (if url-http-data
                                          (concat
                                           "Content-length: " (number-to-string
                                                               (length url-http-data))
                                           "
    "))
                                      ;; End request
                                      "
    "
                                      ;; Any data
                                      url-http-data))
            ;; Bug#23750
            (setq request (url-http--encode-string request))
            (unless (= (string-bytes request)
                       (length request))
              (error "Multibyte text in HTTP request: %s" request))
            (url-http-debug "Request is: 
    %s" request)
            request))
        )
    

    3 使用org写文章

    用org写文章,org-mode可以去看org-mode的官网,或者是其他的教程介绍,一旦用上,就再也离不开了。

    3.1 tags

    其中有几个常用的tags:

    • TITLE
    • CATEGORIES
    • DESCRIPTION
    • KEYWORDS
    • DATE

    因为这是每次写cnblogs都需要的,所以,我做了一个snippet:

    #+TITLE: $1
    #+CATEGORIES: ${2:Emacs}
    #+DESCRIPTION: ${3:}
    #+KEYWORDS: $4
    #+DATE: `(format-time-string "%Y-%m-%d %H:%M")`
    

    这样,每次写博客之前,只需要输入cnblogs,然后tab一下,就可以把这个插入到文章的开头了,然后根据实际需要再填入相关的信息。

    3.2 code blocks

    默认的code block的配色只取front-face的颜色,背景是浅色或白色的,显示的效果不太好,使用下面的配置,就是可以和Emacs中显示的效果一模一样了。

      ;; @ http://emacs.stackexchange.com/questions/3374/set-the-background-of-org-exported-code-blocks-according-to-theme
      (defun my/org-inline-css-hook (exporter)
        "Insert custom inline css to automatically set the
    background of code to whatever theme I'm using's background"
        (when (eq exporter 'html)
          (let* ((my-pre-bg (face-background 'default))
                 (my-pre-fg (face-foreground 'default)))
            (setq
             org-html-head-extra
             (concat
              org-html-head-extra
              (format "<style type="text/css">
     pre.src {background-color: %s; color: %s;}</style>
    "
                      my-pre-bg my-pre-fg))))))
      (add-hook 'org-export-before-processing-hook 'my/org-inline-css-hook)
    

    3.3 quote

    我们写博客时,经常会引用别人的经典的语录。这个时候怎么办呢? 假设我们这样写:

    #+BEGIN_SRC text
    /*子曰:学而时习之,不亦说乎!*/
    

    #+ENDSRC 结果是这样的:

    /*子曰:学而时习之,不亦说乎!*/
    

    我们看到,这个引用使用的是与code block一样的设置。那么,引用改怎么写呢?

    其实,org-mode中专门有一个引用的tag:

    #+BEGIN_QUOTE
    /*子曰:学而时习之,不亦说乎!*/
    #+END_QUOTE
    

    效果是这样的:

    子曰:学而时习之,不亦说乎!

    这个才是正确的引用姿势。

    4 发布

    只需要按 C-c c p 进行发布就可以了,如果是第一次发布,会提示"Do you want to post this blog to cnblogs?" ,回答"y"。如果是更新之前发表过的文章,"Already published! Do you want to update this blog to cnblogs?",回答"y"就可以更新文章。

    5 资源

    所有的配置,可以查看我的github:

    https://github.com/yangwen0228/unimacs

    其中配置文件放置在 personal/configures中。

    Date: 2016-12-30 23:47

    Created: 2017-01-08 周日 19:13

    Validate

  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/yangwen0228/p/6238723.html
Copyright © 2011-2022 走看看