一键收藏至Github

因本人比较喜欢对一些技术文章进行收藏,并进行整理。像Pocket、Evernote这些工具都可以进行离线收藏,都是很不错的工具,但我就想把这些喜欢的文章,进行收藏整理至github,并且一键提交(顺便还可以刷刷Github的活跃度),同时省了自己的时间,只需要在固定的时间,对这些进行整理即可。

简单需求

首先,简单得说一下自己的需求,根据每天的阅读文章通过每天归类显示,并按照每月来生成文章,具体的文章输出结果显示如2016.01阅读文章

技术搭建

这里主要的技术主要两个难点:

  • 一键点击插件的生成
  • 脚本编写生成对应的markdown

技术实现

  1. JS来获取当前文章的标题以及链接
    这里参照百度首页链接的添加,通过JS先获取到document以及location对象,然后通过它俩来拿到当前窗口的链接以及标题,然后调用本地服务的一个请求,传递给本地服务,来进行当前网址的记录。主要的代码如下:
javascript: ((function(s, d, e) {
    var u = location;
    var f = 'http://localhost:3000/create?link=' + e(u.href) + '&title=' + e(d.title) + '&_t=' + new Date().getTime();
    function a() {
        if (!window.open(f, '', 'toolbar=0,status=0,resizable=1,width=700,height=450,left=' + (s.width - 700) / 2 + ',top=' + (s.height - 650) / 2)) u.href = f
    };
    if (/Firefox/.test(navigator.userAgent)) setTimeout(a, 0);
    else a()
})(screen, document, encodeURIComponent));

从上述的代码可以看到,最主要的代码就是通过window对象来打开一个新的窗口,指定窗口就是咱们本地的一个API请求,链接格式为http://localhost:3000/create, 以及两个参数link和title,对应咱们生成markdown的内容。

这里如何使用呢?在app/views/welcome/index.html.erb中,将上述的Js代码放置在一个a标签中,将代码作为链接href属性的值。启动rails的服务器,输入http://localhost:3000/index 就会显示这个相对应的url,我们将其拖拽至我们的书签栏,则就会使用我们的插件工具了。

  1. 搭建获取链接的API
    这里主要使用Ruby on Rails来搭建一个本地的服务器,毕竟是号称10分钟创建一个完整的Web应用程序的语言。
    对应的主要代码目录在app/controllers/article_controller.rb文件中,通过api请求http://localhost:3000/create?link={0}&title&{1} 来获取需要保存的链接,主要代码如下:
class ArticleController < ApplicationController

  def create
    title = params[:title]
    link = params[:link]
    data = []
    file_name = Rails.root.to_s + '/README.md'
    status = 'ok'
    if title.nil? or link.nil?
      status = 'error'
    else
      if(Date.today.mday == 1)
        new_file_name = "#{Rails.root.to_s}/#{Date.today.prev_day.strftime('%Y-%m').to_s}.md"
        File.rename(file_name, new_file_name)
        File.new(file_name, 'w+')
      end
      data = DataHelper.append_to(file_name, title, link)
      if !data.nil?
        DataHelper.write_to(file_name, data)
      end
    end
    GitHelper.commit(title)
    render json: {'status' => status, 'data' => data}
  end
end

上述代码中,主要的逻辑有三处:

  • 判断当天是否为当月的第一天,若是的话,则需要重命名README.md文件为上个月的文件,形如‘2016-01.md'格式的文件。主要的目的是将咱们的文章按每个月份来分类。
  • 通过DataHelper类来添加链接及其对应的标题,可以看到主要通过DataHelper的append_to和write_to方法来实现链接标题的添加。代码如下:
module DataHelper

  # 根据文件获取添入标题和链接之后的最新文本内容
  def self.append_to(file_name, title, link)
    data = []
    changed = false
    inserted = false

    File.open(file_name).each do |line|
      if !inserted and line.start_with?('###') 
        # 当前行为具体的日期
        date_str = line.slice(3, 3 + 10).squish
        if(is_date(date_str))
          # 当前日期为今天,则在当前天下添加新的一行数据
          if(Date.parse(date_str) == Date.today)
            data.push line
            data.push "+ [#{title}](#{link})<br>\n"
            changed = true
            inserted = true
          # 当前日期小于今天,则新建今天的数据
          elsif(Date.parse(date_str) < Date.today)
            data.push "### #{Date.today}<br>\n"
            data.push "+ [#{title}](#{link})<br>\n"
            data.push "\r\n"
            inserted = true
          end
        end
      end
      if !changed
        data.push line
      end
      changed = false
    end
    # 若没有添加,则表示是个新建的文件,直接添加今天的数据
    if(!inserted)
       data.push "### #{Date.today}<br>\n"
       data.push "+ [#{title}](#{link})<br>\n"
       data.push "\r\n"
    end
    data
  end

  # 向文件中写入data
  def self.write_to(file_name, data)
    file = File.new(file_name, 'w+')
    data.each do |line|
      file.write line
    end
    file.close
  end

  # 判断字符是否为一个日期
  def self.is_date(str)
    result = false
    begin
      Date.parse(str)
      result = true
    rescue ArgumentError
      result = false
    end
    result
  end

end

在Datahelper的append_to方法中,是通过逐行读取文件,根据文件对应的日期标题,获取到相应的日期,判断当前日期是否大于获取的日期,大于的时候则可直接添加,等于的时候则可在日期下面的第一行中插入,最后我们获取的将是一个data的数组。另外,使用write_to将data中的数据,逐行写入文件中。

  • Git的自动提交,这里实现的主要的代码在GitHelper中,其中的代码呈上:
module GitHelper

  def self.commit(title)
    t = fork do
      Signal.trap("HUP") {
        system 'git status'
        system 'git add .'
        system "git commit -am 'add #{title}'"
        system 'git pull --rebase'
        system 'git push'
      }
    end
    Process.kill("HUP", t) 
  end
end

我们知道Git提交是件耗时的操作,所以为了提高API的响应速度,这里通过使用异步来提交Git请求,可以看到使用rebase来提交请求,所以出现冲突的时候,我们得自己手动解决了。

使用

  • 打开项目所在的目录,使用** rails s**来启动服务
  • 在浏览器中输入 http://localhost:3000/index 来显示我们需要的书签链接,如图所示;
书签链接.png
  • 将上图中的链接拖拽至chrome的书签栏中,如图:
书签.png
  • 点击fav书签,就可保存当前的页面了,并自动提交了。

总结

这样,我们一个很简单的文章记录加自动提交的功能就完成了。当然还有许多功能可以做一些扩展,例如,可以支持不同的GitHub的仓库;做成chrome的插件来方便使用。最后,放上代码地址:代码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容