因本人比较喜欢对一些技术文章进行收藏,并进行整理。像Pocket、Evernote这些工具均可以进行离线收藏,都是很不错的工具,但我就想把这些喜欢的文章,进行收藏整理至github,而且一键提交(顺便还能够刷刷Github的活跃度),同时省了本身的时间,只须要在固定的时间,对这些进行整理便可。javascript
首先,简单得说一下本身的需求,根据天天的阅读文章经过天天归类显示,并按照每个月来生成文章,具体的文章输出结果显示如2016.01阅读文章。html
这里主要的技术主要两个难点:java
一键点击插件的生成git
脚本编写生成对应的markdowngithub
JS来获取当前文章的标题以及连接
这里参照百度首页连接的添加,经过JS先获取到document以及location对象,而后经过它俩来拿到当前窗口的连接以及标题,而后调用本地服务的一个请求,传递给本地服务,来进行当前网址的记录。主要的代码以下:chrome
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的内容。json
这里如何使用呢?在app/views/welcome/index.html.erb中,将上述的Js代码放置在一个a标签中,将代码做为连接href属性的值。启动rails的服务器,输入http://localhost:3000/index 就会显示这个相对应的url,咱们将其拖拽至咱们的书签栏,则就会使用咱们的插件工具了。api
搭建获取连接的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 来显示咱们须要的书签连接,如图所示;
将上图中的连接拖拽至chrome的书签栏中,如图:
点击fav书签,就可保存当前的页面了,并自动提交了。
这样,咱们一个很简单的文章记录加自动提交的功能就完成了。固然还有许多功能能够作一些扩展,例如,能够支持不一样的GitHub的仓库;作成chrome的插件来方便使用。最后,放上代码地址:代码地址
版权归做者全部,转载请注明 原文连接