PageRenderTime 30ms CodeModel.GetById 4ms RepoModel.GetById 1ms app.codeStats 0ms

/spip/ecrire/inc/notes.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 177 lines | 116 code | 22 blank | 39 comment | 19 complexity | 5c663ca70649e96f7aef318808302332 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  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')
  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);
  31. else
  32. return traiter_raccourci_notes($arg, $marqueur>1?$marqueur:'');
  33. break;
  34. case 'empiler':
  35. #var_dump(">$compt_note:$marqueur");
  36. if ($compt_note==0)
  37. // si le marqueur n'a pas encore ete utilise, on le recycle dans la pile courante
  38. array_push($pile, array(@$les_notes, @$compt_note, $notes_vues,0));
  39. else {
  40. // sinon on le stocke au chaud, et on en cree un nouveau
  41. array_push($pile, array(@$les_notes, @$compt_note, $notes_vues,$marqueur));
  42. $next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general
  43. $marqueur = $next_marqueur; // et on le prend comme marqueur courant
  44. }
  45. $les_notes = '';
  46. $compt_note = 0;
  47. break;
  48. case 'depiler':
  49. #$prev_notes = $les_notes;
  50. if (strlen($les_notes)) spip_log("notes perdues");
  51. // si le marqueur n'a pas servi, le liberer
  52. if (!strlen($les_notes) AND $marqueur==$next_marqueur)
  53. $next_marqueur--;
  54. // on redepile tout suite a une fin d'inclusion ou d'un affichage des notes
  55. list($les_notes, $compt_note, $notes_vues, $marqueur) = array_pop($pile);
  56. #$les_notes .= $prev_notes;
  57. #var_dump("<$compt_note:$marqueur");
  58. // si pas de marqueur attribue, on le fait
  59. if (!$marqueur){
  60. $next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general
  61. $marqueur = $next_marqueur; // et on le prend comme marqueur courant
  62. }
  63. break;
  64. case 'sauver_etat':
  65. if ($compt_note OR $marqueur>1 OR $next_marqueur>1)
  66. return array($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur);
  67. else
  68. return ''; // rien a sauver
  69. break;
  70. case 'restaurer_etat':
  71. if ($arg AND is_array($arg)) // si qqchose a restaurer
  72. list($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur) = $arg;
  73. break;
  74. case 'contexter_cache':
  75. if ($compt_note OR $marqueur>1 OR $next_marqueur>1)
  76. return array("$compt_note:$marqueur:$next_marqueur");
  77. else
  78. return '';
  79. break;
  80. case 'reset_all': // a n'utiliser qu'a fins de test
  81. if (strlen($les_notes)) spip_log("notes perdues [reset_all]");
  82. $pile = array();
  83. $next_marqueur = 1;
  84. $marqueur = 1;
  85. $les_notes = '';
  86. $compt_note = 0;
  87. $notes_vues = array();
  88. break;
  89. }
  90. }
  91. define('_RACCOURCI_NOTES', ', *\[\[(\s*(<([^>\'"]*)>)?(.*?))\]\],msS');
  92. function traiter_raccourci_notes($letexte, $marqueur_notes)
  93. {
  94. global $compt_note, $les_notes, $notes_vues;
  95. global $ouvre_ref, $ferme_ref;
  96. if (!preg_match_all(_RACCOURCI_NOTES, $letexte, $m, PREG_SET_ORDER))
  97. return array($letexte, array());
  98. // quand il y a plusieurs series de notes sur une meme page
  99. $mn = !$marqueur_notes ? '' : ($marqueur_notes.'-');
  100. $mes_notes = array();
  101. foreach ($m as $r) {
  102. list($note_source, $note_all, $ref, $nom, $note_texte) = $r;
  103. // reperer une note nommee, i.e. entre chevrons
  104. // On leve la Confusion avec une balise en regardant
  105. // si la balise fermante correspondante existe
  106. // Cas pathologique: [[ <a> <a href="x">x</a>]]
  107. if (!(isset($nom) AND $ref
  108. AND ((strpos($note_texte, '</' . $nom .'>') === false)
  109. OR preg_match(",<$nom\W.*</$nom>,", $note_texte)))) {
  110. $nom = ++$compt_note;
  111. $note_texte = $note_all;
  112. }
  113. // eliminer '%' pour l'attribut id
  114. $ancre = $mn . str_replace('%','_', rawurlencode($nom));
  115. // ne mettre qu'une ancre par appel de note (XHTML)
  116. $att = ($notes_vues[$ancre]++) ? '' : " id='nh$ancre'";
  117. // creer le popup 'title' sur l'appel de note
  118. if ($title = supprimer_tags(propre($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. $letexte = substr($letexte, 0, $pos)
  129. . code_echappement($nom)
  130. . substr($letexte, $pos + strlen($note_source));
  131. }
  132. return array($letexte, $mes_notes);
  133. }
  134. // http://doc.spip.org/@traiter_les_notes
  135. function traiter_les_notes($notes) {
  136. global $ouvre_note, $ferme_note;
  137. $mes_notes = '';
  138. if ($notes) {
  139. $title = _T('info_notes');
  140. foreach ($notes as $r) {
  141. list($ancre, $nom, $texte) = $r;
  142. $atts = " href='#nh$ancre' id='nb$ancre' class='spip_note' title='$title $ancre' rev='footnote'";
  143. $mes_notes .= "\n\n"
  144. . code_echappement($nom
  145. ? "$ouvre_note<a$atts>$nom</a>$ferme_note"
  146. : '')
  147. . $texte;
  148. }
  149. $mes_notes = propre('<p>' . $mes_notes);
  150. if ($GLOBALS['class_spip'])
  151. $mes_notes = str_replace('<p class="spip">', '<p class="spip_note">', $mes_notes);
  152. }
  153. return ($GLOBALS['les_notes'] .= $mes_notes);
  154. }
  155. ?>