FPs

寫一個Pelican 插件:Read More Link

another_read_more_link_demo

之前用Octopress 搭建博客的時候,用過一個很酷的功能,在文章中插入<!-- more -->之後,首頁的文章列表只會顯示這個標記之前的內容,然後添加一個類似繼續閱讀的鏈接。後來有一段時間切到Wordpress,也有類似的功能,但是在Pelican 上沒見到。

Inserting a <!-- more --> comment into your post will prevent the post content
below this mark from being displayed on the index page for the blog posts,
a "Continue →" button links to the full post.  
-- http://octopress.org/docs/blogging/

Pelica Plugins 列表裏翻了下:

  • summary,需要添加添加首位2個標記(看了下源代碼,只添加<!-- PELICAN_END_SUMMARY --> 也可以,就會從頭開始算),不過也不能添加繼續閱讀的鏈接;
  • read_more_link,不過這個插件是指定SUMMARY_MAX_LENGTH,也不符合需求。

所以覺得不如自己寫一個,看了下官方教程How to create plugins 和 read_more_link 這個插件的源代碼,就能實現了。

#註冊函數,當Pelican 發送all_generators_finalized 信號時候,調用插件
def register():
    try:
        signals.all_generators_finalized.connect(run_plugin)
    except AttributeError:
        signals.content_object_init.connect(insert_read_more_link)

Pelican 在首頁其實顯示的一篇文章的summary,即我們只需要檢測文章中是否出現了<!-- more -->,如果出現了,就改寫文章的summary,再加上繼續閱讀的鏈接即可。

#對生成的文章對象:article 循環處理
def run_plugin(generators):
    for generator in generators:
        if isinstance(generator, ArticlesGenerator):
        for article in generator.articles:
                insert_read_more_link(article)
def insert_read_more_link(instance):
....

content = instance._content

marker_location = content.find("<!-- more -->")

if marker_location == -1:
    #如果找不到註釋標記,先判斷文章是否存在summary,如果沒有的話,就將summary 設置爲全文,然後退出插件
    if hasattr(instance, '_summary'):
        summary = instance._summary
    else:
        instance._summary = instance._content
        instance.has_summary = True
        return
else:
    #按照檢索到註釋標記的位置,截取文章內容作爲summary
    summary = content[0:marker_location]

if ANOTHER_READ_MORE_LINK:
    read_more_link =  ANOTHER_READ_MORE_LINK_FORMAT.format(url=instance.url, text=ANOTHER_READ_MORE_LINK)
    summary = summary  + read_more_link

instance._summary = summary
instance.has_summary = True

下載插件後,在pelicanconf.py 中配置:

PLUGIN_PATHS = ['/home/xxx/blog/xxx/']
PLUGINS = ['other_plugin','another_read_more_link']
ANOTHER_READ_MORE_LINK = "Continue ->"

默認添加的鏈接帶有一個another-read-more-link屬性,用來自定義喜歡的樣式:

<a class="another-read-more-link" href="/{url}" >{text}</a>

例如:

.another-read-more-link {
    background: #eee;
    display: inline-block;
    padding: .4em .4em;
    margin-right: .5em;
    text-decoration: none;
    color: #737373;
    transition: background-color 0.5s;
}

效果見上文圖片。

插件源碼:another_read_more_link
因爲新手上路,源碼上參考read_more_link,外加功能也類似,所以起了這麼一個名字:P。

This article is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
If you reprint it, please indicate the source: http://fangpeishi.com/pelican_plugin_read_more_link.html