<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>piouPiouM's dev</title>
	
	<link>http://pioupioum.fr</link>
	<description>Bloc-note d'un développeur web</description>
	<lastBuildDate>Sat, 16 Mar 2013 21:50:51 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.pioupioum.fr/pioupioum-dev-blog" /><feedburner:info uri="pioupioum-dev-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><item>
		<title>Gestion avancée de Sass et Compass avec RVM et Bundler</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/w4Y29A_iFzg/compass-sass-rvm-bundler-gestion-projet.html</link>
		<comments>http://pioupioum.fr/developpement/compass-sass-rvm-bundler-gestion-projet.html#comments</comments>
		<pubDate>Wed, 07 Nov 2012 23:03:44 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Compass]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[méthodologie]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[Sass]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=660</guid>
		<description><![CDATA[Maintenir un environnement de développement est toujours délicat lorsqu&#8217;il doit convenir à plusieurs projets et
leurs pré-requis. Cela se vérifie d&#8217;autant plus qu&#8217;il nous faut désormais jongler avec des projets hybrides (PHP, Ruby, 
Node.js, etc). Le cas de figure se rencontre lorsque des projets PHP font appels au préprocesseur Sass et Compass, son
framework CSS3, tous deux [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Maintenir un environnement de développement est toujours délicat lorsqu&#8217;il doit convenir à plusieurs projets et
leurs pré-requis. Cela se vérifie d&#8217;autant plus qu&#8217;il nous faut désormais jongler avec des projets hybrides (PHP, Ruby, 
Node.js, etc). Le cas de figure se rencontre lorsque des projets PHP font appels au préprocesseur <a href="http://sass-lang.com/" title="Sass - Syntactically Awesome Stylesheets">Sass</a> et <a href="http://compass-style.org/" title="Compass Home | Compass Documentation">Compass</a>, son
framework CSS3, tous deux en Ruby.</p>

<p>Les amateurs de Ruby dirons que des outils existent pour simplifier la tâche. Et ils ont raison&#160;! Cependant, tout le 
monde n&#8217;est pas rubiste dans l&#8217;âme et c&#8217;est pourquoi je vous présentais il y a quelques mois une méthode pour 
<a href="http://pioupioum.fr/developpement/compass-rvm-multiple-instances.html" title="Instances multiples de Compass avec Ruby Version Manager (rvm) &#8211; Guide d&#8217;installation avancé de Compass">maintenir plusieurs versions de Compass</a>. Je reviens sur cette question épineuse parce que je suis
arrivé à la limite de la solution.<br />
En effet, je dois aujourd&#8217;hui gérer de nombreuses versions de Compass disséminées dans bien des projets. Et autant 
le dire clairement, consulter un README pour me rafraîchir la mémoire quant à la version de Compass (et autres outils 
en Ruby) requise par un projet me fatigue. Il en va de même pour mes collègues.</p>

<p>Heureusement pour nous, l&#8217;évolution des outils que sont <a href="https://rvm.io/" title="RVM: Ruby Version Manager">RVM</a> et <a href="http://gembundler.com/" title="Bundler: The best way to manage Ruby applications">Bundler</a> offre désormais une <strong>gestion 
simplifiée de projets Sass et Compass</strong>, voire automatisée&#160;!</p>

<p><a href="http://pioupioum.fr/developpement/compass-sass-rvm-bundler-gestion-projet.html" title="Gestion avancée de projet Compass avec RVM et Bundler"><img src="http://assets1.pioupioum.fr/uploads/2012/11/compass-rvm-bundler1-610x350.jpg" class="attachment-medium" alt="" title="Gestion avancée de projet Compass avec RVM et Bundler" height="350" width="610"></a><span id="more-660"></span></p>

<h2>Mettre à jour RVM</h2>

<p>Avant toute chose, vérifiez votre version de RVM&#160;:</p>

<pre><code>$ rvm --version
</code></pre>

<p>Puis suivant la version retournée&#160;:</p>

<ul>
<li>supérieure ou égale à <code>1.10.3</code>, vous pouvez passer directement à la section suivante.
Je vous conseille néanmoins de donner un coup de fraîcheur à votre RVM <img src='http://pioupioum.fr/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>inférieure à <code>1.10.3</code>, il va vous falloir mettre à jour RVM.</li>
</ul>

<p>Afin de profiter des dernières améliorations de RVM, il vous faut le mettre à jour, ce qui résume à relancer une
<a href="https://rvm.io/rvm/install/" title="Installing Ruby Version Manager">installation du script</a>&#160;:</p>

<pre><code>$ cd
$ \curl -L https://get.rvm.io | bash -s stable
</code></pre>

<p>L&#8217;antislash en début de la commande <code>curl</code> n&#8217;est pas une erreur, <strong>veillez à le saisir</strong>.</p>

<p>La mise à jour réalisée, re-chargez RVM (ou ouvrez une nouvelle fenêtre de terminal)&#160;:</p>

<pre><code>$ rvm reload
</code></pre>

<p>Pour information, vous pourrez désormais mettre à jour RVM à l&#8217;aide de la commande <code>rvm get stable</code>&#160;:</p>

<pre><code>$ rvm get stable
$ rvm reload
</code></pre>

<p><strong>Important&#160;:</strong><br />
Je ne fais pas appel à la commande <code>sudo</code>, vous non plus&#160;! RVM s&#8217;installera ainsi dans votre espace utilisateur et vous
affranchira de l&#8217;appel à <code>sudo</code> pour un oui ou pour un non (pour simplifier).</p>

<h2>Gestion par projet des versions de Sass et Compass</h2>

<p>La gestion simplifiée de la version de notre pré-processeur CSS préféré est le résultat de 2 évolutions de RVM&#160;:</p>

<ol>
<li>RVM installe la gemme <a href="http://gembundler.com/" title="Bundler: The best way to manage Ruby applications">Bundler</a> en cas de besoin.</li>
<li>À chaque ouverture de dossier, RVM vérifie la présence d&#8217;un fichier <code>Gemfile</code> et le cas échéant le parse pour
identifier la version de ruby et le gemset à charger.</li>
</ol>

<h3>Gestion des dépendances avec Bundler</h3>

<p>Bundler nous permet de maintenir les dépendances Ruby (les gemmes) d&#8217;un projet à l&#8217;aide d&#8217;un simple fichier j&#8217;ai nommé
<code>Gemfile</code>&#160;:</p>

<pre><code>source :rubygems
gem "compass"
gem "oily_png"
</code></pre>

<p>La syntaxe de cet exemple est concise, mais retenez que Bundler offre bien plus d&#8217;<a href="http://gembundler.com/gemfile.html" title="Documentation du format de fichier Gemfile">options</a>. Ici, on indique
simplement que le projet nécessite les dernières versions connues de <a href="http://compass-style.org/" title="Compass Home | Compass Documentation">Compass</a> et la gemme <a href="https://github.com/wvanbergen/oily_png">OilyPNG</a>.</p>

<p>Si vous devez employer une version spécifique d&#8217;une gemme, il est possible de la préciser&#160;:</p>

<pre><code>source :rubygems
gem "compass", "0.12.1"
gem "oily_png"
</code></pre>

<p>voire même d&#8217;indiquer à Bundler que le projet accepte toute nouvelle version mineure à l&#8217;aide du sélecteur pessimiste 
<code>~&gt;</code> (connu sous le doux nom de <em>spermy operator</em>)&#160;:</p>

<pre><code>source :rubygems
gem "compass", "~&gt; 0.12.1"
gem "oily_png"
</code></pre>

<p>Plus clairement, toute version supérieure ou égale à <code>0.12.X</code> et strictement inférieure à <code>0.13</code> sera acceptée.
Une définition équivalente est donc <code>"&gt;= 0.12.1", "&lt; 0.13"</code>.</p>

<p>Le fichier <code>Gemfile</code> est a déposer à la racine du répertoire depuis lequel vous lancez Sass ou Compass. Ainsi, RVM le
chargera dès que vous vous positionnerez dans le répertoire.</p>

<h3>Dédier un gemset par projet avec RVM</h3>

<p>Maintenir de multiples gemsets (idéalement un par projet même si en pratique on en crée un par version de Compass) est
chronophage et peu être source d&#8217;erreurs. Surtout lorsqu&#8217;il y a plusieurs intervenants sur le projet&#160;; les 
configurations des machines et des gemmes installées n&#8217;étant pas obligatoirement identiques.</p>

<p>C&#8217;est pourquoi RVM a évolué pour supporter des commentaires spécifiques dans le fichier <code>Gemfile</code> afin de déterminer la 
version de Ruby ainsi que le nom du gemset à charger pour le répertoire courant&#160;:</p>

<pre><code>source :rubygems

#ruby=1.9.2
#ruby-gemset=customer1-project1

gem "compass", "~&gt; 0.12.1"
gem "oily_png"
</code></pre>

<p>En pratique, lorsque vous vous positionnez dans un dossier (en shell, <em>of course</em>), RVM lit le fichier <code>Gemfile</code> et</p>

<ul>
<li>charge la version de Ruby requise&#160;;</li>
<li><strong>charge ou à défaut crée le gemset précisée.</strong></li>
</ul>

<p>Vous avez bien lu, RVM va permettre la création d&#8217;un gemset dédiée à votre projet si celui-ci venait à manquer <img src='http://pioupioum.fr/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br />
Un exemple, en supposant que mon fichier <code>Gemfile</code> est déposé dans <code>projects/my_project/</code>&#160;:</p>

<pre><code>$ cd projects/
$ rvm gemset name
/Users/mehdi/.rvm/gems/ruby-1.9.2-p320
$ cd my_project/
$ rvm gemset name
customer1-project1
$ cd ..
$ rvm gemset name
/Users/mehdi/.rvm/gems/ruby-1.9.2-p320
</code></pre>

<p><strong>Note&#160;:</strong><br />
La version de Ruby est obligatoire et peut être précise&#160;: <code>#ruby=ruby-1.9.2-p320</code>.</p>

<p>Si la version de Ruby requise est absente de votre environnement, RVM vous invite a l&#8217;installer et bien évidemment 
aucun gemset n&#8217;est créé&#160;:</p>

<pre><code>$ cd my_project2/
ruby-1.9.2-p290 is not installed.
To install do: 'rvm install ruby-1.9.2-p290'
</code></pre>

<p>Enfin, tout sous-répertoire d&#8217;un projet hérite du gemset demandé à RVM.</p>

<h2>Initialisation du projet</h2>

<p>Le fichier <code>Gemfile</code> étant créé, déplacez-vous à sa racine puis lancez l&#8217;installation des gemmes du projet à l&#8217;aide de la commande <code>bundle install</code>&#160;:</p>

<pre><code>$ cd projects/my_project/
$ ls
  foo/   bar/  Gemfile
$ bundle install
  …
$ ls
  foo/   bar/  Gemfile  Gemfile.lock
</code></pre>

<p>Les gemmes sont désormais installées et un nouveau fichier <code>Gemfile.lock</code> est créé. Ce dernier est une sorte 
d&#8217;instantané des versions des gemmes employées, qui accélère les futures gestion de dépendances. Il permet surtout de 
s&#8217;assurer qu&#8217;une tierce personne installera <em>via</em> Bundler des versions identiques des gemmes.<br />
<strong>Ce fichier est donc lui aussi à versionner.</strong></p>

<h2>Automatisation</h2>

<p>Chaque projet possédera désormais son gemset dédié sans trop se fatiguer. C&#8217;est très bien, mais peut mieux faire.
En effet, il nous faut lancer l&#8217;installation des gemmes manuellement et maintenir leurs mises à jour lorsque les besoins
du projet évoluent (à l&#8217;aide d&#8217;un <code>bundle install</code>).</p>

<p>Cette tâche est automatisable en ajoutant dans votre fichier <code>~/.rvmrc</code> la ligne&#160;:</p>

<pre><code>rvm_autoinstall_bundler_flag=1
</code></pre>

<p>Dès lors, RVM va systématiquement lancer la commande <code>bundle install</code> lorsqu&#8217;il rencontre un fichier <code>Gemfile</code> \o/<br />
Attention cependant, autant un pur intégrateur y verra un intérêt, autant un développeur qui checkout régulièrement des 
projets Ruby par simple curiosité n&#8217;activera pas cette option&#160;: il ne souhaitera pas pourrir son environnement Ruby par défaut de toutes les gemmes requises par les dits projets.</p>

<h2>Supprimer le gemset d&#8217;un ancien projet</h2>

<p>Voici la marche à suivre pour supprimer un gemset dédié a un projet qui s&#8217;est (bien — naturellement <img src='http://pioupioum.fr/wp/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) terminé et pour lequel vous n&#8217;aurez
plus à intervenir.</p>

<p>En premier lieu, et ce depuis n&#8217;importe quel emplacement, affichez la liste des gemsets&#160;:</p>

<pre><code>$ rvm list gemsets

rvm gemsets

=&gt; ruby-1.9.2-p180 [ x86_64 ]
   ruby-1.9.2-p180@global [ x86_64 ]
   ruby-1.9.2-p320 [ x86_64 ]
   ruby-1.9.2-p320@customer1-project1 [ x86_64 ]
   ruby-1.9.2-p320@customer1-project2 [ x86_64 ]
   ruby-1.9.2-p320@customer2-project1 [ x86_64 ]
   ruby-1.9.2-p320@customer3-project1 [ x86_64 ]
   ruby-1.9.2-p320@customer4-project1 [ x86_64 ]
   ruby-1.9.2-p320@global [ x86_64 ]
</code></pre>

<p>Vous souhaitez supprimer le gemset dédiée au projet <code>customer3-project1</code>&#160;:</p>

<pre><code>$ rvm gemset delete customer3-project1
/Users/mehdi/.rvm/gems/ruby-1.9.2-p180@customer3-project3 did not previously exist. Ignoring.
</code></pre>

<p>sans succès… Effectivement, une lecture attentive du listing précédent nous informe que la version de Ruby active
est <code>ruby-1.9.2-p180</code> alors que la version associée à votre gemset est <code>ruby-1.9.2-p320</code>. Lancez maintenant la commande
en précisant le couple <code>version_de_ruby@gemset</code> (bref, un copié/collé)&#160;:</p>

<pre><code>$ rvm gemset delete ruby-1.9.2-p320@customer3-project1
Are you SURE you wish to remove the entire gemset directory 'customer3-project1' (/Users/mehdi/.rvm/gems/ruby-1.9.2-p320@customer3-project1)?
(anything other than 'yes' will cancel) &gt; yes
Removing gemset customer3-project1
</code></pre>

<p>Tout simplement <img src='http://pioupioum.fr/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html' title='Utiliser Compass dans un thème WordPress, la bonne méthode'>Utiliser Compass dans un thème WordPress, la bonne méthode</a></li><li><a href='http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html' title='Compass au quotidien'>Compass au quotidien</a></li><li><a href='http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html' title='Compass : supprimer le cache buster des sprites'>Compass&#160;: supprimer le cache buster des sprites</a></li><li><a href='http://pioupioum.fr/developpement/compass-rvm-multiple-instances.html' title='Instances multiples de Compass avec Ruby Version Manager (rvm)'>Instances multiples de Compass avec Ruby Version Manager (rvm)</a></li><li><a href='http://pioupioum.fr/developpement/support-presentation-compass-wel4.html' title='Support de présentation de l&#8217;atelier « Compass, sauvez l&#8217;intégrateur ! »'>Support de présentation de l&#8217;atelier «&#160;Compass, sauvez l&#8217;intégrateur&#160;!&#160;»</a></li></ul>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=w4Y29A_iFzg:_vQfAYjT7cc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=w4Y29A_iFzg:_vQfAYjT7cc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=w4Y29A_iFzg:_vQfAYjT7cc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=w4Y29A_iFzg:_vQfAYjT7cc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=w4Y29A_iFzg:_vQfAYjT7cc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=w4Y29A_iFzg:_vQfAYjT7cc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=w4Y29A_iFzg:_vQfAYjT7cc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=w4Y29A_iFzg:_vQfAYjT7cc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=w4Y29A_iFzg:_vQfAYjT7cc:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/w4Y29A_iFzg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/developpement/compass-sass-rvm-bundler-gestion-projet.html/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/developpement/compass-sass-rvm-bundler-gestion-projet.html</feedburner:origLink></item>
		<item>
		<title>Drupal 6 : résoudre le problème du double charset dans un thème HTML5</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/-RylCEubfM8/drupal-6-html5-supprimer-utf8-content-type.html</link>
		<comments>http://pioupioum.fr/developpement/drupal-6-html5-supprimer-utf8-content-type.html#comments</comments>
		<pubDate>Tue, 23 Oct 2012 22:48:51 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuces]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[drupal 6]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=650</guid>
		<description><![CDATA[Je réalise actuellement un thème Drupal 6&#160;en HTML5 et vient le moment de déclarer comme il se doit le charset du
document. Sachant que Drupal 6 déclare une la balise meta
destinée à un doctype XHTML, mon premier réflexe est d&#8217;appliquer une simple substitution depuis mon implémentation du
hook theme_preprocess_page()&#160;:


1
2
3
4
5
6
7
8
9
10
11
&#60;?php
/**
 * @file template.php
 */
function MYTHEME_preprocess_page&#40;&#38;$vars&#41; &#123;
  $vars&#91;'head'&#93; [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Je réalise actuellement un <strong>thème Drupal 6&#160;en HTML5</strong> et vient le moment de déclarer comme il se doit le charset du
document. Sachant que <a href="http://drupal.org/" title="Drupal - Open Source CMS | drupal.org">Drupal</a> 6 déclare une la balise meta
destinée à un doctype XHTML, mon premier réflexe est d&#8217;appliquer une simple substitution depuis mon implémentation du
hook <code>theme_preprocess_page()</code>&#160;:</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * @file template.php
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> MYTHEME_preprocess_page<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$vars</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$vars</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'head'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_ireplace</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'&lt;meta charset=&quot;utf-8&quot;&gt;'</span><span style="color: #339933;">,</span>
    <span style="color: #000088;">$vars</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'head'</span><span style="color: #009900;">&#93;</span>
  <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<p>Mais le résultat n&#8217;est pas vraiment celui escompté.<span id="more-650"></span></p>

<h2>Une meta Content-Type en trop pour mon thème HTML5</h2>

<p>Voyez vous-même&#160;:</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE html&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> <span style="color: #000066;">lang</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fr&quot;</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>


<p>Ok, il y a bien une couille dans le pâté comme dirait l&#8217;autre. Mon charset XHTML est toujours là.</p>

<p><strong>Note&#160;:</strong><br />
Certains modules comme <a href="http://drupal.org/project/nodewords">Nodewords</a> doublent la déclaration du charset.
Ainsi la précédente substitution fonctionnera, mais un charset XHTML demeurera.</p>

<h2>Une mesure de sécurité peu flexible</h2>

<p>Il s&#8217;avère que pour prémunir toute <a href="http://code.google.com/p/doctype-mirror/wiki/ArticleUtf7">attaque par charset</a>, il a été décidé d&#8217;injecter en dur et de manière peu 
élégante la déclaration de charset depuis le core, dès la fin de la première balise ouvrante <code>&lt;head&gt;</code> rencontrée.<br />
Tout cela se passe <strong>après le traitement du dernier hook disponible</strong>, avec l&#8217;appel à la méthode 
<a href="http://api.drupal.org/api/drupal/includes!common.inc/function/drupal_final_markup/6"><code>drupal_final_markup()</code></a>.</p>

<p>À première vu je l&#8217;ai dans l&#8217;os. Et ce ne sont pas les thèmes estampillés <em>«&#160;Drupal 6 + HTML5&#160;»</em> qui me seront d&#8217;une 
grande aide puisqu&#8217;aucun ne génère un markup HTML5 valide. Vous pourrez vérifier, tous arborent la belle déclaration de 
charset XHTML, en plus de la déclaration HTML5 bien évidemment.</p>

<h2>La solution</h2>

<p>Voici l&#8217;astuce, que dis-je, le palliatif <em>quick &amp; dirty</em> que j&#8217;ai utilisé pour obtenir un en-tête HTML5 valide&#160;: puisque
la fonction <a href="http://api.drupal.org/api/drupal/includes!common.inc/function/drupal_final_markup/6"><code>drupal_final_markup()</code></a> insère la déclaration de charset à la suite de la première
balise <code>&lt;head&gt;</code> rencontrée, et bien je lui en donne une fausse a modifier&#160;:</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE html&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;!--&lt;head&gt;--&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> <span style="color: #000066;">lang</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fr&quot;</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">charset</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;utf-8&quot;</span>&gt;</span></pre></td></tr></table></div>


<p>Pour obtenir ma déclaration de charset HTML5 et rendre inactive la <strong>meta Content-Type</strong> de Drupal 6.</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE html&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;!--&lt;head&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;--&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> <span style="color: #000066;">lang</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fr&quot;</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">charset</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;utf-8&quot;</span>&gt;</span></pre></td></tr></table></div>


<p>La substitution vu en début d&#8217;article est désormais inutile, je déclare mon charset directement dans mes templates.</p>

<p><strong>Attention&#160;:</strong><br />
N&#8217;insérez jamais de commentaire avant la déclaration du doctype sous peine de faire basculer IE en quirks mode.</p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/developpement/drupal-iframe-page.html' title='Drupal 6 : utiliser une iframe comme contenu de page'>Drupal 6&#160;: utiliser une iframe comme contenu de page</a></li><li><a href='http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html' title='Utiliser Compass dans un thème WordPress, la bonne méthode'>Utiliser Compass dans un thème WordPress, la bonne méthode</a></li><li><a href='http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html' title='Compass au quotidien'>Compass au quotidien</a></li><li><a href='http://pioupioum.fr/developpement/drupal7-angoisse-theming.html' title='Les angoisses du theming sous Drupal 7'>Les angoisses du theming sous Drupal 7</a></li><li><a href='http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html' title='Compass : supprimer le cache buster des sprites'>Compass&#160;: supprimer le cache buster des sprites</a></li></ul>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=-RylCEubfM8:5cGl32nXbyw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=-RylCEubfM8:5cGl32nXbyw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=-RylCEubfM8:5cGl32nXbyw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=-RylCEubfM8:5cGl32nXbyw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=-RylCEubfM8:5cGl32nXbyw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=-RylCEubfM8:5cGl32nXbyw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=-RylCEubfM8:5cGl32nXbyw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=-RylCEubfM8:5cGl32nXbyw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=-RylCEubfM8:5cGl32nXbyw:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/-RylCEubfM8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/developpement/drupal-6-html5-supprimer-utf8-content-type.html/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/developpement/drupal-6-html5-supprimer-utf8-content-type.html</feedburner:origLink></item>
		<item>
		<title>Utiliser Compass dans un thème WordPress, la bonne méthode</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/CoYZLqiiohw/compass-theme-wordpress-the-right-way.html</link>
		<comments>http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html#comments</comments>
		<pubDate>Thu, 11 Oct 2012 15:04:37 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuces]]></category>
		<category><![CDATA[Compass]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[méthodologie]]></category>
		<category><![CDATA[Sass]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=641</guid>
		<description><![CDATA[Compass attire — à juste titre — un nombre croissant d&#8217;intégrateurs WordPress et une problématique s&#8217;impose à chaque création de thème&#160;: comment organiser mes fichiers Sass tout en respectant les contraintes du moteur de blog&#160;?

En effet, un thème WordPress requiert à sa racine un fichier style.css muni d&#8217;un bloc de commentaire en en-tête pour stocker [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><a href="http://compass-style.org" title="Compass Home | Compass Documentation">Compass</a> attire — à juste titre — un nombre croissant d&#8217;intégrateurs WordPress et une problématique s&#8217;impose à chaque création de thème&#160;: <strong>comment organiser mes fichiers Sass tout en respectant les contraintes du moteur de blog&#160;?</strong></p>

<p>En effet, un thème WordPress requiert à sa racine un fichier <code>style.css</code> muni d&#8217;un bloc de commentaire en en-tête pour stocker ses métadonnées. Rien de bien compliqué jusque là. Imaginons maintenant que vous souhaitez aussi générer d&#8217;autres feuilles de styles dans sous-répertoire <code>css/</code>.</p>

<p>Il existe des <a href="http://css-tricks.com/compass-compiling-and-wordpress-themes/">solutions</a> mais elles sont complexes, lorsqu&#8217;une connaissance du fonctionnement de Compass suffit.</p>

<p><div id="attachment_640" class="wp-caption aligncenter" style="width: 620px"><a href="/compass-theme-wordpress-the-right-way.html"><img src="http://assets1.pioupioum.fr/uploads/2012/10/manhattan_depuis_brooklyn_bridge-by-marie_olive.jpg" alt="Manhattan depuis Brooklyn Bridge par Marie Olive" title="Utiliser Compass dans un thème Wordpress, la bonne méthode" width="610" height="350" class="size-medium wp-image-600" /></a><p class="wp-caption-text">Crédits&#160;: <a href="http://www.flickr.com/photos/le_piaf_fou/6889718918">Manhattan depuis Brooklyn Bridge</a> par <a href="http://www.flickr.com/photos/le_piaf_fou/">Marie Olive</a></p></div>
<span id="more-641"></span></p>

<h2>Initialiser un <strong>thème WordPress</strong> à la sauce Compass</h2>

<p>Dans un premier temps, générons l&#8217;arborescence du thème (avec la console, c&#8217;est tellement plus rapide :p)&#160;:</p>

<pre><code>$ cd votre-racine-wordpress/wp-content/themes
$ mkdir -p your-theme/{img,sass/{css,partials}}
$ cd your-theme
$ touch index.php config.rb sass/{style,partials/_{base,grid,typography},css/sub-section}.scss
</code></pre>

<p>L&#8217;arborescence obtenue&#160;:</p>

<pre><code>your-theme/
├── img/
├── sass/
│   ├── css/
│   │   └── sub-section.scss
│   ├── partials/
│   │   ├── _base.scss
│   │   ├── _grid.scss
│   │   └── _typography.scss
│   └── style.scss
├── config.rb
└── index.php
</code></pre>

<p>Oui, tous les fichiers Sass sont regroupés au sein du répertoire éponyme et aucun fichier <code>style.scss</code> n&#8217;est présent à la racine du thème.</p>

<h2>Conserver un commentaire après compilation Sass</h2>

<p>Renseignez les métadonnées de votre thème dans le fichier <code>sass/style.scss</code>, en veillant à commencer le bloc de commentaire par la chaîne <code>/*!</code>&#160;:</p>

<pre><code>/*!
Theme Name: Your Theme
Author: your team
etc…
*/
</code></pre>

<p>Le marqueur <code>/*!</code> indique à Sass (et non Compass) de conserver le bloc de commentaire dans la feuille de styles générée, impeccable <img src='http://pioupioum.fr/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p><strong>Note&#160;:</strong><br />
Le commentaire est également conservé lorsque l&#8217;environnement Compass est défini à <code>production</code>. Aussi, le marqueur <code>/*!</code> est remplacé par une ouverture de commentaire normale <code>/*</code>.</p>

<h2>Configurer le projet Compass</h2>

<p>Le travail le plus important reste à faire&#160;: indiquer à Compass où trouver les fichiers sources Sass et la destination des fichiers compilés. Habituellement, en tant qu&#8217;utilisateur de Sass ou Compass, on désigne un répertoire de destination pour réceptionner <strong>toutes</strong> les feuilles de styles présentent à la racine du dossier des sources Sass. Par exemple, tous les fichiers non préfixés par un <code>_</code> situés à la racine de <code>sass/</code> seront générés dans le dossier <code>css/</code>.<br />
Dans le cas présent, nous souhaiterions obtenir un fichier <code>style.css</code> à la racine du thème et un fichier <code>sub-section.css</code> dans le répertoire <code>css/</code>, donc à deux emplacements. Soit l&#8217;arborescence&#160;:</p>

<pre><code>your-theme/
├── css/
│   └── sub-section.css
├── img/
├── sass/
│   ├── partials/
│   │   ├── _base.scss
│   │   ├── _grid.scss
│   │   └── _typography.scss
│   └── style.scss
├── config.rb
├── index.php
└── style.css
</code></pre>

<p>Deux subtilités du fonctionnement de Compass vont aider à résoudre aisément ce petit problème&#160;:</p>

<ol>
<li>tout fichier non préfixé par un tiret bas <code>_</code> sera généré, quelque-soit son niveau de profondeur. Son arborescence sera elle aussi créée.</li>
<li>un chemin dans les options de configuration du projet peut être vide (ou égal à <code>.</code>) pour indiquer le chemin courant.</li>
</ol>

<p>Ainsi, éditez le fichier <code>config.rb</code> comme ci-dessous pour préciser une cible vide pour l&#8217;option <code>css_dir</code>&#160;:</p>

<pre><code>sass_dir   = 'sass'
css_dir    = ''
images_dir = 'img'
relative_assets = true
</code></pre>

<p><strong>Note&#160;:</strong><br />
Je vous invite à consulter le billet <a href="http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html" title="Compass au quotidien &#8211; Compass Cheat Sheet – piouPiouM&#039;s dev">Compass au quotidien</a> pour découvrir des options de configuration complémentaires.</p>

<h2>Compiler les styles Sass du thème WordPress</h2>

<p>Le thème est désormais correctement initialisé, vous pouvez le compiler en vous positionnant au préalable dans le répertoire de votre thème&#160;:</p>

<pre><code>$ cd your-theme
$ compass compile
directory css/ 
   create css/sub-section.css 
   create style.css
</code></pre>

<p>Comme prévu, Compass a bien créé les fichiers <code>css/sub-section.css</code> et <code>style.css</code> \o/</p>

<h2><em>Quid</em> du chemin des images&#160;?</h2>

<p>N&#8217;ayez aucune inquiétude, Compass s&#8217;assurera du bon chemin d&#8217;accès des images, à condition que vous ayez bien configuré le chemin des images <em>via</em> l&#8217;option <code>images_dir</code>.</p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/developpement/compass-sass-rvm-bundler-gestion-projet.html' title='Gestion avancée de Sass et Compass avec RVM et Bundler'>Gestion avancée de Sass et Compass avec RVM et Bundler</a></li><li><a href='http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html' title='Compass au quotidien'>Compass au quotidien</a></li><li><a href='http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html' title='Compass : supprimer le cache buster des sprites'>Compass&#160;: supprimer le cache buster des sprites</a></li><li><a href='http://pioupioum.fr/developpement/compass-rvm-multiple-instances.html' title='Instances multiples de Compass avec Ruby Version Manager (rvm)'>Instances multiples de Compass avec Ruby Version Manager (rvm)</a></li><li><a href='http://pioupioum.fr/snippets/wordpress-autoriser-upload-media-format-inconnu.html' title='WordPress : autoriser l&#8217;upload de fichiers au format non-supporté'>WordPress&#160;: autoriser l&#8217;upload de fichiers au format non-supporté</a></li></ul>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=CoYZLqiiohw:OF3ckgIzvzo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=CoYZLqiiohw:OF3ckgIzvzo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=CoYZLqiiohw:OF3ckgIzvzo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=CoYZLqiiohw:OF3ckgIzvzo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=CoYZLqiiohw:OF3ckgIzvzo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=CoYZLqiiohw:OF3ckgIzvzo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=CoYZLqiiohw:OF3ckgIzvzo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=CoYZLqiiohw:OF3ckgIzvzo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=CoYZLqiiohw:OF3ckgIzvzo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/CoYZLqiiohw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html</feedburner:origLink></item>
		<item>
		<title>Support de présentation de l’atelier « Compass, sauvez l’intégrateur ! »</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/3PzOmKVvOOA/support-presentation-compass-wel4.html</link>
		<comments>http://pioupioum.fr/developpement/support-presentation-compass-wel4.html#comments</comments>
		<pubDate>Mon, 25 Jun 2012 11:25:19 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Compass]]></category>
		<category><![CDATA[conférence]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=632</guid>
		<description><![CDATA[J&#8217;ai eu la chance de donner la semaine dernière un atelier sur Compass à l&#8217;occasion de la 4ème édition du Web Event Lyon.

Retrouvez le support l&#8217;atelier&#160;: Compass, sauvez l&#8217;intégrateur&#160;!.




Bien que de courte durée, l&#8217;atelier a pu se prolonger avec barcamp improvisé de 2h. Les nombreuses questions posées me font dire que Compass et Sass sont [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>J&#8217;ai eu la chance de donner la semaine dernière un atelier sur <strong><a href="http://compass-style.org/">Compass</a></strong> à l&#8217;occasion de la 4ème édition du <a href="http://event.lafermeduweb.net/">Web Event Lyon</a>.</p>

<p>Retrouvez le support l&#8217;atelier&#160;: <strong><a href="/compass-sauvez-integrateur/">Compass, sauvez l&#8217;intégrateur&#160;!</a></strong>.</p>

<p><a href="/developpement/support-presentation-compass-wel4.html" title="Logo Web Event Lyon #4"><img width="573" height="254" src="http://assets1.pioupioum.fr/uploads/2012/06/wel4.jpg" class="attachment-medium" alt="Logo Web Event Lyon #4"/></a>
<span id="more-632"></span></p>

<p>Bien que de courte durée, l&#8217;atelier a pu se prolonger avec barcamp improvisé de 2h. Les nombreuses questions posées me font dire que Compass et <strong><a href="http://sass-lang.com/">Sass</a></strong> sont enfin pris au sérieux en France \o/ Tous deux attirent de plus en plus l&#8217;attention de mes confrères développeurs web et c&#8217;est une bonne nouvelle.</p>

<p>C&#8217;est pourquoi ce support n&#8217;est pas figé dans le marbre. Je le complèterai régulièrement lorsqu&#8217;un problème ou une question deviendra récurrente.</p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/developpement/compass-sass-rvm-bundler-gestion-projet.html' title='Gestion avancée de Sass et Compass avec RVM et Bundler'>Gestion avancée de Sass et Compass avec RVM et Bundler</a></li><li><a href='http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html' title='Utiliser Compass dans un thème WordPress, la bonne méthode'>Utiliser Compass dans un thème WordPress, la bonne méthode</a></li><li><a href='http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html' title='Compass au quotidien'>Compass au quotidien</a></li><li><a href='http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html' title='Compass : supprimer le cache buster des sprites'>Compass&#160;: supprimer le cache buster des sprites</a></li><li><a href='http://pioupioum.fr/developpement/compass-rvm-multiple-instances.html' title='Instances multiples de Compass avec Ruby Version Manager (rvm)'>Instances multiples de Compass avec Ruby Version Manager (rvm)</a></li></ul>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3PzOmKVvOOA:HqX0GO0teY0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=3PzOmKVvOOA:HqX0GO0teY0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3PzOmKVvOOA:HqX0GO0teY0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3PzOmKVvOOA:HqX0GO0teY0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=3PzOmKVvOOA:HqX0GO0teY0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3PzOmKVvOOA:HqX0GO0teY0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=3PzOmKVvOOA:HqX0GO0teY0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3PzOmKVvOOA:HqX0GO0teY0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=3PzOmKVvOOA:HqX0GO0teY0:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/3PzOmKVvOOA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/developpement/support-presentation-compass-wel4.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/developpement/support-presentation-compass-wel4.html</feedburner:origLink></item>
		<item>
		<title>Compass au quotidien</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/uJFpzuw10h0/compass-usage-quotidien-cheatsheet.html</link>
		<comments>http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html#comments</comments>
		<pubDate>Sun, 29 Apr 2012 15:31:39 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuces]]></category>
		<category><![CDATA[Compass]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[méthodologie]]></category>
		<category><![CDATA[productivité]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=625</guid>
		<description><![CDATA[Sass et Compass éveillent de plus en plus la curiosité des intégrateurs Web et développeurs front-end français. Malheureusement je ne peux que constater une certaine réticence de leur part à sauter le pas.
La faute en incombe généralement à une frayeur démesurée de la ligne de commande et, il est vrai, 
à un manque de ressources [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Sass et Compass éveillent de plus en plus la curiosité des intégrateurs Web et développeurs front-end français. Malheureusement je ne peux que constater une certaine réticence de leur part à sauter le pas.<br />
La faute en incombe généralement à une <strong>frayeur démesurée</strong> de la ligne de commande et, il est vrai, 
à un manque de ressources francophones qui expliquent comment intégrer l&#8217;outil dans son processus métier.</p>

<p>Je vous propose ici la méthode de travail générique que j&#8217;utilise depuis maintenant 2 ans 
dans mon environnement professionnel. Je précise bien <em>générique</em> parce que certains projetss peuvent 
imposer une organisation différente.</p>

<p><div id="attachment_624" class="wp-caption aligncenter" style="width: 620px"><a href="/developpement/compass-usage-quotidien-stylesheet.html"><img src="http://assets1.pioupioum.fr/uploads/2012/04/post_it_marilyn-by-peter_hellberg.jpg" alt="Post-it Marilyn par Peter Hellberg" title="Compass au quotidien" width="610" height="300" class="size-medium wp-image-600" /></a><p class="wp-caption-text">Crédits&#160;: <a href="http://www.flickr.com/photos/peterhellberg/4625578444">Post-it Marilyn</a> par <a href="http://www.flickr.com/people/peterhellberg/">Peter Hellberg</a> sous licence <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.fr">CC BY-SA 2.0</a></p></div>
<span id="more-625"></span></p>

<h2>Initialiser un nouveau projet Compass</h2>

<p>Mon projet est généralement contenu dans un projet plus conséquent, comme par exemple un thème Drupal pour lequel j&#8217;ai déjà créé son répertoire. Il me suffit ainsi d&#8217;initialiser un nouveau <strong>projet Compass</strong>, chose aisée grâce à sa commande <code>init</code>&#160;:</p>

<pre><code>$ compass init --prepare --sass-dir sass --css-dir css --images-dir img --relative-assets
directory css/ 
directory sass/ 
   create config.rb
</code></pre>

<p>Puisque je ne souhaite pas que Compass me génère de feuilles de styles par défaut, 
j&#8217;utilise ici l&#8217;option <code>--prepare</code> qui limitera son action à créer&#160;:</p>

<ul>
<li>le fichier de configuration du projet <code>config.rb</code>&#160;;</li>
<li>le répertoires accueillant les sources SCSS nommé ici <code>sass</code>&#160;;</li>
<li>le dossier de destination des feuilles de styles générées <code>css</code>.</li>
</ul>

<p>Cela fait, j&#8217;édite le fichier de configuration pour paramétrer les 2 environnements de déployement 
(<code>development</code> et <code>production</code>, sachant que <code>development</code> est celui par défaut) et pour empêcher 
Compass d&#8217;ajouter un éventuel <a href="http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html" title="Compass : supprimer le cache buster des sprites &#8211; Remove sprite hash – piouPiouM&#039;s dev">cache buster</a>&#160;:</p>

<pre><code>if environment == :production
  output_style = :compressed
else
  output_style = :expanded
  sass_options = { :debug_info =&gt; true }
end

# Désactiver l'ajout du cache buster sur les images appelées via la fonction image-url().
asset_cache_buster :none
</code></pre>

<p><strong>Note&#160;:</strong><br />
La ligne qui contient <code>:debug_info</code> me permet d&#8217;utiliser le plugin pour Firefox <a href="https://addons.mozilla.org/fr/firefox/addon/firesass-for-firebug/">FireSass</a>.</p>

<p>Ok, mon projet Compass est presque prêt. Il ne me manque plus qu&#8217;à créer quelques répertoires et 
fichiers que j&#8217;utilise habituellement&#160;:</p>

<pre><code>$ mkdir -p sass/partials/{reset,ui}
$ touch sass/{style,reset,partials/_{base,reset,ui}}.scss
</code></pre>

<p>Mon arborescence finale&#160;:</p>

<pre><code>$ tree -F
.
├── config.rb
├── css/
└── sass/
    ├── partials/
    │   ├── _base.scss
    │   ├── _reset.scss
    │   ├── _ui.scss
    │   ├── reset/
    │   └── ui/
    ├── reset.scss
    └── style.scss
</code></pre>

<h2>Méthodologie de travail avec Compass</h2>

<p>Après toute modification qui nécessite une vérification du résultat de ma part<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>, je lance une 
compilation des sources Sass par une simple commande&#160;:</p>

<pre><code>$ compass compile
</code></pre>

<p>Comme aucun fichier de configuration n&#8217;est précisé, la commande <code>compile</code> lit le fichier de 
configuration <code>config.rb</code> (ou <code>compass.rb</code>).</p>

<p>Lorsque mon fichier de configuration n&#8217;est pas <em>standard</em>, je précise son emplacement avec l&#8217;argument -c&#160;:
    $ compass compile -c sass/theme.rb</p>

<p>Il est aussi possible de ne compiler qu&#8217;une seule feuille de styles, en précisant simplement
son équivalent Sass&#160;:</p>

<pre><code>$ compass compile sass/styles.scss
</code></pre>

<p>Cette opération pouvant être répétitive, Compass offre une commande <code>watch</code> qui possède les même options
que sa sœur <code>compile</code> mais qui se charge de surveiller mon projet et lancer la compilation 
dès que cela est nécessaire&#160;:</p>

<pre><code>$ compass watch
</code></pre>

<p>Un petit <kbd>Ctrl+C</kbd> stoppera la surveillance.</p>

<h2>Partager son projet Compass</h2>

<p>Jusqu&#8217;ici je ne travaillai qu&#8217;en local. Il me faut maintenant pousser mon travail sur le dépôt 
centralisé pour permettre à mes collègues d&#8217;en bénéficier.<br />
Oui, je pourrai pousser le travail en l&#8217;état, mais non je ne le fait pas. Puisque ces mêmes ressources 
sont destinée à être déployées sur le serveur de production je relance une compilation en précisant 
l&#8217;environnement <code>production</code>&#160;:</p>

<pre><code>$ compass compile -e production --force
</code></pre>

<p>L&#8217;argument <code>--force</code> m&#8217;assure que toutes les ressources seront bien compilées.</p>

<p>J&#8217;obtiens ainsi des feuilles de styles compressées, idéales pour les <strong>webperf</strong> et décourageantes pour 
la personne qui souhaiterait directement les éditer en se cognant du projet Compass parce que ça 
l&#8217;emmerde de s&#8217;y mettre<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> <img src='http://pioupioum.fr/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<blockquote>
  <p>Webperf un jour, webperf toujours&#160;!</p>
</blockquote>

<p>Dernière opération avant de pousser mon travail&#160;: j&#8217;optimise les sprites modifiés depuis la dernière fois. Évoluant sous MacOSX, j&#8217;utilise l&#8217;excellent <a href="http://imageoptim.com/" title="ImageOptim — make websites and apps load faster (Mac app)">ImageOptim</a>. Sous Linux vous pouvez vous tourner vers son équivalent <a href="http://trimage.org/" title="Trimage (lossless) image compressor">Trimage</a> et <a href="http://pnggauntlet.com/" title="PNGGauntlet - PNG Compression Software | BenHollis.net">PNGGauntlet</a> sous Windows.</p>

<h2><em>Au secours, j&#8217;ai un conflit&#160;!</em></h2>

<p>Après un <code>svn up</code> ou <code>git pull</code> il peut arriver un conflit . Il y a 98% de chances pour qu&#8217;il porte sur 
un fichier généré par Compass, à savoir une feuille de styles ou une image de sprite.<br />
Pas de problème, j&#8217;accepte la version entrante ou supprime ma version locale. Je peux ainsi visualiser dans un navigateur la dernière version récupérée et dans tous les cas il me suffit de lancer une compilation pour que mon travail soit à nouveau pris en compte (puisque les modifications entrantes des sources Sass ont été correctement fusionnées).</p>

<h2>En résumé</h2>

<p>Finalement, une fois le projet initialisé, travailler avec Compass revient à exécuter un ridicule
jeux de commandes&#160;:</p>

<pre><code>$ compass watch
CTRL+C
$ compass compile -e production --force
$ open -a "ImageOptim" img/*.png
</code></pre>

<p>Rien de sorcier, n&#8217;est-ce pas&#160;? <img src='http://pioupioum.fr/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<h2>Bonus de Compass</h2>

<p>Il peut arriver que je souhaite supprimer tout fichier généré par Compass&#160;: fichiers de cache, sprites et feuilles de styles. Rien de plus simple à l&#8217;aide de la commande <code>clean</code>&#160;:</p>

<pre><code>$ compass clean
</code></pre>

<p>Parce que les statistiques sont toujours révélatrices de points forts ou faiblesses d&#8217;un projet&#160;:</p>

<pre><code>$ compass stats
</code></pre>

<p><strong>Notes&#160;:</strong><br />
N&#8217;oubliez pas de préciser le fichier de configuration s&#8217;il n&#8217;est pas standard.</p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/developpement/compass-sass-rvm-bundler-gestion-projet.html' title='Gestion avancée de Sass et Compass avec RVM et Bundler'>Gestion avancée de Sass et Compass avec RVM et Bundler</a></li><li><a href='http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html' title='Utiliser Compass dans un thème WordPress, la bonne méthode'>Utiliser Compass dans un thème WordPress, la bonne méthode</a></li><li><a href='http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html' title='Compass : supprimer le cache buster des sprites'>Compass&#160;: supprimer le cache buster des sprites</a></li><li><a href='http://pioupioum.fr/developpement/compass-rvm-multiple-instances.html' title='Instances multiples de Compass avec Ruby Version Manager (rvm)'>Instances multiples de Compass avec Ruby Version Manager (rvm)</a></li><li><a href='http://pioupioum.fr/developpement/git-alias-productivite.html' title='Git : des alias pour aller plus vite'>Git&#160;: des alias pour aller plus vite</a></li></ul>

<div class="footnotes">
<hr />
<h4>Notes</h4>
<ol>

<li id="fn:1">
<p>sans déconner, vous avez vraiment besoin d&#8217;une solution comme <a href="http://livereload.com/" title="LiveReload">LiveReload</a>&#160;? Vous avez si peu confiance en vos compétences&#160;? :-/<br />
Sans parler du fait que c&#8217;est un coup à faire ramer votre machine lorsque le projet à rafraîchir est une
page complexe d&#8217;un CMS…&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

<li id="fn:2">
<p>mes collègues de <a href="http://www.clever-age.com/" title="Clever Garden, Clever Age, Clever Presence - 100% digital">Clever Age</a> Lyon sont géniaux&#160;: aucun n&#8217;a émit d&#8217;objection quand je leur ai 
proposé d&#8217;utiliser Compass dans leurs projets. Au contraire, ils ont été friands de nouveauté \o/&#160;<a href="#fnref:2" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=uJFpzuw10h0:mHueq8gCdtM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=uJFpzuw10h0:mHueq8gCdtM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=uJFpzuw10h0:mHueq8gCdtM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=uJFpzuw10h0:mHueq8gCdtM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=uJFpzuw10h0:mHueq8gCdtM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=uJFpzuw10h0:mHueq8gCdtM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=uJFpzuw10h0:mHueq8gCdtM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=uJFpzuw10h0:mHueq8gCdtM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=uJFpzuw10h0:mHueq8gCdtM:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/uJFpzuw10h0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html</feedburner:origLink></item>
		<item>
		<title>Les angoisses du theming sous Drupal 7</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/3FMXvjfb2BU/drupal7-angoisse-theming.html</link>
		<comments>http://pioupioum.fr/developpement/drupal7-angoisse-theming.html#comments</comments>
		<pubDate>Thu, 19 Apr 2012 22:23:33 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[drupal 7]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=595</guid>
		<description><![CDATA[Le système de theming de Drupal 7 est 
un gâchis. Jacine Luisi, co-auteure du livre The Definitive Guide to Drupal 7, résume dans son article Let’s Do Something About Drupal’s Theme System le fond de ma pensée. Au lieu de retranscrire son article ici même, je vais plutôt vous présenter de quoi il retourne.



Pourquoi le [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><strong>Le système de theming de <a href="http://drupal.org/" title="Drupal - Open Source CMS | drupal.org">Drupal 7</a> est 
un gâchis.</strong> <a href="http://jacine.net/" title="jacine">Jacine Luisi</a>, co-auteure du livre <a href="http://amazon.com/dp/1430231351" title="Amazon.com: The Definitive Guide to Drupal 7 (Definitive Guide Apress) (9781430231356): Benjamin Melancon, Jacine Luisi, Karoly Negyesi, Bojhan Somers, Stephane Corlosquet, Stefan Freudenberg, Ryan Szrama, Dan Hakimzadeh, Amye Scavarda, Allie Micka, Roy Scholten, Kasey Dolin, Sam Boyer, Mike Gifford: Books">The Definitive Guide to Drupal 7</a>, résume dans son article <a href="http://jacine.net/post/19652705220/theme-system">Let’s Do Something About Drupal’s Theme System</a> le fond de ma pensée. Au lieu de retranscrire son article ici même, je vais plutôt vous présenter de quoi il retourne.</p>

<p><div id="attachment_600" class="wp-caption aligncenter" style="width: 620px"><a href="/developpement/drupal7-angoisse-theming.html"><img src="http://assets1.pioupioum.fr/uploads/2012/04/kaos-ii.jpg" alt="Kaos - Chaos paiting (ii)" title="Pourquoi le theming Drupal est-il si compliqué ?" width="610" height="300" class="size-medium wp-image-600" /></a><p class="wp-caption-text">Crédits&#160;: <a href="http://www.flickr.com/photos/kalexanderson/6113247118/">Kaos - Chaos paiting (ii)</a> par <a href="http://www.flickr.com/people/kalexanderson/">Kristina Alexanderson</a> sous licence <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/deed.fr">CC BY-NC-SA 2.0</a></p></div></p>

<p><span id="more-595"></span></p>

<h2>Pourquoi le theming Drupal est-il si compliqué&#160;?</h2>

<p>Depuis que je travaille sur <strong>Drupal 7</strong>, il ne se passe pas une semaine sans que j&#8217;ai à pester contre son <strong>système de thème</strong>. Comme le souligne Jacine, les nombreux points d&#8217;entrées et la multiplicité de niveaux d’interactions font qu&#8217;il est souvent <strong>difficile de trouver où intervenir</strong>.</p>

<blockquote>
  <p>Quel <em>preprocess</em> appeler&#160;? Celui-ci&#160;?<br />
  Perdu. Testons dans un autre ou dans un <em>hook_alter</em>.<br />
  Toujours rien. Peut-être dans un <em>hook_process</em>&#160;?<br />
  Finalement, il me faut surcharger un <em>hook_theme</em> parce que je ne peux agir sur ce <em>pre-render</em>…</p>
</blockquote>

<p>J&#8217;exagère un peu, quoique, pas tant que ça finalement.<br />
Vous allez me dire qu&#8217;avec Drupal 6 nous étions habitué à cette gymnastique mentale, ce à quoi je réponds oui, mais. Mais, c&#8217;était moins anarchique.  Exemple.</p>

<h2>Un exemple tout bête</h2>

<p>Pour un type de contenu spécifique, un client demande à pouvoir insérer librement du code JavaScript et des styles CSS depuis l&#8217;espace de contribution. Pas de problème, il me suffit de récupérer le contenu des champs et de les attacher à la page à l&#8217;aide des fonctions 
<a href="http://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_add_js/7" title="drupal_add_js | Drupal 7 API"><code>drupal_add_js</code></a> et <a href="http://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_add_css/7" title="drupal_add_css | Drupal 7 API"><code>drupal_add_css</code></a> en précisant un type <code>inline</code> et les scopes appropriés. Ni une ni deux, je m&#8217;exécute et fais le nécessaire dans une implémentation de <code>hook_preprocess_node()</code> et, sans surprise, cela fonctionne.</p>

<p><strong>Note&#160;:</strong> les extraits de codes qui suivent sont simplifiés pour se focaliser sur le sujet.</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * @file template.php
 */</span>
<span style="color: #009933; font-style: italic;">/**
 * Implements hook_preprocess_node().
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> MYTHEME_preprocess_node<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$vars</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">// Nous utilisons la propriété `value` au lieu de `safe_value` qui encode les quotes.</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vars</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'field_inline_css'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'value'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    drupal_add_css<span style="color: #009900;">&#40;</span><span style="color: #000088;">$vars</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'field_inline_css'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'value'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
      <span style="color: #0000ff;">'type'</span>       <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'inline'</span><span style="color: #339933;">,</span>
      <span style="color: #0000ff;">'group'</span>      <span style="color: #339933;">=&gt;</span> CSS_THEME<span style="color: #339933;">,</span>
      <span style="color: #0000ff;">'every_page'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
      <span style="color: #0000ff;">'media'</span>      <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'all'</span><span style="color: #339933;">,</span>
      <span style="color: #0000ff;">'preprocess'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// ne pas aggréger avec les autres styles</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #666666; font-style: italic;">// -- snip --</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<p>Malheureusement le markup HTML des champs est malgré tout généré dans le flux du contenu. Ok, il me suffit de les masquer (au sens Drupal 7 du terme). Je regarde pour appliquer un coup de <a href="http://api.drupal.org/api/drupal/includes%21common.inc/function/hide/7" title="hide | Drupal 7 API"><code>hide()</code></a> sur mes champs depuis mon implémentation du <code>preprocess_node</code>. Mince, ces derniers sont déjà marqués comme rendus, leurs contenu calculé, etc. Pas mieux depuis un <a href="http://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_page_alter/7" title="hook_page_alter | Drupal 7 API"><code>hook_page_alter()</code></a>, ni depuis le fichier de template dédié. Pourtant la documentation officielle ne cesse de montrer comme il est facile de gérer la visibilité des champs.</p>

<p>Que faire&#160;? Dois-je perdre du temps pour rendre un à un tous les champs à afficher pour ce type de contenu, ou est-ce que je pousse un peu l&#8217;investigation&#160;? J&#8217;opte pour la seconde option tellement cette situation me paraît ridicule.</p>

<p>Rapidement, je trouve que je peux masquer mes champs en implémentant le <a href="http://api.drupal.org/api/drupal/modules%21node%21node.api.php/function/hook_node_view_alter/7" title="hook_node_view_alter | Drupal 7 API"><code>hook_node_view_alter()</code></a>. Tout fonctionne.</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * @file template.php
 */</span>
<span style="color: #009933; font-style: italic;">/**
 * Implements hook_node_view_alter().
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> MYTHEME_node_view_alter<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$build</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  hide<span style="color: #009900;">&#40;</span><span style="color: #000088;">$build</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'field_inline_css'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  hide<span style="color: #009900;">&#40;</span><span style="color: #000088;">$build</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'field_inline_js'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<p>Cependant, gérer ces champs à deux endroits n&#8217;est pas des plus lisible. Je rapatrie donc le code ajouté dans l&#8217;implémentation du <code>hook_preprocess_node()</code> dans mon <code>hook_node_view_alter</code>.<br />
Déconfiture&#160;: seule l&#8217;injection du JavaScript est prise en compte. Celle des styles CSS est tout bonnement ignorée ;!</p>

<p><strong>WTF Drupal (╯°□°）╯︵ ┻━┻</strong></p>

<p>Et c&#8217;est ainsi que je me suis résigné à scinder cette étape de theming en 2 emplacements distincts. Le tout agrémenté d&#8217;explications en commentaires pour ne pas m&#8217;y perdre dans quelques mois ou tout simplement pour aider mes collègues à s&#8217;y retrouver.</p>

<h2>Comment en est-on arrivé là&#160;?</h2>

<p>La faute en incombe en partie à une structure de données non normalisée couplée à un système de <em><a href="http://drupal.org/node/930760" title="Render Arrays in Drupal 7 | drupal.org">render array</a></em> alléchant mais qui ne tient pas ses promesses. Tout module gère ses données à transmettre à l&#8217;<a href="http://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_render/7" title="drupal_render | Drupal 7 API">API render</a> comme bon lui chante. De ce fait il existe presque autant de cas de figure qu&#8217;il y a de modules :-/ Au niveau des fichiers de template, nous avons le droit à une soupe de variables au type simple et de <em>render array</em>.</p>

<p>Également, les modules peuvent transformer la structure des <em>render array</em> et nous mettre des bâtons dans les roues pour le theming (les modules <a href="http://drupal.org/project/field_group" title="Field group | drupal.org">Field Group</a> et <a href="http://drupal.org/project/ds" title="Display Suite | drupal.org">Display Suite</a> en sont de bons exemples).</p>

<p>Pour finir, bien des situations complexes pourraient être évités si le core de Drupal exploitait systématiquement les <em>render array</em>. Il arrive toujours un moment où, alors que nous cherchons à modifier le <code>#prefix</code> d&#8217;un élément, l&#8217;on tombe sur du pur HTML. Tout ça parce qu&#8217;une implémentation du <a href="http://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_theme/7" title="hook_theme | Drupal 7 API"><code>hook_theme()</code></a> ne retourne pas de <em>render array</em>, comme <a href="http://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_links/7" title="theme_links | Drupal 7 API"><code>theme_links()</code></a> par exemple…</p>

<h2>L&#8217;avenir du theming avec Drupal 8</h2>

<p>FIXME. C&#8217;est l&#8217;idée <img src='http://pioupioum.fr/wp/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> <br />
Jacine propose une <a href="http://jacine.github.com/drupal/">standardisation de composant</a> qui aura le bénéfice de simplifier le templating en rationnalisant la construction d&#8217;une page et, <strong>surtout</strong>, chaque module pourra arrêter de nous noyer sous des kilomètres de classes CSS <em>&#8220;au cas où…&#8221;</em>.</p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/developpement/drupal-6-html5-supprimer-utf8-content-type.html' title='Drupal 6 : résoudre le problème du double charset dans un thème HTML5'>Drupal 6&#160;: résoudre le problème du double charset dans un thème HTML5</a></li><li><a href='http://pioupioum.fr/developpement/drupal-iframe-page.html' title='Drupal 6 : utiliser une iframe comme contenu de page'>Drupal 6&#160;: utiliser une iframe comme contenu de page</a></li></ul>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3FMXvjfb2BU:M4YUBBlmQzE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=3FMXvjfb2BU:M4YUBBlmQzE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3FMXvjfb2BU:M4YUBBlmQzE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3FMXvjfb2BU:M4YUBBlmQzE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=3FMXvjfb2BU:M4YUBBlmQzE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3FMXvjfb2BU:M4YUBBlmQzE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=3FMXvjfb2BU:M4YUBBlmQzE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=3FMXvjfb2BU:M4YUBBlmQzE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=3FMXvjfb2BU:M4YUBBlmQzE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/3FMXvjfb2BU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/developpement/drupal7-angoisse-theming.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/developpement/drupal7-angoisse-theming.html</feedburner:origLink></item>
		<item>
		<title>Page Fan : ajout simplifié d’application onglet à vos pages fan Facebook</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/onrXMct_vhw/facebook-application-add-page-tab-bookmarklet.html</link>
		<comments>http://pioupioum.fr/outils-astuces/facebook-application-add-page-tab-bookmarklet.html#comments</comments>
		<pubDate>Fri, 23 Dec 2011 20:53:42 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Outils, trucs et astuces]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=562</guid>
		<description><![CDATA[Facebook a annoncé la suppression des profils d&#8217;applications au 1er février 2012. Vous ne pourrez plus associer une application onglet à une page fan comme vous le faisiez actuellement. En effet, la page de profil d&#8217;une application mettait à disposition un lien pour ajouter cette dernière à/aux page(s) fan de votre choix.

Facebook propose bien de [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><strong>Facebook</strong> a annoncé la <strong><a href="https://developers.facebook.com/blog/post/611/">suppression des profils d&#8217;applications</a></strong> au 1er février 2012. Vous ne pourrez plus associer une application onglet à une page fan comme vous le faisiez actuellement. En effet, la page de profil d&#8217;une application mettait à disposition un lien pour ajouter cette dernière à/aux page(s) fan de votre choix.</p>

<p>Facebook propose bien de créer manuellement une page associée à votre application, mais vu son utilité autant s&#8217;en passer. À la place, et pour éviter 50 clics supplémentaires, je vous propose, amis <em>Community manager</em>, un <strong>bookmarklet</strong> qui permet d&#8217;associer aisément vos applications à des <strong>pages fan Facebook</strong>.<span id="more-562"></span></p>

<h2>Mises à jour</h2>

<p><strong>20 juin 2012</strong><br />
L&#8217;API JavaScript de Facebook ayant évoluée, le bookmarklet n&#8217;était plus fonctionnel. Il fonctionne à nouveau en forçant l&#8217;appel au domaine <code>https://www.facebook.com</code>.</p>

<p><strong>16 mars 2013</strong><br />
La page de gestion des applications FaceBook a évolué fonctionnellement (rien de visible pour l&#8217;utilisateur). Correction du bookmarklet.<br />
Merci <a href="#comment-37792">@GoPro-Amateur</a> pour me l&#8217;avoir signalé.</p>

<h2>Mise en place du bookmarklet</h2>

<p>Glissez-déposez simplement le lien ci-dessous dans les favoris de votre navigateur&#160;; dans votre barre personnelle par exemple.</p>

<div class="box bookmarklet">
    <a href="javascript:(function(w,z,a,d,e,f,g,undefined){a=w['DeveloperAppTransitions'];b=w.location;f=%22developers.facebook.com%22;if(f!=b.hostname||!a){alert(%22Veuillez%20vous%20placer%20sur%20le%20profil%20d'une%20application%20Facebook.%22);return;}try{d=a._appID;if(!d){g=new%20RegExp(f.replace(/\./g,%22\\.%22)+%22/apps/(\\d+)(?:/[^$]*)?$%22,%22i%22);d=g.exec(b.href)[1];}}catch(e){d=prompt(%22Veuillez%20saisir%20l'identifiant%20de%20l'application%22,%22%22);if(d==null)return;}w.location=z+%22/dialog/pagetab?app_id=%22+d+%22&#038;display=page&#038;redirect_uri=%22+z;}(window,%22https://www.facebook.com%22));" title='Adding an app to a Page – Facebook'><span>FB Add Page Tab</span></a>
</div>

<h2>Utilisation du bookmarklet <em>Facebook Add Page Tab</em></h2>

<p>Rendez-vous sur la page de configuration de votre application<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> puis cliquez sur le <strong>bookmarklet</strong>. Ce dernier vous redirige vers une page Facebook vous demandant les pages qui accueilleront votre application. L&#8217;association faite, vous serez redirigés sur l&#8217;accueil de Facebook, et pourrez accéder à votre/vos page(s) mise(s) à jour <em>via</em> le moteur de recherche ou le manager de pages.</p>

<p><div id="attachment_561" class="wp-caption aligncenter" style="width: 513px"><a href="http://assets1.pioupioum.fr/uploads/2011/12/facebook-configuration-application.jpg"><img src="http://assets1.pioupioum.fr/uploads/2011/12/facebook-configuration-application-503x350.jpg" alt="Page de configuration d&#039;une application Facebook" title="facebook-configuration-application" width="503" height="350" class="size-medium wp-image-561" /></a><p class="wp-caption-text">Page de configuration d&#8217;une application Facebook</p></div></p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/outils-astuces/dailymotion-download-bookmarklet.html' title='Dailymotion Download Bookmarklet'>Dailymotion Download Bookmarklet</a></li><li><a href='http://pioupioum.fr/developpement/javascript-array-intersection.html' title='JavaScript : optimiser le calcul de l&#8217;intersection de tableaux de grandes tailles'>JavaScript&#160;: optimiser le calcul de l&#8217;intersection de tableaux de grandes tailles</a></li><li><a href='http://pioupioum.fr/developpement/jslint-console-rhino.html' title='Une console JSLint pour aider vos validations JavaScript'>Une console JSLint pour aider vos validations JavaScript</a></li><li><a href='http://pioupioum.fr/developpement/optimiser-rapidite-chargement-adsense-jquery.html' title='Optimiser le chargement des AdSense'>Optimiser le chargement des AdSense</a></li><li><a href='http://pioupioum.fr/developpement/jquery-color-plugin-animation-rgba-support.html' title='Du RGBA dans vos animations avec le plugin jQuery Color'>Du RGBA dans vos animations avec le plugin jQuery Color</a></li></ul>

<div class="footnotes">
<hr />
<h4>Notes</h4>
<ol>

<li id="fn:1">
<p>il s&#8217;agit de la page sur laquelle vous récupérez l&#8217;ID de l&#8217;application.&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=onrXMct_vhw:sZQ4xZmhFeo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=onrXMct_vhw:sZQ4xZmhFeo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=onrXMct_vhw:sZQ4xZmhFeo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=onrXMct_vhw:sZQ4xZmhFeo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=onrXMct_vhw:sZQ4xZmhFeo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=onrXMct_vhw:sZQ4xZmhFeo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=onrXMct_vhw:sZQ4xZmhFeo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=onrXMct_vhw:sZQ4xZmhFeo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=onrXMct_vhw:sZQ4xZmhFeo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/onrXMct_vhw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/outils-astuces/facebook-application-add-page-tab-bookmarklet.html/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/outils-astuces/facebook-application-add-page-tab-bookmarklet.html</feedburner:origLink></item>
		<item>
		<title>Compass : supprimer le cache buster des sprites</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/fAm-y5Al7Xk/compass-sprites-supprimer-cache-buster.html</link>
		<comments>http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html#comments</comments>
		<pubDate>Wed, 15 Jun 2011 18:22:54 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuces]]></category>
		<category><![CDATA[Compass]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=543</guid>
		<description><![CDATA[Le générateur de sprites de Compass 0.11.31 crée des images dont le nom a pour format &#60;map>-&#60;hash>.png où &#60;map> correspond au nom du répertoire qui contient les images du sprite et -&#60;hash> à un hash qui&#160;:


assure l&#8217;unicité du fichier généré&#160;;
fait office de cache buster.


Seulement voilà, chaque modification de sprite (par un ajout ou décalage d&#8217;image [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Le générateur de <strong>sprites de Compass 0.11.3</strong><sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> crée des images dont le nom a pour format <code>&lt;map>-&lt;hash>.png</code> où <code>&lt;map></code> correspond au nom du répertoire qui contient les images du sprite et <code>-&lt;hash></code> à un hash qui&#160;:</p>

<ul>
<li>assure l&#8217;unicité du fichier généré&#160;;</li>
<li>fait office de <strong><span lang="en">cache buster</span></strong>.</li>
</ul>

<p>Seulement voilà, chaque modification de sprite (par un ajout ou décalage d&#8217;image par exemple) va générer une image avec un hash différent<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup>, ce qui rend la gestion du dépôt d&#8217;un projet versionné assez prise de tête.<br />
Heureusement, il est possible de ruser.<span id="more-543"></span></p>

<p>Pour ce faire, il suffit d&#8217;implémenter les <span lang="en">callbacks <strong><code>on_sprite_saved</code></strong> et <strong><code>on_stylesheet_saved</code></strong></span> dans le fichier de configuration du projet, comme suit&#160;:</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#</span>
<span style="color:#008000; font-style:italic;"># config.rb</span>
<span style="color:#008000; font-style:italic;">#</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Réaliser une copie des sprites avec un nom dépourvu du hash d'unicité.</span>
on_sprite_saved <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>filename<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">exists</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">cp</span> filename, filename.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">%</span>r<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">-</span>s<span style="color:#006600; font-weight:bold;">&#91;</span>a<span style="color:#006600; font-weight:bold;">-</span>z0<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">9</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#125;</span>\.<span style="color:#9900CC;">png</span>$<span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#996600;">'.png'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Remplacer dans les feuilles de styles générés les références aux sprites par</span>
<span style="color:#008000; font-style:italic;"># leurs équivalents dépourvus du hash d'unicité.</span>
on_stylesheet_saved <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>filename<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">exists</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>
    css = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">read</span> filename
    <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename, <span style="color:#996600;">'w+'</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>f<span style="color:#006600; font-weight:bold;">|</span>
      f <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> css.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">%</span>r<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">-</span>s<span style="color:#006600; font-weight:bold;">&#91;</span>a<span style="color:#006600; font-weight:bold;">-</span>z0<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">9</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#125;</span>\.<span style="color:#9900CC;">png</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#996600;">'.png'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>


<p>Ainsi, après chaque génération de sprite par <a href="http://compass-style.org/" title="Compass Home | Compass Documentation">Compass</a>, une copie de l&#8217;image dépourvue du hash d&#8217;unicité est réalisée. Cela s&#8217;accompagne bien évidemment par un remplacement de leurs appels dans les feuilles de styles.<br />
Il ne reste plus qu&#8217;à ignorer les images ayant un hash au niveau de votre <span lang="en">repository</span> pour ne pas polluer ce dernier.</p>

<p>Je suis conscient qu&#8217;il y aurait plus <span lang="en">secure</span> (je pense notamment aux substitutions dans les feuilles de style), mais disons que cela me convient dans l&#8217;immédiat, et qu&#8217;accessoirement je ne fais pas de ruby <img src='http://pioupioum.fr/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/developpement/compass-sass-rvm-bundler-gestion-projet.html' title='Gestion avancée de Sass et Compass avec RVM et Bundler'>Gestion avancée de Sass et Compass avec RVM et Bundler</a></li><li><a href='http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html' title='Utiliser Compass dans un thème WordPress, la bonne méthode'>Utiliser Compass dans un thème WordPress, la bonne méthode</a></li><li><a href='http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html' title='Compass au quotidien'>Compass au quotidien</a></li><li><a href='http://pioupioum.fr/developpement/compass-rvm-multiple-instances.html' title='Instances multiples de Compass avec Ruby Version Manager (rvm)'>Instances multiples de Compass avec Ruby Version Manager (rvm)</a></li><li><a href='http://pioupioum.fr/developpement/drupal-6-html5-supprimer-utf8-content-type.html' title='Drupal 6 : résoudre le problème du double charset dans un thème HTML5'>Drupal 6&#160;: résoudre le problème du double charset dans un thème HTML5</a></li></ul>

<div class="footnotes">
<hr />
<h4>Notes</h4>
<ol>

<li id="fn:1">
<p><strong>attention&#160;:</strong> les versions de Compass inférieures à 0.11.3 souffrent de bugs qui empêchent cette astuce de fonctionner.&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

<li id="fn:2">
<p>les fichiers obsolètes étants automatiquement supprimés, à moins que la variable de configuration <code>$&lt;map&gt;-clean-up</code> soit positionnée à <code>false</code>.&#160;<a href="#fnref:2" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=fAm-y5Al7Xk:mdhHQdONZrA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=fAm-y5Al7Xk:mdhHQdONZrA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=fAm-y5Al7Xk:mdhHQdONZrA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=fAm-y5Al7Xk:mdhHQdONZrA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=fAm-y5Al7Xk:mdhHQdONZrA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=fAm-y5Al7Xk:mdhHQdONZrA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=fAm-y5Al7Xk:mdhHQdONZrA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=fAm-y5Al7Xk:mdhHQdONZrA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=fAm-y5Al7Xk:mdhHQdONZrA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/fAm-y5Al7Xk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html</feedburner:origLink></item>
		<item>
		<title>Drupal 6 : utiliser une iframe comme contenu de page</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/O8--qFuMo5k/drupal-iframe-page.html</link>
		<comments>http://pioupioum.fr/developpement/drupal-iframe-page.html#comments</comments>
		<pubDate>Sun, 29 May 2011 18:17:22 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuces]]></category>
		<category><![CDATA[drupal]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=529</guid>
		<description><![CDATA[Vous devez intégrer sous Drupal 6 des pages en provenance d&#8217;un site externe. Le web scraping est à exclure et de ce fait le chargement en iframe des pages externes a été retenu.
Marche à suivre.

Déclarer un menu de type callback

En premier lieu, il vous faut créer la page virtuelle qui aura la charge de faire [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Vous devez intégrer sous <strong><a href="http://drupal.org/" title="Drupal - Open Source CMS | drupal.org">Drupal</a> 6</strong> des pages en provenance d&#8217;un site externe. Le <strong><a href="http://fr.wikipedia.org/wiki/Web_scraping" title="Web scraping - Wikipédia">web scraping</a></strong> est à exclure et de ce fait le <strong>chargement en iframe</strong> des pages externes a été retenu.<br />
Marche à suivre.<span id="more-529"></span></p>

<h2>Déclarer un menu de type callback</h2>

<p>En premier lieu, il vous faut créer la page virtuelle qui aura la charge de faire appel au service externe <em>via</em> une iframe. Cela se fait en implémentant le <a href="http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_menu/6" title="hook_menu | Drupal API">hook_menu</a> pour y déclarer une entrée de type <a href="http://api.drupal.org/api/drupal/includes--menu.inc/constant/MENU_CALLBACK/6" title="MENU_CALLBACK | Drupal API">MENU_CALLBACK</a>. La fonction callback associée, <code>_mytheme_load_iframe()</code> ici<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>, prendra 3 arguments&#160;:</p>

<ol>
<li><strong>url</strong>&#160;: l&#8217;URL de la ressource externe à charger dans l&#8217;iframe&#160;;</li>
<li><strong>width</strong>&#160;: la largeur en pixels de l&#8217;iframe, de <strong>type <code>String</code> obligatoirement</strong>&#160;;</li>
<li><strong>height</strong>&#160;: la hauteur en pixels de l&#8217;iframe, obligatoirement de type <code>String</code>.</li>
</ol>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * template.php
 */</span>
<span style="color: #009933; font-style: italic;">/**
 * @implements hook_menu()
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> mytheme_menu<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'drupal/page/path'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'title'</span>            <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Mon contenu externe'</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'page callback'</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'_mytheme_load_iframe'</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'page arguments'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
              <span style="color: #0000ff;">'url'</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'http://example.com/service'</span><span style="color: #339933;">,</span>
              <span style="color: #0000ff;">'width'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'700'</span><span style="color: #339933;">,</span>
              <span style="color: #0000ff;">'height'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'1000'</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'access arguments'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'access content'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'type'</span>             <span style="color: #339933;">=&gt;</span> MENU_CALLBACK<span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Loads an external resource into an iframe.
 *
 * @param string $url   URL to load in the iframe.
 * @param string $width The width of the iframe.
 * @param string $height The height of the iframe.
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> _mytheme_load_iframe<span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$width</span><span style="color: #339933;">,</span> <span style="color: #000088;">$height</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> theme<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'mytheme_simple_iframe'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$iframe_url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$width</span><span style="color: #339933;">,</span> <span style="color: #000088;">$height</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>


<p>Comme vous pouvez le lire, la méthode de callback fait appel à la fonction <a href="http://api.drupal.org/api/drupal/includes--theme.inc/function/theme/6" title="theme | Drupal API">theme()</a> sur un hook <code>mytheme_simple_iframe</code> qui n&#8217;existe pas.</p>

<h2>Création d&#8217;un hook de thème</h2>

<p>La création d&#8217;un hook permettant de faire appel à un fichier template est des plus simple, grâce au <a href="http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_theme/6" title="hook_theme | Drupal API">hook_theme</a>. Définissez dans votre fichier <code>template.php</code> (ou dans un fichier de module) le hook <code>mytheme_simple_iframe</code>&#160;:</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * template.php
 */</span>
<span style="color: #009933; font-style: italic;">/**
 * @implements hook_theme()
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> mytheme_theme<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
      <span style="color: #0000ff;">'mytheme_simple_iframe'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'template'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'simple_iframe'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'arguments'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'url'</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'width'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'700'</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'height'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'500'</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>


<p>Simple de compréhension, on déclare un fichier de template <code>simple_iframe</code> auquel 3 variables seront passées. Les arguments <code>width</code> et <code>height</code> ont une valeur par défaut de précisée, ce qui permet de les omettre dans la définition de la ressource externe dans le hook_menu.</p>

<p>Enfin, créez le fichier de template qui affichera une iframe.</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * simple_iframe.tpl.php
 */</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;div class=&quot;iframe&quot;&gt;
  &lt;iframe src=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">print</span> <span style="color: #000088;">$url</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; width=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">print</span> <span style="color: #000088;">$width</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; height=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">print</span> <span style="color: #000088;">$height</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; frameborder=&quot;0&quot; align=&quot;left&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;</pre></td></tr></table></div>


<p>Désormais, tout accès à l&#8217;URL <code>/drupal/page/path</code> chargera le template <code>simple_iframe.tpl.php</code> lorsque <strong>Drupal</strong> effectuera le rendu de la variable <code>$content</code> du fichier <code>page.tpl.php</code>.</p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/developpement/drupal-6-html5-supprimer-utf8-content-type.html' title='Drupal 6 : résoudre le problème du double charset dans un thème HTML5'>Drupal 6&#160;: résoudre le problème du double charset dans un thème HTML5</a></li><li><a href='http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html' title='Utiliser Compass dans un thème WordPress, la bonne méthode'>Utiliser Compass dans un thème WordPress, la bonne méthode</a></li><li><a href='http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html' title='Compass au quotidien'>Compass au quotidien</a></li><li><a href='http://pioupioum.fr/developpement/drupal7-angoisse-theming.html' title='Les angoisses du theming sous Drupal 7'>Les angoisses du theming sous Drupal 7</a></li><li><a href='http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html' title='Compass : supprimer le cache buster des sprites'>Compass&#160;: supprimer le cache buster des sprites</a></li></ul>

<div class="footnotes">
<hr />
<h4>Notes</h4>
<ol>

<li id="fn:1">
<p>où <code>my_hook</code> correspond au nom du thème ou du module qui sert à enregistrer ces définitions.&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=O8--qFuMo5k:GbwmjdWwmg8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=O8--qFuMo5k:GbwmjdWwmg8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=O8--qFuMo5k:GbwmjdWwmg8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=O8--qFuMo5k:GbwmjdWwmg8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=O8--qFuMo5k:GbwmjdWwmg8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=O8--qFuMo5k:GbwmjdWwmg8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=O8--qFuMo5k:GbwmjdWwmg8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=O8--qFuMo5k:GbwmjdWwmg8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=O8--qFuMo5k:GbwmjdWwmg8:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/O8--qFuMo5k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/developpement/drupal-iframe-page.html/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/developpement/drupal-iframe-page.html</feedburner:origLink></item>
		<item>
		<title>Instances multiples de Compass avec Ruby Version Manager (rvm)</title>
		<link>http://feeds.pioupioum.fr/~r/pioupioum-dev-blog/~3/7dGgEbR4QN8/compass-rvm-multiple-instances.html</link>
		<comments>http://pioupioum.fr/developpement/compass-rvm-multiple-instances.html#comments</comments>
		<pubDate>Mon, 23 May 2011 19:56:22 +0000</pubDate>
		<dc:creator>piouPiouM</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Compass]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://pioupioum.fr/?p=519</guid>
		<description><![CDATA[Dans le cadre de mon travail à Clever Age j&#8217;utilise dans plusieurs projets Compass, le framework Sass, dans sa version 0.10.6. Mais voilà, cette version a laissé place à la branche 0.11 qui, malheureusement, s&#8217;accompagne de son lot de mixins obsolètes voire de bugs avec certaines extensions.

Mes nouveaux projets feront appels à la dernière version [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Dans le cadre de mon travail à <a href="http://www.clever-age.com/" title="Clever Age, digital architecture">Clever Age</a> j&#8217;utilise dans plusieurs projets <strong><a href="http://compass-style.org/" title="Compass Home | Compass Documentation">Compass</a>, le framework <a href="http://sass-lang.com/" title="Sass - Syntactically Awesome Stylesheets">Sass</a></strong>, dans sa version 0.10.6. Mais voilà, cette version a laissé place à la branche 0.11 qui, malheureusement, s&#8217;accompagne de son lot de mixins obsolètes voire <a href="https://github.com/chriseppstein/compass/issues/306">de bugs</a> avec certaines extensions.</p>

<p>Mes nouveaux projets feront appels à la dernière version en date de Compass mais il me faut conserver une branche 0.10 sur mon poste pour assurer le support des anciens projets. Il est actuellement inconcevable de proposer aux clients une mise à jour des fichiers SCSS vers la branche 0.11.</p>

<p>Comment faire cohabiter les deux versions de Compass et leurs dépendances&#160;? C&#8217;est là qu&#8217;intervient <strong><a href="https://rvm.beginrescueend.com/" title="RVM: Ruby Version Manager">Ruby Version Manager</a></strong>, un gestionnaire d&#8217;environnements pour <a href="http://www.ruby-lang.org/fr/" title="Le langage Ruby">Ruby</a>.<span id="more-519"></span></p>

<h2>Installer RVM</h2>

<p>L&#8217;<a href="http://www.clever-age.com/veille/blog/ruby-version-manager-rvm.html" title="Ruby Version Manager (RVM) - Blog - Veille - Clever Age">installation de RVM</a> est des plus simples&#160;: il suffit de suivre la documentation.<br />
Je préfère installer RVM pour l&#8217;utilisateur courant (moi) et non pour tous les utilisateurs du poste, qui n&#8217;auront pas les mêmes besoins. Accessoirement, cela me permet de manipuler les gem sans invoquer <code>sudo</code>.</p>

<pre><code>$ cd
$ bash &lt; &lt;(curl -sk https://rvm.beginrescueend.com/install/rvm)
$ echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] &amp;&amp; . "$HOME/.rvm/scripts/rvm" # Load RVM function' &gt;&gt; ~/.bash_profile
$ source .bash_profile
$ type rvm | head -1
rvm is a function
</code></pre>

<p>J&#8217;en profite pour installer la dernière version stable de Ruby&#160;:</p>

<pre><code>$ rvm install 1.9.2
Installing Ruby from source to: /Users/mehdi/.rvm/rubies/ruby-1.9.2-p180, this may take a while depending on your cpu(s)...

ruby-1.9.2-p180 - #fetching 
ruby-1.9.2-p180 - #downloading ruby-1.9.2-p180, this may take a while depending on your connection...
…
Installing rubygems dedicated to ruby-1.9.2-p180...
…
Installation of rubygems completed successfully.
ruby-1.9.2-p180 - adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
ruby-1.9.2-p180 - #importing default gemsets (/Users/mehdi/.rvm/gemsets/)
Install of ruby-1.9.2-p180 - #complete 
</code></pre>

<p>À ce point, la version de Ruby active sur le système est pourtant celle fournie par Apple (je suis toujours sous OSX :p)&#160;:</p>

<pre><code>$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
</code></pre>

<p>En effet, RVM a bien réalisé l&#8217;installation de Ruby 1.9.2 mais il faut déclarer explicitement notre souhait de l&#8217;utiliser en remplacement de la version système<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>&#160;:</p>

<pre><code>$ rvm use 1.9.2 --default
Using /Users/mehdi/.rvm/gems/ruby-1.9.2-p180
$ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]
</code></pre>

<h2>Installation de la dernière version en date de Compass</h2>

<p>Classique, l&#8217;installation de Compass se fait <em>via</em> gem&#160;:</p>

<pre><code>$ gem install compass
Fetching: sass-3.1.1.gem (100%)
Fetching: chunky_png-1.2.0.gem (100%)
Fetching: fssm-0.2.7.gem (100%)
Fetching: compass-0.11.1.gem (100%)
Successfully installed sass-3.1.1
Successfully installed chunky_png-1.2.0
Successfully installed fssm-0.2.7
Successfully installed compass-0.11.1
4 gems installed
Installing ri documentation for sass-3.1.1...
Installing ri documentation for chunky_png-1.2.0...
Installing ri documentation for fssm-0.2.7...
Installing ri documentation for compass-0.11.1...
Installing RDoc documentation for sass-3.1.1...
Installing RDoc documentation for chunky_png-1.2.0...
Installing RDoc documentation for fssm-0.2.7...
Installing RDoc documentation for compass-0.11.1...
$ gem list

*** LOCAL GEMS ***

chunky_png (1.2.0)
compass (0.11.1)
fssm (0.2.7)
rake (0.9.0)
sass (3.1.1)
</code></pre>

<p>Une petite vérification d&#8217;usage&#160;:</p>

<pre><code>$ compass version 
Compass 0.11.1 (Antares)
Copyright (c) 2008-2011 Chris Eppstein
Released under the MIT License.
Compass is charityware.
Please make a tax deductable donation for a worthy cause: http://umdf.org/compass
</code></pre>

<p>Ok, mon environnement par défaut est prêt. Voyons comment faire cohabiter une ancienne version de Compass.</p>

<h2>Création d&#8217;un Gemset dédié à l&#8217;ancienne version de Compass</h2>

<p>En premier lieu, je me positionne sur l&#8217;environnement ruby voulu. Ici, il s&#8217;agit du Ruby que j&#8217;ai défini par défaut.</p>

<pre><code>$ rvm default
$ rvm gemset name
/Users/mehdi/.rvm/gems/ruby-1.9.2-p180
</code></pre>

<p>Recherchons la dernière version de la branche qui m&#8217;intéresse<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> (0.10 pour rappel)&#160;:</p>

<pre><code>$ gem query -ran ^compass$

*** REMOTE GEMS ***

compass (0.11.1, 0.11.0, 0.10.6, 0.10.5, 0.10.4, 0.10.3, 0.10.2, 0.10.1, 0.10.0, 0.8.17, 0.8.16)
</code></pre>

<p>Ok, il me faut la 0.10.6.<br />
RVM donne accès à des <strong>gemsets</strong> qui sont des espaces cloisonnés de gems pour une version de Ruby donnée. Pratique, j&#8217;ai justement besoin d&#8217;isoler les gems de la version 0.10.6 de Compass à celles de la dernière version en date.</p>

<p>Je crée un gemset au nom assez explicite et l&#8217;utilise&#160;:</p>

<pre><code>$ rvm gemset create compass0.10.6
$ rvm gemset use !$
$ rvm gemset name
compass0.10.6
</code></pre>

<p>La création d&#8217;un gemset fourni un nouvel environnement vierge de gems (ou presque, rake restant disponible)&#160;:</p>

<pre><code>$ gem list

*** LOCAL GEMS ***

rake (0.9.0)
</code></pre>

<p>Je peux maintenant installer Compass 0.10.6<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup>, ses dépendances et autres extensions en toute tranquillité.</p>

<pre><code>$ gem install compass --version 0.10.6 --no-rdoc --no-ri
Fetching: haml-3.1.1.gem (100%)
Fetching: compass-0.10.6.gem (100%)
Successfully installed haml-3.1.1
Successfully installed compass-0.10.6
2 gems installed
$ gem list

*** LOCAL GEMS ***

compass (0.10.6)
haml (3.1.1)
rake (0.9.0)
</code></pre>

<p>La petite vérification d&#8217;usage&#160;:</p>

<pre><code>$ compass version
Compass 0.10.6
Copyright (c) 2008-2009 Chris Eppstein
Released under the MIT License.
</code></pre>

<h3>Installer l&#8217;extension Lemonade pour Compass 0.10.6</h3>

<p>Il ne me reste plus  qu&#8217;à installer l&#8217;extension <a href="http://www.hagenburger.net/BLOG/Lemonade-CSS-Sprites-for-Sass-Compass.html" title="Generate CSS Sprites on the Fly with Lemonade">lemonade</a> que j&#8217;utilise dans mes projets&#160;:</p>

<pre><code>$ gem install lemonade --version '&lt; 0.3.5' --no-rdoc --no-ri
…
4 gems installed
</code></pre>

<p>J&#8217;installe ici la version strictement inférieur à 0.3.5 de lemonade car cette dernière lève directement une erreur pour indiquer que la gem lemonade est désormais dépréciée au profit de Compass Sprites. Le hic étant que ce dernier n&#8217;existe pas dans Compass 0.10.6.</p>

<p>Malheureusement, la gem de lemonade ne précise pas les bonnes versions de ses dépendances, et, de ce fait, on se retrouve avec un environnement incapable de générer les images des sprites. Pour corriger cela, on commence par downgrader la version de <strong><a href="http://rubygems.org/gems/chunky_png">chunky_png</a></strong>&#160;:</p>

<pre><code>$ gem uninstall chunky_png --version 1.2.0
$ gem install chunky_png --version '&lt; 1.0.0' --no-rdoc --no-ri
…
1 gem installed  
</code></pre>

<p>La gem <strong>haml</strong> installée avec l&#8217;extension <em>lemonade</em> est incompatible avec Compass 0.10.6 et risque de générer une erreur du genre&#160;:</p>

<pre><code>compile scss/screen.scss
  error scss/screen.scss (Line 2087: Not a valid color stop: #bcd712 74%)
</code></pre>

<p>Il suffit donc d&#8217;installer la dernière version de la branche 3.0&#160;:</p>

<pre><code>$ gem install haml --version '&lt; 3.1' --no-rdoc --no-ri
$ gem uninstall haml --version 3.1.1
$ gem list

*** LOCAL GEMS ***

chunky_png (0.12.0)
compass (0.10.6)
fssm (0.2.7)
haml (3.0.25)
lemonade (0.3.4)
rake (0.9.0)
sass (3.1.1)
</code></pre>

<h2>Utilisation</h2>

<p>Par défaut, en ouvrant un shell, Compass sera disponible en version 0.11. Si j&#8217;ai à travailler sur un projet en 0.10 il me suffit d&#8217;ouvrir un nouveau shell et d&#8217;activer temporairement le <strong>gemset compass0.10.6</strong>&#160;:</p>

<pre><code>$ rvm gemset use compass0.10.6
</code></pre>

<p>À l&#8217;avenir, je maintiendrai à jour la version de Compass dans l&#8217;environnement par défaut et, si besoin est, je figerai dans un nouveau gemset la version de Compass devenu obsolète.</p>

<h3 class='related_post_title'>Continuez votre lecture sur des sujets similaires</h3>

<ul class='related_post'><li><a href='http://pioupioum.fr/developpement/compass-sass-rvm-bundler-gestion-projet.html' title='Gestion avancée de Sass et Compass avec RVM et Bundler'>Gestion avancée de Sass et Compass avec RVM et Bundler</a></li><li><a href='http://pioupioum.fr/developpement/compass-sprites-supprimer-cache-buster.html' title='Compass : supprimer le cache buster des sprites'>Compass&#160;: supprimer le cache buster des sprites</a></li><li><a href='http://pioupioum.fr/developpement/compass-theme-wordpress-the-right-way.html' title='Utiliser Compass dans un thème WordPress, la bonne méthode'>Utiliser Compass dans un thème WordPress, la bonne méthode</a></li><li><a href='http://pioupioum.fr/developpement/compass-usage-quotidien-cheatsheet.html' title='Compass au quotidien'>Compass au quotidien</a></li><li><a href='http://pioupioum.fr/developpement/support-presentation-compass-wel4.html' title='Support de présentation de l&#8217;atelier « Compass, sauvez l&#8217;intégrateur ! »'>Support de présentation de l&#8217;atelier «&#160;Compass, sauvez l&#8217;intégrateur&#160;!&#160;»</a></li></ul>

<div class="footnotes">
<hr />
<h4>Notes</h4>
<ol>

<li id="fn:1">
<p>vous pouvez activer ponctuellement (le temps de vie du shell) un autre environnement à l&#8217;aide de la commande <code>rvm use</code> en omettant l&#8217;option <code>--default</code>. Pour revenir à l&#8217;environnement par défaut, un petit <code>rvm default</code> suffit.&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

<li id="fn:2">
<p>j&#8217;aurai très bien pu directement invoquer la commande <code>gem install compass --version '&lt; 0.11'</code> et me passer de la recherche <em>via</em> <code>gem query</code>. Je laisse en l&#8217;état pour donner un exemple d&#8217;utilisation de la commande <code>query</code>.&#160;<a href="#fnref:2" rev="footnote">&#8617;</a></p>
</li>

<li id="fn:3">
<p>Je fais l&#8217;impasse sur l&#8217;installation des documentations pour ce gemset, d&#8217;où les arguments <code>--no-rdoc</code> et <code>--no-ri</code>.&#160;<a href="#fnref:3" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
<!-- google_ad_section_end --><div class="feedflare">
<a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=7dGgEbR4QN8:yE7dNUIuYZA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=7dGgEbR4QN8:yE7dNUIuYZA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=7dGgEbR4QN8:yE7dNUIuYZA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=7dGgEbR4QN8:yE7dNUIuYZA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=7dGgEbR4QN8:yE7dNUIuYZA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=7dGgEbR4QN8:yE7dNUIuYZA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=7dGgEbR4QN8:yE7dNUIuYZA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.pioupioum.fr/~ff/pioupioum-dev-blog?a=7dGgEbR4QN8:yE7dNUIuYZA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/pioupioum-dev-blog?i=7dGgEbR4QN8:yE7dNUIuYZA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/pioupioum-dev-blog/~4/7dGgEbR4QN8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://pioupioum.fr/developpement/compass-rvm-multiple-instances.html/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://pioupioum.fr/developpement/compass-rvm-multiple-instances.html</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.310 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-03-21 14:24:29 -->
