PageRenderTime 40ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/_plugins_/textwheel/inc/notes.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 184 lines | 120 code | 25 blank | 39 comment | 19 complexity | 5dcd163645c1e0933ec7aec5c06c33b7 MD5 | raw file
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2010 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined("_ECRIRE_INC_VERSION")) return;
  12. //
  13. // Notes de bas de page
  14. //
  15. // argument = true: empiler l'etat courant, initialiser un nouvel etat
  16. // argument = false: restaurer l'etat precedent, denonce un etat courant perdu
  17. // argument chaine, on y recherche les notes et on les renvoie en tableau
  18. // argument tableau, texte de notes a rajouter dans ce qu'on a deja
  19. // le dernier cas retourne la composition totale
  20. // en particulier, envoyer un tableau vide permet de tout recuperer
  21. // C'est stocke dans la globale $les_notes, mais pas besoin de le savoir
  22. function inc_notes_dist($arg,$operation='traiter', $ignorer_autobr=false)
  23. {
  24. static $pile = array();
  25. static $next_marqueur = 1;
  26. static $marqueur = 1;
  27. global $les_notes, $compt_note, $notes_vues;
  28. switch ($operation){
  29. case 'traiter':
  30. if (is_array($arg)) return traiter_les_notes($arg,$ignorer_autobr);
  31. else
  32. return traiter_raccourci_notes($arg, $marqueur>1?$marqueur:'');
  33. break;
  34. case 'empiler':
  35. if ($compt_note==0)
  36. // si le marqueur n'a pas encore ete utilise, on le recycle dans la pile courante
  37. array_push($pile, array(@$les_notes, @$compt_note, $notes_vues,0));
  38. else {
  39. // sinon on le stocke au chaud, et on en cree un nouveau
  40. array_push($pile, array(@$les_notes, @$compt_note, $notes_vues,$marqueur));
  41. $next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general
  42. $marqueur = $next_marqueur; // et on le prend comme marqueur courant
  43. }
  44. $les_notes = '';
  45. $compt_note = 0;
  46. break;
  47. case 'depiler':
  48. #$prev_notes = $les_notes;
  49. if (strlen($les_notes)) spip_log("notes perdues");
  50. // si le marqueur n'a pas servi, le liberer
  51. if (!strlen($les_notes) AND $marqueur==$next_marqueur)
  52. $next_marqueur--;
  53. // on redepile tout suite a une fin d'inclusion ou d'un affichage des notes
  54. list($les_notes, $compt_note, $notes_vues, $marqueur) = array_pop($pile);
  55. #$les_notes .= $prev_notes;
  56. // si pas de marqueur attribue, on le fait
  57. if (!$marqueur){
  58. $next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general
  59. $marqueur = $next_marqueur; // et on le prend comme marqueur courant
  60. }
  61. break;
  62. case 'sauver_etat':
  63. if ($compt_note OR $marqueur>1 OR $next_marqueur>1)
  64. return array($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur);
  65. else
  66. return ''; // rien a sauver
  67. break;
  68. case 'restaurer_etat':
  69. if ($arg AND is_array($arg)) // si qqchose a restaurer
  70. list($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur) = $arg;
  71. break;
  72. case 'contexter_cache':
  73. if ($compt_note OR $marqueur>1 OR $next_marqueur>1)
  74. return array("$compt_note:$marqueur:$next_marqueur");
  75. else
  76. return '';
  77. break;
  78. case 'reset_all': // a n'utiliser qu'a fins de test
  79. if (strlen($les_notes)) spip_log("notes perdues [reset_all]");
  80. $pile = array();
  81. $next_marqueur = 1;
  82. $marqueur = 1;
  83. $les_notes = '';
  84. $compt_note = 0;
  85. $notes_vues = array();
  86. break;
  87. }
  88. }
  89. define('_RACCOURCI_NOTES', ',\[\[(\s*(<([^>\'"]*)>)?(.*?))\]\],msS');
  90. function traiter_raccourci_notes($letexte, $marqueur_notes)
  91. {
  92. global $compt_note, $les_notes, $notes_vues;
  93. global $ouvre_ref, $ferme_ref;
  94. if (strpos($letexte, '[[') === false
  95. OR !preg_match_all(_RACCOURCI_NOTES, $letexte, $m, PREG_SET_ORDER))
  96. return array($letexte, array());
  97. // quand il y a plusieurs series de notes sur une meme page
  98. $mn = !$marqueur_notes ? '' : ($marqueur_notes.'-');
  99. $mes_notes = array();
  100. foreach ($m as $r) {
  101. list($note_source, $note_all, $ref, $nom, $note_texte) = $r;
  102. // reperer une note nommee, i.e. entre chevrons
  103. // On leve la Confusion avec une balise en regardant
  104. // si la balise fermante correspondante existe
  105. // Cas pathologique: [[ <a> <a href="x">x</a>]]
  106. if (!(isset($nom) AND $ref
  107. AND ((strpos($note_texte, '</' . $nom .'>') === false)
  108. OR preg_match(",<$nom\W.*</$nom>,", $note_texte)))) {
  109. $nom = ++$compt_note;
  110. $note_texte = $note_all;
  111. }
  112. // eliminer '%' pour l'attribut id
  113. $ancre = $mn . str_replace('%','_', rawurlencode($nom));
  114. // ne mettre qu'une ancre par appel de note (XHTML)
  115. $att = ($notes_vues[$ancre]++) ? '' : " id='nh$ancre'";
  116. // creer le popup 'title' sur l'appel de note
  117. // propre est couteux => nettoyer_raccourcis_typo
  118. if ($title = supprimer_tags(nettoyer_raccourcis_typo($note_texte))) {
  119. $title = " title='" . couper($title,80) . "'";
  120. }
  121. // ajouter la note aux notes precedentes
  122. if ($note_texte) {
  123. $mes_notes[]= array($ancre, $nom, $note_texte);
  124. }
  125. // dans le texte, mettre l'appel de note a la place de la note
  126. if ($nom) $nom = "$ouvre_ref<a href='#nb$ancre' class='spip_note' rel='footnote'$title$att>$nom</a>$ferme_ref";
  127. $pos = strpos($letexte, $note_source);
  128. // supprimer les ' ' ou 'nbsp;' avant un appel de note
  129. $avant = preg_replace(',( |&nbsp;|'.chr(194).chr(160).')+$,S', '', substr($letexte, 0, $pos));
  130. $letexte = $avant
  131. . code_echappement($nom)
  132. . substr($letexte, $pos + strlen($note_source));
  133. }
  134. return array($letexte, $mes_notes);
  135. }
  136. // http://doc.spip.org/@traiter_les_notes
  137. function traiter_les_notes($notes,$ignorer_autobr) {
  138. global $ouvre_note, $ferme_note;
  139. $mes_notes = '';
  140. if ($notes) {
  141. $title = _T('info_notes');
  142. foreach ($notes as $r) {
  143. list($ancre, $nom, $texte) = $r;
  144. $atts = " href='#nh$ancre' class='spip_note' title='$title $ancre' rev='footnote'";
  145. $mes_notes .= "\n\n"
  146. . "<div id='nb$ancre'><p". ($GLOBALS['class_spip'] ? " class='spip_note'" : "") .">"
  147. . code_echappement($nom
  148. ? "$ouvre_note<a$atts>$nom</a>$ferme_note"
  149. : '')
  150. . trim($texte)
  151. .'</div>';
  152. }
  153. if ($ignorer_autobr)
  154. $mes_notes = _AUTOBR_IGNORER.$mes_notes;
  155. $mes_notes = propre($mes_notes);
  156. }
  157. return ($GLOBALS['les_notes'] .= $mes_notes);
  158. }
  159. ?>