[Pelican] RSS 臭蟲修正方式

我遇到的問題

話說轉到 Pelican 後,發現他的 RSS 處理有一些小暇疵,主要的幾個問題是:

  1. ATOM/RSS 會把所有文章塞進去,像我這種累積了好幾年的部落格,檔案大的可怕,有等於沒有
  2. ATOM/RSS 裡的資料沒有時區資訊,都是 UTC+0,所以在 RSS 閱讀器上的時間會是錯的
  3. RSS 裡沒有 <guid> 這個標籤,所以每次新增一篇文章,RSS 閱讀器就會以為 RSS 裡的所有文章都是新的

關於前面的兩點,我昨晚很努力的修完了之後,才發現……靠!官方的 GitHub 裡早就已經有解決方案了……一整個就是做白工模式啊。

這件事告訴我們……開工之前要先去官方的 GitHub 裡撈撈看有沒有啥可以用的東西……orz.

修正時區與文章數量

總而言之,關於前面兩點,只要在安裝的時候,直接指定 pip 用官方的 GitHub repository 來安裝就可以解決了。

# pip uninstall pelican
# pip install git+http://github.com/ametaireau/pelican.git#egg=pelican

重新安裝完 Pelican 之後,就可以在設定檔裡指定 MAX_FEED_ITEMSTIMEZONE 這兩個變數,來設定 RSS / ATOM 裡的文章數以及時區。

FEED_MAX_ITEMS = 10       # RSS 文章數
TIMEZONE = "Asia/Taipei"  # RSS 文章時區

修正 RSS GUID

其實很簡單,在 pelican/writers.py 裡有一個 _add_item_to_the_feed 的函式,裡面呼叫了 feed.add_item 這個東西,只要在裡面新帶入一個 unique_id 的參數即可,目前我是直接把他設成文章的網址。

def _add_item_to_the_feed(self, feed, item):

    feed.add_item(
        title=item.title,
        link='%s/%s' % (self.site_url, item.url),
        unique_id='%s/%s' % (self.site_url, item.url),  # 這裡是文章的 GUID #
        description=item.content,
        categories=item.tags if hasattr(item, 'tags') else None,
        author_name=getattr(item, 'author', 'John Doe'),
        pubdate=set_date_tzinfo(item.date,
                                self.settings.get('TIMEZONE', None)))

如果懶的自己改的話,我也已經在 GitHub 上 fork 出一份程式碼,可以直接用 pip 安裝:

# pip uninstall pelican
# pip install git+http://brianhsu@github.com/brianhsu/pelican.git#egg=pelican

小小(?)的抱怨

話說這是第一次實際上跳下來追和修改 Python 的程式碼……整個的感覺就是動態形別的程式語言不是我的菜啊……在改的時候一整個就是超痛苦的。

語法什麼的倒不是問題,官方的文件和一些其他的教學,再加上寫其他程式的經驗,要組出自己想要的運作邏輯並不困難。

難的是面對一大堆缺少型別資訊的參數時,我只能很用力地去猜,去猜他是什麼型別,去猜他有什麼函式可以用,而想也知道猜測的結果通常都是錯的,再加上連型別是啥都不知道,實在很難去直接搜尋,只能當人腦 compiler 一層一層地往外扒,看那個參數是從哪裡傳進來的。

然後當我想要寫自己的 RestructuredText 的指令處理時,發現連要知道 docutils 這個函式庫到底有哪些類別,每個類別有哪個方法都很困難,我翻遍了官方文件,就是沒見到這樣的列表……

這是我在 Java / Scala ecosystem 裡鮮少遇到的問題,就算函式庫的文件再爛,看 JavaDoc/ScalaDoc 也多少能猜到一些,就算函式庫沒提供 JavaDoc,要自己生一份這樣的 API 文件也不困難。

只能說……真的很不習慣啊,難怪我一直對 Python 興趣缺缺。XD

回響