分类:代码

码农是第一生产力。

orgmode 导出 html 的换行处理

我之前还奇怪,在 org2blog 中设置保留换行符时,为什么可以正确处理中文的自动换行 ,今天查看了 orgmode 配置,才发现有个 advice

;;;###autoload
(defadvice org-html-paragraph (before fsh-org-html-paragraph-advice
                                      (paragraph contents info) activate)
  "Join consecutive Chinese lines into a single long line without
unwanted space when exporting org-mode to html."
  (let*
      ((orig-contents (ad-get-arg 1))
       (reg-han "[[:multibyte:]]")
       (fixed-contents (replace-regexp-in-string
                        (concat "\\(" reg-han "\\) *\n *\\(" reg-han "\\)")
                        "\\1\\2" orig-contents)))
    (ad-set-arg 1 fixed-contents)))

这段代码是从 水木 emacs 版 抄过来的,作用是修改 html 导出函数 org-html-paragraph 的第一个参数,将两个汉字中间的换行符去掉。

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

liteide代码分析

结构

主目录

  • api: 接口定义,所有组件通过api相互访问
  • liteide/liteapp: 主程序,构造界面,构造各种manager
  • plugins: 插件,编译成dll,单独加载
  • 3rdparty: 第三方库,编译成静态lib
  • util: 工具类,编译成静态lib

主程序

  • liteapp
    • 包含主界面,对话框
    • 包含各种manager,manager构造函数参数含有liteapp指针
  • manager可以通过m_liteapp->other_manager方式访问其它manager

插件

  • plugin构造函数参数含有liteapp指针,可以通过虚接口访问liteapp所有功能
  • plugin初始化时,自已注册action,用于plugin启动

hexo 博客安装

hexo 基于 node.js,下载安装 node.js 后,用 npm 包管理系统安装 hexo。npm 有很多镜像站点可用,设置一个国内镜像可以提高下载速度。修改文件 D:\nodejs\node_modules\npm\npmrc ,增加一行:

registry = http://npm.cbyun.com/

hexo 的安装使用方法官网有详细说明: http://hexo.io/

部署方法,网上讲得比较多的是 github 部署,如果是个人博客,要用到 rsync 工具。下面是 rsync 配置:

deploy:
  type: rsync
  host: www.hostname.com
  user: username
  root: ~/html/hostname
  port: 22
  delete: true

qt-4.8 vs2010 ssl 编译过程

编译动态库

  • 编译 openssl

    • 将 openssl 压缩包解压到 e:\code\lib
    • 环境变量 PATH 中不包含 cygwin,mingw
    • 打开 vs2010 命令行窗口
    cd e:\code\lib\openssl
    perl configure VC-WIN32
    ms\do_ms
    nmake -f ms\ntdll.mak
    
  • 解压源代码 qt-everywhere-opensource-src-4.8.4.tar 到 D:\qt\4.8.4-shared-vs2010 目录
  • 修改编译参数

    • 修改编译选项(D:/qt/4.8.4/mkspecs/win32-msvc2010/qmake.conf):
    QMAKE_CFLAGS            = -nologo -Zm200 -Zc:wchar_t /EHsc
    QMAKE_CFLAGS_RELEASE    = -O2 -Os -MD
    QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -Os -MD -Zi
    
    • 修改链接选项
    QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /OPT:REF /OPT:ICF
    QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF
    
    • 修改错误代码(编译错误)

    DefaultLocalizationStrategy.cpp:327,将“<selection>”修改成\”<selection>\”

  • 启动 Visual Studio 2005 Command Prompt

    • 进入目录 D:\qt
    • 执行配置命令:
    configure.exe -debug-and-release -fast -confirm-license -opensource -no-qt3support -platform win32-msvc2005 -no-dsp -vcproj -nomake examples -nomake demos -nomake translations -openssl -I E:\code\lib\openssl\inc32 -L E:\code\lib\openssl\out32dll
    configure.exe -debug-and-release -fast -confirm-license -opensource -no-qt3support -platform win32-msvc2010 -no-dsp -vcproj -nomake examples -nomake demos -nomake translations -openssl -I E:\code\lib\openssl\inc32 -L E:\code\lib\openssl\out32dll
    
    • 执行编译命令:
    nmake && nmake install
    
  • 创建 qt\bin\qt.conf
[paths]
Prefix = ..
  • 清理中间文件
    • 备份编译目录为 4.8.4-shared-vs2010.build
    • nmake confclean 注意 目录 4.8.4-shared-vs2010 名称不能修改
    • 利用 beyondcompare,从编译备份目录中恢复所有的 vc80.pdb 文件
    • 清除重复的 DLL 将 qt/lib 目录中的 DLL 全部删除
    • 清除多余的帮助文档首先要运行 qt/bin/assistant.exe,以便更新 qt/doc/pch;然后删除 qt/doc/src 和 qt/doc/html
  • 打包成 7z,大约 200 多 M

静态编译不同点:

  • 编译选项,不依赖 C/C++库

修改 mkspecs/win32-msvc2005/qmake.conf

QMAKE_CFLAGS_RELEASE    = -O2 -Os -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -Os -MT -Zi
QMAKE_CFLAGS_DEBUG  = -Zi -MTd
  • congifure 加上 -static
configure.exe -debug-and-release -fast -confirm-license -opensource -no-qt3support -platform win32-msvc2005 -no-dsp -vcproj -nomake examples -nomake demos -nomake translations -static -openssl -I E:\code\lib\openssl\inc32 -L E:\code\lib\openssl\out32dll
configure.exe -debug-and-release -fast -confirm-license -opensource -no-qt3support -platform win32-msvc2010 -no-dsp -vcproj -nomake examples -nomake demos -nomake translations -static -openssl -I E:\code\lib\openssl\inc32 -L E:\code\lib\openssl\out32dll