一鍵收藏至Github

因本人比較喜歡對一些技術文章進行收藏乞榨,并進行整理。像Pocket成肘、Evernote這些工具都可以進行離線收藏,都是很不錯的工具斧蜕,但我就想把這些喜歡的文章双霍,進行收藏整理至github,并且一鍵提交(順便還可以刷刷Github的活躍度)批销,同時省了自己的時間洒闸,只需要在固定的時間,對這些進行整理即可均芽。

簡單需求

首先丘逸,簡單得說一下自己的需求,根據(jù)每天的閱讀文章通過每天歸類顯示掀宋,并按照每月來生成文章深纲,具體的文章輸出結果顯示如2016.01閱讀文章

技術搭建

這里主要的技術主要兩個難點:

  • 一鍵點擊插件的生成
  • 腳本編寫生成對應的markdown

技術實現(xiàn)

  1. JS來獲取當前文章的標題以及鏈接
    這里參照百度首頁鏈接的添加劲妙,通過JS先獲取到document以及l(fā)ocation對象湃鹊,然后通過它倆來拿到當前窗口的鏈接以及標題,然后調(diào)用本地服務的一個請求镣奋,傳遞給本地服務币呵,來進行當前網(wǎng)址的記錄。主要的代碼如下:
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, 以及兩個參數(shù)link和title肛搬,對應咱們生成markdown的內(nèi)容。

這里如何使用呢毕贼?在app/views/welcome/index.html.erb中温赔,將上述的Js代碼放置在一個a標簽中,將代碼作為鏈接href屬性的值鬼癣。啟動rails的服務器陶贼,輸入http://localhost:3000/index 就會顯示這個相對應的url,我們將其拖拽至我們的書簽欄待秃,則就會使用我們的插件工具了拜秧。

  1. 搭建獲取鏈接的API
    這里主要使用Ruby on Rails來搭建一個本地的服務器,畢竟是號稱10分鐘創(chuàng)建一個完整的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方法來實現(xiàn)鏈接標題的添加泣港。代碼如下:
module DataHelper

  # 根據(jù)文件獲取添入標題和鏈接之后的最新文本內(nèi)容
  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))
          # 當前日期為今天暂殖,則在當前天下添加新的一行數(shù)據(jù)
          if(Date.parse(date_str) == Date.today)
            data.push line
            data.push "+ [#{title}](#{link})<br>\n"
            changed = true
            inserted = true
          # 當前日期小于今天,則新建今天的數(shù)據(jù)
          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
    # 若沒有添加爷速,則表示是個新建的文件央星,直接添加今天的數(shù)據(jù)
    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方法中,是通過逐行讀取文件惫东,根據(jù)文件對應的日期標題莉给,獲取到相應的日期,判斷當前日期是否大于獲取的日期廉沮,大于的時候則可直接添加颓遏,等于的時候則可在日期下面的第一行中插入,最后我們獲取的將是一個data的數(shù)組滞时。另外叁幢,使用write_to將data中的數(shù)據(jù),逐行寫入文件中坪稽。

  • Git的自動提交曼玩,這里實現(xiàn)的主要的代碼在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來提交請求篙梢,所以出現(xiàn)沖突的時候顷帖,我們得自己手動解決了。

使用

  • 打開項目所在的目錄渤滞,使用** rails s**來啟動服務
  • 在瀏覽器中輸入 http://localhost:3000/index 來顯示我們需要的書簽鏈接贬墩,如圖所示;
書簽鏈接.png
  • 將上圖中的鏈接拖拽至chrome的書簽欄中妄呕,如圖:
書簽.png
  • 點擊fav書簽陶舞,就可保存當前的頁面了,并自動提交了绪励。

總結

這樣肿孵,我們一個很簡單的文章記錄加自動提交的功能就完成了论咏。當然還有許多功能可以做一些擴展,例如颁井,可以支持不同的GitHub的倉庫厅贪;做成chrome的插件來方便使用。最后雅宾,放上代碼地址:代碼地址

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末养涮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子眉抬,更是在濱河造成了極大的恐慌贯吓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜀变,死亡現(xiàn)場離奇詭異悄谐,居然都是意外死亡,警方通過查閱死者的電腦和手機库北,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門爬舰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寒瓦,你說我怎么就攤上這事情屹。” “怎么了杂腰?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵垃你,是天一觀的道長。 經(jīng)常有香客問我喂很,道長惜颇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任少辣,我火速辦了婚禮凌摄,結果婚禮上,老公的妹妹穿的比我還像新娘毒坛。我一直安慰自己望伦,他們只是感情好林说,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布煎殷。 她就那樣靜靜地躺著,像睡著了一般腿箩。 火紅的嫁衣襯著肌膚如雪豪直。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天珠移,我揣著相機與錄音弓乙,去河邊找鬼末融。 笑死,一個胖子當著我的面吹牛暇韧,可吹牛的內(nèi)容都是我干的勾习。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼懈玻,長吁一口氣:“原來是場噩夢啊……” “哼巧婶!你這毒婦竟也來了?” 一聲冷哼從身側響起涂乌,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤艺栈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后湾盒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湿右,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年罚勾,在試婚紗的時候發(fā)現(xiàn)自己被綠了毅人。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡尖殃,死狀恐怖堰塌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情分衫,我是刑警寧澤场刑,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站蚪战,受9級特大地震影響牵现,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邀桑,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一瞎疼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壁畸,春花似錦贼急、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至令杈,卻和暖如春走敌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逗噩。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工掉丽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跌榔,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓捶障,卻偏偏與公主長得像僧须,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子项炼,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理皆辽,服務發(fā)現(xiàn),斷路器芥挣,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 今天做了一些一天的詳情頁還是不太熟練驱闷,還有細節(jié)沒有消化,因為自己不懂得還是挺多總是問人家已經(jīng)煩了空免,不過煩我也要問空另,...
    游爽a閱讀 239評論 0 0
  • 看了這個訪談真的嚇到了扼菠,我們認為高大上的東西人家是日常,我們出一趟國門要準備幾年坝咐,人家是假期娛樂循榆。 現(xiàn)在不僅是拼孩...
    小羚羊小小小閱讀 584評論 0 0