Balise #VALID_ID pour SPIP

Cette balise permet de générer un attribut de type ID ou NAME valide.

Pour utiliser la balise #VALID_ID, il vous suffit de copier le code suivant dans le fichier « mes_fonctions.php » (ou créer ce fichier) dans le dossier « squelettes » de SPIP.

  • La syntaxe complète est [(#VALID_ID{label_perso})] ;
  • {label_perso} permet de fixer l’intitulé si le titre ne comporte aucun caractère latin ;
  • Cette balise est a priori utilisable dans n’importe quelle boucle renvoyant un #TITRE.
// sanitize a title to make it match HTML specs
// http://www.w3.org/TR/html4/types.html#h-6.2
function cleanText($texte,$label='section') {
// strips all HTML tags
$texte = supprimer_tags($texte);

// replace all non latin character
$texte = preg_replace('#([^a-z0-9:-_]|[!"#$%&'()*+,/;<=>?@[\\\]^`{|}~])#i', '_', $texte);

// strips all empty characters at the beginning of the text
// the ID or NAME should start with a letter
$texte = preg_replace('#^([_0-9]+)#i', "", $texte);

// If there's no more latin character, then we return nothing
$count = strlen(preg_replace('#([_0-9])#i', "", $texte));
if($count<1) { return false; }

return $texte;
}
function balise_VALID_ID_dist($p) {
// If no alternate label is provided, we just use 'label'
if (!$label = interprete_argument_balise(1,$p)) {$label = "'label'";}

// gets the id of the current object
$_id_objet = $p->boucles[$p->id_boucle]->primary;
$_id = champ_sql($_id_objet, $p);

// gets the title
$_titre = champ_sql('titre', $p);

// Use the clean title or an alternate version if no suitable title
$p->code = "((\$a = cleanText($_titre)) ? \$a : $label.'_'.$_id)";

return $p;
}

Un gros merci à marcimat et sa patience.

J’ai remplacé [[:punct:]]|\^ par [!"#$%&'()*+,/;<=>?@[\\\]^`{|}~]. Cela permet de conserver les caractères « . », « :» et « - ».