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 « - ».