原因

  • 使用 github issue + mardkown 可以方便的写作博客
  • 使用 github api + jekll 可以自动生成 博客

使用

  • [install]复制本仓库下 generate.js 和 package.json 中的依赖 并执行 npm install
  • [setup] 修改 generate.js 中的 仓库地址和 想要生成博客对应的label
  • [usage]执行 node generate.js (node version 10.x) ##

实现

  • 搭建jekll博客,参考其他教程
  • 生成博客
    • 从github获取issue列表,参考 github api
         async function getIssues() {
      return new Promise((resolve, reject) => {
        const options = {
          method: 'GET',
          headers: {
            "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
          }
        };
        var request = require('request');
        request('https://api.github.com/repos/lotosbin/lotosbin.github.io/issues?labels=published', options, function (error, response, body) {
          if (!error && response.statusCode == 200) {
            resolve(JSON.parse(body));
          } else {
            reject(error || `${response.statusCode}`)
          }
        })
      })
         }
      
    • 把issue转换成article
         async function issueToArticle(issue) {
       var moment = require('moment');
       var fileName = `${moment(issue.created_at).format('YYYY-MM-DD')}-${issue.id}-${issue.title}`
       var title = issue.title;
       var body = issue.body;
       var content = `# ${title} \r\n ${body}`
       return { fileName, content }
         }
      
    • 根据article 生成博客文件
        const fs = require('fs');
        casync function writeArticleToFile(article) {
      return new Promise((resolve, reject) => {
        var filePath = `_posts/${article.fileName}.markdown`;
        fs.writeFile(filePath, `${article.content}`, function (err) {
          if (err) {
            console.log(err);
            reject(err);
            return
          }
      
          console.log(`generate file ${filePath}`);
          resolve({ filePath })
        });
      })
        }
      
    • 合体
        var main = async () => {
          var issues = await getIssues();
          for (i in issues) {
       var issue = issues[i];
       var article = await issueToArticle(issue);
       await writeArticleToFile(article);
          }
        }
        main()
      
  • 其他
  • 关于使用node开发命令行工具,参考其他文章

TODO

  • [] 自动工具集成,实现指定标签变更后自动生成文件,并创建 pull request或者自动 commit&push
  • [] 生成RSS
  • [] 增加 github issue 评论功能
  • [] 增加分类功能,ref http://pizn.github.io/2012/02/23/use-category-plugin-for-jekyll-blog.html
  • [] 增加系列功能

参考

ref: ref: zp1112/blog#3 https://www.v2ex.com/t/253854

查看原文