jekyll github blog 标题转文件名函数
Jekyll 标题转文件名函数
在之前的一篇关于 org 写 github blog 的 文章 中,有一个函数是 jekyll-make-slug
,这个函数的作用是将标题字符串中的空格替换成 =-=,从而作为文件名使用,这个函数的工作流程为,在开始写 blog 文章的时侯,输入要写的文章名字,就会自动根据文章名字来命名相关的 org 文件的名字。
(defun jekyll-make-slug (s)
"Turn a string into a slug."
(replace-regexp-in-string
" " "-" (downcase
(replace-regexp-in-string
"[^A-Za-z0-9 ]" "" s))))
原理非常简单,但是这个函数有一个问题,就是对于中文,转换会失败,如果这个字符串全部是中文组成的,那么转换出来的结果是空字符串。
此外还有一个函数,这个函数是完整的命名文件名函数,jekyll 在发布的过程中,会将前面的日期给变成对应的文件夹,而真正生成在 github 可见的文章链接为日期后面的那个字符串,所以如果遇到中文,这个字符串就变成了空,这样会有问题,因此这个函数在日期后面,我强行添加了一个 p
,这样即使遇到全中文的标题,至少也显示成 p.html
。
(defun my-pages-start-post (title)
"Start a new github-pages entry"
(interactive "sPost Title: ")
(let ((draft-file (concat jekyll-directory jekyll-posts-dir
(format-time-string "%Y-%m-%d-p-")
(jekyll-make-slug title)
jekyll-post-ext)))
(if (file-exists-p draft-file)
(find-file draft-file)
(find-file draft-file)
(insert (format jekyll-post-template (jekyll-yaml-escape title))))))
但是,因为这个问题,导致同一天如果写两个全中文标题的 blog 的话,就会出现重复,而要解决这个重复,需要手动来重命名这个文件,体验很不爽,所以,我同一天不会写两篇 blog…。
一个解决方法
实际上,需求就是使得在全中文的时侯,根据中文能生成不同的文件名,因此如果有个函数可以将中文变成拼音,直接连起来就可以了。正好也在使用 pyim
,其中提到了这么 2 个函数
(pyim-hanzi2pinyin STRING &optional SHOU-ZI-MU SEPARATOR RETURN-LIST
IGNORE-DUO-YIN-ZI ADJUST-DUO-YIN-ZI)
(pyim-hanzi2pinyin-simple STRING &optional SHOU-ZI-MU SEPARATOR RETURN-LIST
IGNORE-DUO-YIN-ZI ADJUST-DUO-YIN-ZI)
这两个函数的区别就是第一个,会考虑多音字什么的,我这个需求里面不需要,因此,我将上面的 jekyll-make-slug
函数进行了如下修改:
(defun jekyll-make-slug (s)
"Turn a string into a slug."
(let ((s-pinyin (if (fboundp 'pyim-hanzi2pinyin-simple)
(if (<= (length s) 4)
(pyim-hanzi2pinyin-simple s nil " " nil)
(pyim-hanzi2pinyin-simple s t nil nil))
s)))
(replace-regexp-in-string
" " "-" (downcase
(replace-regexp-in-string
"[^A-Za-z0-9 ]" "" s-pinyin)))))
之所以限制了长度为 4 是因为,如果文章标题比较长,会生成一个及其长的标题,这样的长标题比较难看,因此在数目大于 4 的时侯,将生成汉字的首字母连起来作为标题。。。
这个方案不完美,主要是 pyim-hanzi2pinyin-simple
的问题,在中英文混合的时侯,生成的标题比较奇怪,不过考虑到原需求只要做一个不同标题的区分,也够用了。