天天看點

讓ruby簡化你的工作之blog閱讀器

   閱讀專家和牛人的blog已經是我學習的一種主要方法之一,我每天的必做的就是關注下dreamhead、gigix、江南白衣、robbin、李锟等牛人的blog是不是有什麼新文章。不過我非常讨厭安裝商業公司的rss閱讀器,我害怕他們是流氓軟體!而且很多閱讀器的文章格式與原文有較大差異進而導緻重要資訊的丢失,我還是喜歡用firefox暢遊網絡,這導緻我不得不一次一次地在各個blog間跳轉,打開n個網頁查找我關注的資訊,一次兩次也就罷了,天天這樣實在是太麻煩了,那麼,有沒有什麼工具來簡化我的工作,他能自動每天把我關注的所有blog的文章放在一個頁面裡,我每天早上需要做的隻是運作下這個工具,然後打開生成的網頁就可以看到牛人們的blog。甚至,我可以在windows下做個計劃任務或者linux下使用cron讓這個工具每天在夜深人靜的時候自動運作下,那我每天早上就可以看到牛人們新鮮出爐的好文章了。這個工具生成的網頁應該類似下面這樣:

讓ruby簡化你的工作之blog閱讀器

然後,當我點選某個blog标題的時候會自動展開文章清單:

讓ruby簡化你的工作之blog閱讀器

    點選文章标題就會跳轉到相應的文章網頁。ok,想好了需求,怎麼做?寫這樣的東西當然是腳本語言最快了,我們用ruby來完成這個工具腳本。稍微思考下就可以知道大概的思路,應該是通過某個方法連接配接到各個blog站點,然後抓取我們需要的資訊集中顯示在這個頁面裡。也許你還想到要用正規表達式去解析網頁内容等等,可想象一下這個工作量将多大,再說現在的blog都有替換模闆功能,如果哪天換了模闆,正則比對就失效了,還得重新再來,這也太麻煩了。幸好,blog都有提供rss啊,我們根本沒必要那麼麻煩,直接讀rss不就可以了?那麼ruby有沒有提供讀rss的api?還是要我們自己去解析xml?這件事問下《ruby cookbook》就ok。ruby有提供一個解析rss的庫,支援rss0.9,1.0和2.0标準,權衡之下,我使用了rss2.0,後來發現也可以正常讀取rss1.0的blog。開始寫我們的腳本,先建立一個blog類用于存放資訊:

class blog

  attr_accessor:title,:url,:items

  def initialize(title,url,items=[])

    @title=title

    @url=url

    @items=items

  end

end

    title、url和items分别是blog的标題、位址和文章清單,我們将文章存儲在一個數組裡,預設是空的。然後再定義一個解析blog資訊的方法blog_info,根據位址連接配接rss源并傳回一個blog對象:

def blog_info(url)

  feed = rss::parser.parse(open(url).read, false) 

  blog=blog.new(feed.channel.title,url,feed.items)

    注意,ruby方法預設傳回的最後一行的運作結果,這裡就是new的blog對象,我們通過open-uri庫的open方法連接配接位址并讀取内容,然後使用rss子產品的parser類解析資訊,最後将這些資訊組織成一個blog對象并傳回。我同時關注好幾個blog,那麼将這些blog的rss位址放在一個數組裡,然後周遊數組分别調用blog_info得到blog對象,最後需要考慮的就是怎麼将blog對象顯示在網頁裡。

def rss_read

  urls=['http://www.blogjava.net/canonical/rss','http://dreamhead.blogbus.com/index.rdf',

        'http://michael.nona.name/rss','http://blog.csdn.net/mozilla/rss.aspx','http://blog.csdn.net/g9yuayon/rss.aspx']

  urls.collect do |blog_url|

    blogs<<blog_info(blog_url)

  end  

    rss_read方法最後傳回blog對象組成的數組,剩下的任務就是将這個數組裡資訊顯示在生成的網頁裡。這個問題很類似生成靜态html檔案的需求,那麼ruby是否有類似freemark的模闆語言?答案當然是yes,ruby on rails使用了erb将ruby代碼嵌入模闆當中,我們當然也可以這樣做。erb類似jsp的文法,<%=name%>就是輸出變量name,<% %>中的代碼就是一般的ruby代碼,是以,首先定義我們的模闆檔案blogs.html

<html>

    <head>

        <title>simple rss reader</title>

            <meta http-equiv="content-type" content="text/html; charset=utf-8">

        <style rel="stylesheet" type="text/css" media="all" />body {

    margin: 80px;

    text-align:left;

    font:normal 12px verdana, arial;

    background:#fff

  }

  a:link,a:visited{

    text-decoration:none;

    color:#333333;

  a:hover{

    color:#ff6600

  .dotline {

    border-bottom-style: dotted; border-left-style: dotted; border-right-style: dotted; border-top-style: dotted

        </style>

  <script language="javascript">

           function change(name){

              var div=eval("document.all."+name);

              div.style.display=="none"?(div.style.display=""):(div.style.display="none");

           }

  </script>

  </head>

        <body>

            <p align="center"><strong>您關注的blog清單:</strong></p>

                    <% num=1 %>

                    <% for blog in blogs %>

                      <% begin %>

                        <div>

                            <a href="#" onclick="change('blog<%=num%>');"><%= blog.title %></a>

                            <div id="blog<%=num%>" style="display:none">

                                <% for item in blog.items %>

                                        

                                    <a href="<%=item.link%>" target="_blank"><%= item.title %></a>

                                    <br>

                                <% end %>

                            </div>

                        </div>

                        <hr class=dotline color=#000000 size=1>

                        <% num=num+1 %>

                      <% 

                      rescue standarderror=>e

                         puts "錯誤資訊"+e

                      end %>  

                  <% end %>

        </body>

</html>

    周遊blogs數組,然後将blog的title輸出到網頁,接着就是blog.items文章清單循環輸出,将文章清單放在一個div層中以便隐藏,javascript函數change用于隐藏或者顯示文章清單。模闆檔案有了,現在需要的是讀取模闆檔案并render,輸出到結果檔案:

  blogs=rss_read()

  #讀取模闆檔案

  template=io.read(file.dirname(__file__)+"/blogs.html")

  message=erb.new(template)

  #輸出結果檔案

  file.open("today.html","w+"){|file| file.puts message.result}

最後,我們生成的是一個today.html檔案,這個網頁就是我們就是我們在文章開頭處展示的。message.result就是經過render後,将blogs變量傳入模闆檔案後得到結果,我們将它寫入today.html。

    完整的rss-reader.rb如下:

require 'rss/2.0'

require 'open-uri'

require 'erb'

# author dennis

# email [email protected]

  blogs=[]

  urls.each do |blog_url|

  blogs

if $0==__file__

    使用小竅門:最好将today.html加入firefox的标簽或者ie的收藏夾,windows下建立一個計劃任務每天淩晨自動運作rss-reader.rb生成toady.html(linux可以使用cron),那麼你每天早上打開浏覽器就可以看到牛人們的新鮮文章了^_^

文章轉自莊周夢蝶  ,原文釋出時間2007-07-09