季承成 | CHENGCHENG JI

季承成 | CHENGCHENG JI

计算机科学与信息技术 博士 | Ph.D. in Computer Science and Information Technology

快速发布Vim写的Markdown到博客网站 (一键编译内容至剪贴板,无需插件)

概要

将编译出来HTML本体部分复制到剪贴板, 绑定到Vim快捷键
从而达成一键将Markdown文件编译并将代码本体部分拷贝到剪贴板,以便直接贴到博客里

自从有了Vim一键编译Markdown文件加预览,已经基本达成了日常使用需要。不过如果要发到自己的博客,则需要手动查看源代码并复制相关部分,然后拷贝到博客,不是很方便。如果可以直接一键获得编译好的内容直接贴到博客就好了,于是有了这篇文章。

思路为先编译出HTML代码然后打印到控制台然后使用命令行工具将内容拷贝到剪贴板,
由于笔者使用的是Mac所以使用pbcopy命令。

Markdown-it编译脚本

研究了下gulp-markdown-github-style模块发现内部其实调用的是Markdown-it的模块来渲染md文件然后通过拼接带有CSS的模版文件来实现github式的页面的,
于是去查阅了一下Markdown-it文档,写了一个可以支持内嵌HTML标签的md编译脚本,将其保存为markit.js并放在md源文件同一目录(也可以通过修改vim配置里路径来放至任意位置):

/**
 *	Author: Chengcheng Ji
 *	Date: 2019.3.11
 *	Website: capital-g.cc
 * */
var md = require('markdown-it')({
	html: 		true,	// 开启源代码HTML标签支持(即不进行转义)
	xhtmlOut: 	false,	// 使用'/'来结束单标签(例如<br />)
	breaks: 	false,	// 将'\n'转换为换行标签<br>
	langPrefix: 'language-',//代码块的语言名前缀,用于第三方代码高亮(如highlight.js)
	linkify:	false,	//自动将网址转换成HTML链接
	typographer:false,	//是否开启语言替换和引号美化
	quotes: '""``',	//引号美化参数
	highlight: function (/*str, lang*/) { return ''; }	//代码高亮设定," return '' "即为无特殊设定
});
var fs = require("fs");
//使用外部参数提示符"--file"
var file, i = process.argv.indexOf("--file");
if(i>-1) {
	file = process.argv[i+1];
}
//异步读取--file 标示的目标md文件
fs.readFile(file, function (err, data) {
	if (err) {
		return console.error(err);
	}
	//在编译后的HTML部分加上标签用于CSS
	var result = "<article class=\"markdown-body\">"+md.render(data.toString())+"</article>";
	//将完整结果输出到控制台,后续将其拷贝至剪贴板
	console.log(result);
	//将结果同时输出到./wordpress.txt中,可选
	fs.writeFile('wordpress.txt', result,  function(err){
		if (err){
			console.log(err);
		}
	});
});

绑定Vim快捷键

打开~/.vimrc, 添加如下代码,将以上功能绑定到F3:

" 按F3编译MD文件并拷贝HTML到剪贴板
map <F3> :call CompileMDtoClip()<CR>
imap <F3> <ESC>:call CompileMDtoClip()<CR>
func! CompileMDtoClip()
    exec "w"
    if &filetype == 'markdown'
        " 调用上面的markit.js并将其拷贝到剪贴板
        exec "!node markit.js --file % | pbcopy"
    endif
endfunc

这样就可以使用F3一键编译md文件并把文件内容拷贝至剪切板,接下来只要去博客网站按下Ctrl+v即可,撒花。