Xavier Nayrac

Accro au TDD, rubyiste mais pas que, maker, 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