Proposer une amélioration de commentaire

Le commentaire à poster est au format «docblock» (de phpDoc) qui peut être enrichi de tags spécifiques pour SPIP.
Fichier
plugins-dist/textwheel/inc/lien.php
Fonction
inc_lien_dist

    Nom ou pseudo de l'auteur de la proposition

Code original

/**
 * Production de la balise a+href à partir des raccourcis `[xxx->url]` etc.
 *
 * @note
 *     Compliqué car c'est ici qu'on applique typo(),
 *     et en plus, on veut pouvoir les passer en pipeline
 *
 * @see typo()
 * @param string $lien
 * @param string $texte
 * @param string $class
 * @param string $title
 * @param string $hlang
 * @param string $rel
 * @param string $connect
 * @param array $env
 * @return string
 */
function inc_lien_dist(
	$lien,
	$texte = '',
	$class = '',
	$title = '',
	$hlang = '',
	$rel = '',
	$connect = '',
	$env = array()
) {
	static $u = null;
	if (!$u) {
		$u = url_de_base();
	}
	$typo = false;
 
	// Si une langue est demandee sur un raccourci d'article, chercher
	// la traduction ;
	// - [{en}->art2] => traduction anglaise de l'article 2, sinon art 2
	// - [{}->art2] => traduction en langue courante de l'art 2, sinon art 2
	// s'applique a tout objet traduit
	if (
		$hlang
		and $match = typer_raccourci($lien)
	) {
		@list($type, , $id, , $args, , $ancre) = $match;
		$trouver_table = charger_fonction('trouver_table', 'base');
		$desc = $trouver_table(table_objet($type, $connect), $connect);
		if (
			$desc
			and $id_table_objet = $desc['key']['PRIMARY KEY']
		) {
			$table_objet_sql = $desc['table'];
			if (
				$row = sql_fetsel('*', $table_objet_sql, "$id_table_objet=" . intval($id))
				and isset($row['id_trad'])
				and isset($row['lang'])
				and $id_dest = sql_getfetsel($id_table_objet, $table_objet_sql,
					"id_trad=" . intval($row['id_trad']) . " AND lang=" . sql_quote($hlang))
				and objet_test_si_publie($type, $id_dest)
			) {
				$lien = "$type$id_dest";
			} else {
				$hlang = '';
			}
		} else {
			$hlang = '';
		}
	}
 
	$mode = ($texte and $class) ? 'url' : 'tout';
	$lang = '';
	$lien = calculer_url($lien, $texte, $mode, $connect);
	if ($mode === 'tout') {
		$texte = $lien['titre'];
		if (!$class and isset($lien['class'])) {
			$class = $lien['class'];
		}
		$lang = isset($lien['lang']) ? $lien['lang'] : '';
		$mime = isset($lien['mime']) ? " type='" . $lien['mime'] . "'" : "";
		$lien = $lien['url'];
	}
 
	$lien = trim($lien);
	if (strncmp($lien, "#", 1) == 0) {  # ancres pures (internes a la page)
		$class = 'spip_ancre';
	} elseif (strncasecmp($lien, 'mailto:', 7) == 0) { # pseudo URL de mail
		$class = "spip_mail";
	} elseif (strncmp($texte, '<html>', 6) == 0) { # cf traiter_lien_explicite
		$class = "spip_url";
		# spip_out sur les URLs externes
		if (
			preg_match(',^\w+://,iS', $lien)
			and strncasecmp($lien, url_de_base(), strlen(url_de_base()))
		) {
			$class .= " spip_out";
		}
	} elseif (!$class) {
		# spip_out sur les URLs externes
		if (
			preg_match(',^\w+://,iS', $lien)
			and strncasecmp($lien, url_de_base(), strlen(url_de_base()))
		) {
			$class = "spip_out"; # si pas spip_in|spip_glossaire
		}
	}
	if ($class) {
		$class = " class='$class'";
	}
 
	// Si l'objet n'est pas de la langue courante, on ajoute hreflang
	if (!$hlang and isset($lang) and $lang !== $GLOBALS['spip_lang']) {
		$hlang = $lang;
	}
 
	$lang = ($hlang ? " hreflang='$hlang'" : '');
 
	if ($title) {
		$title = ' title="' . attribut_html($title) . '"';
	} else {
		$title = ''; // $title peut etre 'false'
	}
 
	// rel=external pour les liens externes
	if (
		(strncmp($lien, 'http://', 7) == 0 or strncmp($lien, 'https://', 8) == 0)
		and strncmp("$lien/", $u, strlen($u)) != 0
	) {
		$rel = trim("$rel external");
	}
	if ($rel) {
		$rel = " rel='$rel'";
	}
 
	$lang_objet_prev = '';
	if ($hlang and $hlang !== $GLOBALS['spip_lang']) {
		$lang_objet_prev = isset($GLOBALS['lang_objet']) ? $GLOBALS['lang_objet'] : null;
		$GLOBALS['lang_objet'] = $hlang;
	}
 
	// si pas de modele dans le texte du lien, on peut juste passer typo sur le texte, c'est plus rapide
	// les rares cas de lien qui encapsule un modele passe en dessous, c'est plus lent
	if (traiter_modeles($texte, false, '', $connect, null, $env) == $texte) {
		$texte = typo($texte, true, $connect, $env);
		$lien = "<a href=\"" . str_replace('"', '&quot;',
				$lien) . "\"$class$lang$title$rel" . (isset($mime) ? $mime : '') . ">$texte</a>";
		if ($lang_objet_prev !== '') {
			if ($lang_objet_prev) {
				$GLOBALS['lang_objet'] = $lang_objet_prev;
			} else {
				unset($GLOBALS['lang_objet']);
			}
		}
 
		return $lien;
	}
 
	# ceci s'execute heureusement avant les tableaux et leur "|".
	# Attention, le texte initial est deja echappe mais pas forcement
	# celui retourne par calculer_url.
	# Penser au cas [<imgXX|right>->URL], qui exige typo('<a>...</a>')
	$lien = "<a href=\"" . str_replace('"', '&quot;', $lien) . "\"$class$lang$title$rel$mime>$texte</a>";
	#$res = typo($lien, true, $connect, $env);
	$p = $GLOBALS['toujours_paragrapher'];
	$GLOBALS['toujours_paragrapher'] = false;
	$res = propre($lien, $connect, $env);
	$GLOBALS['toujours_paragrapher'] = $p;
 
	// dans ce cas, echapons le resultat du modele pour que propre etc ne viennent pas pouicher le html
	$res = echappe_html("<html>$res</html>");
	if ($lang_objet_prev !== '') {
		if ($lang_objet_prev) {
			$GLOBALS['lang_objet'] = $lang_objet_prev;
		} else {
			unset($GLOBALS['lang_objet']);
		}
	}
 
	return $res;
}

Le commentaire au format « docblock » peut être complété des éléments suivants sécifiques
à SPIP.

Sur un entête de fichier :

  • @package SPIP\Core\x (pour un fichier du core, x dépendant du fichier)
  • @package SPIP\Nom\x (pour un fichier de plugin, Nom étant le nom du plugin)

Sur un entête de fonction :

  • @pipeline x : indique que la fonction est une utilisation d’un pipeline
  • @pipeline_appel x : indique que la fonction appelle le pipeline indiqué
  • @balise : indique que la fonction est une compilation de balise
  • @filtre : indique un |filtre
  • @critere : indique que la fonction est une compilaiton de critère
  • @boucle : indique que la fonction est une compilaiton de boucle
Vous inscrire sur ce site

L’espace privé de ce site est ouvert aux visiteurs, après inscription. Une fois enregistré, vous pourrez consulter les articles en cours de rédaction, proposer des articles et participer à tous les forums.

Identifiants personnels

Indiquez ici votre nom et votre adresse email. Votre identifiant personnel vous parviendra rapidement, par courrier électronique.