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 这个库自定义来实现,后面的可能需要更多自然语言方面的知识。然而,这些,我现在都不会。 如果谁感兴趣的话,可以玩玩。我也只有等以后有空,挤点时间慢慢来完成这些功能了。又是一个大坑。

以上。

Junjia Ni

2015-12-27

2016-11-10 Thu 13:03

Emacs 25.1.1 (Org mode 9.0)

2016-10-23 Sun 23:09