diff --git a/inc-calcul_mysql3.php b/inc-calcul_mysql3.php
index 6a598a9430fa645d2ccce923857ce29cdc2a1adb..b689c386eed5f0b197a955df8343ecbd2e2b3656 100644
--- a/inc-calcul_mysql3.php
+++ b/inc-calcul_mysql3.php
@@ -131,6 +131,59 @@ function calcul_mysql_in($val, $valeurs, $tobeornotobe)
     }
 }
   
+function calcul_exposer ($pile, $reference) {
+	static $hierarchie;
+
+	if (!$hierarchie) {
+		if ($id = $reference['id_article'])
+			$base = 'articles';
+		else if ($id = $reference['id_breve'])
+			$base = 'breves';
+		else if ($id = $reference['id_syndic'])
+			$base = 'syndic';
+		else if ($id = $reference['id_rubrique'])
+			$base = 'rubriques';
+		else if ($id = $reference['id_secteur'])
+			$base = 'rubriques';
+
+		if (!$base)
+			$hierarchie = '-';
+		else {
+			if ($base != 'rubriques') {
+				$hierarchie[$base][$id] = true;
+				$id_element = 'id_'.ereg_replace('s$', '', $base);
+				$s = spip_fetch_array(spip_query(
+				"SELECT id_rubrique FROM spip_$base WHERE $id_element=$id"));
+				$id = $s['id_rubrique'];
+			}
+
+			$hierarchie['rubriques'][$id] = true;
+
+			while (true) {
+				$s = spip_fetch_array(spip_query(
+				"SELECT id_parent FROM spip_rubriques WHERE id_rubrique=$id"));
+				if ($id = $s['id_parent'])
+					$hierarchie['rubriques'][$id] = true;
+				else
+					break;
+			}
+		}
+	}
+
+	if ($hierarchie == '-')
+		return false;
+	else if ($id = $pile['id_article'])
+		return $hierarchie['articles'][$id];
+	else if ($id = $pile['id_breve'])
+		return $hierarchie['breves'][$id];
+	else if ($id = $pile['id_syndic'])
+		return $hierarchie['syndic'][$id];
+	else if ($id = $pile['id_rubrique'])
+		return $hierarchie['rubriques'][$id];
+	else if ($id = $pile['id_secteur'])
+		return $hierarchie['rubriques'][$id];
+
+}
 
 function calcul_generation ($generation) {
 	$lesfils = array();
diff --git a/inc-vrac-squel.php3 b/inc-vrac-squel.php3
index 136c7e5497506828ac5d75ca2f760ee73a3fe6a1..3a29ef31e649ca3c2638c718e8251a5dc86db692 100644
--- a/inc-vrac-squel.php3
+++ b/inc-vrac-squel.php3
@@ -1,111 +1,112 @@
 <?php
 
-# Fonction de traduction des champs Spip basiques
-# A terme, elle devrait etre remplace'e par autant de fonctions que de 'case'
+//
+// Fonction de traduction des champs Spip basiques
+// A terme, elle devrait etre remplace'e par autant de fonctions que de 'case'
+//
 
-function calculer_champ_divers($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere)
-{
-  global  $flag_pcre;
+function calculer_champ_divers($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere) {
+	global  $flag_pcre;
 
-  switch($nom_champ) {
+	switch($nom_champ) {
 
 	// Introduction (d'un article, d'une breve ou d'un message de forum)
 
-  case 'INTRODUCTION':
+	case 'INTRODUCTION':
 		$code = 'calcul_introduction(\'' .
-		  $boucles[$id_boucle]->type_requete . "',\n" .
-		  index_pile($id_boucle,  "texte", $boucles) . ",\n" .
-		  index_pile($id_boucle,  "chapo", $boucles) . ",\n" .
-		  index_pile($id_boucle,  "descriptif", $boucles) . ")\n"; 
+			$boucles[$id_boucle]->type_requete . "',\n" .
+			index_pile($id_boucle, "texte", $boucles) . ",\n" .
+			index_pile($id_boucle, "chapo", $boucles) . ",\n" .
+			index_pile($id_boucle, "descriptif", $boucles) . ")\n"; 
 		break;
 
-  case 'NOM_SITE_SPIP':
+	case 'NOM_SITE_SPIP':
 		$code = "lire_meta('nom_site')";
 		break;
 
-  case 'EMAIL_WEBMASTER':
+	case 'EMAIL_WEBMASTER':
 		$code = "lire_meta('email_webmaster')";
 		break;
 
-  case 'CHARSET':
+	case 'CHARSET':
 		$code = "lire_meta('charset')";
 		break;
 
 
-  case 'LANG_LEFT':
+	case 'LANG_LEFT':
 		$code = "lang_dir(\$GLOBALS['spip_lang'],'left','right')";
 		break;
 
-  case 'LANG_RIGHT':
+	case 'LANG_RIGHT':
 		$code = "lang_dir(\$GLOBALS['spip_lang'],'right','left')";
 		break;
 
-  case 'LANG_DIR':
+	case 'LANG_DIR':
 		$code = "lang_dir(\$GLOBALS['spip_lang'],'ltr','rtl')";
 		break;
 
-  case 'PUCE':
+	case 'PUCE':
 		$code = "propre('- ')";
 		break;
 
 
-  case 'DATE_NOUVEAUTES':
+	case 'DATE_NOUVEAUTES':
 		$code = "((lire_meta('quoi_de_neuf') == 'oui' AND lire_meta('majnouv')) ? normaliser_date(lire_meta('majnouv')) : \"'0000-00-00'\")";
 		break;
 
-  case 'URL_SITE_SPIP':
+	case 'URL_SITE_SPIP':
 		$code = "lire_meta('adresse_site')";
 		break;
 
-  case 'URL_ARTICLE':
+	case 'URL_ARTICLE':
 		$code = "generer_url_article(" . 
-		  index_pile($id_boucle,  'id_article', $boucles) . 
-		  ")" ;
-		  if ($boucles[$id_boucle]->hash)
-		    $code = "url_var_recherche(" . $code . ")";
+			index_pile($id_boucle, 'id_article', $boucles) . 
+			")" ;
+		if ($boucles[$id_boucle]->hash)
+			$code = "url_var_recherche(" . $code . ")";
 		break;
 
-  case 'URL_RUBRIQUE':
+	case 'URL_RUBRIQUE':
 		$code = "generer_url_rubrique(" . 
-		  index_pile($id_boucle,  'id_rubrique', $boucles) . 
-		  ")" ;
-		  if ($boucles[$id_boucle]->hash)
-		    $code = "url_var_recherche(" . $code . ")";
+			index_pile($id_boucle, 'id_rubrique', $boucles) . 
+			")" ;
+		if ($boucles[$id_boucle]->hash)
+			$code = "url_var_recherche(" . $code . ")";
 		break;
 
-  case 'URL_BREVE':
+	case 'URL_BREVE':
 		$code = "generer_url_breve(" .
-		  index_pile($id_boucle,  'id_breve', $boucles) . 
-		  ")";
-		  if ($boucles[$id_boucle]->hash)
-		    $code = "url_var_recherche(" . $code . ")";
+			index_pile($id_boucle, 'id_breve', $boucles) . 
+			")";
+		if ($boucles[$id_boucle]->hash)
+			$code = "url_var_recherche(" . $code . ")";
 		break;
 
-  case 'URL_MOT':
+	case 'URL_MOT':
 		$code = "generer_url_mot(" .
-		  index_pile($id_boucle,  'id_mot', $boucles) .
-		  ")";
+			index_pile($id_boucle, 'id_mot', $boucles) .
+			")";
 		$code = "url_var_recherche(" . $code . ")";
 		break;
 
-  case 'URL_FORUM':
+	case 'URL_FORUM':
 		$code = "generer_url_forum(" .
-		  index_pile($id_boucle,  'id_forum', $boucles) .")";
+			index_pile($id_boucle, 'id_forum', $boucles) .")";
 		break;
 
-  case 'URL_DOCUMENT':
+	case 'URL_DOCUMENT':
 		$code = "generer_url_document(" .
-		  index_pile($id_boucle,  'id_document', $boucles) . ")";
+			index_pile($id_boucle, 'id_document', $boucles) . ")";
 		break;
 
-  case 'URL_AUTEUR': # 1.7.2
-               $code = "generer_url_auteur(" .
-                 index_pile($id_boucle,  'id_forum', $boucles) .")";
-               if ($boucles[$id_boucle]->hash)
-                   $code = "url_var_recherche(" . $code . ")";
-               break;
- 
-  case 'NOTES':
+	case 'URL_AUTEUR': # 1.7.2
+		$code = "generer_url_auteur(" .
+			index_pile($id_boucle, 'id_forum', $boucles) .")";
+		if ($boucles[$id_boucle]->hash)
+			$code = "url_var_recherche(" . $code . ")";
+		break;
+
+	case 'NOTES':
 		$milieu = '$lacible = $GLOBALS["les_notes"];
 			$GLOBALS["les_notes"] = "";
 			$GLOBALS["compt_note"] = 0;
@@ -114,195 +115,180 @@ function calculer_champ_divers($fonctions, $nom_champ, $id_boucle, &$boucles, $i
 		$code = '$lacible';
 		break;
 
-  case 'RECHERCHE':
+	case 'RECHERCHE':
 		$code = 'htmlspecialchars($GLOBALS["recherche"])';
 		break;
 
-  case 'COMPTEUR_BOUCLE':
+	case 'COMPTEUR_BOUCLE':
 		$code = '$compteur_boucle';
 		break;
 
-  case 'TOTAL_BOUCLE':
-	if ($id_mere === '')
-	    {
-	      include_local("inc-debug-squel.php3");
-	      erreur_squelette(_L("Champ #TOTAL_BOUCLE hors boucle"), '', $id_boucle);
-	    }
-	$code = "\$Numrows['$id_mere']";
-	$boucles[$id_mere]->numrows = true;
-		break;
-
-  case 'POINTS':
-	  $n = 0;
-	  $b = $id_boucle;
-	  $code = '';
-	  while ($b != '')
-	    {
-	      if ($s = 	$boucles[$b]->param)
-		{
-		  foreach($s as $v)
-		    {
-		      if (strpos($v,'recherche') !== false)
-			{
-			  $code = '$Pile[$SP' . (($n==0) ? "" : "-$n") .
-			    '][points]';
-			  $b = '';
-			  break;
+	case 'TOTAL_BOUCLE':
+		if ($id_mere === '') {
+			include_local("inc-debug-squel.php3");
+			erreur_squelette(_L("Champ #TOTAL_BOUCLE hors boucle"), '', $id_boucle);
+		}
+		$code = "\$Numrows['$id_mere']";
+		$boucles[$id_mere]->numrows = true;
+		break;
+
+	case 'POINTS':
+		$n = 0;
+		$b = $id_boucle;
+		$code = '';
+		while ($b != '') {
+			if ($s = $boucles[$b]->param) {
+				foreach($s as $v) {
+					if (strpos($v,'recherche') !== false) {
+						$code = '$Pile[$SP' . (($n==0) ? "" : "-$n") .
+							'][points]';
+					$b = '';
+					break;
+					}
+				}
 			}
-		      }
+			$n++;
+			$b = $boucles[$b]->id_parent;
+		}
+		if (!$code) {
+			include_local("inc-debug-squel.php3");
+			erreur_squelette(_L("Champ #POINTS hors d'une recherche"), '', $idb);
 		}
+		break;
 
-	      $n++;
-	      $b = $boucles[$b]->id_parent;
-	    }
-	  if (!$code) 
-	    {
-	      include_local("inc-debug-squel.php3");
-	      erreur_squelette(_L("Champ #POINTS hors d'une recherche"), '', $idb);
-	    }
+	case 'POPULARITE_ABSOLUE':
+		$code = 'ceil(' .
+			index_pile($id_boucle, "popularite", $boucles) .
+			')';
+		break;
 
+	case 'POPULARITE_SITE':
+		$code = 'ceil(lire_meta(\'popularite_total\'))';
 		break;
 
-  case 'POPULARITE_ABSOLUE':
-		$code = 'ceil(' .
-		  index_pile($id_boucle,  "popularite", $boucles) .
-		  ')';
-		break;
-
-  case 'POPULARITE_SITE':
-                $code = 'ceil(lire_meta(\'popularite_total\'))';
-                break;
-
-  case 'POPULARITE_MAX':
-                $code = 'ceil(lire_meta(\'popularite_max\'))';
-                break;
-
-
-  case 'EXPOSER':
-          break;
-                $on = 'on';
-                $off='';
-                if ($fonctions) {
-                        // Gerer la notation [(#EXPOSER|on,off)]
-                        reset($fonctions);
-                        list(, $onoff) = each($fonctions);
-                        ereg("([^,]*)(,(.*))?", $onoff, $regs);
-                        $on = addslashes($regs[1]);
-                        $off = addslashes($regs[3]);
-
-                        // autres filtres
-                        $filtres=Array();
-                        while (list(, $nom) = each($fonctions)) {
-                                $filtres[] = $nom;
-                        }
-                        $fonctions = $filtres;
-                }
-                $id_on_off = $doublons[$boucles[$id_boucle]->type_requete];
-                if ($id_on_off) 
-                        $code = "(\$Pile[0]['$id_on_off'] == \$Pile[\$SP]['$id_on_off']) ?
- '$on' : '$off'";
-                else 
-                        $code = "'$off'";
-                break;
+	case 'POPULARITE_MAX':
+		$code = 'ceil(lire_meta(\'popularite_max\'))';
+		break;
+
+	case 'EXPOSER':
+		$on = 'on';
+		$off= '';
+		if ($fonctions) {
+			// Gerer la notation [(#EXPOSER|on,off)]
+			reset($fonctions);
+			list(, $onoff) = each($fonctions);
+			ereg("([^,]*)(,(.*))?", $onoff, $regs);
+			$on = addslashes($regs[1]);
+			$off = addslashes($regs[3]);
+
+			// autres filtres
+			$filtres=Array();
+			while (list(, $nom) = each($fonctions))
+				$filtres[] = $nom;
+			$fonctions = $filtres;
+		}
+
+		// Faut-il exposer ?
+		$code = "(calcul_exposer(\$Pile[\$SP], \$Pile[0]) ? '$on': '$off')";
+
+		break;
+
+
 	//
 	// Inserer directement un document dans le squelette
 	//
 	case 'EMBED_DOCUMENT':
-		$milieu = "
-		include_ecrire('inc_documents.php3');";
+		$milieu = "\ninclude_ecrire('inc_documents.php3');";
 		$code = "embed_document(" .
-		  index_pile($id_boucle,  'id_document', $boucles) . ", '" .
+			index_pile($id_boucle,  'id_document', $boucles) . ", '" .
 			($fonctions) ? join($fonctions, "|") : "" .
 			"', false)";
 		$fonctions = "";
 		break;
 
 	// Debut et fin de surlignage auto des mots de la recherche
-	// on inse`re une balise Span avec une classe sans spec:
+	// on insere une balise Span avec une classe sans spec:
 	// c'est transparent s'il n'y a pas de recherche,
-	// sinon elles seront remplace'es par les fontions de inc_surligne
+	// sinon elles seront remplacees par les fontions de inc_surligne
 	// flag_pcre est juste une flag signalant que preg_match est dispo.
 
-  case 'DEBUT_SURLIGNE':
-	  $code = ($flag_pcre ? ('\'<span class="spip_surligneconditionnel">\'') : '');
-	  break;
-  case 'FIN_SURLIGNE':
-	  $code = ($flag_pcre ? ('\'</span class="spip_surligneconditionnel">\'') : '');
-	  break;
-
-  case 'MENU_LANG':
-                $code = '"<"."?php
-                        include_ecrire(\"inc_lang.php3\");
-                        echo menu_langues(\"var_lang\", \$menu_lang);
-                        ?".">"';
-                break;
-
-        //
-        // Formulaire de changement de langue / page de login
-  case 'MENU_LANG_ECRIRE':
-                $code = '"<"."?php
-                        include_ecrire(\"inc_lang.php3\");
-                        echo menu_langues(\"var_lang_ecrire\", \$menu_lang);
-                        ?".">"';
-
-                break;
+	case 'DEBUT_SURLIGNE':
+		$code = ($flag_pcre ? ('\'<span class="spip_surligneconditionnel">\'') : '');
+		break;
+	case 'FIN_SURLIGNE':
+		$code = ($flag_pcre ? ('\'</span class="spip_surligneconditionnel">\'') : '');
+		break;
+
+    // Formulaire de changement de langue
+	case 'MENU_LANG':
+		$code = '"<"."?php
+			include_ecrire(\"inc_lang.php3\");
+			echo menu_langues(\"var_lang\", \$menu_lang);
+			?".">"';
+		break;
+
+    // Formulaire de changement de langue / page de login
+	case 'MENU_LANG_ECRIRE':
+		$code = '"<"."?php
+			include_ecrire(\"inc_lang.php3\");
+			echo menu_langues(\"var_lang_ecrire\", \$menu_lang);
+			?".">"';
+		break;
 
 	//
 	// Formulaires de login
 	//
-  case 'LOGIN_PRIVE':
-	  $code = '"<"."?php include(\'inc-login.php3\'); login(\'\', \'prive\'); ?".">"'; 
-		break;
-
-  case 'LOGIN_PUBLIC':
-    $lacible = '\$GLOBALS[\'clean_link\']';
-    if ($fonctions) {
-      $filtres = array();
-      while (list(, $nom) = each($fonctions))
-	$lacible = "new Link('".$nom."')";
-      $fonctions = $filtres;
-    }
-    $code = '"<"."?php include(\'inc-login.php3\'); login(' . $lacible . ', false); ?".">"';
-    break;
-
-  case 'URL_LOGOUT':
-                if ($fonctions) {
-                        $url = "&url=".$fonctions[0];
-                        $fonctions = array();
-                } else {
-                        $url = '&url=\'.urlencode(\$clean_link->getUrl()).\'';
-                }
-                $code = '"<"."?php if (\$GLOBALS[\'auteur_session\'][\'login\'])
+	case 'LOGIN_PRIVE':
+		$code = '"<"."?php include(\'inc-login.php3\'); login(\'\', \'prive\'); ?".">"'; 
+		break;
+
+	case 'LOGIN_PUBLIC':
+		if ($nom = $fonctions[0])
+			$lacible = "new Link('".$nom."')";
+		else
+			$lacible = '\$GLOBALS[\'clean_link\']';
+		$code = '"<"."?php include(\'inc-login.php3\'); login(' . $lacible . ', false); ?".">"';
+		$fonctions = array();
+		break;
+
+	case 'URL_LOGOUT':
+		if ($fonctions) {
+			$url = "&url=".$fonctions[0];
+			$fonctions = array();
+		} else {
+			$url = '&url=\'.urlencode(\$clean_link->getUrl()).\'';
+		}
+		$code = '"<"."?php if (\$GLOBALS[\'auteur_session\'][\'login\'])
  { echo \'spip_cookie.php3?logout_public=\'.\$GLOBALS[\'auteur_session\'][\'login\'].\'' . $url . '\'; } ?".">"';
 		break;
 
-  case 'LOGO_ARTICLE':
-  case 'LOGO_ARTICLE_NORMAL':
-  case 'LOGO_ARTICLE_RUBRIQUE':
-  case 'LOGO_ARTICLE_SURVOL':
-  case 'LOGO_AUTEUR':
-  case 'LOGO_AUTEUR_NORMAL':
-  case 'LOGO_AUTEUR_SURVOL':
-  case 'LOGO_SITE':
-  case 'LOGO_BREVE':
-  case 'LOGO_BREVE_RUBRIQUE':
-  case 'LOGO_MOT':
-  case 'LOGO_RUBRIQUE':
-  case 'LOGO_RUBRIQUE_NORMAL':
-  case 'LOGO_RUBRIQUE_SURVOL':
-  case 'LOGO_DOCUMENT' :
-    // retour imme'diat: filtres de'rogatoires traite's dans la fonction
-    return calculer_champ_LOGO($fonctions, $nom_champ, $id_boucle, $boucles, $id_mere);
-    break; 
-
-  default:
-	  // champ inconnu. Il s'auto-de'note.
-	    $code = "'#$nom_champ'";
-	  break;
+	case 'LOGO_ARTICLE':
+	case 'LOGO_ARTICLE_NORMAL':
+	case 'LOGO_ARTICLE_RUBRIQUE':
+	case 'LOGO_ARTICLE_SURVOL':
+	case 'LOGO_AUTEUR':
+	case 'LOGO_AUTEUR_NORMAL':
+	case 'LOGO_AUTEUR_SURVOL':
+	case 'LOGO_SITE':
+	case 'LOGO_BREVE':
+	case 'LOGO_BREVE_RUBRIQUE':
+	case 'LOGO_MOT':
+	case 'LOGO_RUBRIQUE':
+	case 'LOGO_RUBRIQUE_NORMAL':
+	case 'LOGO_RUBRIQUE_SURVOL':
+	case 'LOGO_DOCUMENT' :
+		// retour immediat: filtres derogatoires traites dans la fonction
+		return calculer_champ_LOGO($fonctions, $nom_champ, $id_boucle, $boucles, $id_mere);
+		break; 
+
+	default:
+		// champ inconnu. Il s'autodenote.
+		$code = "'<blink>#$nom_champ</blink>'";
+		break;
 	} // switch
 
-  list($c,$m) = applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere);
-  return array($c,$milieu . $m);
+	list($c,$m) = applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere);
+	return array($c,$milieu . $m);
 }