Un plugin Octopress pour les articles connexes
Je cherchais un plugin Octopress pour embarquer une section d’articles connexes (related posts) dans certains articles et, curieusement, je n’en ai pas trouvé. C’est donc l’occasion d’écrire mon second plugin pour Octopress.
Pour voir ce que fait ce plugin, il vous suffit de regarder la section «Articles connexes» à la fin de cet article. Le code est sur Github: octopress-connexe.
Je vais commenter quelques unes des méthodes:
def my_categories(context)
context.environments.first["page"]["categories"]
end
def my_url(context)
context.environments.first["page"]["url"]
end
J’ai séché un certain temps là-dessus. Pour connaitre les informations
relative à l’article courant, on se sert de
context.environments.first["page"]
.
Et voici comment je fais la sélection des articles connexes:
def build_posts(context)
remove_unrelated_posts
remove_current_post(context)
sort_posts
end
def remove_unrelated_posts
@posts = @posts.select do |post|
result = false
@categories.each do |category|
result = true if post.categories.include?(category)
end
result
end
end
def remove_current_post(context)
@posts.delete_if {|post| post.url == my_url(context)}
end
def sort_posts
@posts = @posts.map do |post|
weight = 0
@categories.each do |category|
weight += 1 if post.categories.include?(category)
end
[weight, post]
end
@posts = @posts.sort.reverse
end
Dans un premier temps, j’écarte les articles qui n’ont pas au moins
une catégorie commune avec l’article courant. C’est le rôle de la méthode
remove_unrelated_posts
. Puis après avoir écarter de la liste l’article
courant, il ne reste plus qu’à trier avec la méthode sort_posts
. Dans cette
méthode, j’attribue un poid à chaque article en fonction du nombre de
catégories communes. C’est ce poid qui sert de référence pour le tri.
À demain.