Notes de bas de page (ou pas)

IenisseiIenissei Member
mars 2009 modifié dans Modifications
Bonjour,

Usant et abusant de notes de bas de page, j'ai écrit un petit système pour faire les gérer relativement automatiquement. C'est artisanal en ce sens que j'ai modifié du code et que j'en ai rajouté, ce qui implique de tout re-vérifier pour les mises-à-jour ou de s'abstenir; mais si certains en ont besoin aussi ou sont intéressés par l'idée, c'est une solution possible, et si jamais Pluxml évolue dans ce sens ça peut servir aussi.

La méthode la plus simple pour créer des notes de bas de page (qu'on peut placer n'importe où via le CSS, donc pas notes bêtement collées en bas du texte), c'est de créer une classe spéciale, et de générer un lien + une ancre entre le numéro dans le texte et la note; mais ça fait taper trois lignes de code au milieu du texte et ça interrompt inutilement la rédaction, alors qu'on peut automatiser ça très facilement.

Pour ce faire, il suffit de définir un marquage spécial pour les notes, et de demander à Pluxml d'avoir l'amabilité de se débrouiller pour faire les ancres et le lien. Mais d'abord, il faut permettre à Pluxml de créer des notes de bas de page, on modifie article.php dans l'admin.

Là, il y a des provisions pour toutes les données fournies à la création et à l'édition d'un article: on ajoute simplement une ligne pour les notes à chaque fois (je donne les lignes précédentes et suivantes à chaque fois, mais on ajoute simplement la variable $notes); dans l'ordre:
$content =  trim($_POST['content']);
		$notes =  trim($_POST['notes']); ### ADDED ###
		$url = $_POST['url'];
$content =  trim($result['content']);
	$notes =  trim($result['notes']); ### ADDED ###
	$author = $result['author'];
$content = '<p></p>';
	$notes = '<p>[[1]] </p>'; # Si on veut que la note soit entre les balises <p></p> bien sûr. ### ADDED ###
	$author = $_SESSION['author'];
Puis, dans le même fichier, au niveau du code pour la preview:
# On remplace les chemins des images et documents (pas au même niveau)
	$_chapo = str_replace('src="'.$plxAdmin->aConf['images'],'src="'.PLX_ROOT.$plxAdmin->aConf['images'],$chapo);
	$_chapo = str_replace('href="./?telechargement/','href="'.PLX_ROOT.'?telechargement/',$_chapo);
	$_content = str_replace('src="'.$plxAdmin->aConf['images'],'src="'.PLX_ROOT.$plxAdmin->aConf['images'],$content);
	$_content = str_replace('href="./?telechargement/','href="'.PLX_ROOT.'?telechargement/',$_content);
	$_notes = str_replace('src="'.$plxAdmin->aConf['images'],'src="'.PLX_ROOT.$plxAdmin->aConf['images'],$notes); ### ADDED ###
	$_notes = str_replace('href="./?telechargement/','href="'.PLX_ROOT.'?telechargement/',$_notes); ### ADDED ###
	echo '<div id="preview"><blockquote><h3>'.htmlspecialchars($title,ENT_QUOTES,PLX_CHARSET).'</h3>'.$_chapo.'<br />'.$_content.'<br />'.$_notes.'</blockquote></div>'; ### MODIFIED ###
Enfin, on ajoute un formulaire pour les notes dans la partie htlm de la page; je l'ai placé après la case du contenu, ce qui me semblait logique:
<p class="field"><label>Notes :</label></p> <!-- ADDED -->
		<?php plxUtils::printArea('notes',htmlspecialchars($notes,ENT_QUOTES,PLX_CHARSET),60,5); ?> <!-- ADDED -->
Ensuite, dans class.plx.motor.php, à la fonction parseArticle, on ajoute (je donne le début du code originel):
# Recuperation des valeurs de nos champs XML
		$art['title'] = trim($values[ $iTags['title'][0] ]['value']);
		$art['author'] = trim($values[ $iTags['author'][0] ]['value']);
		$art['allow_com'] = trim($values[ $iTags['allow_com'][0] ]['value']);
		$art['chapo'] = (isset($values[ $iTags['chapo'][0] ]['value']))?trim($values[ $iTags['chapo'][0] ]['value']):'';
		$art['content'] = (isset($values[ $iTags['content'][0] ]['value']))?trim($values[ $iTags['content'][0] ]['value']):'';
		$art['notes'] = (isset($values[ $iTags['notes'][0] ]['value']))?trim($values[ $iTags['notes'][0] ]['value']):''; /* ADDED */
Enfin, on modifie class.plx.show.php; on transforme le marquage 1 (ou le numéro de la note) en un lien valide dans le contenu de l'article:
function artContent() {
	
		$content = preg_replace('/\[\[([0-9]+)\]\]/', '<a href="#fn\1" id="ref\1">[\1]</a>', $this->plxMotor->plxRecord_arts->f('content')); # On remplace le mark-up des notes de bas de page par des liens /* ADDED */

		echo $this->plxMotor->plxRecord_arts->f('chapo')."\n"; # Chapo
		echo $content."\n"; # Contenu /* MODIFIED */
	}
On ajoute une fonction au dessous, qui fait l'inverse: elle affiche la note et crée un lien ramenant vers l'ancre dans le texte:
function artNotes() { /* ADDED */
	
		if($this->plxMotor->mode == 'article'){
	
			$notes = preg_replace('/\[\[([0-9]+)\]\]/', '<a href="#ref\1" id="fn\1">[\1]</a>', $this->plxMotor->plxRecord_arts->f('notes')); # On remplace le mark-up des notes de bas de page par des liens de retour /

			echo $notes."\n";
		}
	}
Voilà, j'espère qu'il y a tout ce que j'ai dû modifier pour que ça marche. Pour finir, il est nécessaire d'adapter le thème en créant les classes CSS appropriées. Il faut ajouter ce petit bout de code, entouré de balises et classes, à l'endroit des notes:
<?php $plxShow->artNotes(); ?>
Un dernier truc: dans la fonction artNotes, j'ai spécifié que les notes ne devaient être parsées qu'en mode "article", c'est-à-dire qu'elles n'apparaissent pas en mode "home" ou "catégories". C'est un choix arbitraire, mais il faut savoir que si vous comptez mettre les notes dans les pages avec une liste d'articles (ou de chapôs), il faudra probablement des modifications parfois plus complexes pour concernant l'affichage.

Voilà…

Réponses

  • GzygGzyg Member
    Voilà qui m'intéresse...

    Je te fais un retour dès que je trouve un peu de temps...

    En tout cas, merci ! :)


    à plus,

    Gzyg
  • antistressantistress Member
    janvier 2010 modifié
    De ce que j'ai lu ce week end (j'ai pas les références sous la main mais j'avais fait une simple recherche) les notes de bas de page sont déconseillées pour des questions de sémantique et d'accessibilité il vaut mieux garder les notes près du texte que l'on veut annoter et donc en général prévoir une autre présentation
Connectez-vous ou Inscrivez-vous pour répondre.