Lokkaの記事本文に「続きを読む」リンク

このHatenaダイヤリーもそうですが、「続きを読む」というリンクを作ってトップページは概要だけを表示したいという場合があります。そこでLokkaプラグインを作ろうと思いました。

lokka-read_moreプラグインを作ってみた

最初、afterフィルタで対応できるのかなと思ったのですが、このフィルタが呼ばれるのはrenderした後なので意味がありませんでした。したがって、beforeフィルタで表示する本文の内容を修正することにしました。
また、「続きを読む」というリンクは、「----」(半角ハイフン4つ)を1行を文中に書くというルールにしました。
APP_ROOT/public/plugin/lokka-read_more/lib/Lokka/read_more.rb

module Lokka
  module ReadMore
    def self.registered(app)
      app.before '/' do
        return unless request.env['REQUEST_METHOD'] == "GET"
        @posts = Post.page(params[:page], :per_page => settings.per_page)
        @posts.each do |post|
          unless (i = post.body.index("----<br>")).nil?
            post.body = post.body.slice(0, i)
            post.body += %Q(<a href="/#{post.id}">#{t.read_more}</a>)
          end 
        end 
      end 

      app.before %r{^/([0-9a-zA-Z-]+)$} do |id_or_slug|
        return unless request.env['REQUEST_METHOD'] == "GET"
        @entry = Entry.get_by_fuzzy_slug(id_or_slug)
        @entry.body.sub!("----<br>", "") 
      end 
    end 
  end 
end

APP_ROOT/public/plugin/lokka-read_more/i18n/en.yml

read_more: more...

APP_ROOT/public/plugin/lokka-read_more/i18n/ja.yml

read_more: 続きを読む

app.rbを一部修正

このままではAPP_ROOT/lib/lokka/app.rbの「get '/' do」ブロック内で@postsが、「get %r{^/([0-9a-zA-Z-]+)$} do |id_or_slug|」ブロック内で@entryは書き換えられてしまいます。そこで、APP_ROOT/lib/lokka/app.rbの一部、修正(1と2のunless)しました。
APP_ROOT/lib/lokka/app.rb

(省略)
# index
get '/' do
  @theme_types << :index
  @theme_types << :entries

  @posts = Post.page(params[:page], :per_page => settings.per_page) unless @posts # 1
(省略)
# entry
get %r{^/([0-9a-zA-Z-]+)$} do |id_or_slug|
  @theme_types << :entry

  @entry = Entry.get_by_fuzzy_slug(id_or_slug) unless @entry # 2
  return 404 if @entry.blank?
(省略)

余談

今回、本文に「続きを読む」リンクを追加するプラグインを考えてみたいのですが、これ以外にも本文を修正するプラグインを作成する場合、現時点はapp.rbを上記のように修正する必要がありますがレアケースなのかな?