Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Comment écrire un plugin Octopress - partie 2

| Comments

Niveau : facile

Dans la première partie, je m’étais arrêté sur le code suivant:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module Jekyll
  class LevelTag < Liquid::Tag

    def initialize(tagname, level, tokens)
      @level = level
    end

    def render(context)
      "Niveau : #{@level}"
    end

  end
end
Liquid::Template.register_tag('level', Jekyll::LevelTag)

Aujourd’hui je montre comment permettre à l’utilisateur de personnaliser le contenu du code Html produit.

Tout d’abord, voici le code du plugin terminé. Je vous rappelle que vous pouvez trouver ce plugin sur Github.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
module Jekyll
  class LevelTag < Liquid::Tag

    def initialize(tagname, level, tokens)
      @level = level.strip
    end

    def render(context)
      config = context.registers[:site].config
      label = config['level_tag_level'] || "Level: "
      level = case @level
      when "1" then config['level_tag_level_1'] || "easy"
      when "2" then config['level_tag_level_2'] || "medium"
      when "3" then config['level_tag_level_3'] || "hard"
      else
        "unknown"
      end
      classes = "class='level-tag level-tag-#{@level}'"
      "<div #{classes}>#{label}<span>#{level}</span></div>"
    end

  end

end
Liquid::Template.register_tag('level', Jekyll::LevelTag)

L’appel du plugin dans les articles sera maintenant réalisé comme ceci:

1
{% level 1 %}

Par rapport à la première version, la méthode render a bien enflée. - Je trouve qu’il y a trop de code dedans, mais ce sera peut-être le sujet d’un prochain article sur le refactoring. - C’est cette méthode qui fait tout le travail, voici les explications:

1
2
3
def render(context)
  config = context.registers[:site].config
  label = config['level_tag_level'] || "Level: "

C’est l’objet context qui va permettre de récupérer les informations nécéssaires dans le fichier de configuration _config.yml. Voici par exemple ce que j’ai ajouté dans mon _config.yml:

1
2
3
4
5
# LevelTag plugin
level_tag_level: "Niveau : "
level_tag_level_1: "facile"
level_tag_level_2: "intermédiaire"
level_tag_level_3: "avancé"

La ligne suivante:

label = config['level_tag_level'] || "Level: "

initialise la variable label avec le contenu de level_tag_level, trouvé dans le _config.yml. La partie du code || "Level: " est là pour s’assurer que si level_tag_level n’existe pas dans le fichier de configuration, label sera bien initialisé avec une valeur par défaut.

1
2
3
4
5
6
7
  level = case @level
  when "1" then config['level_tag_level_1'] || "easy"
  when "2" then config['level_tag_level_2'] || "medium"
  when "3" then config['level_tag_level_3'] || "hard"
  else
    "unknown"
  end

C’est la même logique que précédement. La variable level sera initialisée avec du contenu trouvé dans _config.yml ou bien, avec une valeur par défaut.

1
2
  classes = "class='level-tag level-tag-#{@level}'"
  "<div #{classes}>#{label}<span>#{level}</span></div>"

Finalement, comme dans la première partie, on retrouve en fin de méthode la production du code Html.

À demain.

Articles connexes

Commentaires