标签:org2blog

以下是与标签 “org2blog” 相关联的文章

在 orgmode 中粘贴截图

用 org2blog 写博客有一段时间了,但是从来都不在文章中加配图。因为一直没有找到好的办法,可以在 orgmode 中粘贴并管理图片。

这个问题还是要解决的,在网上搜了一圈解决方案。一个办法是使用命令行截图软件,将图片保存到指定位置,然后在 orgmode 中插入路径。我平时使用 picpick 这个截图软件,不想更换其它软件,所以不采用这个方案。

最后在 stackoverflow 上找到一个方法, 先用 C# 写一个小程序,从剪切板中将图片保存到指定路径,然后在 orgmode 中插入这个路径。这个方法可以与 picpick 软件可以配合使用,感觉不错,决定试一下。

  • 用 VS2005 新建一个 C# Windows Program 项目,命名为 CbImage2File
  • 删除 Form1.cs
  • 修改 program.cs 文件
using System;
using System.Collections.Generic;
using System.Text;

namespace CbImage2File
{
    static class Program
    {
        private static int FAILURE = 1;

        private static void Failure(string description)
        {
            Console.Error.WriteLine("Clipboard does not contain image data");
            Environment.Exit(FAILURE);
        }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            System.Drawing.Image image = System.Windows.Forms.Clipboard.GetImage();

            if (image == null)
            {
                Failure("Clipboard does not contain image data");
            }

            if (args.Length == 0)
            {
                Failure("You have not specified an output path for the image");
            }

            if (args.Length > 1)
            {
                Failure("You must only specify a file path (1 argument)");
            }

            string filePath = args[0];
            System.IO.DirectoryInfo folderInfo = new System.IO.FileInfo(filePath).Directory;

            if (!folderInfo.Exists)
            {
                System.IO.Directory.CreateDirectory(folderInfo.FullName);
            }

            image.Save(filePath);
        }
    }
}
  • 编译 release 版本,得到 CbImage2File.exe
  • myconfig/package.el 中增加
;;;###autoload
(defun org-insert-image-from-clipboard ()
  (interactive)
  (let* ((home-dir "d:/cygwin/home/fj/")
         (relative-dir "org/image")
         (attachments-dir (concat home-dir relative-dir))
         (png-file-name (format-time-string "%Y%m%d_%H%M%S.png"))
         (png-path (concat attachments-dir "/" png-file-name))
         (relative-path (concat relative-dir "/" png-file-name))
         (temp-buffer-name "CbImage2File-buffer"))
    (call-process "D:/tools/CbImage2File.exe" nil temp-buffer-name nil png-path)
    (let ((result (with-current-buffer temp-buffer-name (buffer-string))))
      (progn
        (kill-buffer temp-buffer-name)
        (if (string= result "")
            (progn 
              (insert (concat "[[~/" relative-path "]]"))
              ;(org-display-inline-images)
              )
          (insert result))))))

测试图片

图1  这是一张测试图片

emacs25.1 org2blog 发布中文出错问题

使用 org2blog 发布博客时,提示出错信息如下:

error in process sentinel: url-http-create-request: Multibyte text in HTTP request: POST /xmlrpc.php HTTP/1.1

依次排查了以下可能的原因

  • 网络代理
    • 换成全局代理 podvpn,还是无法正常发布。
    • 使用 linode 上的 emacs,把 blog 文件复制过去,也无法正常发布。
  • wordpress 设置

    早上刚安装了 Disable comments 插件,该插件会禁用 ping 功能,会不会与此相关。麻烦的是,该插件写数据库,并且删除插件时不还原数据库,所以只能对整个 wordpress 进行还原。刚好前两天有个备份,花了点时间,可以正常还原。但问题还在。

  • emacs 插件升级

    将 emacs packages 还原到最后一个备份,不能解决问题。

  • 其它线索
    • linode 和 dell 电脑上的 emacs 无法正常发布 blog,但是 x200 上的 emacs 可以正常发布 blog。
    • 在出错信息中,中文被转换成了 unicode 数字形式。
    • 发布的博客中,如果没有中文,可以正常发布。

最后,从 github org2blog 官方问题列表中,搜到了 Issue 223 。该问题是 emacs25.1 引入的,一个 bugfix 导致了 multibyte http request 问题。

解决方法,修改 url-http.el 文件,注释掉以下几行,并 byte-compile

;; Bug#23750
; (unless (= (string-bytes request)
;            (length request))
;   (error "Multibyte text in HTTP request: %s" request))

org2blog 的使用

当初建立这个博客就是为了试一试 org2blog ,使用一段时间后,建立了一套使用方法。把所有博客写在文件 blog.org 中,级别 1 用于区分文章,级别 1 标题是文章标题,属性是文章属性。从级别 2 开始,是文章的子标题。下面列出了一些功能点需要花时间配置的。

自动登陆

每次启动 emacs 后,需要执行一次 org2blog/wp-login 命令登陆。登录信息在 emacs 关闭后不会记录,下次启动 emacs 后,还需要再次登录,次数多了会觉得不方便。org2blog 可以通过配置实现自动登陆,具体配置可参考官方网站。

subtree 的 post-and-publish 功能

不知道出于哪方面考虑,org2blog 不提供 subtree 的 post-and-publish 功能,只有 post 接口。在配置文件中加入下面函数,可实现 post-and-publish 功能。

;;;###autoload
(defun org2blog/wp-post-subtree-and-publish ()
  "Publish the current subtree as a page."
  (interactive)
  (org2blog/wp-post-subtree t))

多余窗口处理

每次发布文章后,org2blog 会弹出一个新窗口,可能是临时 buffer,没什么意义,总要手动关闭。下面这段代码可以在发布文章后取消弹出窗口。

(defadvice org2blog/wp-upload-files-replace-urls
    (after fj/org2blog/wp-upload-files-replace-urls (text) activate)
  (delete-window))

换行处理

使用 org2blog 过程中,发现对换行处理不太好:如果将 org2blog/wp-keep-new-lines 设置成 t ,中文换行处理基本没有问题,能识别自动换行还是硬换行,对于自动换行会在转换后连接成一行。而英文处理会有问题,所有的自动换行都被识别成了段硬换行。如果将 org2blog/wp-keep-new-lines 设置成 nil , 中文处理会有问题,列表中后必要的换行会被删除。

麻烦是的, org2blog/wp-keep-new-lines 是全局配置,无法根据一篇文章进行换行调整。我设计了一个解决方法,如果在属性中添加了 ENGLISH 描述,则不保留换行符,适用于英文文章。如果没有这个属性,则保留换行符,适用于中文文章。这需要通过写代码来实现,修改代码的方法不可取,因为库会经常升级,覆盖这些修改。较好的方法是用 defadvice

(defadvice org2blog/wp--parse-subtree-entry
    (before fj/org2blog/wp--parse-subtree-entry () activate)
  (let* ((keep-new-lines (org-entry-get (point) "ENGLISH")))
    (if keep-new-lines
  (setq keep-new-lines nil)
      (setq keep-new-lines org2blog/wp-keep-new-lines))
    (plist-put org2blog/wp-export-options :wp-keep-new-lines keep-new-lines)))