X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fplugins-dist%2Ftextwheel%2Finc%2Fnotes.php;h=bbaad0b2896582b0c5e061db02acf751687b3dad;hb=4f443dce95ff6f8221c189880a70c74ce1c1f238;hp=85ec7bb1bf00f29e548c9356c032512f3be74e4b;hpb=4a628e9b277d3617535f99d663ca79fa2e891177;p=lhc%2Fweb%2Fwww.git diff --git a/www/plugins-dist/textwheel/inc/notes.php b/www/plugins-dist/textwheel/inc/notes.php index 85ec7bb1..bbaad0b2 100644 --- a/www/plugins-dist/textwheel/inc/notes.php +++ b/www/plugins-dist/textwheel/inc/notes.php @@ -10,44 +10,82 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined("_ECRIRE_INC_VERSION")) return; +/** + * Gestion des notes de bas de page + * + * @package SPIP\Textwheel\Notes + **/ + +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} // // Notes de bas de page // -if (!defined('_NOTES_OUVRE_REF')) define('_NOTES_OUVRE_REF',' ['); -if (!defined('_NOTES_FERME_REF')) define('_NOTES_FERME_REF',']'); -if (!defined('_NOTES_OUVRE_NOTE')) define('_NOTES_OUVRE_NOTE','['); -if (!defined('_NOTES_FERME_NOTE')) define('_NOTES_FERME_NOTE','] '); -if (!defined('_NOTES_RACCOURCI')) define('_NOTES_RACCOURCI', ',\[\[(\s*(<([^>\'"]*)>)?(.*?))\]\],msS'); - -// argument = true: empiler l'etat courant, initialiser un nouvel etat -// argument = false: restaurer l'etat precedent, denonce un etat courant perdu -// argument chaine, on y recherche les notes et on les renvoie en tableau -// argument tableau, texte de notes a rajouter dans ce qu'on a deja -// le dernier cas retourne la composition totale -// en particulier, envoyer un tableau vide permet de tout recuperer -// C'est stocke dans la globale $les_notes, mais pas besoin de le savoir - -function inc_notes_dist($arg,$operation='traiter', $ignorer_autobr=false) -{ +if (!defined('_NOTES_OUVRE_REF')) { + define('_NOTES_OUVRE_REF', ' ['); +} +if (!defined('_NOTES_FERME_REF')) { + define('_NOTES_FERME_REF', ']'); +} +if (!defined('_NOTES_OUVRE_NOTE')) { + define('_NOTES_OUVRE_NOTE', '['); +} +if (!defined('_NOTES_FERME_NOTE')) { + define('_NOTES_FERME_NOTE', '] '); +} +if (!defined('_NOTES_RACCOURCI')) { + define('_NOTES_RACCOURCI', ',\[\[(\s*(<([^>\'"]*)>)?(.*?))\]\],msS'); +} + + +/** + * Empile ou dépile des notes de bas de page + * + * Point d'entrée pour la gestion des notes. + * + * @note + * C'est stocké dans la globale `$les_notes`, mais pas besoin de le savoir + * @param bool|string|array $arg + * Argument : + * + * - true : empiler l'etat courant, initialiser un nouvel état + * - false : restaurer l'état précédent, dénonce un état courant perdu + * - chaîne : on y recherche les notes et on les renvoie en tableau + * - tableau : texte de notes à rajouter dans ce qu'on a déjà + * + * Ce dernier cas retourne la composition totale, en particulier, + * envoyer un tableau vide permet de tout récupérer. + * @param string $operation + * En complément du format attendu dans `$arg`, on indique ici + * le type d'oopétation à réaliser (traiter | empiler | depiler | + * sauver_etat | restaurer_etat | contexter_cache) + * @param bool $ignorer_autobr + * True pour ne pas prendre en compte les retours à la ligne comme + * des tags br (mais 2 à la suite font un paragraphe tout de même). + * @return string|array + **/ +function inc_notes_dist($arg, $operation = 'traiter', $ignorer_autobr = false) { static $pile = array(); static $next_marqueur = 1; static $marqueur = 1; global $les_notes, $compt_note, $notes_vues; - switch ($operation){ + switch ($operation) { case 'traiter': - if (is_array($arg)) return traiter_les_notes($arg,$ignorer_autobr); - else - return traiter_raccourci_notes($arg, $marqueur>1?$marqueur:''); + if (is_array($arg)) { + return traiter_les_notes($arg, $ignorer_autobr); + } else { + return traiter_raccourci_notes($arg, $marqueur > 1 ? $marqueur : ''); + } break; case 'empiler': - if ($compt_note==0) - // si le marqueur n'a pas encore ete utilise, on le recycle dans la pile courante - array_push($pile, array(@$les_notes, @$compt_note, $notes_vues,0)); - else { + if ($compt_note == 0) // si le marqueur n'a pas encore ete utilise, on le recycle dans la pile courante + { + array_push($pile, array(@$les_notes, @$compt_note, $notes_vues, 0)); + } else { // sinon on le stocke au chaud, et on en cree un nouveau - array_push($pile, array(@$les_notes, @$compt_note, $notes_vues,$marqueur)); + array_push($pile, array(@$les_notes, @$compt_note, $notes_vues, $marqueur)); $next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general $marqueur = $next_marqueur; // et on le prend comme marqueur courant } @@ -56,37 +94,46 @@ function inc_notes_dist($arg,$operation='traiter', $ignorer_autobr=false) break; case 'depiler': #$prev_notes = $les_notes; - if (strlen($les_notes)) spip_log("notes perdues"); + if (strlen($les_notes)) { + spip_log("notes perdues"); + } // si le marqueur n'a pas servi, le liberer - if (!strlen($les_notes) AND $marqueur==$next_marqueur) + if (!strlen($les_notes) and $marqueur == $next_marqueur) { $next_marqueur--; + } // on redepile tout suite a une fin d'inclusion ou d'un affichage des notes list($les_notes, $compt_note, $notes_vues, $marqueur) = array_pop($pile); #$les_notes .= $prev_notes; // si pas de marqueur attribue, on le fait - if (!$marqueur){ + if (!$marqueur) { $next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general $marqueur = $next_marqueur; // et on le prend comme marqueur courant } break; case 'sauver_etat': - if ($compt_note OR $marqueur>1 OR $next_marqueur>1) - return array($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur); - else - return ''; // rien a sauver + if ($compt_note or $marqueur > 1 or $next_marqueur > 1) { + return array($les_notes, $compt_note, $notes_vues, $marqueur, $next_marqueur); + } else { + return ''; + } // rien a sauver break; case 'restaurer_etat': - if ($arg AND is_array($arg)) // si qqchose a restaurer - list($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur) = $arg; + if ($arg and is_array($arg)) // si qqchose a restaurer + { + list($les_notes, $compt_note, $notes_vues, $marqueur, $next_marqueur) = $arg; + } break; case 'contexter_cache': - if ($compt_note OR $marqueur>1 OR $next_marqueur>1) + if ($compt_note or $marqueur > 1 or $next_marqueur > 1) { return array("$compt_note:$marqueur:$next_marqueur"); - else + } else { return ''; + } break; case 'reset_all': // a n'utiliser qu'a fins de test - if (strlen($les_notes)) spip_log("notes perdues [reset_all]"); + if (strlen($les_notes)) { + spip_log("notes perdues [reset_all]"); + } $pile = array(); $next_marqueur = 1; $marqueur = 1; @@ -98,16 +145,17 @@ function inc_notes_dist($arg,$operation='traiter', $ignorer_autobr=false) } -function traiter_raccourci_notes($letexte, $marqueur_notes) -{ +function traiter_raccourci_notes($letexte, $marqueur_notes) { global $compt_note, $notes_vues; if (strpos($letexte, '[[') === false - OR !preg_match_all(_NOTES_RACCOURCI, $letexte, $m, PREG_SET_ORDER)) + or !preg_match_all(_NOTES_RACCOURCI, $letexte, $m, PREG_SET_ORDER) + ) { return array($letexte, array()); + } // quand il y a plusieurs series de notes sur une meme page - $mn = !$marqueur_notes ? '' : ($marqueur_notes.'-'); + $mn = !$marqueur_notes ? '' : ($marqueur_notes . '-'); $mes_notes = array(); foreach ($m as $r) { list($note_source, $note_all, $ref, $nom, $note_texte) = $r; @@ -117,41 +165,43 @@ function traiter_raccourci_notes($letexte, $marqueur_notes) // si la balise fermante correspondante existe // Cas pathologique: [[ x]] - if (!(isset($nom) AND $ref - AND ((strpos($note_texte, '') === false) - OR preg_match(",<$nom\W.*,", $note_texte)))) { + if (!(isset($nom) and $ref + and ((strpos($note_texte, '') === false) + or preg_match(",<$nom\W.*,", $note_texte))) + ) { $nom = ++$compt_note; $note_texte = $note_all; } // eliminer '%' pour l'attribut id - $ancre = $mn . str_replace('%','_', rawurlencode($nom)); + $ancre = $mn . str_replace('%', '_', rawurlencode($nom)); // ne mettre qu'une ancre par appel de note (XHTML) + if (!isset($notes_vues[$ancre])) { + $notes_vues[$ancre] = 0; + } $att = ($notes_vues[$ancre]++) ? '' : " id='nh$ancre'"; // creer le popup 'title' sur l'appel de note // propre est couteux => nettoyer_raccourcis_typo if ($title = supprimer_tags(nettoyer_raccourcis_typo($note_texte))) { - $title = " title='" . couper($title,80) . "'"; + $title = " title='" . couper($title, 80) . "'"; } // ajouter la note aux notes precedentes if ($note_texte) { - $mes_notes[]= array($ancre, $nom, $note_texte); + $mes_notes[] = array($ancre, $nom, $note_texte); } // dans le texte, mettre l'appel de note a la place de la note - if ($nom) $nom = _NOTES_OUVRE_REF."$nom"._NOTES_FERME_REF; + if ($nom) { + $nom = _NOTES_OUVRE_REF . "$nom" . _NOTES_FERME_REF; + } $pos = strpos($letexte, $note_source); - - // supprimer les ' ' ou 'nbsp;' avant un appel de note - $avant = preg_replace(',( | |'.chr(194).chr(160).')+$,S', '', substr($letexte, 0, $pos)); - - $letexte = $avant - . code_echappement($nom) - . substr($letexte, $pos + strlen($note_source)); + $letexte = rtrim(substr($letexte, 0, $pos), ' ') + . code_echappement($nom) + . substr($letexte, $pos + strlen($note_source)); } @@ -160,26 +210,26 @@ function traiter_raccourci_notes($letexte, $marqueur_notes) // https://code.spip.net/@traiter_les_notes -function traiter_les_notes($notes,$ignorer_autobr) { +function traiter_les_notes($notes, $ignorer_autobr) { $mes_notes = ''; if ($notes) { - $title = _T('info_notes'); + $title = _T('info_notes'); foreach ($notes as $r) { list($ancre, $nom, $texte) = $r; - $atts = " href='#nh$ancre' class='spip_note' title='$title $ancre' rev='footnote'"; + $atts = " href='#nh$ancre' class='spip_note' title='$title $ancre' rev='appendix'"; $mes_notes .= "\n\n" - . "
" - . code_echappement($nom - ? _NOTES_OUVRE_NOTE."$nom"._NOTES_FERME_NOTE - : '') - . trim($texte) - .'
'; + . "
" + . code_echappement($nom + ? _NOTES_OUVRE_NOTE . "$nom" . _NOTES_FERME_NOTE + : '') + . trim($texte) + . '
'; + } + if ($ignorer_autobr) { + $mes_notes = _AUTOBR_IGNORER . $mes_notes; } - if ($ignorer_autobr) - $mes_notes = _AUTOBR_IGNORER.$mes_notes; $mes_notes = propre($mes_notes); } + return ($GLOBALS['les_notes'] .= $mes_notes); } - -?>