/episodes/272/fr.html
HTML | 202 lines | 138 code | 64 blank | 0 comment | 0 complexity | 737b63ddccc13b6dda5a45d708c979f0 MD5 | raw file
- <p>Github a <a href="https://github.com/blog/832-rolling-out-the-redcarpet">présenté</a>, il y à quelques mois, une gem nommée <a href="https://github.com/tanoku/redcarpet">Redcarpet</a>. Cette gem permet d'interpréter du code <a href="http://en.wikipedia.org/wiki/Markdown">Markdown</a> et Github l'utilise en interne, conjointement à la librairie <a href="http://fossil.instinctive.eu/libupskirt/index">Upskirt</a>, pour fournir un moyen simple de baliser les documents. Redcarpet est facile à utiliser et, dans cet épisode, nous allons l'ajouter à une application Rails, montrer comment elle peut être personnalisée et mettre en place la coloration syntaxique des blocs de code.</p>
- <p>Nous allons travailler avec une simple application de blog (voir ci-dessous). Le contenu saisi pour l'article et affiché directement en HTML. Bien que nous ayons entré deux paragraphes, ils sont montrés comme un seul bloc.</p>
- <div class="imageWrapper">
- <img src="/system/photos/691/original/E272I01.png" width="801" height="358" alt="Notre application de blog."/>
- </div>
- <p>Le contenu n'est, pour le moment, interprété d'aucune façon. Nous allons changer notre application pour qu'il passe au travers de Markdown. De cette manière, tout utilisateur créant ou modifiant du contenu aura une grande flexibilité sur le format de sortie.</p>
- <h3>Installer Redcarpet</h3>
- <p>La première étape est, comme vous vous en doutez, d'installer la gem Redcarpet. Comme d'habitude, nous référençons la gem dans le Gemfile et nous faisons appel à bundle pour l'installer.</p>
- <p class="codeFilePath">/Gemfile</p>
- <pre class="ruby">source 'http://rubygems.org'
- gem 'rails', '3.0.9'
- gem 'sqlite3'
- gem 'nifty-generators'
- gem 'redcarpet'</pre>
- <p>Nous allons ensuite aller dans la page <code>show</code> de <code>ArticleController</code> et ajouter Redcarpet à la ligne affichant le contenu de l'article. Pour ce faire, nous créons un nouvel objet <code>Redcarpet</code>, lui passons le contenu à baliser et appelons <code>to_html</code> sur la chaine retournée.</p>
- <p class="codeFilePath">/app/views/articles/show.html.erb</p>
- <pre class="ruby"><% title @article.name %>
- <%= Redcarpet.new(@article.content).to_html %>
- <p>
- <%= link_to "Edit", edit_article_path(@article) %> |
- <%= link_to "Destroy", @article, :confirm => 'Are you sure?', :method => :delete %> |
- <%= link_to "View All", articles_path %>
- </p></pre>
- <p>Cependant, lorsque nous rechargeons la page, nous n'obtenons pas vraiment le résultat attendu.</p>
- <div class="imageWrapper">
- <img src="/system/photos/692/original/E272I02.png" width="800" height="324" alt="Les balises sont echappees."/>
- </div>
- <p>Rails 3 a automatiquement échappé le code et nous voyons donc les balises ajoutées par Redcarpet. La méthode rapide pour régler ce problème est d'appeler <code>raw</code> sur le contenu.</p>
- <p class="codeFilePath">/app/views/articles/show.html.erb</p>
- <pre class="ruby"><% title @article.name %>
- <%= raw Redcarpet.new(@article.content).to_html %>
- <p>
- <%= link_to "Edit", edit_article_path(@article) %> |
- <%= link_to "Destroy", @article, :confirm => 'Are you sure?', :method => :delete %> |
- <%= link_to "View All", articles_path %>
- </p></pre>
- <p>Lorsque nous rechargeons la page, elle s'affiche comme nous le voulions.</p>
- <div class="imageWrapper">
- <img src="/system/photos/693/original/E272I03.png" width="800" height="350" alt="Le contenu est maintenant en deux paragraphes comme voulu."/>
- </div>
- <p>Faire cela chaque fois que nous voulons afficher du code Markdown est un peu pénible. Nous allons donc créer un helper appelé <code>markdown</code> pour rendre cela plus aisé.</p>
- <p class="codeFilePath">/app/helpers/application_helper.rb</p>
- <pre class="ruby">module ApplicationHelper
- def markdown(text)
- Redcarpet.new(text).to_html.html_safe
- end
- end</pre>
- <p>Lorsque nous retournons du contenu depuis un helper, nous appelons dessus <code>html_safe</code> plutôt que <code>raw</code>. Nous pouvons maintenant utiliser notre helper dans la page d'un article.</p>
- <p class="codeFilePath">/app/views/articles/show.html.erb</p>
- <pre class="ruby"><% title @article.name %>
- <%= markdown @article.content %>
- <p>
- <%= link_to "Edit", edit_article_path(@article) %> |
- <%= link_to "Destroy", @article, :confirm => 'Are you sure?', :method => :delete %> |
- <%= link_to "View All", articles_path %>
- </p></pre>
- <h3>Personnaliser Redcarpet</h3>
- <p>Nous allons maintenant voir la personnalisation de Redcarpet. Une chose qu'elle ne fait pas par défaut est la gestion des sauts de lignes uniques : une ligne vide est requise pour marquer un nouveau paragraphe. Si nous entrons du texte avec un saut de ligne comme ceci</p>
- <pre class="html">give me a
- break</pre>
- <p>il sera montré comme une seule ligne à l'affichage.</p>
- <div class="imageWrapper">
- <img src="/system/photos/694/original/E272I04.png" width="802" height="478" alt="Les sauts de lignes ne sont pas montres dans le contenu."/>
- </div>
- <p>Il serait préférable que saisir du texte comme ceci insère une balise de saut de ligne au bon endroit dans le code HTML. Si nous regardons la <a href="http://rdoc.info/github/tanoku/redcarpet/master/Redcarpet">documentation de Redcarpet</a>, nous voyons une liste d'options dont l'une est <a href="http://rdoc.info/github/tanoku/redcarpet/master/Redcarpet#hard_wrap-instance_method">hard_wrap</a> qui fera exactement cela.</p>
- <p>Nous ajoutons les options sous forme de symboles passés au constructeur de Redcarpet, comme ceci :</p>
- <p class="codeFilePath">/app/helpers/application_helper.rb</p>
- <pre class="ruby">module ApplicationHelper
- def markdown(text)
- Redcarpet.new(text, :hard_wrap).to_html.html_safe
- end
- end</pre>
- <p>Lorsque nous rechargeons la page de notre article, le texte “Give me a break” sera affiché sur deux lignes comme nous le voulions.</p>
- <div class="imageWrapper">
- <img src="/system/photos/695/original/E272I05.png" width="802" height="428" alt="Le saut de ligne est maintenant affiche."/>
- </div>
- <p>Il existe un certain nombre d'options utiles que nous pouvons ajouter. L'option <code><a href="http://rdoc.info/github/tanoku/redcarpet/master/Redcarpet#filter_html-instance_method">filter_html</a></code> empêchera tout code HTML d'être affiché. Nous allons également ajouter l'option <code><a href="http://rdoc.info/github/tanoku/redcarpet/master/Redcarpet#autolink-instance_method">autolink</a></code> afin que toute URL détectée dans le code soit transformée en lien. Puisque nous prévoyons d'inclure des exemples de code dans les articles, nous allons utiliser l'option <code><a href="http://rdoc.info/github/tanoku/redcarpet/master/Redcarpet#no_intraemphasis-instance_method">no_intraemphasis</a></code>. Elle évite que les underscores dans les mots soient traités comme des marqueurs de texte italique et permet donc un traitement normal des méthodes et variables Ruby avec underscores. Enfin, pour aider à l'affichage des extraits de code dans nos articles, nous allons ajouter deux options : <code><a href="http://rdoc.info/github/tanoku/redcarpet/master/Redcarpet#fenced_code-instance_method">fenced_code</a></code> (nous allons voir rapidement son utilisation) et <code><a href="http://rdoc.info/github/tanoku/redcarpet/master/Redcarpet#gh_blockcode-instance_method">gh_blockcode</a></code>.</p>
- <p>Nous avons maintenant une longue liste d'options que nous allons extraire sous forme de tableau dans notre helper.</p>
- <p class="codeFilePath">/app/helpers/applciation_helper.rb</p>
- <pre class="ruby">module ApplicationHelper
- def markdown(text)
- options = [:hard_wrap, :filter_html, :autolink, ↵
- :no_intraemphasis, :fenced_code, :gh_blockcode]
- Redcarpet.new(text, *options).to_html.html_safe
- end
- end</pre>
- <p>Avec ces options, nous pouvons ajouter des blocs de code à nos articles tout comme nous le faisons sur Github. Ces blocs commencent et se terminent par une ligne contenant trois apostrophes inverses et le langage est spécifié sur la ligne d'ouverture. Nous allons modifier notre article pour y ajouter un bloc de code.</p>
- <pre class="html">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
- ``` ruby
- puts "Hello, world!"
- ```</pre>
- <p>Le rendu est le suivant, l'extrait de code étant affiché dans une balise <code>pre</code> avec l'attribut <code>lang</code> approprié pour définir le langage.</p>
- <div class="imageWrapper">
- <img src="/system/photos/696/original/E272I06.png" width="802" height="428" alt="Les blocs de code sont maintenant affiches."/>
- </div>
- <p>Nous pouvons également utiliser une méthode plus traditionnelle de définition des blocs de code en utilisant des tildes au lieu des apostrophes inverses.</p>
- <pre class="html">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
- ~~~ruby
- puts "Hello, world!"
- ~~~</pre>
- <p>Ceci sera affiché exactement de la même façon qu'avec les apostrophes inverses.</p>
- <h3>Coloration syntaxique</h3>
- <p>Maintenant que nous pouvons afficher des blocs de code dans nos articles, comment pouvons nous ajouter la coloration syntaxique ? Github gère cela grâce à une combinaison de la librairie Python <a href="http://pygments.org/">Pygments</a> et de la gem <a href="https://github.com/github/albino">Albino</a>. Nous allons faire de même dans notre application.</p>
- <p>Nous allons ajouter Albino à notre <code>Gemfile</code> mais également Nokogiri de façon à ce qu'il interprète et parse le code HTML généré par Redcarpet.</p>
- <p class="codeFilePath">/Gemfile</p>
- <pre class="ruby">source 'http://rubygems.org'
- gem 'rails', '3.0.9'
- gem 'sqlite3'
- gem 'nifty-generators'
- gem 'redcarpet'
- gem 'albino'
- gem 'nokogiri'</pre>
- <p>Comme toujours, nous appelons bundle pour s'assurer que tout est installé.</p>
- <p>Nous allons également avoir besoin de Pygments. Comme nous avons python sur notre machine, nous pouvons l'installer en faisant</p>
- <pre class="terminal">$ sudo easy_install pygments</pre>
- <p>Dans notre <code>ApplicationHelper</code>, nous allons ajouter une méthode, que nous allons appeler <code>syntax_highlighter</code>, autour de la ligne qui convertit le code Redcarpet en HTML. Cette méthode utilisera Nokogiri pour chercher les éléments <code>pre</code> ayant un attribut <code>lang</code> dans le document puisque c'est la façon dont Redcarpet définit les blocs de code. Elle va ensuite remplacer le contenu de ces éléments par la syntaxe interprétée.</p>
- <p class="codeFilePath">/app/helpers/application_helper.rb</p>
- <pre class="ruby">module ApplicationHelper
- def markdown(text)
- options = [:hard_wrap, :filter_html, :autolink, ↵
- :no_intraemphasis, :fenced_code, :gh_blockcode]
- syntax_highlighter(Redcarpet.new(text, ↵
- *options).to_html).html_safe
- end
-
- def syntax_highlighter(html)
- doc = Nokogiri::HTML(html)
- doc.search("//pre[@lang]").each do |pre|
- pre.replace Albino.colorize(pre.text.rstrip, pre[:lang])
- end
- doc.to_s
- end
- end</pre>
- <p>Ce code est basé sur la gem <a href="https://github.com/injekt/rack-pygmentize">rack-pygmentize</a> et cela vaut la peine de jeter un coup d'œil pour voir comment elle fonctionne. Cette méthode rend facile la migration vers d'autres systèmes de coloration syntaxique comme Coderay si vous préférez.</p>
- <p>Nous avons ajouté une feuille de style pour montrer la coloration syntaxique que vous pouvez trouver <a href="https://github.com/ryanb/railscasts-episodes/blob/master/episode-272/blog-after/public/stylesheets/pygments.css">sur Github</a>. Lorsque nous rechargeons la page, l'exemple de code est colorisé.</p>
- <div class="imageWrapper">
- <img src="/system/photos/697/original/E272I07.png" width="800" height="322" alt="La syntaxe du code est maintenant colorisee."/>
- </div>
- <p>C'est tout pour cet épisode. Pour plus d'informations, regardez la <a href="https://github.com/tanoku/redcarpet">page Github du projet</a>.</p>