我遇到的問題
話說轉到 Pelican 後,發現他的 RSS 處理有一些小暇疵,主要的幾個問題是:
- ATOM/RSS 會把所有文章塞進去,像我這種累積了好幾年的部落格,檔案大的可怕,有等於沒有
- ATOM/RSS 裡的資料沒有時區資訊,都是 UTC+0,所以在 RSS 閱讀器上的時間會是錯的
- 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_ITEMS 和 TIMEZONE 這兩個變數,來設定 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
回響