60 lines
1.1 KiB
Ruby
60 lines
1.1 KiB
Ruby
module Jekyll
|
|
class RelatedPosts
|
|
|
|
class << self
|
|
attr_accessor :lsi
|
|
end
|
|
|
|
attr_reader :post, :site
|
|
|
|
def initialize(post)
|
|
@post = post
|
|
@site = post.site
|
|
require 'classifier' if site.lsi
|
|
end
|
|
|
|
def build
|
|
return [] unless site.posts.size > 1
|
|
|
|
if site.lsi
|
|
build_index
|
|
lsi_related_posts
|
|
else
|
|
most_recent_posts
|
|
end
|
|
end
|
|
|
|
|
|
def build_index
|
|
self.class.lsi ||= begin
|
|
lsi = Classifier::LSI.new(:auto_rebuild => false)
|
|
display("Populating LSI...")
|
|
|
|
site.posts.each do |x|
|
|
lsi.add_item(x)
|
|
end
|
|
|
|
display("Rebuilding index...")
|
|
lsi.build_index
|
|
display("")
|
|
lsi
|
|
end
|
|
end
|
|
|
|
def lsi_related_posts
|
|
self.class.lsi.find_related(post.content, 11) - [post]
|
|
end
|
|
|
|
def most_recent_posts
|
|
recent_posts = site.posts.reverse - [post]
|
|
recent_posts.first(10)
|
|
end
|
|
|
|
def display(output)
|
|
$stdout.print("\n")
|
|
$stdout.print(Jekyll.logger.formatted_topic(output))
|
|
$stdout.flush
|
|
end
|
|
end
|
|
end
|