OE And NK
1 前奏
最近闲着无聊,感觉也没有什么特别的事情要干,于是又回到了整博客上了。 一开始的时候,也没有想要做成什么样子,只是自己写写字的地方。用orgmode来写文章,写好之后导出。 加一点点js和css让其变得好看一点。就是这么简单。
但是后来发现,需要维护2个库(一个是文章的库,另一个是导出的库),提交成本有点高,于是想写一个shell脚本,简单处理一下即可。 不过,写好之后测试发现,是同步提交的。这就意味着,必须提交完成之后才能进行下一个。 这个可是忍不了的,虽然解决了之前手动敲2遍命令的麻烦,可是依然很耗时。尤其是在 大天朝 。
没有办法,只能使用更加高级的脚本来解决。最初的想法是想用 Python 来搞定的,但是发现自己大部分Python语法已然忘记。 自己现在会的只有一点点JavaScript,哈哈哈,大笑3声之后,用起了node。一开始的时候,只是简单的一个js脚本,创建2个线程,写好测试成功。 心里很是满意。
没过一分钟,突然想到预览的时候使用的是一行Python命令 python -m SimpleHTTPServer 8080
来起的服务器。何不将这个合并到之前脚本中去呢?
于是….
2 设计要素
OEAndNK 用来预览发布orgmode导出的文章。她不解决git冲突,不做任何和预览发布不相关的事情(暂时)。
依赖orgmode导出的原始HTML文件,关于orgmode如何配置,可以看我这篇文章 This-Site.org#orgmode 中关于orgmode那部分的内容。 导出配置中带有外部js和css链接,这个就是全部美化的核心了。
在node部分,使用了 koa 框架做HTTP协议处理、页面的渲染等工作,监听3000端口。使用 websocket 协议用于前台和服务器信息交流的桥梁,监听3001端口。 上面就是我的思路了,实现上面其实不是很美好,所以就不宣传了,如果想参考一下,可以点击 这里 。
接下来想怎么玩就怎么玩啦。
3 初始化操作
3.1 两个库(两个分支)
这里你可以是两个库,也可以是两个分支。我的话是搞成了两个库。 一个库(creamidea)用于放原始文章,另一个库(creamidea.github.com)用于放导出的文章,也就是最终效果页面的库。
var child1 = child_process.fork(__dirname + '/deploy.js', ['articles', '.', message.argv[0]]) var child2 = child_process.fork(__dirname + '/deploy.js', ['master', '.', message.argv[0]])
- artilces 用来放文章的地方,原始的org文件
- public 导出的文章,包括js/css,这个分支同步到你的 nickname.github.io
3.2 articles
文章库的初始化,将文章库的位置赋值给 deploy.js 中的 articlesDir
。
然后增加远程库地址并设置–set-upstream:
$ git remote add origin git@github.com:your-repo-path $ git branch --set-upstream my_branch origin/my_branch
3.3 public
文章公共库,用于Github Page引擎渲染的库,赋值 deploy.js 中的 publicDir
。
然后增加远程库地址并设置–set-upstream:
$ git remote add origin git@github.com:your-page-repo-path $ git branch --set-upstream my_branch origin/my_branch
4 发布
初始化动作都完成之后,以后的步骤就非常的简单了,只要点击一次 Publish 按钮就可以了。 这颗按钮只会在线下有,线上是没有的。
那怎么实现的呢?
其实很简单,就是本地起的服务器中,在传到浏览器的流中植入了本地的一些js,来动态处理这些。
app.use(function*(next) { // console.log(this) yield next var body = this.body var type = this.type if (type === 'html' || type === 'text/html') { // 截获koa-static处理的html文件,插入自己想要的东西,然后返回 var html = "" body.on('data', function(chunk) { // console.log(chunk.toString()); html = chunk.toString() html = html.slice(0, -16) + '<div id="oe-nk-local"></div>' + // '<link rel="stylesheet" type="text/css" href="publish.css">'+ '<script src="/bower_components/react/react.min.js"></script>' + '<script src="/bower_components/react/react-with-addons.min.js"></script>' + '<script src="/bower_components/react/react-dom.min.js"></script>' + '<script src="/bower_components/ace/build/src-min-noconflict/ace.js"></script>' + '<script src="/bundle.js"></script>' + '</body></html>' }) // yield body.on('end') yield body.on.bind(body, 'end') // TODO: 理解这里的意思 http://stackoverflow.com/a/23853606/1925954 this.body = html } })
5 尾声
完成上述一些环境搭建,初始化步骤之后,以后写完检查无误就可以点击按钮发布了。如丝般顺滑。
但是,我后来做着做着就想增加更多的功能了,比如:
- 优化前端 TERMINAL 信息展示
- 增加在线编辑的功能
- 提取文章关键字
- 搜索
- ……
前两个功能可以使用 ace editor 这个库自定义来实现,后面的可能需要更多自然语言方面的知识。然而,这些,我现在都不会。 如果谁感兴趣的话,可以玩玩。我也只有等以后有空,挤点时间慢慢来完成这些功能了。又是一个大坑。
以上。