@@ -30,7 +30,7 @@ discard block |
||
| 30 | 30 | * @package SPIP\Core\Drapeaux\Edition |
| 31 | 31 | **/ |
| 32 | 32 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 33 | - return; |
|
| 33 | + return; |
|
| 34 | 34 | } |
| 35 | 35 | |
| 36 | 36 | |
@@ -45,46 +45,46 @@ discard block |
||
| 45 | 45 | * `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()` |
| 46 | 46 | **/ |
| 47 | 47 | function lire_tableau_edition() { |
| 48 | - $edition = @unserialize($GLOBALS['meta']['drapeau_edition']); |
|
| 49 | - if (!$edition) { |
|
| 50 | - return []; |
|
| 51 | - } |
|
| 52 | - $changed = false; |
|
| 48 | + $edition = @unserialize($GLOBALS['meta']['drapeau_edition']); |
|
| 49 | + if (!$edition) { |
|
| 50 | + return []; |
|
| 51 | + } |
|
| 52 | + $changed = false; |
|
| 53 | 53 | |
| 54 | - $bon_pour_le_service = time() - 3600; |
|
| 55 | - // parcourir le tableau et virer les vieux |
|
| 56 | - foreach ($edition as $objet => $data) { |
|
| 57 | - if (!is_array($data)) { |
|
| 58 | - unset($edition[$objet]); |
|
| 59 | - } // vieille version |
|
| 60 | - else { |
|
| 61 | - foreach ($data as $id => $tab) { |
|
| 62 | - if (!is_array($tab)) { |
|
| 63 | - unset($edition[$objet][$tab]); |
|
| 64 | - } // vieille version |
|
| 65 | - else { |
|
| 66 | - foreach ($tab as $n => $duo) { |
|
| 67 | - if (current($duo) < $bon_pour_le_service) { |
|
| 68 | - unset($edition[$objet][$id][$n]); |
|
| 69 | - $changed = true; |
|
| 70 | - } |
|
| 71 | - } |
|
| 72 | - } |
|
| 73 | - if (!$edition[$objet][$id]) { |
|
| 74 | - unset($edition[$objet][$id]); |
|
| 75 | - } |
|
| 76 | - } |
|
| 77 | - } |
|
| 78 | - if (!$edition[$objet]) { |
|
| 79 | - unset($edition[$objet]); |
|
| 80 | - } |
|
| 81 | - } |
|
| 54 | + $bon_pour_le_service = time() - 3600; |
|
| 55 | + // parcourir le tableau et virer les vieux |
|
| 56 | + foreach ($edition as $objet => $data) { |
|
| 57 | + if (!is_array($data)) { |
|
| 58 | + unset($edition[$objet]); |
|
| 59 | + } // vieille version |
|
| 60 | + else { |
|
| 61 | + foreach ($data as $id => $tab) { |
|
| 62 | + if (!is_array($tab)) { |
|
| 63 | + unset($edition[$objet][$tab]); |
|
| 64 | + } // vieille version |
|
| 65 | + else { |
|
| 66 | + foreach ($tab as $n => $duo) { |
|
| 67 | + if (current($duo) < $bon_pour_le_service) { |
|
| 68 | + unset($edition[$objet][$id][$n]); |
|
| 69 | + $changed = true; |
|
| 70 | + } |
|
| 71 | + } |
|
| 72 | + } |
|
| 73 | + if (!$edition[$objet][$id]) { |
|
| 74 | + unset($edition[$objet][$id]); |
|
| 75 | + } |
|
| 76 | + } |
|
| 77 | + } |
|
| 78 | + if (!$edition[$objet]) { |
|
| 79 | + unset($edition[$objet]); |
|
| 80 | + } |
|
| 81 | + } |
|
| 82 | 82 | |
| 83 | - if ($changed) { |
|
| 84 | - ecrire_tableau_edition($edition); |
|
| 85 | - } |
|
| 83 | + if ($changed) { |
|
| 84 | + ecrire_tableau_edition($edition); |
|
| 85 | + } |
|
| 86 | 86 | |
| 87 | - return $edition; |
|
| 87 | + return $edition; |
|
| 88 | 88 | } |
| 89 | 89 | |
| 90 | 90 | /** |
@@ -97,7 +97,7 @@ discard block |
||
| 97 | 97 | * `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()` |
| 98 | 98 | **/ |
| 99 | 99 | function ecrire_tableau_edition($edition) { |
| 100 | - ecrire_meta('drapeau_edition', serialize($edition)); |
|
| 100 | + ecrire_meta('drapeau_edition', serialize($edition)); |
|
| 101 | 101 | } |
| 102 | 102 | |
| 103 | 103 | /** |
@@ -117,22 +117,22 @@ discard block |
||
| 117 | 117 | * Type d'objet édité |
| 118 | 118 | */ |
| 119 | 119 | function signale_edition($id, $auteur, $type = 'article') { |
| 120 | - include_spip('base/objets'); |
|
| 121 | - include_spip('inc/filtres'); |
|
| 122 | - if (objet_info($type, 'editable') !== 'oui') { |
|
| 123 | - return; |
|
| 124 | - } |
|
| 120 | + include_spip('base/objets'); |
|
| 121 | + include_spip('inc/filtres'); |
|
| 122 | + if (objet_info($type, 'editable') !== 'oui') { |
|
| 123 | + return; |
|
| 124 | + } |
|
| 125 | 125 | |
| 126 | - $edition = lire_tableau_edition(); |
|
| 126 | + $edition = lire_tableau_edition(); |
|
| 127 | 127 | |
| 128 | - $nom = $auteur['nom'] ?? $GLOBALS['ip']; |
|
| 129 | - $id_a = $auteur['id_auteur'] ?? $GLOBALS['ip']; |
|
| 128 | + $nom = $auteur['nom'] ?? $GLOBALS['ip']; |
|
| 129 | + $id_a = $auteur['id_auteur'] ?? $GLOBALS['ip']; |
|
| 130 | 130 | |
| 131 | - if (!isset($edition[$type][$id]) or !is_array($edition[$type][$id])) { |
|
| 132 | - $edition[$type][$id] = []; |
|
| 133 | - } |
|
| 134 | - $edition[$type][$id][$id_a][$nom] = time(); |
|
| 135 | - ecrire_tableau_edition($edition); |
|
| 131 | + if (!isset($edition[$type][$id]) or !is_array($edition[$type][$id])) { |
|
| 132 | + $edition[$type][$id] = []; |
|
| 133 | + } |
|
| 134 | + $edition[$type][$id][$id_a][$nom] = time(); |
|
| 135 | + ecrire_tableau_edition($edition); |
|
| 136 | 136 | } |
| 137 | 137 | |
| 138 | 138 | /** |
@@ -149,9 +149,9 @@ discard block |
||
| 149 | 149 | */ |
| 150 | 150 | function qui_edite($id, $type = 'article') { |
| 151 | 151 | |
| 152 | - $edition = lire_tableau_edition(); |
|
| 152 | + $edition = lire_tableau_edition(); |
|
| 153 | 153 | |
| 154 | - return empty($edition[$type][$id]) ? [] : $edition[$type][$id]; |
|
| 154 | + return empty($edition[$type][$id]) ? [] : $edition[$type][$id]; |
|
| 155 | 155 | } |
| 156 | 156 | |
| 157 | 157 | /** |
@@ -165,23 +165,23 @@ discard block |
||
| 165 | 165 | * Liste de tableaux `['nom_auteur_modif' => x|y|z, 'date_diff' => n]` |
| 166 | 166 | */ |
| 167 | 167 | function mention_qui_edite($id, $type = 'article'): array { |
| 168 | - $modif = qui_edite($id, $type); |
|
| 169 | - unset($modif[$GLOBALS['visiteur_session']['id_auteur']]); |
|
| 168 | + $modif = qui_edite($id, $type); |
|
| 169 | + unset($modif[$GLOBALS['visiteur_session']['id_auteur']]); |
|
| 170 | 170 | |
| 171 | - if ($modif) { |
|
| 172 | - $quand = 0; |
|
| 173 | - foreach ($modif as $duo) { |
|
| 174 | - $auteurs[] = typo(key($duo)); |
|
| 175 | - $quand = max($quand, current($duo)); |
|
| 176 | - } |
|
| 171 | + if ($modif) { |
|
| 172 | + $quand = 0; |
|
| 173 | + foreach ($modif as $duo) { |
|
| 174 | + $auteurs[] = typo(key($duo)); |
|
| 175 | + $quand = max($quand, current($duo)); |
|
| 176 | + } |
|
| 177 | 177 | |
| 178 | - // format lie a la chaine de langue 'avis_article_modifie' |
|
| 179 | - return [ |
|
| 180 | - 'nom_auteur_modif' => join(' | ', $auteurs), |
|
| 181 | - 'date_diff' => ceil((time() - $quand) / 60) |
|
| 182 | - ]; |
|
| 183 | - } |
|
| 184 | - return []; |
|
| 178 | + // format lie a la chaine de langue 'avis_article_modifie' |
|
| 179 | + return [ |
|
| 180 | + 'nom_auteur_modif' => join(' | ', $auteurs), |
|
| 181 | + 'date_diff' => ceil((time() - $quand) / 60) |
|
| 182 | + ]; |
|
| 183 | + } |
|
| 184 | + return []; |
|
| 185 | 185 | } |
| 186 | 186 | |
| 187 | 187 | /** |
@@ -195,25 +195,25 @@ discard block |
||
| 195 | 195 | * Liste de tableaux `['objet' => x, 'id_objet' => n]` |
| 196 | 196 | */ |
| 197 | 197 | function liste_drapeau_edition($id_auteur) { |
| 198 | - $edition = lire_tableau_edition(); |
|
| 199 | - $objets_ouverts = []; |
|
| 198 | + $edition = lire_tableau_edition(); |
|
| 199 | + $objets_ouverts = []; |
|
| 200 | 200 | |
| 201 | - foreach ($edition as $objet => $data) { |
|
| 202 | - foreach ($data as $id => $auteurs) { |
|
| 203 | - if ( |
|
| 204 | - isset($auteurs[$id_auteur]) |
|
| 205 | - and is_array($auteurs[$id_auteur]) // precaution |
|
| 206 | - and (array_pop($auteurs[$id_auteur]) > time() - 3600) |
|
| 207 | - ) { |
|
| 208 | - $objets_ouverts[] = [ |
|
| 209 | - 'objet' => $objet, |
|
| 210 | - 'id_objet' => $id, |
|
| 211 | - ]; |
|
| 212 | - } |
|
| 213 | - } |
|
| 214 | - } |
|
| 201 | + foreach ($edition as $objet => $data) { |
|
| 202 | + foreach ($data as $id => $auteurs) { |
|
| 203 | + if ( |
|
| 204 | + isset($auteurs[$id_auteur]) |
|
| 205 | + and is_array($auteurs[$id_auteur]) // precaution |
|
| 206 | + and (array_pop($auteurs[$id_auteur]) > time() - 3600) |
|
| 207 | + ) { |
|
| 208 | + $objets_ouverts[] = [ |
|
| 209 | + 'objet' => $objet, |
|
| 210 | + 'id_objet' => $id, |
|
| 211 | + ]; |
|
| 212 | + } |
|
| 213 | + } |
|
| 214 | + } |
|
| 215 | 215 | |
| 216 | - return $objets_ouverts; |
|
| 216 | + return $objets_ouverts; |
|
| 217 | 217 | } |
| 218 | 218 | |
| 219 | 219 | /** |
@@ -226,15 +226,15 @@ discard block |
||
| 226 | 226 | * @return void |
| 227 | 227 | */ |
| 228 | 228 | function debloquer_tous($id_auteur) { |
| 229 | - $edition = lire_tableau_edition(); |
|
| 230 | - foreach ($edition as $objet => $data) { |
|
| 231 | - foreach ($data as $id => $auteurs) { |
|
| 232 | - if (isset($auteurs[$id_auteur])) { |
|
| 233 | - unset($edition[$objet][$id][$id_auteur]); |
|
| 234 | - ecrire_tableau_edition($edition); |
|
| 235 | - } |
|
| 236 | - } |
|
| 237 | - } |
|
| 229 | + $edition = lire_tableau_edition(); |
|
| 230 | + foreach ($edition as $objet => $data) { |
|
| 231 | + foreach ($data as $id => $auteurs) { |
|
| 232 | + if (isset($auteurs[$id_auteur])) { |
|
| 233 | + unset($edition[$objet][$id][$id_auteur]); |
|
| 234 | + ecrire_tableau_edition($edition); |
|
| 235 | + } |
|
| 236 | + } |
|
| 237 | + } |
|
| 238 | 238 | } |
| 239 | 239 | |
| 240 | 240 | /** |
@@ -252,19 +252,19 @@ discard block |
||
| 252 | 252 | * @return void |
| 253 | 253 | */ |
| 254 | 254 | function debloquer_edition($id_auteur, $id_objet, $type = 'article') { |
| 255 | - $edition = lire_tableau_edition(); |
|
| 255 | + $edition = lire_tableau_edition(); |
|
| 256 | 256 | |
| 257 | - foreach ($edition as $objet => $data) { |
|
| 258 | - if ($objet == $type) { |
|
| 259 | - foreach ($data as $id => $auteurs) { |
|
| 260 | - if ( |
|
| 261 | - $id == $id_objet |
|
| 262 | - and isset($auteurs[$id_auteur]) |
|
| 263 | - ) { |
|
| 264 | - unset($edition[$objet][$id][$id_auteur]); |
|
| 265 | - ecrire_tableau_edition($edition); |
|
| 266 | - } |
|
| 267 | - } |
|
| 268 | - } |
|
| 269 | - } |
|
| 257 | + foreach ($edition as $objet => $data) { |
|
| 258 | + if ($objet == $type) { |
|
| 259 | + foreach ($data as $id => $auteurs) { |
|
| 260 | + if ( |
|
| 261 | + $id == $id_objet |
|
| 262 | + and isset($auteurs[$id_auteur]) |
|
| 263 | + ) { |
|
| 264 | + unset($edition[$objet][$id][$id_auteur]); |
|
| 265 | + ecrire_tableau_edition($edition); |
|
| 266 | + } |
|
| 267 | + } |
|
| 268 | + } |
|
| 269 | + } |
|
| 270 | 270 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Formulaires |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | |
@@ -36,25 +36,25 @@ discard block |
||
| 36 | 36 | * ($table_source,$objet,$id_objet,$objet_lien) |
| 37 | 37 | */ |
| 38 | 38 | function determine_source_lien_objet($a, $b, $c) { |
| 39 | - $table_source = $objet_lien = $objet = $id_objet = null; |
|
| 40 | - // auteurs, article, 23 : |
|
| 41 | - // associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens |
|
| 42 | - if (is_numeric($c) and !is_numeric($b)) { |
|
| 43 | - $table_source = table_objet($a); |
|
| 44 | - $objet_lien = objet_type($a); |
|
| 45 | - $objet = objet_type($b); |
|
| 46 | - $id_objet = $c; |
|
| 47 | - } |
|
| 48 | - // article, 23, auteurs |
|
| 49 | - // associer des auteurs à l'article 23, sur la table pivot spip_articles_liens |
|
| 50 | - if (is_numeric($b) and !is_numeric($c)) { |
|
| 51 | - $table_source = table_objet($c); |
|
| 52 | - $objet_lien = objet_type($a); |
|
| 53 | - $objet = objet_type($a); |
|
| 54 | - $id_objet = $b; |
|
| 55 | - } |
|
| 56 | - |
|
| 57 | - return [$table_source, $objet, $id_objet, $objet_lien]; |
|
| 39 | + $table_source = $objet_lien = $objet = $id_objet = null; |
|
| 40 | + // auteurs, article, 23 : |
|
| 41 | + // associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens |
|
| 42 | + if (is_numeric($c) and !is_numeric($b)) { |
|
| 43 | + $table_source = table_objet($a); |
|
| 44 | + $objet_lien = objet_type($a); |
|
| 45 | + $objet = objet_type($b); |
|
| 46 | + $id_objet = $c; |
|
| 47 | + } |
|
| 48 | + // article, 23, auteurs |
|
| 49 | + // associer des auteurs à l'article 23, sur la table pivot spip_articles_liens |
|
| 50 | + if (is_numeric($b) and !is_numeric($c)) { |
|
| 51 | + $table_source = table_objet($c); |
|
| 52 | + $objet_lien = objet_type($a); |
|
| 53 | + $objet = objet_type($a); |
|
| 54 | + $id_objet = $b; |
|
| 55 | + } |
|
| 56 | + |
|
| 57 | + return [$table_source, $objet, $id_objet, $objet_lien]; |
|
| 58 | 58 | } |
| 59 | 59 | |
| 60 | 60 | /** |
@@ -80,93 +80,93 @@ discard block |
||
| 80 | 80 | */ |
| 81 | 81 | function formulaires_editer_liens_charger_dist($a, $b, $c, $options = []) { |
| 82 | 82 | |
| 83 | - // compat avec ancienne signature ou le 4eme argument est $editable |
|
| 84 | - if (!is_array($options)) { |
|
| 85 | - $options = ['editable' => $options]; |
|
| 86 | - } elseif (!isset($options['editable'])) { |
|
| 87 | - $options['editable'] = true; |
|
| 88 | - } |
|
| 89 | - |
|
| 90 | - $editable = $options['editable']; |
|
| 91 | - |
|
| 92 | - [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c); |
|
| 93 | - if (!$table_source or !$objet or !$objet_lien or !$id_objet) { |
|
| 94 | - return false; |
|
| 95 | - } |
|
| 96 | - |
|
| 97 | - $objet_source = objet_type($table_source); |
|
| 98 | - $table_sql_source = table_objet_sql($objet_source); |
|
| 99 | - |
|
| 100 | - // verifier existence de la table xxx_liens |
|
| 101 | - include_spip('action/editer_liens'); |
|
| 102 | - if (!objet_associable($objet_lien)) { |
|
| 103 | - return false; |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - // L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument |
|
| 107 | - include_spip('inc/autoriser'); |
|
| 108 | - $editable = ($editable and autoriser('associer' . $table_source, $objet, $id_objet) |
|
| 109 | - and autoriser('modifier', $objet, $id_objet)); |
|
| 110 | - |
|
| 111 | - if ( |
|
| 112 | - !$editable and !count(objet_trouver_liens( |
|
| 113 | - [$objet_lien => '*'], |
|
| 114 | - [($objet_lien == $objet_source ? $objet : $objet_source) => $id_objet] |
|
| 115 | - )) |
|
| 116 | - ) { |
|
| 117 | - return false; |
|
| 118 | - } |
|
| 119 | - |
|
| 120 | - // squelettes de vue et de d'association |
|
| 121 | - // ils sont différents si des rôles sont définis. |
|
| 122 | - $skel_vue = $table_source . '_lies'; |
|
| 123 | - $skel_ajout = $table_source . '_associer'; |
|
| 124 | - |
|
| 125 | - // description des roles |
|
| 126 | - include_spip('inc/roles'); |
|
| 127 | - if ($roles = roles_presents($objet_source, $objet)) { |
|
| 128 | - // on demande de nouveaux squelettes en conséquence |
|
| 129 | - $skel_vue = $table_source . '_roles_lies'; |
|
| 130 | - $skel_ajout = $table_source . '_roles_associer'; |
|
| 131 | - } |
|
| 132 | - |
|
| 133 | - $oups = ''; |
|
| 134 | - if ($editable) { |
|
| 135 | - $oups = _request('_oups') ?? ''; |
|
| 136 | - if ($oups) { |
|
| 137 | - if (json_decode(base64_decode($oups, true))) { |
|
| 138 | - // on est bon, rien a faire |
|
| 139 | - } else { |
|
| 140 | - $oups = ''; |
|
| 141 | - } |
|
| 142 | - } |
|
| 143 | - } |
|
| 144 | - $valeurs = [ |
|
| 145 | - 'id' => "$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form |
|
| 146 | - '_vue_liee' => $skel_vue, |
|
| 147 | - '_vue_ajout' => $skel_ajout, |
|
| 148 | - '_objet_lien' => $objet_lien, |
|
| 149 | - 'id_lien_ajoute' => _request('id_lien_ajoute'), |
|
| 150 | - 'objet' => $objet, |
|
| 151 | - 'id_objet' => $id_objet, |
|
| 152 | - 'objet_source' => $objet_source, |
|
| 153 | - 'table_source' => $table_source, |
|
| 154 | - 'recherche' => '', |
|
| 155 | - 'visible' => 0, |
|
| 156 | - 'ajouter_lien' => '', |
|
| 157 | - 'supprimer_lien' => '', |
|
| 158 | - 'qualifier_lien' => '', |
|
| 159 | - 'ordonner_lien' => '', |
|
| 160 | - 'desordonner_liens' => '', |
|
| 161 | - '_roles' => $roles, # description des roles |
|
| 162 | - '_oups' => entites_html($oups), |
|
| 163 | - 'editable' => $editable, |
|
| 164 | - ]; |
|
| 165 | - |
|
| 166 | - // les options non definies dans $valeurs sont passees telles quelles au formulaire html |
|
| 167 | - $valeurs = array_merge($options, $valeurs); |
|
| 168 | - |
|
| 169 | - return $valeurs; |
|
| 83 | + // compat avec ancienne signature ou le 4eme argument est $editable |
|
| 84 | + if (!is_array($options)) { |
|
| 85 | + $options = ['editable' => $options]; |
|
| 86 | + } elseif (!isset($options['editable'])) { |
|
| 87 | + $options['editable'] = true; |
|
| 88 | + } |
|
| 89 | + |
|
| 90 | + $editable = $options['editable']; |
|
| 91 | + |
|
| 92 | + [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c); |
|
| 93 | + if (!$table_source or !$objet or !$objet_lien or !$id_objet) { |
|
| 94 | + return false; |
|
| 95 | + } |
|
| 96 | + |
|
| 97 | + $objet_source = objet_type($table_source); |
|
| 98 | + $table_sql_source = table_objet_sql($objet_source); |
|
| 99 | + |
|
| 100 | + // verifier existence de la table xxx_liens |
|
| 101 | + include_spip('action/editer_liens'); |
|
| 102 | + if (!objet_associable($objet_lien)) { |
|
| 103 | + return false; |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + // L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument |
|
| 107 | + include_spip('inc/autoriser'); |
|
| 108 | + $editable = ($editable and autoriser('associer' . $table_source, $objet, $id_objet) |
|
| 109 | + and autoriser('modifier', $objet, $id_objet)); |
|
| 110 | + |
|
| 111 | + if ( |
|
| 112 | + !$editable and !count(objet_trouver_liens( |
|
| 113 | + [$objet_lien => '*'], |
|
| 114 | + [($objet_lien == $objet_source ? $objet : $objet_source) => $id_objet] |
|
| 115 | + )) |
|
| 116 | + ) { |
|
| 117 | + return false; |
|
| 118 | + } |
|
| 119 | + |
|
| 120 | + // squelettes de vue et de d'association |
|
| 121 | + // ils sont différents si des rôles sont définis. |
|
| 122 | + $skel_vue = $table_source . '_lies'; |
|
| 123 | + $skel_ajout = $table_source . '_associer'; |
|
| 124 | + |
|
| 125 | + // description des roles |
|
| 126 | + include_spip('inc/roles'); |
|
| 127 | + if ($roles = roles_presents($objet_source, $objet)) { |
|
| 128 | + // on demande de nouveaux squelettes en conséquence |
|
| 129 | + $skel_vue = $table_source . '_roles_lies'; |
|
| 130 | + $skel_ajout = $table_source . '_roles_associer'; |
|
| 131 | + } |
|
| 132 | + |
|
| 133 | + $oups = ''; |
|
| 134 | + if ($editable) { |
|
| 135 | + $oups = _request('_oups') ?? ''; |
|
| 136 | + if ($oups) { |
|
| 137 | + if (json_decode(base64_decode($oups, true))) { |
|
| 138 | + // on est bon, rien a faire |
|
| 139 | + } else { |
|
| 140 | + $oups = ''; |
|
| 141 | + } |
|
| 142 | + } |
|
| 143 | + } |
|
| 144 | + $valeurs = [ |
|
| 145 | + 'id' => "$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form |
|
| 146 | + '_vue_liee' => $skel_vue, |
|
| 147 | + '_vue_ajout' => $skel_ajout, |
|
| 148 | + '_objet_lien' => $objet_lien, |
|
| 149 | + 'id_lien_ajoute' => _request('id_lien_ajoute'), |
|
| 150 | + 'objet' => $objet, |
|
| 151 | + 'id_objet' => $id_objet, |
|
| 152 | + 'objet_source' => $objet_source, |
|
| 153 | + 'table_source' => $table_source, |
|
| 154 | + 'recherche' => '', |
|
| 155 | + 'visible' => 0, |
|
| 156 | + 'ajouter_lien' => '', |
|
| 157 | + 'supprimer_lien' => '', |
|
| 158 | + 'qualifier_lien' => '', |
|
| 159 | + 'ordonner_lien' => '', |
|
| 160 | + 'desordonner_liens' => '', |
|
| 161 | + '_roles' => $roles, # description des roles |
|
| 162 | + '_oups' => entites_html($oups), |
|
| 163 | + 'editable' => $editable, |
|
| 164 | + ]; |
|
| 165 | + |
|
| 166 | + // les options non definies dans $valeurs sont passees telles quelles au formulaire html |
|
| 167 | + $valeurs = array_merge($options, $valeurs); |
|
| 168 | + |
|
| 169 | + return $valeurs; |
|
| 170 | 170 | } |
| 171 | 171 | |
| 172 | 172 | /** |
@@ -210,165 +210,165 @@ discard block |
||
| 210 | 210 | * @return array |
| 211 | 211 | */ |
| 212 | 212 | function formulaires_editer_liens_traiter_dist($a, $b, $c, $options = []) { |
| 213 | - // compat avec ancienne signature ou le 4eme argument est $editable |
|
| 214 | - if (!is_array($options)) { |
|
| 215 | - $options = ['editable' => $options]; |
|
| 216 | - } elseif (!isset($options['editable'])) { |
|
| 217 | - $options['editable'] = true; |
|
| 218 | - } |
|
| 219 | - |
|
| 220 | - $editable = $options['editable']; |
|
| 221 | - |
|
| 222 | - $res = ['editable' => $editable ? true : false]; |
|
| 223 | - [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c); |
|
| 224 | - if (!$table_source or !$objet or !$objet_lien) { |
|
| 225 | - return $res; |
|
| 226 | - } |
|
| 227 | - |
|
| 228 | - |
|
| 229 | - if (_request('tout_voir')) { |
|
| 230 | - set_request('recherche', ''); |
|
| 231 | - } |
|
| 232 | - |
|
| 233 | - include_spip('inc/autoriser'); |
|
| 234 | - if (autoriser('modifier', $objet, $id_objet)) { |
|
| 235 | - // annuler les suppressions du coup d'avant ! |
|
| 236 | - if ( |
|
| 237 | - _request('annuler_oups') |
|
| 238 | - and $oups = _request('_oups') |
|
| 239 | - and $oups = base64_decode($oups, true) |
|
| 240 | - and $oups = json_decode($oups, true) |
|
| 241 | - ) { |
|
| 242 | - if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", 'action', true)) { |
|
| 243 | - $oups_objets($oups); |
|
| 244 | - } else { |
|
| 245 | - $objet_source = objet_type($table_source); |
|
| 246 | - include_spip('action/editer_liens'); |
|
| 247 | - foreach ($oups as $oup) { |
|
| 248 | - if ($objet_lien == $objet_source) { |
|
| 249 | - objet_associer([$objet_source => $oup[$objet_source]], [$objet => $oup[$objet]], $oup); |
|
| 250 | - } else { |
|
| 251 | - objet_associer([$objet => $oup[$objet]], [$objet_source => $oup[$objet_source]], $oup); |
|
| 252 | - } |
|
| 253 | - } |
|
| 254 | - } |
|
| 255 | - # oups ne persiste que pour la derniere action, si suppression |
|
| 256 | - set_request('_oups'); |
|
| 257 | - } |
|
| 258 | - |
|
| 259 | - $supprimer = _request('supprimer_lien'); |
|
| 260 | - $ajouter = _request('ajouter_lien'); |
|
| 261 | - $ordonner = _request('ordonner_lien'); |
|
| 262 | - |
|
| 263 | - if (_request('desordonner_liens')) { |
|
| 264 | - include_spip('action/editer_liens'); |
|
| 265 | - objet_qualifier_liens([$objet_lien => '*'], [$objet => $id_objet], ['rang_lien' => 0]); |
|
| 266 | - } |
|
| 267 | - |
|
| 268 | - // il est possible de preciser dans une seule variable un remplacement : |
|
| 269 | - // remplacer_lien[old][new] |
|
| 270 | - if ($remplacer = _request('remplacer_lien')) { |
|
| 271 | - foreach ($remplacer as $k => $v) { |
|
| 272 | - if ($old = lien_verifier_action($k, '')) { |
|
| 273 | - foreach (is_array($v) ? $v : [$v] as $kn => $vn) { |
|
| 274 | - if ($new = lien_verifier_action($kn, $vn)) { |
|
| 275 | - $supprimer[$old] = 'x'; |
|
| 276 | - $ajouter[$new] = '+'; |
|
| 277 | - } |
|
| 278 | - } |
|
| 279 | - } |
|
| 280 | - } |
|
| 281 | - } |
|
| 282 | - |
|
| 283 | - if ($supprimer) { |
|
| 284 | - if ( |
|
| 285 | - $supprimer_objets = charger_fonction( |
|
| 286 | - "editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}", |
|
| 287 | - 'action', |
|
| 288 | - true |
|
| 289 | - ) |
|
| 290 | - ) { |
|
| 291 | - $oups = $supprimer_objets($supprimer); |
|
| 292 | - } else { |
|
| 293 | - include_spip('action/editer_liens'); |
|
| 294 | - $oups = []; |
|
| 295 | - |
|
| 296 | - foreach ($supprimer as $k => $v) { |
|
| 297 | - if ($lien = lien_verifier_action($k, $v)) { |
|
| 298 | - $lien = explode('-', $lien); |
|
| 299 | - [$objet_source, $ids, $objet_lie, $idl, $role] = array_pad($lien, 5, null); |
|
| 300 | - // appliquer une condition sur le rôle si défini ('*' pour tous les roles) |
|
| 301 | - $cond = (!is_null($role) ? ['role' => $role] : []); |
|
| 302 | - if ($objet_lien == $objet_source) { |
|
| 303 | - $oups = array_merge( |
|
| 304 | - $oups, |
|
| 305 | - objet_trouver_liens([$objet_source => $ids], [$objet_lie => $idl], $cond) |
|
| 306 | - ); |
|
| 307 | - objet_dissocier([$objet_source => $ids], [$objet_lie => $idl], $cond); |
|
| 308 | - } else { |
|
| 309 | - $oups = array_merge( |
|
| 310 | - $oups, |
|
| 311 | - objet_trouver_liens([$objet_lie => $idl], [$objet_source => $ids], $cond) |
|
| 312 | - ); |
|
| 313 | - objet_dissocier([$objet_lie => $idl], [$objet_source => $ids], $cond); |
|
| 314 | - } |
|
| 315 | - } |
|
| 316 | - } |
|
| 317 | - } |
|
| 318 | - set_request('_oups', $oups ? base64_encode(json_encode($oups)) : null); |
|
| 319 | - } |
|
| 320 | - |
|
| 321 | - if ($ajouter) { |
|
| 322 | - if ( |
|
| 323 | - $ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", 'action', true) |
|
| 324 | - ) { |
|
| 325 | - $ajout_ok = $ajouter_objets($ajouter); |
|
| 326 | - } else { |
|
| 327 | - $ajout_ok = false; |
|
| 328 | - include_spip('action/editer_liens'); |
|
| 329 | - foreach ($ajouter as $k => $v) { |
|
| 330 | - if ($lien = lien_verifier_action($k, $v)) { |
|
| 331 | - $ajout_ok = true; |
|
| 332 | - [$objet1, $ids, $objet2, $idl] = explode('-', $lien); |
|
| 333 | - $qualifs = lien_retrouver_qualif($objet_lien, $lien); |
|
| 334 | - if ($objet_lien == $objet1) { |
|
| 335 | - lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs); |
|
| 336 | - } else { |
|
| 337 | - lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs); |
|
| 338 | - } |
|
| 339 | - set_request('id_lien_ajoute', $ids); |
|
| 340 | - } |
|
| 341 | - } |
|
| 342 | - } |
|
| 343 | - # oups ne persiste que pour la derniere action, si suppression |
|
| 344 | - # une suppression suivie d'un ajout dans le meme hit est un remplacement |
|
| 345 | - # non annulable ! |
|
| 346 | - if ($ajout_ok) { |
|
| 347 | - set_request('_oups'); |
|
| 348 | - } |
|
| 349 | - } |
|
| 350 | - |
|
| 351 | - if ($ordonner) { |
|
| 352 | - include_spip('action/editer_liens'); |
|
| 353 | - foreach ($ordonner as $k => $rang_lien) { |
|
| 354 | - if ($lien = lien_verifier_action($k, '')) { |
|
| 355 | - [$objet1, $ids, $objet2, $idl] = explode('-', $lien); |
|
| 356 | - $qualif = ['rang_lien' => $rang_lien]; |
|
| 357 | - |
|
| 358 | - if ($objet_lien == $objet1) { |
|
| 359 | - objet_qualifier_liens([$objet1 => $ids], [$objet2 => $idl], $qualif); |
|
| 360 | - } else { |
|
| 361 | - objet_qualifier_liens([$objet2 => $idl], [$objet1 => $ids], $qualif); |
|
| 362 | - } |
|
| 363 | - set_request('id_lien_ajoute', $ids); |
|
| 364 | - set_request('_oups'); |
|
| 365 | - } |
|
| 366 | - } |
|
| 367 | - } |
|
| 368 | - } |
|
| 369 | - |
|
| 370 | - |
|
| 371 | - return $res; |
|
| 213 | + // compat avec ancienne signature ou le 4eme argument est $editable |
|
| 214 | + if (!is_array($options)) { |
|
| 215 | + $options = ['editable' => $options]; |
|
| 216 | + } elseif (!isset($options['editable'])) { |
|
| 217 | + $options['editable'] = true; |
|
| 218 | + } |
|
| 219 | + |
|
| 220 | + $editable = $options['editable']; |
|
| 221 | + |
|
| 222 | + $res = ['editable' => $editable ? true : false]; |
|
| 223 | + [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c); |
|
| 224 | + if (!$table_source or !$objet or !$objet_lien) { |
|
| 225 | + return $res; |
|
| 226 | + } |
|
| 227 | + |
|
| 228 | + |
|
| 229 | + if (_request('tout_voir')) { |
|
| 230 | + set_request('recherche', ''); |
|
| 231 | + } |
|
| 232 | + |
|
| 233 | + include_spip('inc/autoriser'); |
|
| 234 | + if (autoriser('modifier', $objet, $id_objet)) { |
|
| 235 | + // annuler les suppressions du coup d'avant ! |
|
| 236 | + if ( |
|
| 237 | + _request('annuler_oups') |
|
| 238 | + and $oups = _request('_oups') |
|
| 239 | + and $oups = base64_decode($oups, true) |
|
| 240 | + and $oups = json_decode($oups, true) |
|
| 241 | + ) { |
|
| 242 | + if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", 'action', true)) { |
|
| 243 | + $oups_objets($oups); |
|
| 244 | + } else { |
|
| 245 | + $objet_source = objet_type($table_source); |
|
| 246 | + include_spip('action/editer_liens'); |
|
| 247 | + foreach ($oups as $oup) { |
|
| 248 | + if ($objet_lien == $objet_source) { |
|
| 249 | + objet_associer([$objet_source => $oup[$objet_source]], [$objet => $oup[$objet]], $oup); |
|
| 250 | + } else { |
|
| 251 | + objet_associer([$objet => $oup[$objet]], [$objet_source => $oup[$objet_source]], $oup); |
|
| 252 | + } |
|
| 253 | + } |
|
| 254 | + } |
|
| 255 | + # oups ne persiste que pour la derniere action, si suppression |
|
| 256 | + set_request('_oups'); |
|
| 257 | + } |
|
| 258 | + |
|
| 259 | + $supprimer = _request('supprimer_lien'); |
|
| 260 | + $ajouter = _request('ajouter_lien'); |
|
| 261 | + $ordonner = _request('ordonner_lien'); |
|
| 262 | + |
|
| 263 | + if (_request('desordonner_liens')) { |
|
| 264 | + include_spip('action/editer_liens'); |
|
| 265 | + objet_qualifier_liens([$objet_lien => '*'], [$objet => $id_objet], ['rang_lien' => 0]); |
|
| 266 | + } |
|
| 267 | + |
|
| 268 | + // il est possible de preciser dans une seule variable un remplacement : |
|
| 269 | + // remplacer_lien[old][new] |
|
| 270 | + if ($remplacer = _request('remplacer_lien')) { |
|
| 271 | + foreach ($remplacer as $k => $v) { |
|
| 272 | + if ($old = lien_verifier_action($k, '')) { |
|
| 273 | + foreach (is_array($v) ? $v : [$v] as $kn => $vn) { |
|
| 274 | + if ($new = lien_verifier_action($kn, $vn)) { |
|
| 275 | + $supprimer[$old] = 'x'; |
|
| 276 | + $ajouter[$new] = '+'; |
|
| 277 | + } |
|
| 278 | + } |
|
| 279 | + } |
|
| 280 | + } |
|
| 281 | + } |
|
| 282 | + |
|
| 283 | + if ($supprimer) { |
|
| 284 | + if ( |
|
| 285 | + $supprimer_objets = charger_fonction( |
|
| 286 | + "editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}", |
|
| 287 | + 'action', |
|
| 288 | + true |
|
| 289 | + ) |
|
| 290 | + ) { |
|
| 291 | + $oups = $supprimer_objets($supprimer); |
|
| 292 | + } else { |
|
| 293 | + include_spip('action/editer_liens'); |
|
| 294 | + $oups = []; |
|
| 295 | + |
|
| 296 | + foreach ($supprimer as $k => $v) { |
|
| 297 | + if ($lien = lien_verifier_action($k, $v)) { |
|
| 298 | + $lien = explode('-', $lien); |
|
| 299 | + [$objet_source, $ids, $objet_lie, $idl, $role] = array_pad($lien, 5, null); |
|
| 300 | + // appliquer une condition sur le rôle si défini ('*' pour tous les roles) |
|
| 301 | + $cond = (!is_null($role) ? ['role' => $role] : []); |
|
| 302 | + if ($objet_lien == $objet_source) { |
|
| 303 | + $oups = array_merge( |
|
| 304 | + $oups, |
|
| 305 | + objet_trouver_liens([$objet_source => $ids], [$objet_lie => $idl], $cond) |
|
| 306 | + ); |
|
| 307 | + objet_dissocier([$objet_source => $ids], [$objet_lie => $idl], $cond); |
|
| 308 | + } else { |
|
| 309 | + $oups = array_merge( |
|
| 310 | + $oups, |
|
| 311 | + objet_trouver_liens([$objet_lie => $idl], [$objet_source => $ids], $cond) |
|
| 312 | + ); |
|
| 313 | + objet_dissocier([$objet_lie => $idl], [$objet_source => $ids], $cond); |
|
| 314 | + } |
|
| 315 | + } |
|
| 316 | + } |
|
| 317 | + } |
|
| 318 | + set_request('_oups', $oups ? base64_encode(json_encode($oups)) : null); |
|
| 319 | + } |
|
| 320 | + |
|
| 321 | + if ($ajouter) { |
|
| 322 | + if ( |
|
| 323 | + $ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", 'action', true) |
|
| 324 | + ) { |
|
| 325 | + $ajout_ok = $ajouter_objets($ajouter); |
|
| 326 | + } else { |
|
| 327 | + $ajout_ok = false; |
|
| 328 | + include_spip('action/editer_liens'); |
|
| 329 | + foreach ($ajouter as $k => $v) { |
|
| 330 | + if ($lien = lien_verifier_action($k, $v)) { |
|
| 331 | + $ajout_ok = true; |
|
| 332 | + [$objet1, $ids, $objet2, $idl] = explode('-', $lien); |
|
| 333 | + $qualifs = lien_retrouver_qualif($objet_lien, $lien); |
|
| 334 | + if ($objet_lien == $objet1) { |
|
| 335 | + lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs); |
|
| 336 | + } else { |
|
| 337 | + lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs); |
|
| 338 | + } |
|
| 339 | + set_request('id_lien_ajoute', $ids); |
|
| 340 | + } |
|
| 341 | + } |
|
| 342 | + } |
|
| 343 | + # oups ne persiste que pour la derniere action, si suppression |
|
| 344 | + # une suppression suivie d'un ajout dans le meme hit est un remplacement |
|
| 345 | + # non annulable ! |
|
| 346 | + if ($ajout_ok) { |
|
| 347 | + set_request('_oups'); |
|
| 348 | + } |
|
| 349 | + } |
|
| 350 | + |
|
| 351 | + if ($ordonner) { |
|
| 352 | + include_spip('action/editer_liens'); |
|
| 353 | + foreach ($ordonner as $k => $rang_lien) { |
|
| 354 | + if ($lien = lien_verifier_action($k, '')) { |
|
| 355 | + [$objet1, $ids, $objet2, $idl] = explode('-', $lien); |
|
| 356 | + $qualif = ['rang_lien' => $rang_lien]; |
|
| 357 | + |
|
| 358 | + if ($objet_lien == $objet1) { |
|
| 359 | + objet_qualifier_liens([$objet1 => $ids], [$objet2 => $idl], $qualif); |
|
| 360 | + } else { |
|
| 361 | + objet_qualifier_liens([$objet2 => $idl], [$objet1 => $ids], $qualif); |
|
| 362 | + } |
|
| 363 | + set_request('id_lien_ajoute', $ids); |
|
| 364 | + set_request('_oups'); |
|
| 365 | + } |
|
| 366 | + } |
|
| 367 | + } |
|
| 368 | + } |
|
| 369 | + |
|
| 370 | + |
|
| 371 | + return $res; |
|
| 372 | 372 | } |
| 373 | 373 | |
| 374 | 374 | |
@@ -391,24 +391,24 @@ discard block |
||
| 391 | 391 | * @return string Action demandée si trouvée, sinon '' |
| 392 | 392 | */ |
| 393 | 393 | function lien_verifier_action($k, $v) { |
| 394 | - $action = ''; |
|
| 395 | - if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) { |
|
| 396 | - $action = $k; |
|
| 397 | - } |
|
| 398 | - if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) { |
|
| 399 | - if (is_numeric($k)) { |
|
| 400 | - $action = $v; |
|
| 401 | - } |
|
| 402 | - if (_request($k)) { |
|
| 403 | - $action = $v; |
|
| 404 | - } |
|
| 405 | - } |
|
| 406 | - // ajout un role null fictif (plus pratique) si pas défini |
|
| 407 | - if ($action and count(explode('-', $action)) == 4) { |
|
| 408 | - $action .= '-'; |
|
| 409 | - } |
|
| 410 | - |
|
| 411 | - return $action; |
|
| 394 | + $action = ''; |
|
| 395 | + if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) { |
|
| 396 | + $action = $k; |
|
| 397 | + } |
|
| 398 | + if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) { |
|
| 399 | + if (is_numeric($k)) { |
|
| 400 | + $action = $v; |
|
| 401 | + } |
|
| 402 | + if (_request($k)) { |
|
| 403 | + $action = $v; |
|
| 404 | + } |
|
| 405 | + } |
|
| 406 | + // ajout un role null fictif (plus pratique) si pas défini |
|
| 407 | + if ($action and count(explode('-', $action)) == 4) { |
|
| 408 | + $action .= '-'; |
|
| 409 | + } |
|
| 410 | + |
|
| 411 | + return $action; |
|
| 412 | 412 | } |
| 413 | 413 | |
| 414 | 414 | |
@@ -424,66 +424,66 @@ discard block |
||
| 424 | 424 | * Liste des qualifs pour chaque lien. Tableau vide s'il n'y en a pas. |
| 425 | 425 | **/ |
| 426 | 426 | function lien_retrouver_qualif($objet_lien, $lien) { |
| 427 | - // un role est défini dans la liaison |
|
| 428 | - $defs = explode('-', $lien); |
|
| 429 | - [$objet1, , $objet2, , $role] = array_pad($defs, 5, null); |
|
| 430 | - if ($objet_lien == $objet1) { |
|
| 431 | - $colonne_role = roles_colonne($objet1, $objet2); |
|
| 432 | - } else { |
|
| 433 | - $colonne_role = roles_colonne($objet2, $objet1); |
|
| 434 | - } |
|
| 435 | - |
|
| 436 | - // cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut) |
|
| 437 | - if ($role) { |
|
| 438 | - return [ |
|
| 439 | - // un seul lien avec ce role |
|
| 440 | - [$colonne_role => $role] |
|
| 441 | - ]; |
|
| 442 | - } |
|
| 443 | - |
|
| 444 | - // retrouver les rôles postés pour cette liaison, s'il y en a. |
|
| 445 | - $qualifier_lien = _request('qualifier_lien'); |
|
| 446 | - if (!$qualifier_lien or !is_array($qualifier_lien)) { |
|
| 447 | - return []; |
|
| 448 | - } |
|
| 449 | - |
|
| 450 | - // pas avec l'action complete (incluant le role) |
|
| 451 | - $qualif = []; |
|
| 452 | - if ( |
|
| 453 | - (!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien]) |
|
| 454 | - and count($defs) == 5 |
|
| 455 | - ) { |
|
| 456 | - // on tente avec l'action sans le role |
|
| 457 | - array_pop($defs); |
|
| 458 | - $lien = implode('-', $defs); |
|
| 459 | - if (!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien]) { |
|
| 460 | - $qualif = []; |
|
| 461 | - } |
|
| 462 | - } |
|
| 463 | - |
|
| 464 | - // $qualif de la forme array(role=>array(...),valeur=>array(...),....) |
|
| 465 | - // on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...) |
|
| 466 | - $qualifs = []; |
|
| 467 | - while (is_countable($qualif) ? count($qualif) : 0) { |
|
| 468 | - $q = []; |
|
| 469 | - foreach ($qualif as $att => $values) { |
|
| 470 | - if (is_array($values)) { |
|
| 471 | - $q[$att] = array_shift($qualif[$att]); |
|
| 472 | - if (!(is_countable($qualif[$att]) ? count($qualif[$att]) : 0)) { |
|
| 473 | - unset($qualif[$att]); |
|
| 474 | - } |
|
| 475 | - } else { |
|
| 476 | - $q[$att] = $values; |
|
| 477 | - unset($qualif[$att]); |
|
| 478 | - } |
|
| 479 | - } |
|
| 480 | - // pas de rôle vide |
|
| 481 | - if (!$colonne_role or !isset($q[$colonne_role]) or $q[$colonne_role]) { |
|
| 482 | - $qualifs[] = $q; |
|
| 483 | - } |
|
| 484 | - } |
|
| 485 | - |
|
| 486 | - return $qualifs; |
|
| 427 | + // un role est défini dans la liaison |
|
| 428 | + $defs = explode('-', $lien); |
|
| 429 | + [$objet1, , $objet2, , $role] = array_pad($defs, 5, null); |
|
| 430 | + if ($objet_lien == $objet1) { |
|
| 431 | + $colonne_role = roles_colonne($objet1, $objet2); |
|
| 432 | + } else { |
|
| 433 | + $colonne_role = roles_colonne($objet2, $objet1); |
|
| 434 | + } |
|
| 435 | + |
|
| 436 | + // cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut) |
|
| 437 | + if ($role) { |
|
| 438 | + return [ |
|
| 439 | + // un seul lien avec ce role |
|
| 440 | + [$colonne_role => $role] |
|
| 441 | + ]; |
|
| 442 | + } |
|
| 443 | + |
|
| 444 | + // retrouver les rôles postés pour cette liaison, s'il y en a. |
|
| 445 | + $qualifier_lien = _request('qualifier_lien'); |
|
| 446 | + if (!$qualifier_lien or !is_array($qualifier_lien)) { |
|
| 447 | + return []; |
|
| 448 | + } |
|
| 449 | + |
|
| 450 | + // pas avec l'action complete (incluant le role) |
|
| 451 | + $qualif = []; |
|
| 452 | + if ( |
|
| 453 | + (!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien]) |
|
| 454 | + and count($defs) == 5 |
|
| 455 | + ) { |
|
| 456 | + // on tente avec l'action sans le role |
|
| 457 | + array_pop($defs); |
|
| 458 | + $lien = implode('-', $defs); |
|
| 459 | + if (!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien]) { |
|
| 460 | + $qualif = []; |
|
| 461 | + } |
|
| 462 | + } |
|
| 463 | + |
|
| 464 | + // $qualif de la forme array(role=>array(...),valeur=>array(...),....) |
|
| 465 | + // on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...) |
|
| 466 | + $qualifs = []; |
|
| 467 | + while (is_countable($qualif) ? count($qualif) : 0) { |
|
| 468 | + $q = []; |
|
| 469 | + foreach ($qualif as $att => $values) { |
|
| 470 | + if (is_array($values)) { |
|
| 471 | + $q[$att] = array_shift($qualif[$att]); |
|
| 472 | + if (!(is_countable($qualif[$att]) ? count($qualif[$att]) : 0)) { |
|
| 473 | + unset($qualif[$att]); |
|
| 474 | + } |
|
| 475 | + } else { |
|
| 476 | + $q[$att] = $values; |
|
| 477 | + unset($qualif[$att]); |
|
| 478 | + } |
|
| 479 | + } |
|
| 480 | + // pas de rôle vide |
|
| 481 | + if (!$colonne_role or !isset($q[$colonne_role]) or $q[$colonne_role]) { |
|
| 482 | + $qualifs[] = $q; |
|
| 483 | + } |
|
| 484 | + } |
|
| 485 | + |
|
| 486 | + return $qualifs; |
|
| 487 | 487 | } |
| 488 | 488 | |
| 489 | 489 | /** |
@@ -502,12 +502,12 @@ discard block |
||
| 502 | 502 | **/ |
| 503 | 503 | function lien_ajouter_liaisons($objet_source, $ids, $objet_lien, $idl, $qualifs) { |
| 504 | 504 | |
| 505 | - // retrouver la colonne de roles s'il y en a a lier |
|
| 506 | - if (is_array($qualifs) and count($qualifs)) { |
|
| 507 | - foreach ($qualifs as $qualif) { |
|
| 508 | - objet_associer([$objet_source => $ids], [$objet_lien => $idl], $qualif); |
|
| 509 | - } |
|
| 510 | - } else { |
|
| 511 | - objet_associer([$objet_source => $ids], [$objet_lien => $idl]); |
|
| 512 | - } |
|
| 505 | + // retrouver la colonne de roles s'il y en a a lier |
|
| 506 | + if (is_array($qualifs) and count($qualifs)) { |
|
| 507 | + foreach ($qualifs as $qualif) { |
|
| 508 | + objet_associer([$objet_source => $ids], [$objet_lien => $idl], $qualif); |
|
| 509 | + } |
|
| 510 | + } else { |
|
| 511 | + objet_associer([$objet_source => $ids], [$objet_lien => $idl]); |
|
| 512 | + } |
|
| 513 | 513 | } |
@@ -105,7 +105,7 @@ discard block |
||
| 105 | 105 | |
| 106 | 106 | // L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument |
| 107 | 107 | include_spip('inc/autoriser'); |
| 108 | - $editable = ($editable and autoriser('associer' . $table_source, $objet, $id_objet) |
|
| 108 | + $editable = ($editable and autoriser('associer'.$table_source, $objet, $id_objet) |
|
| 109 | 109 | and autoriser('modifier', $objet, $id_objet)); |
| 110 | 110 | |
| 111 | 111 | if ( |
@@ -119,15 +119,15 @@ discard block |
||
| 119 | 119 | |
| 120 | 120 | // squelettes de vue et de d'association |
| 121 | 121 | // ils sont différents si des rôles sont définis. |
| 122 | - $skel_vue = $table_source . '_lies'; |
|
| 123 | - $skel_ajout = $table_source . '_associer'; |
|
| 122 | + $skel_vue = $table_source.'_lies'; |
|
| 123 | + $skel_ajout = $table_source.'_associer'; |
|
| 124 | 124 | |
| 125 | 125 | // description des roles |
| 126 | 126 | include_spip('inc/roles'); |
| 127 | 127 | if ($roles = roles_presents($objet_source, $objet)) { |
| 128 | 128 | // on demande de nouveaux squelettes en conséquence |
| 129 | - $skel_vue = $table_source . '_roles_lies'; |
|
| 130 | - $skel_ajout = $table_source . '_roles_associer'; |
|
| 129 | + $skel_vue = $table_source.'_roles_lies'; |
|
| 130 | + $skel_ajout = $table_source.'_roles_associer'; |
|
| 131 | 131 | } |
| 132 | 132 | |
| 133 | 133 | $oups = ''; |
@@ -426,7 +426,7 @@ discard block |
||
| 426 | 426 | function lien_retrouver_qualif($objet_lien, $lien) { |
| 427 | 427 | // un role est défini dans la liaison |
| 428 | 428 | $defs = explode('-', $lien); |
| 429 | - [$objet1, , $objet2, , $role] = array_pad($defs, 5, null); |
|
| 429 | + [$objet1,, $objet2,, $role] = array_pad($defs, 5, null); |
|
| 430 | 430 | if ($objet_lien == $objet1) { |
| 431 | 431 | $colonne_role = roles_colonne($objet1, $objet2); |
| 432 | 432 | } else { |
@@ -648,8 +648,7 @@ discard block |
||
| 648 | 648 | if (!$srcSize) { |
| 649 | 649 | $poids_img[$src] = filesize($src); |
| 650 | 650 | } |
| 651 | - } |
|
| 652 | - elseif (strpos($src, '<svg') !== false) { |
|
| 651 | + } elseif (strpos($src, '<svg') !== false) { |
|
| 653 | 652 | include_spip('inc/svg'); |
| 654 | 653 | if ($attrs = svg_lire_attributs($src)) { |
| 655 | 654 | [$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs); |
@@ -3507,8 +3506,7 @@ discard block |
||
| 3507 | 3506 | ) { |
| 3508 | 3507 | if ($variante_svg_size = substr($variante_svg_generique, 0, -6) . $m[1] . '.svg' and file_exists($variante_svg_size)) { |
| 3509 | 3508 | $img_file = $variante_svg_size; |
| 3510 | - } |
|
| 3511 | - else { |
|
| 3509 | + } else { |
|
| 3512 | 3510 | $img_file = $variante_svg_generique; |
| 3513 | 3511 | } |
| 3514 | 3512 | } |
@@ -3540,8 +3538,7 @@ discard block |
||
| 3540 | 3538 | } |
| 3541 | 3539 | if (!isset($options['chemin_image']) or $options['chemin_image'] == true) { |
| 3542 | 3540 | $img_file = chemin_image($img); |
| 3543 | - } |
|
| 3544 | - else { |
|
| 3541 | + } else { |
|
| 3545 | 3542 | if (!isset($options['variante_svg_si_possible']) or $options['variante_svg_si_possible'] == true) { |
| 3546 | 3543 | $img_file = http_img_variante_svg_si_possible($img_file); |
| 3547 | 3544 | } |
@@ -3571,11 +3568,9 @@ discard block |
||
| 3571 | 3568 | } |
| 3572 | 3569 | if ($alt === false) { |
| 3573 | 3570 | $alt = ''; |
| 3574 | - } |
|
| 3575 | - elseif ($alt or $alt === '') { |
|
| 3571 | + } elseif ($alt or $alt === '') { |
|
| 3576 | 3572 | $alt = " alt='" . attribut_html($alt) . "'"; |
| 3577 | - } |
|
| 3578 | - else { |
|
| 3573 | + } else { |
|
| 3579 | 3574 | $alt = " alt='" . attribut_html($title) . "'"; |
| 3580 | 3575 | } |
| 3581 | 3576 | return "<img src='" . attribut_html($img_file) . "'$alt" |
@@ -3702,13 +3697,11 @@ discard block |
||
| 3702 | 3697 | if (!is_null($class)) { |
| 3703 | 3698 | if (strlen($class)) { |
| 3704 | 3699 | $img = inserer_attribut($img, 'class', $class); |
| 3705 | - } |
|
| 3706 | - else { |
|
| 3700 | + } else { |
|
| 3707 | 3701 | $img = vider_attribut($img, 'class'); |
| 3708 | 3702 | } |
| 3709 | 3703 | } |
| 3710 | - } |
|
| 3711 | - else { |
|
| 3704 | + } else { |
|
| 3712 | 3705 | $img = http_img_pack( |
| 3713 | 3706 | $img, |
| 3714 | 3707 | $alt, |
@@ -3806,8 +3799,7 @@ discard block |
||
| 3806 | 3799 | if (!is_null($class)) { |
| 3807 | 3800 | if (strlen($class)) { |
| 3808 | 3801 | $balise_svg = inserer_attribut($balise_svg, 'class', $class); |
| 3809 | - } |
|
| 3810 | - else { |
|
| 3802 | + } else { |
|
| 3811 | 3803 | $balise_svg = vider_attribut($balise_svg, 'class'); |
| 3812 | 3804 | } |
| 3813 | 3805 | } |
@@ -3819,8 +3811,7 @@ discard block |
||
| 3819 | 3811 | $balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id); |
| 3820 | 3812 | $title = "<title id=\"$id\">" . entites_html($alt) . "</title>\n"; |
| 3821 | 3813 | $balise_svg .= $title; |
| 3822 | - } |
|
| 3823 | - else { |
|
| 3814 | + } else { |
|
| 3824 | 3815 | $balise_svg = inserer_attribut($balise_svg, 'aria-hidden', 'true'); |
| 3825 | 3816 | } |
| 3826 | 3817 | |
@@ -5231,8 +5222,7 @@ discard block |
||
| 5231 | 5222 | // reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine |
| 5232 | 5223 | if (isset($options['hash_on_content']) and $options['hash_on_content']) { |
| 5233 | 5224 | $hash = md5($contexte_implicite['host'] . '::' . $cache); |
| 5234 | - } |
|
| 5235 | - else { |
|
| 5225 | + } else { |
|
| 5236 | 5226 | unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js |
| 5237 | 5227 | ksort($contexte); |
| 5238 | 5228 | $hash = md5($fond . json_encode($contexte_implicite, JSON_THROW_ON_ERROR) . json_encode($contexte, JSON_THROW_ON_ERROR) . $connect); |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Filtres |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | include_spip('inc/charsets'); |
@@ -42,8 +42,8 @@ discard block |
||
| 42 | 42 | * @return string Fonction PHP correspondante du filtre |
| 43 | 43 | */ |
| 44 | 44 | function charger_filtre($fonc, $default = 'filtre_identite_dist') { |
| 45 | - include_fichiers_fonctions(); // inclure les fichiers fonctions |
|
| 46 | - return chercher_filtre($fonc, $default); |
|
| 45 | + include_fichiers_fonctions(); // inclure les fichiers fonctions |
|
| 46 | + return chercher_filtre($fonc, $default); |
|
| 47 | 47 | } |
| 48 | 48 | |
| 49 | 49 | /** |
@@ -53,7 +53,7 @@ discard block |
||
| 53 | 53 | * @return string Texte |
| 54 | 54 | **/ |
| 55 | 55 | function filtre_identite_dist($texte) { |
| 56 | - return $texte; |
|
| 56 | + return $texte; |
|
| 57 | 57 | } |
| 58 | 58 | |
| 59 | 59 | /** |
@@ -77,33 +77,33 @@ discard block |
||
| 77 | 77 | * Fonction PHP correspondante du filtre demandé |
| 78 | 78 | */ |
| 79 | 79 | function chercher_filtre($fonc, $default = null) { |
| 80 | - if (!$fonc) { |
|
| 81 | - return $default; |
|
| 82 | - } |
|
| 83 | - // Cas des types mime, sans confondre avec les appels de fonction de classe |
|
| 84 | - // Foo::Bar |
|
| 85 | - // qui peuvent etre avec un namespace : space\Foo::Bar |
|
| 86 | - if (preg_match(',^[\w]+/,', $fonc)) { |
|
| 87 | - $nom = preg_replace(',\W,', '_', $fonc); |
|
| 88 | - $f = chercher_filtre($nom); |
|
| 89 | - // cas du sous-type MIME sans filtre associe, passer au type: |
|
| 90 | - // si filtre_text_plain pas defini, passe a filtre_text |
|
| 91 | - if (!$f and $nom !== $fonc) { |
|
| 92 | - $f = chercher_filtre(preg_replace(',\W.*$,', '', $fonc)); |
|
| 93 | - } |
|
| 94 | - |
|
| 95 | - return $f; |
|
| 96 | - } |
|
| 97 | - |
|
| 98 | - include_fichiers_fonctions(); |
|
| 99 | - foreach (['filtre_' . $fonc, 'filtre_' . $fonc . '_dist', $fonc] as $f) { |
|
| 100 | - trouver_filtre_matrice($f); // charge des fichiers spécifiques éventuels |
|
| 101 | - if (is_callable($f)) { |
|
| 102 | - return $f; |
|
| 103 | - } |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - return $default; |
|
| 80 | + if (!$fonc) { |
|
| 81 | + return $default; |
|
| 82 | + } |
|
| 83 | + // Cas des types mime, sans confondre avec les appels de fonction de classe |
|
| 84 | + // Foo::Bar |
|
| 85 | + // qui peuvent etre avec un namespace : space\Foo::Bar |
|
| 86 | + if (preg_match(',^[\w]+/,', $fonc)) { |
|
| 87 | + $nom = preg_replace(',\W,', '_', $fonc); |
|
| 88 | + $f = chercher_filtre($nom); |
|
| 89 | + // cas du sous-type MIME sans filtre associe, passer au type: |
|
| 90 | + // si filtre_text_plain pas defini, passe a filtre_text |
|
| 91 | + if (!$f and $nom !== $fonc) { |
|
| 92 | + $f = chercher_filtre(preg_replace(',\W.*$,', '', $fonc)); |
|
| 93 | + } |
|
| 94 | + |
|
| 95 | + return $f; |
|
| 96 | + } |
|
| 97 | + |
|
| 98 | + include_fichiers_fonctions(); |
|
| 99 | + foreach (['filtre_' . $fonc, 'filtre_' . $fonc . '_dist', $fonc] as $f) { |
|
| 100 | + trouver_filtre_matrice($f); // charge des fichiers spécifiques éventuels |
|
| 101 | + if (is_callable($f)) { |
|
| 102 | + return $f; |
|
| 103 | + } |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + return $default; |
|
| 107 | 107 | } |
| 108 | 108 | |
| 109 | 109 | /** |
@@ -147,8 +147,8 @@ discard block |
||
| 147 | 147 | * Chaîne vide sinon. |
| 148 | 148 | **/ |
| 149 | 149 | function appliquer_filtre($arg, $filtre) { |
| 150 | - $args = func_get_args(); |
|
| 151 | - return appliquer_filtre_sinon($arg, $filtre, $args, ''); |
|
| 150 | + $args = func_get_args(); |
|
| 151 | + return appliquer_filtre_sinon($arg, $filtre, $args, ''); |
|
| 152 | 152 | } |
| 153 | 153 | |
| 154 | 154 | /** |
@@ -173,8 +173,8 @@ discard block |
||
| 173 | 173 | * Texte d'origine sinon |
| 174 | 174 | **/ |
| 175 | 175 | function appliquer_si_filtre($arg, $filtre) { |
| 176 | - $args = func_get_args(); |
|
| 177 | - return appliquer_filtre_sinon($arg, $filtre, $args, $arg); |
|
| 176 | + $args = func_get_args(); |
|
| 177 | + return appliquer_filtre_sinon($arg, $filtre, $args, $arg); |
|
| 178 | 178 | } |
| 179 | 179 | |
| 180 | 180 | /** |
@@ -190,12 +190,12 @@ discard block |
||
| 190 | 190 | * Version de SPIP |
| 191 | 191 | **/ |
| 192 | 192 | function spip_version() { |
| 193 | - $version = $GLOBALS['spip_version_affichee']; |
|
| 194 | - if ($vcs_version = version_vcs_courante(_DIR_RACINE)) { |
|
| 195 | - $version .= " $vcs_version"; |
|
| 196 | - } |
|
| 193 | + $version = $GLOBALS['spip_version_affichee']; |
|
| 194 | + if ($vcs_version = version_vcs_courante(_DIR_RACINE)) { |
|
| 195 | + $version .= " $vcs_version"; |
|
| 196 | + } |
|
| 197 | 197 | |
| 198 | - return $version; |
|
| 198 | + return $version; |
|
| 199 | 199 | } |
| 200 | 200 | |
| 201 | 201 | /** |
@@ -207,11 +207,11 @@ discard block |
||
| 207 | 207 | * @return string |
| 208 | 208 | */ |
| 209 | 209 | function header_silencieux($version): string { |
| 210 | - if (isset($GLOBALS['spip_header_silencieux']) && (bool) $GLOBALS['spip_header_silencieux']) { |
|
| 211 | - $version = ''; |
|
| 212 | - } |
|
| 210 | + if (isset($GLOBALS['spip_header_silencieux']) && (bool) $GLOBALS['spip_header_silencieux']) { |
|
| 211 | + $version = ''; |
|
| 212 | + } |
|
| 213 | 213 | |
| 214 | - return (string) $version; |
|
| 214 | + return (string) $version; |
|
| 215 | 215 | } |
| 216 | 216 | |
| 217 | 217 | /** |
@@ -224,19 +224,19 @@ discard block |
||
| 224 | 224 | * - string|null si $raw = false |
| 225 | 225 | */ |
| 226 | 226 | function version_vcs_courante($dir, $raw = false) { |
| 227 | - $desc = decrire_version_git($dir); |
|
| 228 | - if ($desc === null) { |
|
| 229 | - $desc = decrire_version_svn($dir); |
|
| 230 | - } |
|
| 231 | - if ($desc === null or $raw) { |
|
| 232 | - return $desc; |
|
| 233 | - } |
|
| 234 | - // affichage "GIT [master: abcdef]" |
|
| 235 | - $commit = $desc['commit_short'] ?? $desc['commit']; |
|
| 236 | - if ($desc['branch']) { |
|
| 237 | - $commit = $desc['branch'] . ': ' . $commit; |
|
| 238 | - } |
|
| 239 | - return "{$desc['vcs']} [$commit]"; |
|
| 227 | + $desc = decrire_version_git($dir); |
|
| 228 | + if ($desc === null) { |
|
| 229 | + $desc = decrire_version_svn($dir); |
|
| 230 | + } |
|
| 231 | + if ($desc === null or $raw) { |
|
| 232 | + return $desc; |
|
| 233 | + } |
|
| 234 | + // affichage "GIT [master: abcdef]" |
|
| 235 | + $commit = $desc['commit_short'] ?? $desc['commit']; |
|
| 236 | + if ($desc['branch']) { |
|
| 237 | + $commit = $desc['branch'] . ': ' . $commit; |
|
| 238 | + } |
|
| 239 | + return "{$desc['vcs']} [$commit]"; |
|
| 240 | 240 | } |
| 241 | 241 | |
| 242 | 242 | /** |
@@ -248,24 +248,24 @@ discard block |
||
| 248 | 248 | * array ['branch' => xx, 'commit' => yy] sinon. |
| 249 | 249 | **/ |
| 250 | 250 | function decrire_version_git($dir) { |
| 251 | - if (!$dir) { |
|
| 252 | - $dir = '.'; |
|
| 253 | - } |
|
| 251 | + if (!$dir) { |
|
| 252 | + $dir = '.'; |
|
| 253 | + } |
|
| 254 | 254 | |
| 255 | - // version installee par GIT |
|
| 256 | - if (lire_fichier($dir . '/.git/HEAD', $c)) { |
|
| 257 | - $currentHead = trim(substr($c, 4)); |
|
| 258 | - if (lire_fichier($dir . '/.git/' . $currentHead, $hash)) { |
|
| 259 | - return [ |
|
| 260 | - 'vcs' => 'GIT', |
|
| 261 | - 'branch' => basename($currentHead), |
|
| 262 | - 'commit' => trim($hash), |
|
| 263 | - 'commit_short' => substr(trim($hash), 0, 8), |
|
| 264 | - ]; |
|
| 265 | - } |
|
| 266 | - } |
|
| 255 | + // version installee par GIT |
|
| 256 | + if (lire_fichier($dir . '/.git/HEAD', $c)) { |
|
| 257 | + $currentHead = trim(substr($c, 4)); |
|
| 258 | + if (lire_fichier($dir . '/.git/' . $currentHead, $hash)) { |
|
| 259 | + return [ |
|
| 260 | + 'vcs' => 'GIT', |
|
| 261 | + 'branch' => basename($currentHead), |
|
| 262 | + 'commit' => trim($hash), |
|
| 263 | + 'commit_short' => substr(trim($hash), 0, 8), |
|
| 264 | + ]; |
|
| 265 | + } |
|
| 266 | + } |
|
| 267 | 267 | |
| 268 | - return null; |
|
| 268 | + return null; |
|
| 269 | 269 | } |
| 270 | 270 | |
| 271 | 271 | |
@@ -278,25 +278,25 @@ discard block |
||
| 278 | 278 | * array ['commit' => yy, 'date' => xx, 'author' => xx] sinon. |
| 279 | 279 | **/ |
| 280 | 280 | function decrire_version_svn($dir) { |
| 281 | - if (!$dir) { |
|
| 282 | - $dir = '.'; |
|
| 283 | - } |
|
| 284 | - // version installee par SVN |
|
| 285 | - if (file_exists($dir . '/.svn/wc.db') && class_exists(\SQLite3::class)) { |
|
| 286 | - $db = new SQLite3($dir . '/.svn/wc.db'); |
|
| 287 | - $result = $db->query('SELECT changed_revision FROM nodes WHERE local_relpath = "" LIMIT 1'); |
|
| 288 | - if ($result) { |
|
| 289 | - $row = $result->fetchArray(); |
|
| 290 | - if ($row['changed_revision'] != '') { |
|
| 291 | - return [ |
|
| 292 | - 'vcs' => 'SVN', |
|
| 293 | - 'branch' => '', |
|
| 294 | - 'commit' => $row['changed_revision'], |
|
| 295 | - ]; |
|
| 296 | - } |
|
| 297 | - } |
|
| 298 | - } |
|
| 299 | - return null; |
|
| 281 | + if (!$dir) { |
|
| 282 | + $dir = '.'; |
|
| 283 | + } |
|
| 284 | + // version installee par SVN |
|
| 285 | + if (file_exists($dir . '/.svn/wc.db') && class_exists(\SQLite3::class)) { |
|
| 286 | + $db = new SQLite3($dir . '/.svn/wc.db'); |
|
| 287 | + $result = $db->query('SELECT changed_revision FROM nodes WHERE local_relpath = "" LIMIT 1'); |
|
| 288 | + if ($result) { |
|
| 289 | + $row = $result->fetchArray(); |
|
| 290 | + if ($row['changed_revision'] != '') { |
|
| 291 | + return [ |
|
| 292 | + 'vcs' => 'SVN', |
|
| 293 | + 'branch' => '', |
|
| 294 | + 'commit' => $row['changed_revision'], |
|
| 295 | + ]; |
|
| 296 | + } |
|
| 297 | + } |
|
| 298 | + } |
|
| 299 | + return null; |
|
| 300 | 300 | } |
| 301 | 301 | |
| 302 | 302 | // La matrice est necessaire pour ne filtrer _que_ des fonctions definies dans filtres_images |
@@ -343,18 +343,18 @@ discard block |
||
| 343 | 343 | * Code HTML retourné par le filtre |
| 344 | 344 | **/ |
| 345 | 345 | function filtrer($filtre) { |
| 346 | - $tous = func_get_args(); |
|
| 347 | - if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') { |
|
| 348 | - return image_filtrer($tous); |
|
| 349 | - } elseif ($f = chercher_filtre($filtre)) { |
|
| 350 | - array_shift($tous); |
|
| 351 | - return $f(...$tous); |
|
| 352 | - } else { |
|
| 353 | - // le filtre n'existe pas, on provoque une erreur |
|
| 354 | - $msg = ['zbug_erreur_filtre', ['filtre' => texte_script($filtre)]]; |
|
| 355 | - erreur_squelette($msg); |
|
| 356 | - return ''; |
|
| 357 | - } |
|
| 346 | + $tous = func_get_args(); |
|
| 347 | + if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') { |
|
| 348 | + return image_filtrer($tous); |
|
| 349 | + } elseif ($f = chercher_filtre($filtre)) { |
|
| 350 | + array_shift($tous); |
|
| 351 | + return $f(...$tous); |
|
| 352 | + } else { |
|
| 353 | + // le filtre n'existe pas, on provoque une erreur |
|
| 354 | + $msg = ['zbug_erreur_filtre', ['filtre' => texte_script($filtre)]]; |
|
| 355 | + erreur_squelette($msg); |
|
| 356 | + return ''; |
|
| 357 | + } |
|
| 358 | 358 | } |
| 359 | 359 | |
| 360 | 360 | /** |
@@ -371,11 +371,11 @@ discard block |
||
| 371 | 371 | * @return bool true si on trouve le filtre dans la matrice, false sinon. |
| 372 | 372 | */ |
| 373 | 373 | function trouver_filtre_matrice($filtre) { |
| 374 | - if (isset($GLOBALS['spip_matrice'][$filtre]) and is_string($f = $GLOBALS['spip_matrice'][$filtre])) { |
|
| 375 | - find_in_path($f, '', true); |
|
| 376 | - $GLOBALS['spip_matrice'][$filtre] = true; |
|
| 377 | - } |
|
| 378 | - return !empty($GLOBALS['spip_matrice'][$filtre]); |
|
| 374 | + if (isset($GLOBALS['spip_matrice'][$filtre]) and is_string($f = $GLOBALS['spip_matrice'][$filtre])) { |
|
| 375 | + find_in_path($f, '', true); |
|
| 376 | + $GLOBALS['spip_matrice'][$filtre] = true; |
|
| 377 | + } |
|
| 378 | + return !empty($GLOBALS['spip_matrice'][$filtre]); |
|
| 379 | 379 | } |
| 380 | 380 | |
| 381 | 381 | |
@@ -403,8 +403,8 @@ discard block |
||
| 403 | 403 | * @return mixed |
| 404 | 404 | */ |
| 405 | 405 | function filtre_set(&$Pile, $val, $key, $continue = null) { |
| 406 | - $Pile['vars'][$key] = $val; |
|
| 407 | - return $continue ? $val : ''; |
|
| 406 | + $Pile['vars'][$key] = $val; |
|
| 407 | + return $continue ? $val : ''; |
|
| 408 | 408 | } |
| 409 | 409 | |
| 410 | 410 | /** |
@@ -430,8 +430,8 @@ discard block |
||
| 430 | 430 | * @return string|mixed Retourne `$val` si `$continue` présent, sinon ''. |
| 431 | 431 | */ |
| 432 | 432 | function filtre_setenv(&$Pile, $val, $key, $continue = null) { |
| 433 | - $Pile[0][$key] = $val; |
|
| 434 | - return $continue ? $val : ''; |
|
| 433 | + $Pile[0][$key] = $val; |
|
| 434 | + return $continue ? $val : ''; |
|
| 435 | 435 | } |
| 436 | 436 | |
| 437 | 437 | /** |
@@ -440,8 +440,8 @@ discard block |
||
| 440 | 440 | * @return string |
| 441 | 441 | */ |
| 442 | 442 | function filtre_sanitize_env(&$Pile, $keys) { |
| 443 | - $Pile[0] = spip_sanitize_from_request($Pile[0], $keys); |
|
| 444 | - return ''; |
|
| 443 | + $Pile[0] = spip_sanitize_from_request($Pile[0], $keys); |
|
| 444 | + return ''; |
|
| 445 | 445 | } |
| 446 | 446 | |
| 447 | 447 | |
@@ -464,18 +464,18 @@ discard block |
||
| 464 | 464 | * @return mixed Retourne la valeur (sans la modifier). |
| 465 | 465 | */ |
| 466 | 466 | function filtre_debug($val, $key = null) { |
| 467 | - $debug = ( |
|
| 468 | - is_null($key) ? '' : (var_export($key, true) . ' = ') |
|
| 469 | - ) . var_export($val, true); |
|
| 467 | + $debug = ( |
|
| 468 | + is_null($key) ? '' : (var_export($key, true) . ' = ') |
|
| 469 | + ) . var_export($val, true); |
|
| 470 | 470 | |
| 471 | - include_spip('inc/autoriser'); |
|
| 472 | - if (autoriser('webmestre')) { |
|
| 473 | - echo "<div class='spip_debug'>\n", $debug, "</div>\n"; |
|
| 474 | - } |
|
| 471 | + include_spip('inc/autoriser'); |
|
| 472 | + if (autoriser('webmestre')) { |
|
| 473 | + echo "<div class='spip_debug'>\n", $debug, "</div>\n"; |
|
| 474 | + } |
|
| 475 | 475 | |
| 476 | - spip_log($debug, 'debug'); |
|
| 476 | + spip_log($debug, 'debug'); |
|
| 477 | 477 | |
| 478 | - return $val; |
|
| 478 | + return $val; |
|
| 479 | 479 | } |
| 480 | 480 | |
| 481 | 481 | |
@@ -505,84 +505,84 @@ discard block |
||
| 505 | 505 | * Texte qui a reçu les filtres |
| 506 | 506 | **/ |
| 507 | 507 | function image_filtrer($args) { |
| 508 | - $filtre = array_shift($args); # enlever $filtre |
|
| 509 | - $texte = array_shift($args); |
|
| 510 | - if ($texte === null || !strlen($texte)) { |
|
| 511 | - return ''; |
|
| 512 | - } |
|
| 513 | - find_in_path('filtres_images_mini.php', 'inc/', true); |
|
| 514 | - statut_effacer_images_temporaires(true); // activer la suppression des images temporaires car le compilo finit la chaine par un image_graver |
|
| 515 | - // Cas du nom de fichier local |
|
| 516 | - $is_file = trim($texte); |
|
| 517 | - if ( |
|
| 518 | - strpos(substr($is_file, strlen(_DIR_RACINE)), '..') !== false |
|
| 519 | - or strpbrk($is_file, "<>\n\r\t") !== false |
|
| 520 | - or strpos($is_file, '/') === 0 |
|
| 521 | - ) { |
|
| 522 | - $is_file = false; |
|
| 523 | - } |
|
| 524 | - if ($is_file) { |
|
| 525 | - $is_local_file = function ($path) { |
|
| 526 | - if (strpos($path, '?') !== false) { |
|
| 527 | - $path = supprimer_timestamp($path); |
|
| 528 | - // remove ?24px added by find_in_theme on .svg files |
|
| 529 | - $path = preg_replace(',\?[[:digit:]]+(px)$,', '', $path); |
|
| 530 | - } |
|
| 531 | - return file_exists($path); |
|
| 532 | - }; |
|
| 533 | - if ($is_local_file($is_file) or tester_url_absolue($is_file)) { |
|
| 534 | - $res = $filtre("<img src='$is_file' />", ...$args); |
|
| 535 | - statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo |
|
| 536 | - return $res; |
|
| 537 | - } |
|
| 538 | - } |
|
| 539 | - |
|
| 540 | - // Cas general : trier toutes les images, avec eventuellement leur <span> |
|
| 541 | - if ( |
|
| 542 | - preg_match_all( |
|
| 543 | - ',(<([a-z]+) [^<>]*spip_documents[^<>]*>)?\s*(<img\s.*>),UimsS', |
|
| 544 | - $texte, |
|
| 545 | - $tags, |
|
| 546 | - PREG_SET_ORDER |
|
| 547 | - ) |
|
| 548 | - ) { |
|
| 549 | - foreach ($tags as $tag) { |
|
| 550 | - $class = extraire_attribut($tag[3], 'class'); |
|
| 551 | - if ( |
|
| 552 | - !$class or |
|
| 553 | - (strpos($class, 'filtre_inactif') === false |
|
| 554 | - // compat historique a virer en 3.2 |
|
| 555 | - and strpos($class, 'no_image_filtrer') === false) |
|
| 556 | - ) { |
|
| 557 | - if ($reduit = $filtre($tag[3], ...$args)) { |
|
| 558 | - // En cas de span spip_documents, modifier le style=...width: |
|
| 559 | - if ($tag[1]) { |
|
| 560 | - $w = extraire_attribut($reduit, 'width'); |
|
| 561 | - if (!$w and preg_match(',width:\s*(\d+)px,S', extraire_attribut($reduit, 'style'), $regs)) { |
|
| 562 | - $w = $regs[1]; |
|
| 563 | - } |
|
| 564 | - if ($w and ($style = extraire_attribut($tag[1], 'style'))) { |
|
| 565 | - $style = preg_replace(',width:\s*\d+px,S', "width:{$w}px", $style); |
|
| 566 | - $replace = inserer_attribut($tag[1], 'style', $style); |
|
| 567 | - $texte = str_replace($tag[1], $replace, $texte); |
|
| 568 | - } |
|
| 569 | - } |
|
| 570 | - // traiter aussi un eventuel mouseover |
|
| 571 | - if ($mouseover = extraire_attribut($reduit, 'onmouseover')) { |
|
| 572 | - if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)) { |
|
| 573 | - $srcover = $match[1]; |
|
| 574 | - $srcover_filter = $filtre("<img src='" . $match[1] . "' />", ...$args); |
|
| 575 | - $srcover_filter = extraire_attribut($srcover_filter, 'src'); |
|
| 576 | - $reduit = str_replace($srcover, $srcover_filter, $reduit); |
|
| 577 | - } |
|
| 578 | - } |
|
| 579 | - $texte = str_replace($tag[3], $reduit, $texte); |
|
| 580 | - } |
|
| 581 | - } |
|
| 582 | - } |
|
| 583 | - } |
|
| 584 | - statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo |
|
| 585 | - return $texte; |
|
| 508 | + $filtre = array_shift($args); # enlever $filtre |
|
| 509 | + $texte = array_shift($args); |
|
| 510 | + if ($texte === null || !strlen($texte)) { |
|
| 511 | + return ''; |
|
| 512 | + } |
|
| 513 | + find_in_path('filtres_images_mini.php', 'inc/', true); |
|
| 514 | + statut_effacer_images_temporaires(true); // activer la suppression des images temporaires car le compilo finit la chaine par un image_graver |
|
| 515 | + // Cas du nom de fichier local |
|
| 516 | + $is_file = trim($texte); |
|
| 517 | + if ( |
|
| 518 | + strpos(substr($is_file, strlen(_DIR_RACINE)), '..') !== false |
|
| 519 | + or strpbrk($is_file, "<>\n\r\t") !== false |
|
| 520 | + or strpos($is_file, '/') === 0 |
|
| 521 | + ) { |
|
| 522 | + $is_file = false; |
|
| 523 | + } |
|
| 524 | + if ($is_file) { |
|
| 525 | + $is_local_file = function ($path) { |
|
| 526 | + if (strpos($path, '?') !== false) { |
|
| 527 | + $path = supprimer_timestamp($path); |
|
| 528 | + // remove ?24px added by find_in_theme on .svg files |
|
| 529 | + $path = preg_replace(',\?[[:digit:]]+(px)$,', '', $path); |
|
| 530 | + } |
|
| 531 | + return file_exists($path); |
|
| 532 | + }; |
|
| 533 | + if ($is_local_file($is_file) or tester_url_absolue($is_file)) { |
|
| 534 | + $res = $filtre("<img src='$is_file' />", ...$args); |
|
| 535 | + statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo |
|
| 536 | + return $res; |
|
| 537 | + } |
|
| 538 | + } |
|
| 539 | + |
|
| 540 | + // Cas general : trier toutes les images, avec eventuellement leur <span> |
|
| 541 | + if ( |
|
| 542 | + preg_match_all( |
|
| 543 | + ',(<([a-z]+) [^<>]*spip_documents[^<>]*>)?\s*(<img\s.*>),UimsS', |
|
| 544 | + $texte, |
|
| 545 | + $tags, |
|
| 546 | + PREG_SET_ORDER |
|
| 547 | + ) |
|
| 548 | + ) { |
|
| 549 | + foreach ($tags as $tag) { |
|
| 550 | + $class = extraire_attribut($tag[3], 'class'); |
|
| 551 | + if ( |
|
| 552 | + !$class or |
|
| 553 | + (strpos($class, 'filtre_inactif') === false |
|
| 554 | + // compat historique a virer en 3.2 |
|
| 555 | + and strpos($class, 'no_image_filtrer') === false) |
|
| 556 | + ) { |
|
| 557 | + if ($reduit = $filtre($tag[3], ...$args)) { |
|
| 558 | + // En cas de span spip_documents, modifier le style=...width: |
|
| 559 | + if ($tag[1]) { |
|
| 560 | + $w = extraire_attribut($reduit, 'width'); |
|
| 561 | + if (!$w and preg_match(',width:\s*(\d+)px,S', extraire_attribut($reduit, 'style'), $regs)) { |
|
| 562 | + $w = $regs[1]; |
|
| 563 | + } |
|
| 564 | + if ($w and ($style = extraire_attribut($tag[1], 'style'))) { |
|
| 565 | + $style = preg_replace(',width:\s*\d+px,S', "width:{$w}px", $style); |
|
| 566 | + $replace = inserer_attribut($tag[1], 'style', $style); |
|
| 567 | + $texte = str_replace($tag[1], $replace, $texte); |
|
| 568 | + } |
|
| 569 | + } |
|
| 570 | + // traiter aussi un eventuel mouseover |
|
| 571 | + if ($mouseover = extraire_attribut($reduit, 'onmouseover')) { |
|
| 572 | + if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)) { |
|
| 573 | + $srcover = $match[1]; |
|
| 574 | + $srcover_filter = $filtre("<img src='" . $match[1] . "' />", ...$args); |
|
| 575 | + $srcover_filter = extraire_attribut($srcover_filter, 'src'); |
|
| 576 | + $reduit = str_replace($srcover, $srcover_filter, $reduit); |
|
| 577 | + } |
|
| 578 | + } |
|
| 579 | + $texte = str_replace($tag[3], $reduit, $texte); |
|
| 580 | + } |
|
| 581 | + } |
|
| 582 | + } |
|
| 583 | + } |
|
| 584 | + statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo |
|
| 585 | + return $texte; |
|
| 586 | 586 | } |
| 587 | 587 | |
| 588 | 588 | /** |
@@ -599,91 +599,91 @@ discard block |
||
| 599 | 599 | **/ |
| 600 | 600 | function infos_image($img, $force_refresh = false) { |
| 601 | 601 | |
| 602 | - static $largeur_img = [], $hauteur_img = [], $poids_img = []; |
|
| 603 | - $srcWidth = 0; |
|
| 604 | - $srcHeight = 0; |
|
| 605 | - $srcSize = null; |
|
| 606 | - |
|
| 607 | - $src = extraire_attribut($img, 'src'); |
|
| 608 | - |
|
| 609 | - if (!$src) { |
|
| 610 | - $src = $img; |
|
| 611 | - } else { |
|
| 612 | - $srcWidth = extraire_attribut($img, 'width'); |
|
| 613 | - $srcHeight = extraire_attribut($img, 'height'); |
|
| 614 | - } |
|
| 615 | - |
|
| 616 | - // ne jamais operer directement sur une image distante pour des raisons de perfo |
|
| 617 | - // la copie locale a toutes les chances d'etre la ou de resservir |
|
| 618 | - if (tester_url_absolue($src)) { |
|
| 619 | - include_spip('inc/distant'); |
|
| 620 | - $fichier = copie_locale($src); |
|
| 621 | - $src = $fichier ? _DIR_RACINE . $fichier : $src; |
|
| 622 | - } |
|
| 623 | - if (($p = strpos($src, '?')) !== false) { |
|
| 624 | - $src = substr($src, 0, $p); |
|
| 625 | - } |
|
| 626 | - |
|
| 627 | - $imagesize = false; |
|
| 628 | - if (isset($largeur_img[$src]) and !$force_refresh) { |
|
| 629 | - $srcWidth = $largeur_img[$src]; |
|
| 630 | - } |
|
| 631 | - if (isset($hauteur_img[$src]) and !$force_refresh) { |
|
| 632 | - $srcHeight = $hauteur_img[$src]; |
|
| 633 | - } |
|
| 634 | - if (isset($poids_img[$src]) and !$force_refresh) { |
|
| 635 | - $srcSize = $poids_img[$src]; |
|
| 636 | - } |
|
| 637 | - if (!$srcWidth or !$srcHeight or is_null($srcSize)) { |
|
| 638 | - if ( |
|
| 639 | - file_exists($src) |
|
| 640 | - and $imagesize = spip_getimagesize($src) |
|
| 641 | - ) { |
|
| 642 | - if (!$srcWidth) { |
|
| 643 | - $largeur_img[$src] = $srcWidth = $imagesize[0]; |
|
| 644 | - } |
|
| 645 | - if (!$srcHeight) { |
|
| 646 | - $hauteur_img[$src] = $srcHeight = $imagesize[1]; |
|
| 647 | - } |
|
| 648 | - if (!$srcSize) { |
|
| 649 | - $poids_img[$src] = filesize($src); |
|
| 650 | - } |
|
| 651 | - } |
|
| 652 | - elseif (strpos($src, '<svg') !== false) { |
|
| 653 | - include_spip('inc/svg'); |
|
| 654 | - if ($attrs = svg_lire_attributs($src)) { |
|
| 655 | - [$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs); |
|
| 656 | - if (!$srcWidth) { |
|
| 657 | - $largeur_img[$src] = $srcWidth = $width; |
|
| 658 | - } |
|
| 659 | - if (!$srcHeight) { |
|
| 660 | - $hauteur_img[$src] = $srcHeight = $height; |
|
| 661 | - } |
|
| 662 | - if (!$srcSize) { |
|
| 663 | - $poids_img[$src] = $srcSize = strlen($src); |
|
| 664 | - } |
|
| 665 | - } |
|
| 666 | - } |
|
| 667 | - // $src peut etre une reference a une image temporaire dont a n'a que le log .src |
|
| 668 | - // on s'y refere, l'image sera reconstruite en temps utile si necessaire |
|
| 669 | - elseif ( |
|
| 670 | - @file_exists($f = "$src.src") |
|
| 671 | - and lire_fichier($f, $valeurs) |
|
| 672 | - and $valeurs = unserialize($valeurs) |
|
| 673 | - ) { |
|
| 674 | - if (!$srcWidth) { |
|
| 675 | - $largeur_img[$src] = $srcWidth = $valeurs['largeur_dest']; |
|
| 676 | - } |
|
| 677 | - if (!$srcHeight) { |
|
| 678 | - $hauteur_img[$src] = $srcHeight = $valeurs['hauteur_dest']; |
|
| 679 | - } |
|
| 680 | - if (!$srcSize) { |
|
| 681 | - $poids_img[$src] = $srcSize = 0; |
|
| 682 | - } |
|
| 683 | - } |
|
| 684 | - } |
|
| 685 | - |
|
| 686 | - return ['hauteur' => $srcHeight, 'largeur' => $srcWidth, 'poids' => $srcSize]; |
|
| 602 | + static $largeur_img = [], $hauteur_img = [], $poids_img = []; |
|
| 603 | + $srcWidth = 0; |
|
| 604 | + $srcHeight = 0; |
|
| 605 | + $srcSize = null; |
|
| 606 | + |
|
| 607 | + $src = extraire_attribut($img, 'src'); |
|
| 608 | + |
|
| 609 | + if (!$src) { |
|
| 610 | + $src = $img; |
|
| 611 | + } else { |
|
| 612 | + $srcWidth = extraire_attribut($img, 'width'); |
|
| 613 | + $srcHeight = extraire_attribut($img, 'height'); |
|
| 614 | + } |
|
| 615 | + |
|
| 616 | + // ne jamais operer directement sur une image distante pour des raisons de perfo |
|
| 617 | + // la copie locale a toutes les chances d'etre la ou de resservir |
|
| 618 | + if (tester_url_absolue($src)) { |
|
| 619 | + include_spip('inc/distant'); |
|
| 620 | + $fichier = copie_locale($src); |
|
| 621 | + $src = $fichier ? _DIR_RACINE . $fichier : $src; |
|
| 622 | + } |
|
| 623 | + if (($p = strpos($src, '?')) !== false) { |
|
| 624 | + $src = substr($src, 0, $p); |
|
| 625 | + } |
|
| 626 | + |
|
| 627 | + $imagesize = false; |
|
| 628 | + if (isset($largeur_img[$src]) and !$force_refresh) { |
|
| 629 | + $srcWidth = $largeur_img[$src]; |
|
| 630 | + } |
|
| 631 | + if (isset($hauteur_img[$src]) and !$force_refresh) { |
|
| 632 | + $srcHeight = $hauteur_img[$src]; |
|
| 633 | + } |
|
| 634 | + if (isset($poids_img[$src]) and !$force_refresh) { |
|
| 635 | + $srcSize = $poids_img[$src]; |
|
| 636 | + } |
|
| 637 | + if (!$srcWidth or !$srcHeight or is_null($srcSize)) { |
|
| 638 | + if ( |
|
| 639 | + file_exists($src) |
|
| 640 | + and $imagesize = spip_getimagesize($src) |
|
| 641 | + ) { |
|
| 642 | + if (!$srcWidth) { |
|
| 643 | + $largeur_img[$src] = $srcWidth = $imagesize[0]; |
|
| 644 | + } |
|
| 645 | + if (!$srcHeight) { |
|
| 646 | + $hauteur_img[$src] = $srcHeight = $imagesize[1]; |
|
| 647 | + } |
|
| 648 | + if (!$srcSize) { |
|
| 649 | + $poids_img[$src] = filesize($src); |
|
| 650 | + } |
|
| 651 | + } |
|
| 652 | + elseif (strpos($src, '<svg') !== false) { |
|
| 653 | + include_spip('inc/svg'); |
|
| 654 | + if ($attrs = svg_lire_attributs($src)) { |
|
| 655 | + [$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs); |
|
| 656 | + if (!$srcWidth) { |
|
| 657 | + $largeur_img[$src] = $srcWidth = $width; |
|
| 658 | + } |
|
| 659 | + if (!$srcHeight) { |
|
| 660 | + $hauteur_img[$src] = $srcHeight = $height; |
|
| 661 | + } |
|
| 662 | + if (!$srcSize) { |
|
| 663 | + $poids_img[$src] = $srcSize = strlen($src); |
|
| 664 | + } |
|
| 665 | + } |
|
| 666 | + } |
|
| 667 | + // $src peut etre une reference a une image temporaire dont a n'a que le log .src |
|
| 668 | + // on s'y refere, l'image sera reconstruite en temps utile si necessaire |
|
| 669 | + elseif ( |
|
| 670 | + @file_exists($f = "$src.src") |
|
| 671 | + and lire_fichier($f, $valeurs) |
|
| 672 | + and $valeurs = unserialize($valeurs) |
|
| 673 | + ) { |
|
| 674 | + if (!$srcWidth) { |
|
| 675 | + $largeur_img[$src] = $srcWidth = $valeurs['largeur_dest']; |
|
| 676 | + } |
|
| 677 | + if (!$srcHeight) { |
|
| 678 | + $hauteur_img[$src] = $srcHeight = $valeurs['hauteur_dest']; |
|
| 679 | + } |
|
| 680 | + if (!$srcSize) { |
|
| 681 | + $poids_img[$src] = $srcSize = 0; |
|
| 682 | + } |
|
| 683 | + } |
|
| 684 | + } |
|
| 685 | + |
|
| 686 | + return ['hauteur' => $srcHeight, 'largeur' => $srcWidth, 'poids' => $srcSize]; |
|
| 687 | 687 | } |
| 688 | 688 | |
| 689 | 689 | /** |
@@ -699,13 +699,13 @@ discard block |
||
| 699 | 699 | * poids |
| 700 | 700 | **/ |
| 701 | 701 | function poids_image($img, $force_refresh = false) { |
| 702 | - $infos = infos_image($img, $force_refresh); |
|
| 703 | - return $infos['poids']; |
|
| 702 | + $infos = infos_image($img, $force_refresh); |
|
| 703 | + return $infos['poids']; |
|
| 704 | 704 | } |
| 705 | 705 | |
| 706 | 706 | function taille_image($img, $force_refresh = false) { |
| 707 | - $infos = infos_image($img, $force_refresh); |
|
| 708 | - return [$infos['hauteur'], $infos['largeur']]; |
|
| 707 | + $infos = infos_image($img, $force_refresh); |
|
| 708 | + return [$infos['hauteur'], $infos['largeur']]; |
|
| 709 | 709 | } |
| 710 | 710 | |
| 711 | 711 | /** |
@@ -722,12 +722,12 @@ discard block |
||
| 722 | 722 | * Largeur en pixels, NULL ou 0 si aucune image. |
| 723 | 723 | **/ |
| 724 | 724 | function largeur($img) { |
| 725 | - if (!$img) { |
|
| 726 | - return; |
|
| 727 | - } |
|
| 728 | - [$h, $l] = taille_image($img); |
|
| 725 | + if (!$img) { |
|
| 726 | + return; |
|
| 727 | + } |
|
| 728 | + [$h, $l] = taille_image($img); |
|
| 729 | 729 | |
| 730 | - return $l; |
|
| 730 | + return $l; |
|
| 731 | 731 | } |
| 732 | 732 | |
| 733 | 733 | /** |
@@ -744,12 +744,12 @@ discard block |
||
| 744 | 744 | * Hauteur en pixels, NULL ou 0 si aucune image. |
| 745 | 745 | **/ |
| 746 | 746 | function hauteur($img) { |
| 747 | - if (!$img) { |
|
| 748 | - return; |
|
| 749 | - } |
|
| 750 | - [$h, $l] = taille_image($img); |
|
| 747 | + if (!$img) { |
|
| 748 | + return; |
|
| 749 | + } |
|
| 750 | + [$h, $l] = taille_image($img); |
|
| 751 | 751 | |
| 752 | - return $h; |
|
| 752 | + return $h; |
|
| 753 | 753 | } |
| 754 | 754 | |
| 755 | 755 | |
@@ -769,11 +769,11 @@ discard block |
||
| 769 | 769 | * @return string |
| 770 | 770 | **/ |
| 771 | 771 | function corriger_entites_html($texte) { |
| 772 | - if (strpos($texte, '&') === false) { |
|
| 773 | - return $texte; |
|
| 774 | - } |
|
| 772 | + if (strpos($texte, '&') === false) { |
|
| 773 | + return $texte; |
|
| 774 | + } |
|
| 775 | 775 | |
| 776 | - return preg_replace(',&(#[0-9][0-9][0-9]+;|amp;),iS', '&\1', $texte); |
|
| 776 | + return preg_replace(',&(#[0-9][0-9][0-9]+;|amp;),iS', '&\1', $texte); |
|
| 777 | 777 | } |
| 778 | 778 | |
| 779 | 779 | /** |
@@ -788,11 +788,11 @@ discard block |
||
| 788 | 788 | * @return string |
| 789 | 789 | **/ |
| 790 | 790 | function corriger_toutes_entites_html($texte) { |
| 791 | - if (strpos($texte, '&') === false) { |
|
| 792 | - return $texte; |
|
| 793 | - } |
|
| 791 | + if (strpos($texte, '&') === false) { |
|
| 792 | + return $texte; |
|
| 793 | + } |
|
| 794 | 794 | |
| 795 | - return preg_replace(',&(#?[a-z0-9]+;),iS', '&\1', $texte); |
|
| 795 | + return preg_replace(',&(#?[a-z0-9]+;),iS', '&\1', $texte); |
|
| 796 | 796 | } |
| 797 | 797 | |
| 798 | 798 | /** |
@@ -802,7 +802,7 @@ discard block |
||
| 802 | 802 | * @return string |
| 803 | 803 | **/ |
| 804 | 804 | function proteger_amp($texte) { |
| 805 | - return str_replace('&', '&', $texte); |
|
| 805 | + return str_replace('&', '&', $texte); |
|
| 806 | 806 | } |
| 807 | 807 | |
| 808 | 808 | |
@@ -833,21 +833,21 @@ discard block |
||
| 833 | 833 | * @return mixed|string |
| 834 | 834 | */ |
| 835 | 835 | function entites_html($texte, $tout = false, $quote = true) { |
| 836 | - if ( |
|
| 837 | - !is_string($texte) or !$texte |
|
| 838 | - or strpbrk($texte, "&\"'<>") == false |
|
| 839 | - ) { |
|
| 840 | - return $texte; |
|
| 841 | - } |
|
| 842 | - include_spip('inc/texte'); |
|
| 843 | - $flags = ($quote ? ENT_QUOTES : ENT_NOQUOTES); |
|
| 844 | - $flags |= ENT_HTML401; |
|
| 845 | - $texte = spip_htmlspecialchars(echappe_retour(echappe_html($texte, '', true), '', 'proteger_amp'), $flags); |
|
| 846 | - if ($tout) { |
|
| 847 | - return corriger_toutes_entites_html($texte); |
|
| 848 | - } else { |
|
| 849 | - return corriger_entites_html($texte); |
|
| 850 | - } |
|
| 836 | + if ( |
|
| 837 | + !is_string($texte) or !$texte |
|
| 838 | + or strpbrk($texte, "&\"'<>") == false |
|
| 839 | + ) { |
|
| 840 | + return $texte; |
|
| 841 | + } |
|
| 842 | + include_spip('inc/texte'); |
|
| 843 | + $flags = ($quote ? ENT_QUOTES : ENT_NOQUOTES); |
|
| 844 | + $flags |= ENT_HTML401; |
|
| 845 | + $texte = spip_htmlspecialchars(echappe_retour(echappe_html($texte, '', true), '', 'proteger_amp'), $flags); |
|
| 846 | + if ($tout) { |
|
| 847 | + return corriger_toutes_entites_html($texte); |
|
| 848 | + } else { |
|
| 849 | + return corriger_entites_html($texte); |
|
| 850 | + } |
|
| 851 | 851 | } |
| 852 | 852 | |
| 853 | 853 | /** |
@@ -866,38 +866,38 @@ discard block |
||
| 866 | 866 | * Texte converti |
| 867 | 867 | **/ |
| 868 | 868 | function filtrer_entites(?string $texte): string { |
| 869 | - $texte ??= ''; |
|
| 870 | - if (strpos($texte, '&') === false) { |
|
| 871 | - return $texte; |
|
| 872 | - } |
|
| 873 | - // filtrer |
|
| 874 | - $texte = html2unicode($texte); |
|
| 875 | - // remettre le tout dans le charset cible |
|
| 876 | - $texte = unicode2charset($texte); |
|
| 877 | - // cas particulier des " et ' qu'il faut filtrer aussi |
|
| 878 | - // (on le faisait deja avec un ") |
|
| 879 | - if (strpos($texte, '&#') !== false) { |
|
| 880 | - $texte = str_replace([''', ''', '"', '"'], ["'", "'", '"', '"'], $texte); |
|
| 881 | - } |
|
| 869 | + $texte ??= ''; |
|
| 870 | + if (strpos($texte, '&') === false) { |
|
| 871 | + return $texte; |
|
| 872 | + } |
|
| 873 | + // filtrer |
|
| 874 | + $texte = html2unicode($texte); |
|
| 875 | + // remettre le tout dans le charset cible |
|
| 876 | + $texte = unicode2charset($texte); |
|
| 877 | + // cas particulier des " et ' qu'il faut filtrer aussi |
|
| 878 | + // (on le faisait deja avec un ") |
|
| 879 | + if (strpos($texte, '&#') !== false) { |
|
| 880 | + $texte = str_replace([''', ''', '"', '"'], ["'", "'", '"', '"'], $texte); |
|
| 881 | + } |
|
| 882 | 882 | |
| 883 | - return $texte; |
|
| 883 | + return $texte; |
|
| 884 | 884 | } |
| 885 | 885 | |
| 886 | 886 | |
| 887 | 887 | if (!function_exists('filtre_filtrer_entites_dist')) { |
| 888 | - /** |
|
| 889 | - * Version sécurisée de filtrer_entites |
|
| 890 | - * |
|
| 891 | - * @uses interdire_scripts() |
|
| 892 | - * @uses filtrer_entites() |
|
| 893 | - * |
|
| 894 | - * @param string $t |
|
| 895 | - * @return string |
|
| 896 | - */ |
|
| 897 | - function filtre_filtrer_entites_dist($t) { |
|
| 898 | - include_spip('inc/texte'); |
|
| 899 | - return interdire_scripts(filtrer_entites($t)); |
|
| 900 | - } |
|
| 888 | + /** |
|
| 889 | + * Version sécurisée de filtrer_entites |
|
| 890 | + * |
|
| 891 | + * @uses interdire_scripts() |
|
| 892 | + * @uses filtrer_entites() |
|
| 893 | + * |
|
| 894 | + * @param string $t |
|
| 895 | + * @return string |
|
| 896 | + */ |
|
| 897 | + function filtre_filtrer_entites_dist($t) { |
|
| 898 | + include_spip('inc/texte'); |
|
| 899 | + return interdire_scripts(filtrer_entites($t)); |
|
| 900 | + } |
|
| 901 | 901 | } |
| 902 | 902 | |
| 903 | 903 | |
@@ -912,18 +912,18 @@ discard block |
||
| 912 | 912 | * @return string|array |
| 913 | 913 | **/ |
| 914 | 914 | function supprimer_caracteres_illegaux($texte) { |
| 915 | - static $from = "\x0\x1\x2\x3\x4\x5\x6\x7\x8\xB\xC\xE\xF\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; |
|
| 916 | - static $to = null; |
|
| 915 | + static $from = "\x0\x1\x2\x3\x4\x5\x6\x7\x8\xB\xC\xE\xF\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; |
|
| 916 | + static $to = null; |
|
| 917 | 917 | |
| 918 | - if (is_array($texte)) { |
|
| 919 | - return array_map('supprimer_caracteres_illegaux', $texte); |
|
| 920 | - } |
|
| 918 | + if (is_array($texte)) { |
|
| 919 | + return array_map('supprimer_caracteres_illegaux', $texte); |
|
| 920 | + } |
|
| 921 | 921 | |
| 922 | - if (!$to) { |
|
| 923 | - $to = str_repeat('-', strlen($from)); |
|
| 924 | - } |
|
| 922 | + if (!$to) { |
|
| 923 | + $to = str_repeat('-', strlen($from)); |
|
| 924 | + } |
|
| 925 | 925 | |
| 926 | - return strtr($texte, $from, $to); |
|
| 926 | + return strtr($texte, $from, $to); |
|
| 927 | 927 | } |
| 928 | 928 | |
| 929 | 929 | /** |
@@ -935,10 +935,10 @@ discard block |
||
| 935 | 935 | * @return string|array |
| 936 | 936 | **/ |
| 937 | 937 | function corriger_caracteres($texte) { |
| 938 | - $texte = corriger_caracteres_windows($texte); |
|
| 939 | - $texte = supprimer_caracteres_illegaux($texte); |
|
| 938 | + $texte = corriger_caracteres_windows($texte); |
|
| 939 | + $texte = supprimer_caracteres_illegaux($texte); |
|
| 940 | 940 | |
| 941 | - return $texte; |
|
| 941 | + return $texte; |
|
| 942 | 942 | } |
| 943 | 943 | |
| 944 | 944 | /** |
@@ -955,44 +955,44 @@ discard block |
||
| 955 | 955 | * Texte encodé pour XML |
| 956 | 956 | */ |
| 957 | 957 | function texte_backend(string $texte): string { |
| 958 | - if ($texte === '') { |
|
| 959 | - return ''; |
|
| 960 | - } |
|
| 958 | + if ($texte === '') { |
|
| 959 | + return ''; |
|
| 960 | + } |
|
| 961 | 961 | |
| 962 | - static $apostrophe = ['’', "'"]; # n'allouer qu'une fois |
|
| 962 | + static $apostrophe = ['’', "'"]; # n'allouer qu'une fois |
|
| 963 | 963 | |
| 964 | - // si on a des liens ou des images, les passer en absolu |
|
| 965 | - $texte = liens_absolus($texte); |
|
| 964 | + // si on a des liens ou des images, les passer en absolu |
|
| 965 | + $texte = liens_absolus($texte); |
|
| 966 | 966 | |
| 967 | - // echapper les tags > < |
|
| 968 | - $texte = preg_replace(',&(gt|lt);,S', '&\1;', $texte); |
|
| 967 | + // echapper les tags > < |
|
| 968 | + $texte = preg_replace(',&(gt|lt);,S', '&\1;', $texte); |
|
| 969 | 969 | |
| 970 | - // importer les é |
|
| 971 | - $texte = filtrer_entites($texte); |
|
| 970 | + // importer les é |
|
| 971 | + $texte = filtrer_entites($texte); |
|
| 972 | 972 | |
| 973 | - // " -> " et tout ce genre de choses |
|
| 974 | - $u = $GLOBALS['meta']['pcre_u']; |
|
| 975 | - $texte = str_replace(' ', ' ', $texte); |
|
| 976 | - $texte = preg_replace('/\s{2,}/S' . $u, ' ', $texte); |
|
| 977 | - // ne pas echapper les sinqle quotes car certains outils de syndication gerent mal |
|
| 978 | - $texte = entites_html($texte, false, false); |
|
| 979 | - // mais bien echapper les double quotes ! |
|
| 980 | - $texte = str_replace('"', '"', $texte); |
|
| 973 | + // " -> " et tout ce genre de choses |
|
| 974 | + $u = $GLOBALS['meta']['pcre_u']; |
|
| 975 | + $texte = str_replace(' ', ' ', $texte); |
|
| 976 | + $texte = preg_replace('/\s{2,}/S' . $u, ' ', $texte); |
|
| 977 | + // ne pas echapper les sinqle quotes car certains outils de syndication gerent mal |
|
| 978 | + $texte = entites_html($texte, false, false); |
|
| 979 | + // mais bien echapper les double quotes ! |
|
| 980 | + $texte = str_replace('"', '"', $texte); |
|
| 981 | 981 | |
| 982 | - // verifier le charset |
|
| 983 | - $texte = charset2unicode($texte); |
|
| 982 | + // verifier le charset |
|
| 983 | + $texte = charset2unicode($texte); |
|
| 984 | 984 | |
| 985 | - // Caracteres problematiques en iso-latin 1 |
|
| 986 | - if (isset($GLOBALS['meta']['charset']) and $GLOBALS['meta']['charset'] == 'iso-8859-1') { |
|
| 987 | - $texte = str_replace(chr(156), 'œ', $texte); |
|
| 988 | - $texte = str_replace(chr(140), 'Œ', $texte); |
|
| 989 | - $texte = str_replace(chr(159), 'Ÿ', $texte); |
|
| 990 | - } |
|
| 985 | + // Caracteres problematiques en iso-latin 1 |
|
| 986 | + if (isset($GLOBALS['meta']['charset']) and $GLOBALS['meta']['charset'] == 'iso-8859-1') { |
|
| 987 | + $texte = str_replace(chr(156), 'œ', $texte); |
|
| 988 | + $texte = str_replace(chr(140), 'Œ', $texte); |
|
| 989 | + $texte = str_replace(chr(159), 'Ÿ', $texte); |
|
| 990 | + } |
|
| 991 | 991 | |
| 992 | - // l'apostrophe curly pose probleme a certains lecteure de RSS |
|
| 993 | - // et le caractere apostrophe alourdit les squelettes avec PHP |
|
| 994 | - // ==> on les remplace par l'entite HTML |
|
| 995 | - return str_replace($apostrophe, "'", $texte); |
|
| 992 | + // l'apostrophe curly pose probleme a certains lecteure de RSS |
|
| 993 | + // et le caractere apostrophe alourdit les squelettes avec PHP |
|
| 994 | + // ==> on les remplace par l'entite HTML |
|
| 995 | + return str_replace($apostrophe, "'", $texte); |
|
| 996 | 996 | } |
| 997 | 997 | |
| 998 | 998 | /** |
@@ -1009,7 +1009,7 @@ discard block |
||
| 1009 | 1009 | * Texte encodé et quote pour XML |
| 1010 | 1010 | */ |
| 1011 | 1011 | function texte_backendq(string $texte): string { |
| 1012 | - return addslashes(texte_backend($texte)); |
|
| 1012 | + return addslashes(texte_backend($texte)); |
|
| 1013 | 1013 | } |
| 1014 | 1014 | |
| 1015 | 1015 | |
@@ -1032,11 +1032,11 @@ discard block |
||
| 1032 | 1032 | * Numéro de titre, sinon chaîne vide |
| 1033 | 1033 | **/ |
| 1034 | 1034 | function supprimer_numero($texte) { |
| 1035 | - return preg_replace( |
|
| 1036 | - ',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S', |
|
| 1037 | - '', |
|
| 1038 | - $texte |
|
| 1039 | - ); |
|
| 1035 | + return preg_replace( |
|
| 1036 | + ',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S', |
|
| 1037 | + '', |
|
| 1038 | + $texte |
|
| 1039 | + ); |
|
| 1040 | 1040 | } |
| 1041 | 1041 | |
| 1042 | 1042 | /** |
@@ -1059,18 +1059,18 @@ discard block |
||
| 1059 | 1059 | * Numéro de titre, sinon chaîne vide |
| 1060 | 1060 | **/ |
| 1061 | 1061 | function recuperer_numero($texte) { |
| 1062 | - if ( |
|
| 1063 | - $texte and |
|
| 1064 | - preg_match( |
|
| 1065 | - ',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S', |
|
| 1066 | - $texte, |
|
| 1067 | - $regs |
|
| 1068 | - ) |
|
| 1069 | - ) { |
|
| 1070 | - return strval($regs[1]); |
|
| 1071 | - } else { |
|
| 1072 | - return ''; |
|
| 1073 | - } |
|
| 1062 | + if ( |
|
| 1063 | + $texte and |
|
| 1064 | + preg_match( |
|
| 1065 | + ',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S', |
|
| 1066 | + $texte, |
|
| 1067 | + $regs |
|
| 1068 | + ) |
|
| 1069 | + ) { |
|
| 1070 | + return strval($regs[1]); |
|
| 1071 | + } else { |
|
| 1072 | + return ''; |
|
| 1073 | + } |
|
| 1074 | 1074 | } |
| 1075 | 1075 | |
| 1076 | 1076 | /** |
@@ -1097,16 +1097,16 @@ discard block |
||
| 1097 | 1097 | * Texte ou tableau de textes converti |
| 1098 | 1098 | **/ |
| 1099 | 1099 | function supprimer_tags($texte, $rempl = '') { |
| 1100 | - if ($texte === null) { |
|
| 1101 | - return ''; |
|
| 1102 | - } |
|
| 1103 | - $texte = preg_replace(',<(!--|\w|/|!\[endif|!\[if)[^>]*>,US', $rempl, $texte); |
|
| 1104 | - // ne pas oublier un < final non ferme car coupe |
|
| 1105 | - $texte = preg_replace(',<(!--|\w|/).*$,US', $rempl, $texte); |
|
| 1106 | - // mais qui peut aussi etre un simple signe plus petit que |
|
| 1107 | - $texte = str_replace('<', '<', $texte); |
|
| 1100 | + if ($texte === null) { |
|
| 1101 | + return ''; |
|
| 1102 | + } |
|
| 1103 | + $texte = preg_replace(',<(!--|\w|/|!\[endif|!\[if)[^>]*>,US', $rempl, $texte); |
|
| 1104 | + // ne pas oublier un < final non ferme car coupe |
|
| 1105 | + $texte = preg_replace(',<(!--|\w|/).*$,US', $rempl, $texte); |
|
| 1106 | + // mais qui peut aussi etre un simple signe plus petit que |
|
| 1107 | + $texte = str_replace('<', '<', $texte); |
|
| 1108 | 1108 | |
| 1109 | - return $texte; |
|
| 1109 | + return $texte; |
|
| 1110 | 1110 | } |
| 1111 | 1111 | |
| 1112 | 1112 | /** |
@@ -1129,9 +1129,9 @@ discard block |
||
| 1129 | 1129 | * Texte converti |
| 1130 | 1130 | **/ |
| 1131 | 1131 | function echapper_tags($texte, $rempl = '') { |
| 1132 | - $texte = preg_replace('/<([^>]*)>/', "<\\1>", $texte); |
|
| 1132 | + $texte = preg_replace('/<([^>]*)>/', "<\\1>", $texte); |
|
| 1133 | 1133 | |
| 1134 | - return $texte; |
|
| 1134 | + return $texte; |
|
| 1135 | 1135 | } |
| 1136 | 1136 | |
| 1137 | 1137 | /** |
@@ -1152,18 +1152,18 @@ discard block |
||
| 1152 | 1152 | * Texte converti |
| 1153 | 1153 | **/ |
| 1154 | 1154 | function textebrut($texte) { |
| 1155 | - $u = $GLOBALS['meta']['pcre_u']; |
|
| 1156 | - $texte = preg_replace('/\s+/S' . $u, ' ', $texte); |
|
| 1157 | - $texte = preg_replace('/<(p|br)( [^>]*)?' . '>/iS', "\n\n", $texte); |
|
| 1158 | - $texte = preg_replace("/^\n+/", '', $texte); |
|
| 1159 | - $texte = preg_replace("/\n+$/", '', $texte); |
|
| 1160 | - $texte = preg_replace("/\n +/", "\n", $texte); |
|
| 1161 | - $texte = supprimer_tags($texte); |
|
| 1162 | - $texte = preg_replace('/( | )+/S', ' ', $texte); |
|
| 1163 | - // nettoyer l'apostrophe curly qui pose probleme a certains rss-readers, lecteurs de mail... |
|
| 1164 | - $texte = str_replace('’', "'", $texte); |
|
| 1155 | + $u = $GLOBALS['meta']['pcre_u']; |
|
| 1156 | + $texte = preg_replace('/\s+/S' . $u, ' ', $texte); |
|
| 1157 | + $texte = preg_replace('/<(p|br)( [^>]*)?' . '>/iS', "\n\n", $texte); |
|
| 1158 | + $texte = preg_replace("/^\n+/", '', $texte); |
|
| 1159 | + $texte = preg_replace("/\n+$/", '', $texte); |
|
| 1160 | + $texte = preg_replace("/\n +/", "\n", $texte); |
|
| 1161 | + $texte = supprimer_tags($texte); |
|
| 1162 | + $texte = preg_replace('/( | )+/S', ' ', $texte); |
|
| 1163 | + // nettoyer l'apostrophe curly qui pose probleme a certains rss-readers, lecteurs de mail... |
|
| 1164 | + $texte = str_replace('’', "'", $texte); |
|
| 1165 | 1165 | |
| 1166 | - return $texte; |
|
| 1166 | + return $texte; |
|
| 1167 | 1167 | } |
| 1168 | 1168 | |
| 1169 | 1169 | |
@@ -1179,23 +1179,23 @@ discard block |
||
| 1179 | 1179 | * Texte avec liens ouvrants |
| 1180 | 1180 | **/ |
| 1181 | 1181 | function liens_ouvrants($texte) { |
| 1182 | - if ( |
|
| 1183 | - preg_match_all( |
|
| 1184 | - ",(<a\s+[^>]*https?://[^>]*class=[\"']spip_(out|url)\b[^>]+>),imsS", |
|
| 1185 | - $texte, |
|
| 1186 | - $liens, |
|
| 1187 | - PREG_PATTERN_ORDER |
|
| 1188 | - ) |
|
| 1189 | - ) { |
|
| 1190 | - foreach ($liens[0] as $a) { |
|
| 1191 | - $rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel'); |
|
| 1192 | - $ablank = inserer_attribut($a, 'rel', $rel); |
|
| 1193 | - $ablank = inserer_attribut($ablank, 'target', '_blank'); |
|
| 1194 | - $texte = str_replace($a, $ablank, $texte); |
|
| 1195 | - } |
|
| 1196 | - } |
|
| 1197 | - |
|
| 1198 | - return $texte; |
|
| 1182 | + if ( |
|
| 1183 | + preg_match_all( |
|
| 1184 | + ",(<a\s+[^>]*https?://[^>]*class=[\"']spip_(out|url)\b[^>]+>),imsS", |
|
| 1185 | + $texte, |
|
| 1186 | + $liens, |
|
| 1187 | + PREG_PATTERN_ORDER |
|
| 1188 | + ) |
|
| 1189 | + ) { |
|
| 1190 | + foreach ($liens[0] as $a) { |
|
| 1191 | + $rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel'); |
|
| 1192 | + $ablank = inserer_attribut($a, 'rel', $rel); |
|
| 1193 | + $ablank = inserer_attribut($ablank, 'target', '_blank'); |
|
| 1194 | + $texte = str_replace($a, $ablank, $texte); |
|
| 1195 | + } |
|
| 1196 | + } |
|
| 1197 | + |
|
| 1198 | + return $texte; |
|
| 1199 | 1199 | } |
| 1200 | 1200 | |
| 1201 | 1201 | /** |
@@ -1205,22 +1205,22 @@ discard block |
||
| 1205 | 1205 | * @return string |
| 1206 | 1206 | */ |
| 1207 | 1207 | function liens_nofollow($texte) { |
| 1208 | - if (stripos($texte, '<a') === false) { |
|
| 1209 | - return $texte; |
|
| 1210 | - } |
|
| 1208 | + if (stripos($texte, '<a') === false) { |
|
| 1209 | + return $texte; |
|
| 1210 | + } |
|
| 1211 | 1211 | |
| 1212 | - if (preg_match_all(",<a\b[^>]*>,UimsS", $texte, $regs, PREG_PATTERN_ORDER)) { |
|
| 1213 | - foreach ($regs[0] as $a) { |
|
| 1214 | - $rel = extraire_attribut($a, 'rel') ?? ''; |
|
| 1215 | - if (strpos($rel, 'nofollow') === false) { |
|
| 1216 | - $rel = 'nofollow' . ($rel ? " $rel" : ''); |
|
| 1217 | - $anofollow = inserer_attribut($a, 'rel', $rel); |
|
| 1218 | - $texte = str_replace($a, $anofollow, $texte); |
|
| 1219 | - } |
|
| 1220 | - } |
|
| 1221 | - } |
|
| 1212 | + if (preg_match_all(",<a\b[^>]*>,UimsS", $texte, $regs, PREG_PATTERN_ORDER)) { |
|
| 1213 | + foreach ($regs[0] as $a) { |
|
| 1214 | + $rel = extraire_attribut($a, 'rel') ?? ''; |
|
| 1215 | + if (strpos($rel, 'nofollow') === false) { |
|
| 1216 | + $rel = 'nofollow' . ($rel ? " $rel" : ''); |
|
| 1217 | + $anofollow = inserer_attribut($a, 'rel', $rel); |
|
| 1218 | + $texte = str_replace($a, $anofollow, $texte); |
|
| 1219 | + } |
|
| 1220 | + } |
|
| 1221 | + } |
|
| 1222 | 1222 | |
| 1223 | - return $texte; |
|
| 1223 | + return $texte; |
|
| 1224 | 1224 | } |
| 1225 | 1225 | |
| 1226 | 1226 | /** |
@@ -1239,12 +1239,12 @@ discard block |
||
| 1239 | 1239 | * Texte sans paraghaphes |
| 1240 | 1240 | **/ |
| 1241 | 1241 | function PtoBR($texte) { |
| 1242 | - $u = $GLOBALS['meta']['pcre_u']; |
|
| 1243 | - $texte = preg_replace('@</p>@iS', "\n", $texte); |
|
| 1244 | - $texte = preg_replace("@<p\b.*>@UiS", '<br />', $texte); |
|
| 1245 | - $texte = preg_replace('@^\s*<br />@S' . $u, '', $texte); |
|
| 1242 | + $u = $GLOBALS['meta']['pcre_u']; |
|
| 1243 | + $texte = preg_replace('@</p>@iS', "\n", $texte); |
|
| 1244 | + $texte = preg_replace("@<p\b.*>@UiS", '<br />', $texte); |
|
| 1245 | + $texte = preg_replace('@^\s*<br />@S' . $u, '', $texte); |
|
| 1246 | 1246 | |
| 1247 | - return $texte; |
|
| 1247 | + return $texte; |
|
| 1248 | 1248 | } |
| 1249 | 1249 | |
| 1250 | 1250 | |
@@ -1269,14 +1269,14 @@ discard block |
||
| 1269 | 1269 | * @return string Texte encadré du style CSS |
| 1270 | 1270 | */ |
| 1271 | 1271 | function lignes_longues($texte) { |
| 1272 | - if (!strlen(trim($texte))) { |
|
| 1273 | - return $texte; |
|
| 1274 | - } |
|
| 1275 | - include_spip('inc/texte'); |
|
| 1276 | - $tag = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $texte) ? |
|
| 1277 | - 'div' : 'span'; |
|
| 1272 | + if (!strlen(trim($texte))) { |
|
| 1273 | + return $texte; |
|
| 1274 | + } |
|
| 1275 | + include_spip('inc/texte'); |
|
| 1276 | + $tag = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $texte) ? |
|
| 1277 | + 'div' : 'span'; |
|
| 1278 | 1278 | |
| 1279 | - return "<$tag style='word-wrap:break-word;'>$texte</$tag>"; |
|
| 1279 | + return "<$tag style='word-wrap:break-word;'>$texte</$tag>"; |
|
| 1280 | 1280 | } |
| 1281 | 1281 | |
| 1282 | 1282 | /** |
@@ -1295,30 +1295,30 @@ discard block |
||
| 1295 | 1295 | * @return string Texte en majuscule |
| 1296 | 1296 | */ |
| 1297 | 1297 | function majuscules($texte) { |
| 1298 | - if (!strlen($texte)) { |
|
| 1299 | - return ''; |
|
| 1300 | - } |
|
| 1298 | + if (!strlen($texte)) { |
|
| 1299 | + return ''; |
|
| 1300 | + } |
|
| 1301 | 1301 | |
| 1302 | - // Cas du turc |
|
| 1303 | - if ($GLOBALS['spip_lang'] == 'tr') { |
|
| 1304 | - # remplacer hors des tags et des entites |
|
| 1305 | - if (preg_match_all(',<[^<>]+>|&[^;]+;,S', $texte, $regs, PREG_SET_ORDER)) { |
|
| 1306 | - foreach ($regs as $n => $match) { |
|
| 1307 | - $texte = str_replace($match[0], "@@SPIP_TURC$n@@", $texte); |
|
| 1308 | - } |
|
| 1309 | - } |
|
| 1302 | + // Cas du turc |
|
| 1303 | + if ($GLOBALS['spip_lang'] == 'tr') { |
|
| 1304 | + # remplacer hors des tags et des entites |
|
| 1305 | + if (preg_match_all(',<[^<>]+>|&[^;]+;,S', $texte, $regs, PREG_SET_ORDER)) { |
|
| 1306 | + foreach ($regs as $n => $match) { |
|
| 1307 | + $texte = str_replace($match[0], "@@SPIP_TURC$n@@", $texte); |
|
| 1308 | + } |
|
| 1309 | + } |
|
| 1310 | 1310 | |
| 1311 | - $texte = str_replace('i', 'İ', $texte); |
|
| 1311 | + $texte = str_replace('i', 'İ', $texte); |
|
| 1312 | 1312 | |
| 1313 | - if ($regs) { |
|
| 1314 | - foreach ($regs as $n => $match) { |
|
| 1315 | - $texte = str_replace("@@SPIP_TURC$n@@", $match[0], $texte); |
|
| 1316 | - } |
|
| 1317 | - } |
|
| 1318 | - } |
|
| 1313 | + if ($regs) { |
|
| 1314 | + foreach ($regs as $n => $match) { |
|
| 1315 | + $texte = str_replace("@@SPIP_TURC$n@@", $match[0], $texte); |
|
| 1316 | + } |
|
| 1317 | + } |
|
| 1318 | + } |
|
| 1319 | 1319 | |
| 1320 | - // Cas general |
|
| 1321 | - return "<span style='text-transform: uppercase;'>$texte</span>"; |
|
| 1320 | + // Cas general |
|
| 1321 | + return "<span style='text-transform: uppercase;'>$texte</span>"; |
|
| 1322 | 1322 | } |
| 1323 | 1323 | |
| 1324 | 1324 | /** |
@@ -1336,29 +1336,29 @@ discard block |
||
| 1336 | 1336 | * @return string |
| 1337 | 1337 | **/ |
| 1338 | 1338 | function taille_en_octets($taille) { |
| 1339 | - if (!defined('_KILOBYTE')) { |
|
| 1340 | - /** |
|
| 1341 | - * Définit le nombre d'octets dans un Kilobyte |
|
| 1342 | - * |
|
| 1343 | - * @var int |
|
| 1344 | - **/ |
|
| 1345 | - define('_KILOBYTE', 1024); |
|
| 1346 | - } |
|
| 1339 | + if (!defined('_KILOBYTE')) { |
|
| 1340 | + /** |
|
| 1341 | + * Définit le nombre d'octets dans un Kilobyte |
|
| 1342 | + * |
|
| 1343 | + * @var int |
|
| 1344 | + **/ |
|
| 1345 | + define('_KILOBYTE', 1024); |
|
| 1346 | + } |
|
| 1347 | 1347 | |
| 1348 | - if ($taille < 1) { |
|
| 1349 | - return ''; |
|
| 1350 | - } |
|
| 1351 | - if ($taille < _KILOBYTE) { |
|
| 1352 | - $taille = _T('taille_octets', ['taille' => $taille]); |
|
| 1353 | - } elseif ($taille < _KILOBYTE * _KILOBYTE) { |
|
| 1354 | - $taille = _T('taille_ko', ['taille' => round($taille / _KILOBYTE, 1)]); |
|
| 1355 | - } elseif ($taille < _KILOBYTE * _KILOBYTE * _KILOBYTE) { |
|
| 1356 | - $taille = _T('taille_mo', ['taille' => round($taille / _KILOBYTE / _KILOBYTE, 1)]); |
|
| 1357 | - } else { |
|
| 1358 | - $taille = _T('taille_go', ['taille' => round($taille / _KILOBYTE / _KILOBYTE / _KILOBYTE, 2)]); |
|
| 1359 | - } |
|
| 1348 | + if ($taille < 1) { |
|
| 1349 | + return ''; |
|
| 1350 | + } |
|
| 1351 | + if ($taille < _KILOBYTE) { |
|
| 1352 | + $taille = _T('taille_octets', ['taille' => $taille]); |
|
| 1353 | + } elseif ($taille < _KILOBYTE * _KILOBYTE) { |
|
| 1354 | + $taille = _T('taille_ko', ['taille' => round($taille / _KILOBYTE, 1)]); |
|
| 1355 | + } elseif ($taille < _KILOBYTE * _KILOBYTE * _KILOBYTE) { |
|
| 1356 | + $taille = _T('taille_mo', ['taille' => round($taille / _KILOBYTE / _KILOBYTE, 1)]); |
|
| 1357 | + } else { |
|
| 1358 | + $taille = _T('taille_go', ['taille' => round($taille / _KILOBYTE / _KILOBYTE / _KILOBYTE, 2)]); |
|
| 1359 | + } |
|
| 1360 | 1360 | |
| 1361 | - return $taille; |
|
| 1361 | + return $taille; |
|
| 1362 | 1362 | } |
| 1363 | 1363 | |
| 1364 | 1364 | |
@@ -1380,21 +1380,21 @@ discard block |
||
| 1380 | 1380 | * Texte prêt pour être utilisé en attribut HTML |
| 1381 | 1381 | **/ |
| 1382 | 1382 | function attribut_html(?string $texte, $textebrut = true): string { |
| 1383 | - if ($texte === null) { |
|
| 1384 | - return ''; |
|
| 1385 | - } |
|
| 1386 | - $u = $GLOBALS['meta']['pcre_u']; |
|
| 1387 | - if ($textebrut) { |
|
| 1388 | - $texte = preg_replace([",\n,", ',\s(?=\s),msS' . $u], [' ', ''], textebrut($texte)); |
|
| 1389 | - } |
|
| 1390 | - $texte = texte_backend($texte); |
|
| 1391 | - $texte = str_replace(["'", '"'], [''', '"'], $texte); |
|
| 1383 | + if ($texte === null) { |
|
| 1384 | + return ''; |
|
| 1385 | + } |
|
| 1386 | + $u = $GLOBALS['meta']['pcre_u']; |
|
| 1387 | + if ($textebrut) { |
|
| 1388 | + $texte = preg_replace([",\n,", ',\s(?=\s),msS' . $u], [' ', ''], textebrut($texte)); |
|
| 1389 | + } |
|
| 1390 | + $texte = texte_backend($texte); |
|
| 1391 | + $texte = str_replace(["'", '"'], [''', '"'], $texte); |
|
| 1392 | 1392 | |
| 1393 | - return preg_replace( |
|
| 1394 | - ['/&(amp;|#38;)/', '/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,5};)/'], |
|
| 1395 | - ['&', '&'], |
|
| 1396 | - $texte |
|
| 1397 | - ); |
|
| 1393 | + return preg_replace( |
|
| 1394 | + ['/&(amp;|#38;)/', '/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,5};)/'], |
|
| 1395 | + ['&', '&'], |
|
| 1396 | + $texte |
|
| 1397 | + ); |
|
| 1398 | 1398 | } |
| 1399 | 1399 | |
| 1400 | 1400 | |
@@ -1414,15 +1414,15 @@ discard block |
||
| 1414 | 1414 | * URL ou chaîne vide |
| 1415 | 1415 | **/ |
| 1416 | 1416 | function vider_url(?string $url, $entites = true): string { |
| 1417 | - if ($url === null) { |
|
| 1418 | - return ''; |
|
| 1419 | - } |
|
| 1420 | - # un message pour abs_url |
|
| 1421 | - $GLOBALS['mode_abs_url'] = 'url'; |
|
| 1422 | - $url = trim($url); |
|
| 1423 | - $r = ',^(?:' . _PROTOCOLES_STD . '):?/?/?$,iS'; |
|
| 1417 | + if ($url === null) { |
|
| 1418 | + return ''; |
|
| 1419 | + } |
|
| 1420 | + # un message pour abs_url |
|
| 1421 | + $GLOBALS['mode_abs_url'] = 'url'; |
|
| 1422 | + $url = trim($url); |
|
| 1423 | + $r = ',^(?:' . _PROTOCOLES_STD . '):?/?/?$,iS'; |
|
| 1424 | 1424 | |
| 1425 | - return preg_match($r, $url) ? '' : ($entites ? entites_html($url) : $url); |
|
| 1425 | + return preg_match($r, $url) ? '' : ($entites ? entites_html($url) : $url); |
|
| 1426 | 1426 | } |
| 1427 | 1427 | |
| 1428 | 1428 | |
@@ -1437,10 +1437,10 @@ discard block |
||
| 1437 | 1437 | * @return string Adresse email maquillée |
| 1438 | 1438 | **/ |
| 1439 | 1439 | function antispam($texte) { |
| 1440 | - include_spip('inc/acces'); |
|
| 1441 | - $masque = creer_pass_aleatoire(3); |
|
| 1440 | + include_spip('inc/acces'); |
|
| 1441 | + $masque = creer_pass_aleatoire(3); |
|
| 1442 | 1442 | |
| 1443 | - return preg_replace('/@/', " $masque ", $texte); |
|
| 1443 | + return preg_replace('/@/', " $masque ", $texte); |
|
| 1444 | 1444 | } |
| 1445 | 1445 | |
| 1446 | 1446 | /** |
@@ -1472,8 +1472,8 @@ discard block |
||
| 1472 | 1472 | * True si on a le droit d'accès, false sinon. |
| 1473 | 1473 | **/ |
| 1474 | 1474 | function filtre_securiser_acces_dist($id_auteur, $cle, $dir, $op = '', $args = '') { |
| 1475 | - include_spip('inc/acces'); |
|
| 1476 | - return securiser_acces_low_sec($id_auteur, $cle, $op ? "$dir $op $args" : $dir); |
|
| 1475 | + include_spip('inc/acces'); |
|
| 1476 | + return securiser_acces_low_sec($id_auteur, $cle, $op ? "$dir $op $args" : $dir); |
|
| 1477 | 1477 | } |
| 1478 | 1478 | |
| 1479 | 1479 | /** |
@@ -1498,13 +1498,13 @@ discard block |
||
| 1498 | 1498 | * Retourne $texte, sinon $sinon. |
| 1499 | 1499 | **/ |
| 1500 | 1500 | function sinon($texte, $sinon = '') { |
| 1501 | - if ($texte) { |
|
| 1502 | - return $texte; |
|
| 1503 | - } elseif (is_scalar($texte) and strlen($texte)) { |
|
| 1504 | - return $texte; |
|
| 1505 | - } else { |
|
| 1506 | - return $sinon; |
|
| 1507 | - } |
|
| 1501 | + if ($texte) { |
|
| 1502 | + return $texte; |
|
| 1503 | + } elseif (is_scalar($texte) and strlen($texte)) { |
|
| 1504 | + return $texte; |
|
| 1505 | + } else { |
|
| 1506 | + return $sinon; |
|
| 1507 | + } |
|
| 1508 | 1508 | } |
| 1509 | 1509 | |
| 1510 | 1510 | /** |
@@ -1528,7 +1528,7 @@ discard block |
||
| 1528 | 1528 | * @return mixed |
| 1529 | 1529 | **/ |
| 1530 | 1530 | function choixsivide($a, $vide, $pasvide) { |
| 1531 | - return $a ? $pasvide : $vide; |
|
| 1531 | + return $a ? $pasvide : $vide; |
|
| 1532 | 1532 | } |
| 1533 | 1533 | |
| 1534 | 1534 | /** |
@@ -1552,7 +1552,7 @@ discard block |
||
| 1552 | 1552 | * @return mixed |
| 1553 | 1553 | **/ |
| 1554 | 1554 | function choixsiegal($a1, $a2, $v, $f) { |
| 1555 | - return ($a1 == $a2) ? $v : $f; |
|
| 1555 | + return ($a1 == $a2) ? $v : $f; |
|
| 1556 | 1556 | } |
| 1557 | 1557 | |
| 1558 | 1558 | // |
@@ -1571,13 +1571,13 @@ discard block |
||
| 1571 | 1571 | * @return string |
| 1572 | 1572 | **/ |
| 1573 | 1573 | function filtrer_ical($texte) { |
| 1574 | - #include_spip('inc/charsets'); |
|
| 1575 | - $texte = html2unicode($texte); |
|
| 1576 | - $texte = unicode2charset(charset2unicode($texte, $GLOBALS['meta']['charset']), 'utf-8'); |
|
| 1577 | - $texte = preg_replace("/\n/", ' ', $texte); |
|
| 1578 | - $texte = preg_replace('/,/', '\,', $texte); |
|
| 1574 | + #include_spip('inc/charsets'); |
|
| 1575 | + $texte = html2unicode($texte); |
|
| 1576 | + $texte = unicode2charset(charset2unicode($texte, $GLOBALS['meta']['charset']), 'utf-8'); |
|
| 1577 | + $texte = preg_replace("/\n/", ' ', $texte); |
|
| 1578 | + $texte = preg_replace('/,/', '\,', $texte); |
|
| 1579 | 1579 | |
| 1580 | - return $texte; |
|
| 1580 | + return $texte; |
|
| 1581 | 1581 | } |
| 1582 | 1582 | |
| 1583 | 1583 | |
@@ -1602,54 +1602,54 @@ discard block |
||
| 1602 | 1602 | * @return string |
| 1603 | 1603 | **/ |
| 1604 | 1604 | function post_autobr($texte, $delim = "\n_ ") { |
| 1605 | - if (!function_exists('echappe_html')) { |
|
| 1606 | - include_spip('inc/texte_mini'); |
|
| 1607 | - } |
|
| 1608 | - $texte = str_replace("\r\n", "\r", $texte); |
|
| 1609 | - $texte = str_replace("\r", "\n", $texte); |
|
| 1610 | - |
|
| 1611 | - if (preg_match(",\n+$,", $texte, $fin)) { |
|
| 1612 | - $texte = substr($texte, 0, -strlen($fin = $fin[0])); |
|
| 1613 | - } else { |
|
| 1614 | - $fin = ''; |
|
| 1615 | - } |
|
| 1616 | - |
|
| 1617 | - $texte = echappe_html($texte, '', true); |
|
| 1618 | - |
|
| 1619 | - // echapper les modeles |
|
| 1620 | - if (strpos($texte, '<') !== false) { |
|
| 1621 | - include_spip('inc/lien'); |
|
| 1622 | - if (defined('_PREG_MODELE')) { |
|
| 1623 | - $preg_modeles = '@' . _PREG_MODELE . '@imsS'; |
|
| 1624 | - $texte = echappe_html($texte, '', true, $preg_modeles); |
|
| 1625 | - } |
|
| 1626 | - } |
|
| 1627 | - |
|
| 1628 | - $debut = ''; |
|
| 1629 | - $suite = $texte; |
|
| 1630 | - while ($t = strpos('-' . $suite, "\n", 1)) { |
|
| 1631 | - $debut .= substr($suite, 0, $t - 1); |
|
| 1632 | - $suite = substr($suite, $t); |
|
| 1633 | - $car = substr($suite, 0, 1); |
|
| 1634 | - if ( |
|
| 1635 | - ($car <> '-') and ($car <> '_') and ($car <> "\n") and ($car <> '|') and ($car <> '}') |
|
| 1636 | - and !preg_match(',^\s*(\n|</?(quote|div|dl|dt|dd)|$),S', ($suite)) |
|
| 1637 | - and !preg_match(',</?(quote|div|dl|dt|dd)> *$,iS', $debut) |
|
| 1638 | - ) { |
|
| 1639 | - $debut .= $delim; |
|
| 1640 | - } else { |
|
| 1641 | - $debut .= "\n"; |
|
| 1642 | - } |
|
| 1643 | - if (preg_match(",^\n+,", $suite, $regs)) { |
|
| 1644 | - $debut .= $regs[0]; |
|
| 1645 | - $suite = substr($suite, strlen($regs[0])); |
|
| 1646 | - } |
|
| 1647 | - } |
|
| 1648 | - $texte = $debut . $suite; |
|
| 1649 | - |
|
| 1650 | - $texte = echappe_retour($texte); |
|
| 1651 | - |
|
| 1652 | - return $texte . $fin; |
|
| 1605 | + if (!function_exists('echappe_html')) { |
|
| 1606 | + include_spip('inc/texte_mini'); |
|
| 1607 | + } |
|
| 1608 | + $texte = str_replace("\r\n", "\r", $texte); |
|
| 1609 | + $texte = str_replace("\r", "\n", $texte); |
|
| 1610 | + |
|
| 1611 | + if (preg_match(",\n+$,", $texte, $fin)) { |
|
| 1612 | + $texte = substr($texte, 0, -strlen($fin = $fin[0])); |
|
| 1613 | + } else { |
|
| 1614 | + $fin = ''; |
|
| 1615 | + } |
|
| 1616 | + |
|
| 1617 | + $texte = echappe_html($texte, '', true); |
|
| 1618 | + |
|
| 1619 | + // echapper les modeles |
|
| 1620 | + if (strpos($texte, '<') !== false) { |
|
| 1621 | + include_spip('inc/lien'); |
|
| 1622 | + if (defined('_PREG_MODELE')) { |
|
| 1623 | + $preg_modeles = '@' . _PREG_MODELE . '@imsS'; |
|
| 1624 | + $texte = echappe_html($texte, '', true, $preg_modeles); |
|
| 1625 | + } |
|
| 1626 | + } |
|
| 1627 | + |
|
| 1628 | + $debut = ''; |
|
| 1629 | + $suite = $texte; |
|
| 1630 | + while ($t = strpos('-' . $suite, "\n", 1)) { |
|
| 1631 | + $debut .= substr($suite, 0, $t - 1); |
|
| 1632 | + $suite = substr($suite, $t); |
|
| 1633 | + $car = substr($suite, 0, 1); |
|
| 1634 | + if ( |
|
| 1635 | + ($car <> '-') and ($car <> '_') and ($car <> "\n") and ($car <> '|') and ($car <> '}') |
|
| 1636 | + and !preg_match(',^\s*(\n|</?(quote|div|dl|dt|dd)|$),S', ($suite)) |
|
| 1637 | + and !preg_match(',</?(quote|div|dl|dt|dd)> *$,iS', $debut) |
|
| 1638 | + ) { |
|
| 1639 | + $debut .= $delim; |
|
| 1640 | + } else { |
|
| 1641 | + $debut .= "\n"; |
|
| 1642 | + } |
|
| 1643 | + if (preg_match(",^\n+,", $suite, $regs)) { |
|
| 1644 | + $debut .= $regs[0]; |
|
| 1645 | + $suite = substr($suite, strlen($regs[0])); |
|
| 1646 | + } |
|
| 1647 | + } |
|
| 1648 | + $texte = $debut . $suite; |
|
| 1649 | + |
|
| 1650 | + $texte = echappe_retour($texte); |
|
| 1651 | + |
|
| 1652 | + return $texte . $fin; |
|
| 1653 | 1653 | } |
| 1654 | 1654 | |
| 1655 | 1655 | |
@@ -1690,47 +1690,47 @@ discard block |
||
| 1690 | 1690 | * @return string |
| 1691 | 1691 | **/ |
| 1692 | 1692 | function extraire_idiome($letexte, $lang = null, $options = []) { |
| 1693 | - static $traduire = false; |
|
| 1694 | - if ( |
|
| 1695 | - $letexte |
|
| 1696 | - and preg_match_all(_EXTRAIRE_IDIOME, $letexte, $regs, PREG_SET_ORDER) |
|
| 1697 | - ) { |
|
| 1698 | - if (!$traduire) { |
|
| 1699 | - $traduire = charger_fonction('traduire', 'inc'); |
|
| 1700 | - include_spip('inc/lang'); |
|
| 1701 | - } |
|
| 1702 | - if (!$lang) { |
|
| 1703 | - $lang = $GLOBALS['spip_lang']; |
|
| 1704 | - } |
|
| 1705 | - // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean |
|
| 1706 | - if (is_bool($options)) { |
|
| 1707 | - $options = ['echappe_span' => $options]; |
|
| 1708 | - } |
|
| 1709 | - if (!isset($options['echappe_span'])) { |
|
| 1710 | - $options = array_merge($options, ['echappe_span' => false]); |
|
| 1711 | - } |
|
| 1712 | - |
|
| 1713 | - foreach ($regs as $reg) { |
|
| 1714 | - $cle = ($reg[1] ? $reg[1] . ':' : '') . $reg[2]; |
|
| 1715 | - $desc = $traduire($cle, $lang, true); |
|
| 1716 | - $l = $desc->langue; |
|
| 1717 | - // si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte. |
|
| 1718 | - if (strlen($desc->texte ?? '')) { |
|
| 1719 | - $trad = code_echappement($desc->texte, 'idiome', false); |
|
| 1720 | - if ($l !== $lang) { |
|
| 1721 | - $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); |
|
| 1722 | - } |
|
| 1723 | - if (lang_dir($l) !== lang_dir($lang)) { |
|
| 1724 | - $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l))); |
|
| 1725 | - } |
|
| 1726 | - if (!$options['echappe_span']) { |
|
| 1727 | - $trad = echappe_retour($trad, 'idiome'); |
|
| 1728 | - } |
|
| 1729 | - $letexte = str_replace($reg[0], $trad, $letexte); |
|
| 1730 | - } |
|
| 1731 | - } |
|
| 1732 | - } |
|
| 1733 | - return $letexte; |
|
| 1693 | + static $traduire = false; |
|
| 1694 | + if ( |
|
| 1695 | + $letexte |
|
| 1696 | + and preg_match_all(_EXTRAIRE_IDIOME, $letexte, $regs, PREG_SET_ORDER) |
|
| 1697 | + ) { |
|
| 1698 | + if (!$traduire) { |
|
| 1699 | + $traduire = charger_fonction('traduire', 'inc'); |
|
| 1700 | + include_spip('inc/lang'); |
|
| 1701 | + } |
|
| 1702 | + if (!$lang) { |
|
| 1703 | + $lang = $GLOBALS['spip_lang']; |
|
| 1704 | + } |
|
| 1705 | + // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean |
|
| 1706 | + if (is_bool($options)) { |
|
| 1707 | + $options = ['echappe_span' => $options]; |
|
| 1708 | + } |
|
| 1709 | + if (!isset($options['echappe_span'])) { |
|
| 1710 | + $options = array_merge($options, ['echappe_span' => false]); |
|
| 1711 | + } |
|
| 1712 | + |
|
| 1713 | + foreach ($regs as $reg) { |
|
| 1714 | + $cle = ($reg[1] ? $reg[1] . ':' : '') . $reg[2]; |
|
| 1715 | + $desc = $traduire($cle, $lang, true); |
|
| 1716 | + $l = $desc->langue; |
|
| 1717 | + // si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte. |
|
| 1718 | + if (strlen($desc->texte ?? '')) { |
|
| 1719 | + $trad = code_echappement($desc->texte, 'idiome', false); |
|
| 1720 | + if ($l !== $lang) { |
|
| 1721 | + $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); |
|
| 1722 | + } |
|
| 1723 | + if (lang_dir($l) !== lang_dir($lang)) { |
|
| 1724 | + $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l))); |
|
| 1725 | + } |
|
| 1726 | + if (!$options['echappe_span']) { |
|
| 1727 | + $trad = echappe_retour($trad, 'idiome'); |
|
| 1728 | + } |
|
| 1729 | + $letexte = str_replace($reg[0], $trad, $letexte); |
|
| 1730 | + } |
|
| 1731 | + } |
|
| 1732 | + } |
|
| 1733 | + return $letexte; |
|
| 1734 | 1734 | } |
| 1735 | 1735 | |
| 1736 | 1736 | /** |
@@ -1782,68 +1782,68 @@ discard block |
||
| 1782 | 1782 | **/ |
| 1783 | 1783 | function extraire_multi($letexte, $lang = null, $options = []) { |
| 1784 | 1784 | |
| 1785 | - if ( |
|
| 1786 | - $letexte |
|
| 1787 | - and preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER) |
|
| 1788 | - ) { |
|
| 1789 | - if (!$lang) { |
|
| 1790 | - $lang = $GLOBALS['spip_lang']; |
|
| 1791 | - } |
|
| 1792 | - |
|
| 1793 | - // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean |
|
| 1794 | - if (is_bool($options)) { |
|
| 1795 | - $options = ['echappe_span' => $options, 'lang_defaut' => _LANGUE_PAR_DEFAUT]; |
|
| 1796 | - } |
|
| 1797 | - if (!isset($options['echappe_span'])) { |
|
| 1798 | - $options = array_merge($options, ['echappe_span' => false]); |
|
| 1799 | - } |
|
| 1800 | - if (!isset($options['lang_defaut'])) { |
|
| 1801 | - $options = array_merge($options, ['lang_defaut' => _LANGUE_PAR_DEFAUT]); |
|
| 1802 | - } |
|
| 1803 | - |
|
| 1804 | - include_spip('inc/lang'); |
|
| 1805 | - foreach ($regs as $reg) { |
|
| 1806 | - // chercher la version de la langue courante |
|
| 1807 | - $trads = extraire_trads($reg[1]); |
|
| 1808 | - if ($l = approcher_langue($trads, $lang)) { |
|
| 1809 | - $trad = $trads[$l]; |
|
| 1810 | - } else { |
|
| 1811 | - if ($options['lang_defaut'] == 'aucune') { |
|
| 1812 | - $trad = ''; |
|
| 1813 | - } else { |
|
| 1814 | - // langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php) |
|
| 1815 | - // ou la premiere dispo |
|
| 1816 | - // mais typographier le texte selon les regles de celle-ci |
|
| 1817 | - // Attention aux blocs multi sur plusieurs lignes |
|
| 1818 | - if (!$l = approcher_langue($trads, $options['lang_defaut'])) { |
|
| 1819 | - $l = key($trads); |
|
| 1820 | - } |
|
| 1821 | - $trad = $trads[$l]; |
|
| 1822 | - $typographie = charger_fonction(lang_typo($l), 'typographie'); |
|
| 1823 | - $trad = $typographie($trad); |
|
| 1824 | - // Tester si on echappe en span ou en div |
|
| 1825 | - // il ne faut pas echapper en div si propre produit un seul paragraphe |
|
| 1826 | - include_spip('inc/texte'); |
|
| 1827 | - $trad_propre = preg_replace(',(^<p[^>]*>|</p>$),Uims', '', propre($trad)); |
|
| 1828 | - $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; |
|
| 1829 | - if ($mode === 'div') { |
|
| 1830 | - $trad = rtrim($trad) . "\n\n"; |
|
| 1831 | - } |
|
| 1832 | - $trad = code_echappement($trad, 'multi', false, $mode); |
|
| 1833 | - $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); |
|
| 1834 | - if (lang_dir($l) !== lang_dir($lang)) { |
|
| 1835 | - $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l))); |
|
| 1836 | - } |
|
| 1837 | - if (!$options['echappe_span']) { |
|
| 1838 | - $trad = echappe_retour($trad, 'multi'); |
|
| 1839 | - } |
|
| 1840 | - } |
|
| 1841 | - } |
|
| 1842 | - $letexte = str_replace($reg[0], $trad, $letexte); |
|
| 1843 | - } |
|
| 1844 | - } |
|
| 1845 | - |
|
| 1846 | - return $letexte; |
|
| 1785 | + if ( |
|
| 1786 | + $letexte |
|
| 1787 | + and preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER) |
|
| 1788 | + ) { |
|
| 1789 | + if (!$lang) { |
|
| 1790 | + $lang = $GLOBALS['spip_lang']; |
|
| 1791 | + } |
|
| 1792 | + |
|
| 1793 | + // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean |
|
| 1794 | + if (is_bool($options)) { |
|
| 1795 | + $options = ['echappe_span' => $options, 'lang_defaut' => _LANGUE_PAR_DEFAUT]; |
|
| 1796 | + } |
|
| 1797 | + if (!isset($options['echappe_span'])) { |
|
| 1798 | + $options = array_merge($options, ['echappe_span' => false]); |
|
| 1799 | + } |
|
| 1800 | + if (!isset($options['lang_defaut'])) { |
|
| 1801 | + $options = array_merge($options, ['lang_defaut' => _LANGUE_PAR_DEFAUT]); |
|
| 1802 | + } |
|
| 1803 | + |
|
| 1804 | + include_spip('inc/lang'); |
|
| 1805 | + foreach ($regs as $reg) { |
|
| 1806 | + // chercher la version de la langue courante |
|
| 1807 | + $trads = extraire_trads($reg[1]); |
|
| 1808 | + if ($l = approcher_langue($trads, $lang)) { |
|
| 1809 | + $trad = $trads[$l]; |
|
| 1810 | + } else { |
|
| 1811 | + if ($options['lang_defaut'] == 'aucune') { |
|
| 1812 | + $trad = ''; |
|
| 1813 | + } else { |
|
| 1814 | + // langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php) |
|
| 1815 | + // ou la premiere dispo |
|
| 1816 | + // mais typographier le texte selon les regles de celle-ci |
|
| 1817 | + // Attention aux blocs multi sur plusieurs lignes |
|
| 1818 | + if (!$l = approcher_langue($trads, $options['lang_defaut'])) { |
|
| 1819 | + $l = key($trads); |
|
| 1820 | + } |
|
| 1821 | + $trad = $trads[$l]; |
|
| 1822 | + $typographie = charger_fonction(lang_typo($l), 'typographie'); |
|
| 1823 | + $trad = $typographie($trad); |
|
| 1824 | + // Tester si on echappe en span ou en div |
|
| 1825 | + // il ne faut pas echapper en div si propre produit un seul paragraphe |
|
| 1826 | + include_spip('inc/texte'); |
|
| 1827 | + $trad_propre = preg_replace(',(^<p[^>]*>|</p>$),Uims', '', propre($trad)); |
|
| 1828 | + $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; |
|
| 1829 | + if ($mode === 'div') { |
|
| 1830 | + $trad = rtrim($trad) . "\n\n"; |
|
| 1831 | + } |
|
| 1832 | + $trad = code_echappement($trad, 'multi', false, $mode); |
|
| 1833 | + $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); |
|
| 1834 | + if (lang_dir($l) !== lang_dir($lang)) { |
|
| 1835 | + $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l))); |
|
| 1836 | + } |
|
| 1837 | + if (!$options['echappe_span']) { |
|
| 1838 | + $trad = echappe_retour($trad, 'multi'); |
|
| 1839 | + } |
|
| 1840 | + } |
|
| 1841 | + } |
|
| 1842 | + $letexte = str_replace($reg[0], $trad, $letexte); |
|
| 1843 | + } |
|
| 1844 | + } |
|
| 1845 | + |
|
| 1846 | + return $letexte; |
|
| 1847 | 1847 | } |
| 1848 | 1848 | |
| 1849 | 1849 | /** |
@@ -1859,21 +1859,21 @@ discard block |
||
| 1859 | 1859 | * Peut retourner un code de langue vide, lorsqu'un texte par défaut est indiqué. |
| 1860 | 1860 | **/ |
| 1861 | 1861 | function extraire_trads($bloc) { |
| 1862 | - $trads = []; |
|
| 1863 | - $lang = ''; |
|
| 1862 | + $trads = []; |
|
| 1863 | + $lang = ''; |
|
| 1864 | 1864 | // ce reg fait planter l'analyse multi s'il y a de l'{italique} dans le champ |
| 1865 | 1865 | // while (preg_match("/^(.*?)[{\[]([a-z_]+)[}\]]/siS", $bloc, $regs)) { |
| 1866 | - while (preg_match('/^(.*?)[\[]([a-z_]+)[\]]/siS', $bloc, $regs)) { |
|
| 1867 | - $texte = trim($regs[1]); |
|
| 1868 | - if ($texte or $lang) { |
|
| 1869 | - $trads[$lang] = $texte; |
|
| 1870 | - } |
|
| 1871 | - $bloc = substr($bloc, strlen($regs[0])); |
|
| 1872 | - $lang = $regs[2]; |
|
| 1873 | - } |
|
| 1874 | - $trads[$lang] = $bloc; |
|
| 1866 | + while (preg_match('/^(.*?)[\[]([a-z_]+)[\]]/siS', $bloc, $regs)) { |
|
| 1867 | + $texte = trim($regs[1]); |
|
| 1868 | + if ($texte or $lang) { |
|
| 1869 | + $trads[$lang] = $texte; |
|
| 1870 | + } |
|
| 1871 | + $bloc = substr($bloc, strlen($regs[0])); |
|
| 1872 | + $lang = $regs[2]; |
|
| 1873 | + } |
|
| 1874 | + $trads[$lang] = $bloc; |
|
| 1875 | 1875 | |
| 1876 | - return $trads; |
|
| 1876 | + return $trads; |
|
| 1877 | 1877 | } |
| 1878 | 1878 | |
| 1879 | 1879 | |
@@ -1884,7 +1884,7 @@ discard block |
||
| 1884 | 1884 | * @return string L'initiale en majuscule |
| 1885 | 1885 | */ |
| 1886 | 1886 | function filtre_initiale($nom) { |
| 1887 | - return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1); |
|
| 1887 | + return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1); |
|
| 1888 | 1888 | } |
| 1889 | 1889 | |
| 1890 | 1890 | |
@@ -1929,33 +1929,33 @@ discard block |
||
| 1929 | 1929 | * - null (interne) : si on empile |
| 1930 | 1930 | **/ |
| 1931 | 1931 | function unique($donnee, $famille = '', $cpt = false) { |
| 1932 | - static $mem = []; |
|
| 1933 | - // permettre de vider la pile et de la restaurer |
|
| 1934 | - // pour le calcul de introduction... |
|
| 1935 | - if ($famille == '_spip_raz_') { |
|
| 1936 | - $tmp = $mem; |
|
| 1937 | - $mem = []; |
|
| 1938 | - |
|
| 1939 | - return $tmp; |
|
| 1940 | - } elseif ($famille == '_spip_set_') { |
|
| 1941 | - $mem = $donnee; |
|
| 1942 | - |
|
| 1943 | - return; |
|
| 1944 | - } |
|
| 1945 | - // eviter une notice |
|
| 1946 | - if (!isset($mem[$famille])) { |
|
| 1947 | - $mem[$famille] = []; |
|
| 1948 | - } |
|
| 1949 | - if ($cpt) { |
|
| 1950 | - return is_countable($mem[$famille]) ? count($mem[$famille]) : 0; |
|
| 1951 | - } |
|
| 1952 | - // eviter une notice |
|
| 1953 | - if (!isset($mem[$famille][$donnee])) { |
|
| 1954 | - $mem[$famille][$donnee] = 0; |
|
| 1955 | - } |
|
| 1956 | - if (!($mem[$famille][$donnee]++)) { |
|
| 1957 | - return $donnee; |
|
| 1958 | - } |
|
| 1932 | + static $mem = []; |
|
| 1933 | + // permettre de vider la pile et de la restaurer |
|
| 1934 | + // pour le calcul de introduction... |
|
| 1935 | + if ($famille == '_spip_raz_') { |
|
| 1936 | + $tmp = $mem; |
|
| 1937 | + $mem = []; |
|
| 1938 | + |
|
| 1939 | + return $tmp; |
|
| 1940 | + } elseif ($famille == '_spip_set_') { |
|
| 1941 | + $mem = $donnee; |
|
| 1942 | + |
|
| 1943 | + return; |
|
| 1944 | + } |
|
| 1945 | + // eviter une notice |
|
| 1946 | + if (!isset($mem[$famille])) { |
|
| 1947 | + $mem[$famille] = []; |
|
| 1948 | + } |
|
| 1949 | + if ($cpt) { |
|
| 1950 | + return is_countable($mem[$famille]) ? count($mem[$famille]) : 0; |
|
| 1951 | + } |
|
| 1952 | + // eviter une notice |
|
| 1953 | + if (!isset($mem[$famille][$donnee])) { |
|
| 1954 | + $mem[$famille][$donnee] = 0; |
|
| 1955 | + } |
|
| 1956 | + if (!($mem[$famille][$donnee]++)) { |
|
| 1957 | + return $donnee; |
|
| 1958 | + } |
|
| 1959 | 1959 | } |
| 1960 | 1960 | |
| 1961 | 1961 | |
@@ -1985,20 +1985,20 @@ discard block |
||
| 1985 | 1985 | * Une des valeurs en fonction du compteur. |
| 1986 | 1986 | **/ |
| 1987 | 1987 | function alterner($i, ...$args) { |
| 1988 | - // recuperer les arguments (attention fonctions un peu space) |
|
| 1989 | - $num = count($args); |
|
| 1988 | + // recuperer les arguments (attention fonctions un peu space) |
|
| 1989 | + $num = count($args); |
|
| 1990 | 1990 | |
| 1991 | - if ($num === 1 && is_array($args[0])) { |
|
| 1992 | - // un tableau de valeur dont les cles sont numerotees de 0 a num |
|
| 1993 | - $args = array_values($args[0]); |
|
| 1994 | - $num = count($args); |
|
| 1995 | - } |
|
| 1991 | + if ($num === 1 && is_array($args[0])) { |
|
| 1992 | + // un tableau de valeur dont les cles sont numerotees de 0 a num |
|
| 1993 | + $args = array_values($args[0]); |
|
| 1994 | + $num = count($args); |
|
| 1995 | + } |
|
| 1996 | 1996 | |
| 1997 | - // un index compris entre 0 et num exclus |
|
| 1998 | - $i = ((intval($i) - 1) % $num); // dans ]-$num;$num[ |
|
| 1999 | - $i = ($i + $num) % $num; // dans [0;$num[ |
|
| 2000 | - // renvoyer le i-ieme argument, modulo le nombre d'arguments |
|
| 2001 | - return $args[$i]; |
|
| 1997 | + // un index compris entre 0 et num exclus |
|
| 1998 | + $i = ((intval($i) - 1) % $num); // dans ]-$num;$num[ |
|
| 1999 | + $i = ($i + $num) % $num; // dans [0;$num[ |
|
| 2000 | + // renvoyer le i-ieme argument, modulo le nombre d'arguments |
|
| 2001 | + return $args[$i]; |
|
| 2002 | 2002 | } |
| 2003 | 2003 | |
| 2004 | 2004 | |
@@ -2024,51 +2024,51 @@ discard block |
||
| 2024 | 2024 | * - null lorsque l’attribut n’existe pas. |
| 2025 | 2025 | **/ |
| 2026 | 2026 | function extraire_attribut($balise, $attribut, $complet = false) { |
| 2027 | - if (is_array($balise)) { |
|
| 2028 | - array_walk( |
|
| 2029 | - $balise, |
|
| 2030 | - function (&$a, $key, $t) { |
|
| 2031 | - $a = extraire_attribut($a, $t); |
|
| 2032 | - }, |
|
| 2033 | - $attribut |
|
| 2034 | - ); |
|
| 2035 | - |
|
| 2036 | - return $balise; |
|
| 2037 | - } |
|
| 2038 | - if ( |
|
| 2039 | - $balise |
|
| 2040 | - && preg_match( |
|
| 2041 | - ',(^.*?<(?:(?>\s*)(?>[\w:.-]+)(?>(?:=(?:"[^"]*"|\'[^\']*\'|[^\'"]\S*))?))*?)(\s+' |
|
| 2042 | - . $attribut |
|
| 2043 | - . '(?:=\s*("[^"]*"|\'[^\']*\'|[^\'"]\S*))?)()((?:[\s/][^>]*)?>.*),isS', |
|
| 2044 | - $balise, |
|
| 2045 | - $r |
|
| 2046 | - ) |
|
| 2047 | - ) { |
|
| 2048 | - if (isset($r[3][0]) and ($r[3][0] == '"' || $r[3][0] == "'")) { |
|
| 2049 | - $r[4] = substr($r[3], 1, -1); |
|
| 2050 | - $r[3] = $r[3][0]; |
|
| 2051 | - } elseif ($r[3] !== '') { |
|
| 2052 | - $r[4] = $r[3]; |
|
| 2053 | - $r[3] = ''; |
|
| 2054 | - } else { |
|
| 2055 | - $r[4] = trim($r[2]); |
|
| 2056 | - } |
|
| 2057 | - $att = $r[4]; |
|
| 2058 | - if (strpos($att, '&#') !== false) { |
|
| 2059 | - $att = str_replace([''', ''', '"', '"'], ["'", "'", '"', '"'], $att); |
|
| 2060 | - } |
|
| 2061 | - $att = filtrer_entites($att); |
|
| 2062 | - } else { |
|
| 2063 | - $att = null; |
|
| 2064 | - $r = []; |
|
| 2065 | - } |
|
| 2066 | - |
|
| 2067 | - if ($complet) { |
|
| 2068 | - return [$att, $r]; |
|
| 2069 | - } else { |
|
| 2070 | - return $att; |
|
| 2071 | - } |
|
| 2027 | + if (is_array($balise)) { |
|
| 2028 | + array_walk( |
|
| 2029 | + $balise, |
|
| 2030 | + function (&$a, $key, $t) { |
|
| 2031 | + $a = extraire_attribut($a, $t); |
|
| 2032 | + }, |
|
| 2033 | + $attribut |
|
| 2034 | + ); |
|
| 2035 | + |
|
| 2036 | + return $balise; |
|
| 2037 | + } |
|
| 2038 | + if ( |
|
| 2039 | + $balise |
|
| 2040 | + && preg_match( |
|
| 2041 | + ',(^.*?<(?:(?>\s*)(?>[\w:.-]+)(?>(?:=(?:"[^"]*"|\'[^\']*\'|[^\'"]\S*))?))*?)(\s+' |
|
| 2042 | + . $attribut |
|
| 2043 | + . '(?:=\s*("[^"]*"|\'[^\']*\'|[^\'"]\S*))?)()((?:[\s/][^>]*)?>.*),isS', |
|
| 2044 | + $balise, |
|
| 2045 | + $r |
|
| 2046 | + ) |
|
| 2047 | + ) { |
|
| 2048 | + if (isset($r[3][0]) and ($r[3][0] == '"' || $r[3][0] == "'")) { |
|
| 2049 | + $r[4] = substr($r[3], 1, -1); |
|
| 2050 | + $r[3] = $r[3][0]; |
|
| 2051 | + } elseif ($r[3] !== '') { |
|
| 2052 | + $r[4] = $r[3]; |
|
| 2053 | + $r[3] = ''; |
|
| 2054 | + } else { |
|
| 2055 | + $r[4] = trim($r[2]); |
|
| 2056 | + } |
|
| 2057 | + $att = $r[4]; |
|
| 2058 | + if (strpos($att, '&#') !== false) { |
|
| 2059 | + $att = str_replace([''', ''', '"', '"'], ["'", "'", '"', '"'], $att); |
|
| 2060 | + } |
|
| 2061 | + $att = filtrer_entites($att); |
|
| 2062 | + } else { |
|
| 2063 | + $att = null; |
|
| 2064 | + $r = []; |
|
| 2065 | + } |
|
| 2066 | + |
|
| 2067 | + if ($complet) { |
|
| 2068 | + return [$att, $r]; |
|
| 2069 | + } else { |
|
| 2070 | + return $att; |
|
| 2071 | + } |
|
| 2072 | 2072 | } |
| 2073 | 2073 | |
| 2074 | 2074 | /** |
@@ -2101,41 +2101,41 @@ discard block |
||
| 2101 | 2101 | **/ |
| 2102 | 2102 | function inserer_attribut(?string $balise, string $attribut, string $val, bool $proteger = true, bool $vider = false): string { |
| 2103 | 2103 | |
| 2104 | - if ($balise === null or $balise === '') { |
|
| 2105 | - return ''; |
|
| 2106 | - } |
|
| 2104 | + if ($balise === null or $balise === '') { |
|
| 2105 | + return ''; |
|
| 2106 | + } |
|
| 2107 | 2107 | |
| 2108 | - // preparer l'attribut |
|
| 2109 | - // supprimer les etc mais pas les balises html |
|
| 2110 | - // qui ont un sens dans un attribut value d'un input |
|
| 2111 | - if ($proteger) { |
|
| 2112 | - $val = attribut_html($val, false); |
|
| 2113 | - } |
|
| 2108 | + // preparer l'attribut |
|
| 2109 | + // supprimer les etc mais pas les balises html |
|
| 2110 | + // qui ont un sens dans un attribut value d'un input |
|
| 2111 | + if ($proteger) { |
|
| 2112 | + $val = attribut_html($val, false); |
|
| 2113 | + } |
|
| 2114 | 2114 | |
| 2115 | - // echapper les ' pour eviter tout bug |
|
| 2116 | - $val = str_replace("'", ''', $val); |
|
| 2117 | - if ($vider and strlen($val) === 0) { |
|
| 2118 | - $insert = ''; |
|
| 2119 | - } else { |
|
| 2120 | - $insert = " $attribut='$val'"; |
|
| 2121 | - } |
|
| 2115 | + // echapper les ' pour eviter tout bug |
|
| 2116 | + $val = str_replace("'", ''', $val); |
|
| 2117 | + if ($vider and strlen($val) === 0) { |
|
| 2118 | + $insert = ''; |
|
| 2119 | + } else { |
|
| 2120 | + $insert = " $attribut='$val'"; |
|
| 2121 | + } |
|
| 2122 | 2122 | |
| 2123 | - [$old, $r] = extraire_attribut($balise, $attribut, true); |
|
| 2123 | + [$old, $r] = extraire_attribut($balise, $attribut, true); |
|
| 2124 | 2124 | |
| 2125 | - if ($old !== null) { |
|
| 2126 | - // Remplacer l'ancien attribut du meme nom |
|
| 2127 | - $balise = $r[1] . $insert . $r[5]; |
|
| 2128 | - } else { |
|
| 2129 | - // preferer une balise " />" (comme <img />) |
|
| 2130 | - if (preg_match(',/>,', $balise)) { |
|
| 2131 | - $balise = preg_replace(',\s?/>,S', $insert . ' />', $balise, 1); |
|
| 2132 | - } // sinon une balise <a ...> ... </a> |
|
| 2133 | - else { |
|
| 2134 | - $balise = preg_replace(',\s?>,S', $insert . '>', $balise, 1); |
|
| 2135 | - } |
|
| 2136 | - } |
|
| 2125 | + if ($old !== null) { |
|
| 2126 | + // Remplacer l'ancien attribut du meme nom |
|
| 2127 | + $balise = $r[1] . $insert . $r[5]; |
|
| 2128 | + } else { |
|
| 2129 | + // preferer une balise " />" (comme <img />) |
|
| 2130 | + if (preg_match(',/>,', $balise)) { |
|
| 2131 | + $balise = preg_replace(',\s?/>,S', $insert . ' />', $balise, 1); |
|
| 2132 | + } // sinon une balise <a ...> ... </a> |
|
| 2133 | + else { |
|
| 2134 | + $balise = preg_replace(',\s?>,S', $insert . '>', $balise, 1); |
|
| 2135 | + } |
|
| 2136 | + } |
|
| 2137 | 2137 | |
| 2138 | - return $balise; |
|
| 2138 | + return $balise; |
|
| 2139 | 2139 | } |
| 2140 | 2140 | |
| 2141 | 2141 | /** |
@@ -2153,7 +2153,7 @@ discard block |
||
| 2153 | 2153 | * @return string Code HTML sans l'attribut |
| 2154 | 2154 | **/ |
| 2155 | 2155 | function vider_attribut(?string $balise, string $attribut): string { |
| 2156 | - return inserer_attribut($balise, $attribut, '', false, true); |
|
| 2156 | + return inserer_attribut($balise, $attribut, '', false, true); |
|
| 2157 | 2157 | } |
| 2158 | 2158 | |
| 2159 | 2159 | /** |
@@ -2165,53 +2165,53 @@ discard block |
||
| 2165 | 2165 | * @return string |
| 2166 | 2166 | */ |
| 2167 | 2167 | function modifier_class($balise, $class, $operation = 'ajouter') { |
| 2168 | - if (is_string($class)) { |
|
| 2169 | - $class = explode(' ', trim($class)); |
|
| 2170 | - } |
|
| 2171 | - $class = array_filter($class); |
|
| 2172 | - $class = array_unique($class); |
|
| 2173 | - if (!$class) { |
|
| 2174 | - return $balise; |
|
| 2175 | - } |
|
| 2176 | - |
|
| 2177 | - // si la ou les classes ont des caracteres invalides on ne fait rien |
|
| 2178 | - if (preg_match(',[^\w-],', implode('', $class))) { |
|
| 2179 | - return $balise; |
|
| 2180 | - } |
|
| 2181 | - |
|
| 2182 | - $class_courante = extraire_attribut($balise, 'class'); |
|
| 2183 | - $class_new = $class_courante; |
|
| 2184 | - foreach ($class as $c) { |
|
| 2185 | - $is_class_presente = false; |
|
| 2186 | - if ( |
|
| 2187 | - $class_courante |
|
| 2188 | - and strpos($class_courante, (string) $c) !== false |
|
| 2189 | - and preg_match('/(^|\s)' . preg_quote($c) . '($|\s)/', $class_courante) |
|
| 2190 | - ) { |
|
| 2191 | - $is_class_presente = true; |
|
| 2192 | - } |
|
| 2193 | - if ( |
|
| 2194 | - in_array($operation, ['ajouter', 'commuter']) |
|
| 2195 | - and !$is_class_presente |
|
| 2196 | - ) { |
|
| 2197 | - $class_new = ltrim(rtrim($class_new ?? '') . ' ' . $c); |
|
| 2198 | - } elseif ( |
|
| 2199 | - in_array($operation, ['supprimer', 'commuter']) |
|
| 2200 | - and $is_class_presente |
|
| 2201 | - ) { |
|
| 2202 | - $class_new = trim(preg_replace('/(^|\s)' . preg_quote($c) . '($|\s)/', "\\1", $class_new)); |
|
| 2203 | - } |
|
| 2204 | - } |
|
| 2205 | - |
|
| 2206 | - if ($class_new !== $class_courante) { |
|
| 2207 | - if (strlen($class_new)) { |
|
| 2208 | - $balise = inserer_attribut($balise, 'class', $class_new); |
|
| 2209 | - } elseif ($class_courante) { |
|
| 2210 | - $balise = vider_attribut($balise, 'class'); |
|
| 2211 | - } |
|
| 2212 | - } |
|
| 2213 | - |
|
| 2214 | - return $balise; |
|
| 2168 | + if (is_string($class)) { |
|
| 2169 | + $class = explode(' ', trim($class)); |
|
| 2170 | + } |
|
| 2171 | + $class = array_filter($class); |
|
| 2172 | + $class = array_unique($class); |
|
| 2173 | + if (!$class) { |
|
| 2174 | + return $balise; |
|
| 2175 | + } |
|
| 2176 | + |
|
| 2177 | + // si la ou les classes ont des caracteres invalides on ne fait rien |
|
| 2178 | + if (preg_match(',[^\w-],', implode('', $class))) { |
|
| 2179 | + return $balise; |
|
| 2180 | + } |
|
| 2181 | + |
|
| 2182 | + $class_courante = extraire_attribut($balise, 'class'); |
|
| 2183 | + $class_new = $class_courante; |
|
| 2184 | + foreach ($class as $c) { |
|
| 2185 | + $is_class_presente = false; |
|
| 2186 | + if ( |
|
| 2187 | + $class_courante |
|
| 2188 | + and strpos($class_courante, (string) $c) !== false |
|
| 2189 | + and preg_match('/(^|\s)' . preg_quote($c) . '($|\s)/', $class_courante) |
|
| 2190 | + ) { |
|
| 2191 | + $is_class_presente = true; |
|
| 2192 | + } |
|
| 2193 | + if ( |
|
| 2194 | + in_array($operation, ['ajouter', 'commuter']) |
|
| 2195 | + and !$is_class_presente |
|
| 2196 | + ) { |
|
| 2197 | + $class_new = ltrim(rtrim($class_new ?? '') . ' ' . $c); |
|
| 2198 | + } elseif ( |
|
| 2199 | + in_array($operation, ['supprimer', 'commuter']) |
|
| 2200 | + and $is_class_presente |
|
| 2201 | + ) { |
|
| 2202 | + $class_new = trim(preg_replace('/(^|\s)' . preg_quote($c) . '($|\s)/', "\\1", $class_new)); |
|
| 2203 | + } |
|
| 2204 | + } |
|
| 2205 | + |
|
| 2206 | + if ($class_new !== $class_courante) { |
|
| 2207 | + if (strlen($class_new)) { |
|
| 2208 | + $balise = inserer_attribut($balise, 'class', $class_new); |
|
| 2209 | + } elseif ($class_courante) { |
|
| 2210 | + $balise = vider_attribut($balise, 'class'); |
|
| 2211 | + } |
|
| 2212 | + } |
|
| 2213 | + |
|
| 2214 | + return $balise; |
|
| 2215 | 2215 | } |
| 2216 | 2216 | |
| 2217 | 2217 | /** |
@@ -2221,7 +2221,7 @@ discard block |
||
| 2221 | 2221 | * @return string |
| 2222 | 2222 | */ |
| 2223 | 2223 | function ajouter_class($balise, $class) { |
| 2224 | - return modifier_class($balise, $class, 'ajouter'); |
|
| 2224 | + return modifier_class($balise, $class, 'ajouter'); |
|
| 2225 | 2225 | } |
| 2226 | 2226 | |
| 2227 | 2227 | /** |
@@ -2231,7 +2231,7 @@ discard block |
||
| 2231 | 2231 | * @return string |
| 2232 | 2232 | */ |
| 2233 | 2233 | function supprimer_class($balise, $class) { |
| 2234 | - return modifier_class($balise, $class, 'supprimer'); |
|
| 2234 | + return modifier_class($balise, $class, 'supprimer'); |
|
| 2235 | 2235 | } |
| 2236 | 2236 | |
| 2237 | 2237 | /** |
@@ -2242,7 +2242,7 @@ discard block |
||
| 2242 | 2242 | * @return string |
| 2243 | 2243 | */ |
| 2244 | 2244 | function commuter_class($balise, $class) { |
| 2245 | - return modifier_class($balise, $class, 'commuter'); |
|
| 2245 | + return modifier_class($balise, $class, 'commuter'); |
|
| 2246 | 2246 | } |
| 2247 | 2247 | |
| 2248 | 2248 | /** |
@@ -2253,19 +2253,19 @@ discard block |
||
| 2253 | 2253 | * @return string |
| 2254 | 2254 | */ |
| 2255 | 2255 | function tester_config($id, $mode = '') { |
| 2256 | - include_spip('action/inscrire_auteur'); |
|
| 2256 | + include_spip('action/inscrire_auteur'); |
|
| 2257 | 2257 | |
| 2258 | - return tester_statut_inscription($mode, $id); |
|
| 2258 | + return tester_statut_inscription($mode, $id); |
|
| 2259 | 2259 | } |
| 2260 | 2260 | |
| 2261 | 2261 | // |
| 2262 | 2262 | // Quelques fonctions de calcul arithmetique |
| 2263 | 2263 | // |
| 2264 | 2264 | function floatstr($a) { |
| 2265 | - return str_replace(',', '.', (string)floatval($a)); |
|
| 2265 | + return str_replace(',', '.', (string)floatval($a)); |
|
| 2266 | 2266 | } |
| 2267 | 2267 | function strize($f, $a, $b) { |
| 2268 | - return floatstr($f(floatstr($a), floatstr($b))); |
|
| 2268 | + return floatstr($f(floatstr($a), floatstr($b))); |
|
| 2269 | 2269 | } |
| 2270 | 2270 | |
| 2271 | 2271 | /** |
@@ -2284,7 +2284,7 @@ discard block |
||
| 2284 | 2284 | * @return int $a+$b |
| 2285 | 2285 | **/ |
| 2286 | 2286 | function plus($a, $b) { |
| 2287 | - return $a + $b; |
|
| 2287 | + return $a + $b; |
|
| 2288 | 2288 | } |
| 2289 | 2289 | function strplus($a, $b) { |
| 2290 | 2290 | return strize('plus', $a, $b); |
@@ -2305,7 +2305,7 @@ discard block |
||
| 2305 | 2305 | * @return int $a-$b |
| 2306 | 2306 | **/ |
| 2307 | 2307 | function moins($a, $b) { |
| 2308 | - return $a - $b; |
|
| 2308 | + return $a - $b; |
|
| 2309 | 2309 | } |
| 2310 | 2310 | function strmoins($a, $b) { |
| 2311 | 2311 | return strize('moins', $a, $b); |
@@ -2328,7 +2328,7 @@ discard block |
||
| 2328 | 2328 | * @return int $a*$b |
| 2329 | 2329 | **/ |
| 2330 | 2330 | function mult($a, $b) { |
| 2331 | - return $a * $b; |
|
| 2331 | + return $a * $b; |
|
| 2332 | 2332 | } |
| 2333 | 2333 | function strmult($a, $b) { |
| 2334 | 2334 | return strize('mult', $a, $b); |
@@ -2351,7 +2351,7 @@ discard block |
||
| 2351 | 2351 | * @return int $a/$b (ou 0 si $b est nul) |
| 2352 | 2352 | **/ |
| 2353 | 2353 | function div($a, $b) { |
| 2354 | - return $b ? $a / $b : 0; |
|
| 2354 | + return $b ? $a / $b : 0; |
|
| 2355 | 2355 | } |
| 2356 | 2356 | function strdiv($a, $b) { |
| 2357 | 2357 | return strize('div', $a, $b); |
@@ -2375,7 +2375,7 @@ discard block |
||
| 2375 | 2375 | * @return int ($nb % $mod) + $add |
| 2376 | 2376 | **/ |
| 2377 | 2377 | function modulo($nb, $mod, $add = 0) { |
| 2378 | - return ($mod ? $nb % $mod : 0) + $add; |
|
| 2378 | + return ($mod ? $nb % $mod : 0) + $add; |
|
| 2379 | 2379 | } |
| 2380 | 2380 | |
| 2381 | 2381 | |
@@ -2390,26 +2390,26 @@ discard block |
||
| 2390 | 2390 | * - true sinon |
| 2391 | 2391 | **/ |
| 2392 | 2392 | function nom_acceptable($nom) { |
| 2393 | - $remp2 = []; |
|
| 2394 | - $remp1 = []; |
|
| 2395 | - if (!is_string($nom)) { |
|
| 2396 | - return false; |
|
| 2397 | - } |
|
| 2398 | - if (!defined('_TAGS_NOM_AUTEUR')) { |
|
| 2399 | - define('_TAGS_NOM_AUTEUR', ''); |
|
| 2400 | - } |
|
| 2401 | - $tags_acceptes = array_unique(explode(',', 'multi,' . _TAGS_NOM_AUTEUR)); |
|
| 2402 | - foreach ($tags_acceptes as $tag) { |
|
| 2403 | - if (strlen($tag)) { |
|
| 2404 | - $remp1[] = '<' . trim($tag) . '>'; |
|
| 2405 | - $remp1[] = '</' . trim($tag) . '>'; |
|
| 2406 | - $remp2[] = '\x60' . trim($tag) . '\x61'; |
|
| 2407 | - $remp2[] = '\x60/' . trim($tag) . '\x61'; |
|
| 2408 | - } |
|
| 2409 | - } |
|
| 2410 | - $v_nom = str_replace($remp2, $remp1, supprimer_tags(str_replace($remp1, $remp2, $nom))); |
|
| 2411 | - |
|
| 2412 | - return str_replace('<', '<', $v_nom) == $nom; |
|
| 2393 | + $remp2 = []; |
|
| 2394 | + $remp1 = []; |
|
| 2395 | + if (!is_string($nom)) { |
|
| 2396 | + return false; |
|
| 2397 | + } |
|
| 2398 | + if (!defined('_TAGS_NOM_AUTEUR')) { |
|
| 2399 | + define('_TAGS_NOM_AUTEUR', ''); |
|
| 2400 | + } |
|
| 2401 | + $tags_acceptes = array_unique(explode(',', 'multi,' . _TAGS_NOM_AUTEUR)); |
|
| 2402 | + foreach ($tags_acceptes as $tag) { |
|
| 2403 | + if (strlen($tag)) { |
|
| 2404 | + $remp1[] = '<' . trim($tag) . '>'; |
|
| 2405 | + $remp1[] = '</' . trim($tag) . '>'; |
|
| 2406 | + $remp2[] = '\x60' . trim($tag) . '\x61'; |
|
| 2407 | + $remp2[] = '\x60/' . trim($tag) . '\x61'; |
|
| 2408 | + } |
|
| 2409 | + } |
|
| 2410 | + $v_nom = str_replace($remp2, $remp1, supprimer_tags(str_replace($remp1, $remp2, $nom))); |
|
| 2411 | + |
|
| 2412 | + return str_replace('<', '<', $v_nom) == $nom; |
|
| 2413 | 2413 | } |
| 2414 | 2414 | |
| 2415 | 2415 | |
@@ -2425,14 +2425,14 @@ discard block |
||
| 2425 | 2425 | * - renvoie un tableau si l'entree est un tableau |
| 2426 | 2426 | **/ |
| 2427 | 2427 | function email_valide($adresses) { |
| 2428 | - if (is_array($adresses)) { |
|
| 2429 | - $adresses = array_map('email_valide', $adresses); |
|
| 2430 | - $adresses = array_filter($adresses); |
|
| 2431 | - return $adresses; |
|
| 2432 | - } |
|
| 2428 | + if (is_array($adresses)) { |
|
| 2429 | + $adresses = array_map('email_valide', $adresses); |
|
| 2430 | + $adresses = array_filter($adresses); |
|
| 2431 | + return $adresses; |
|
| 2432 | + } |
|
| 2433 | 2433 | |
| 2434 | - $email_valide = charger_fonction('email_valide', 'inc'); |
|
| 2435 | - return $email_valide($adresses); |
|
| 2434 | + $email_valide = charger_fonction('email_valide', 'inc'); |
|
| 2435 | + return $email_valide($adresses); |
|
| 2436 | 2436 | } |
| 2437 | 2437 | |
| 2438 | 2438 | /** |
@@ -2446,29 +2446,29 @@ discard block |
||
| 2446 | 2446 | * @return string Texte |
| 2447 | 2447 | **/ |
| 2448 | 2448 | function afficher_enclosures($tags) { |
| 2449 | - $s = []; |
|
| 2450 | - foreach (extraire_balises($tags, 'a') as $tag) { |
|
| 2451 | - if ( |
|
| 2452 | - extraire_attribut($tag, 'rel') == 'enclosure' |
|
| 2453 | - and $t = extraire_attribut($tag, 'href') |
|
| 2454 | - ) { |
|
| 2455 | - $s[] = preg_replace( |
|
| 2456 | - ',>[^<]+</a>,S', |
|
| 2457 | - '>' |
|
| 2458 | - . http_img_pack( |
|
| 2459 | - 'attachment-16.png', |
|
| 2460 | - $t, |
|
| 2461 | - '', |
|
| 2462 | - $t, |
|
| 2463 | - ['utiliser_suffixe_size' => true] |
|
| 2464 | - ) |
|
| 2465 | - . '</a>', |
|
| 2466 | - $tag |
|
| 2467 | - ); |
|
| 2468 | - } |
|
| 2469 | - } |
|
| 2470 | - |
|
| 2471 | - return join(' ', $s); |
|
| 2449 | + $s = []; |
|
| 2450 | + foreach (extraire_balises($tags, 'a') as $tag) { |
|
| 2451 | + if ( |
|
| 2452 | + extraire_attribut($tag, 'rel') == 'enclosure' |
|
| 2453 | + and $t = extraire_attribut($tag, 'href') |
|
| 2454 | + ) { |
|
| 2455 | + $s[] = preg_replace( |
|
| 2456 | + ',>[^<]+</a>,S', |
|
| 2457 | + '>' |
|
| 2458 | + . http_img_pack( |
|
| 2459 | + 'attachment-16.png', |
|
| 2460 | + $t, |
|
| 2461 | + '', |
|
| 2462 | + $t, |
|
| 2463 | + ['utiliser_suffixe_size' => true] |
|
| 2464 | + ) |
|
| 2465 | + . '</a>', |
|
| 2466 | + $tag |
|
| 2467 | + ); |
|
| 2468 | + } |
|
| 2469 | + } |
|
| 2470 | + |
|
| 2471 | + return join(' ', $s); |
|
| 2472 | 2472 | } |
| 2473 | 2473 | |
| 2474 | 2474 | /** |
@@ -2483,15 +2483,15 @@ discard block |
||
| 2483 | 2483 | * @return string Liens trouvés |
| 2484 | 2484 | **/ |
| 2485 | 2485 | function afficher_tags($tags, $rels = 'tag,directory') { |
| 2486 | - $s = []; |
|
| 2487 | - foreach (extraire_balises($tags, 'a') as $tag) { |
|
| 2488 | - $rel = extraire_attribut($tag, 'rel'); |
|
| 2489 | - if (strstr(",$rels,", (string) ",$rel,")) { |
|
| 2490 | - $s[] = $tag; |
|
| 2491 | - } |
|
| 2492 | - } |
|
| 2486 | + $s = []; |
|
| 2487 | + foreach (extraire_balises($tags, 'a') as $tag) { |
|
| 2488 | + $rel = extraire_attribut($tag, 'rel'); |
|
| 2489 | + if (strstr(",$rels,", (string) ",$rel,")) { |
|
| 2490 | + $s[] = $tag; |
|
| 2491 | + } |
|
| 2492 | + } |
|
| 2493 | 2493 | |
| 2494 | - return join(', ', $s); |
|
| 2494 | + return join(', ', $s); |
|
| 2495 | 2495 | } |
| 2496 | 2496 | |
| 2497 | 2497 | |
@@ -2513,21 +2513,21 @@ discard block |
||
| 2513 | 2513 | * @return string Tag HTML `<a>` avec microformat. |
| 2514 | 2514 | **/ |
| 2515 | 2515 | function enclosure2microformat($e) { |
| 2516 | - if (!$url = filtrer_entites(extraire_attribut($e, 'url') ?? '')) { |
|
| 2517 | - $url = filtrer_entites(extraire_attribut($e, 'href') ?? ''); |
|
| 2518 | - } |
|
| 2519 | - $type = extraire_attribut($e, 'type'); |
|
| 2520 | - if (!$length = extraire_attribut($e, 'length')) { |
|
| 2521 | - # <media:content : longeur dans fileSize. On tente. |
|
| 2522 | - $length = extraire_attribut($e, 'fileSize'); |
|
| 2523 | - } |
|
| 2524 | - $fichier = basename($url); |
|
| 2516 | + if (!$url = filtrer_entites(extraire_attribut($e, 'url') ?? '')) { |
|
| 2517 | + $url = filtrer_entites(extraire_attribut($e, 'href') ?? ''); |
|
| 2518 | + } |
|
| 2519 | + $type = extraire_attribut($e, 'type'); |
|
| 2520 | + if (!$length = extraire_attribut($e, 'length')) { |
|
| 2521 | + # <media:content : longeur dans fileSize. On tente. |
|
| 2522 | + $length = extraire_attribut($e, 'fileSize'); |
|
| 2523 | + } |
|
| 2524 | + $fichier = basename($url); |
|
| 2525 | 2525 | |
| 2526 | - return '<a rel="enclosure"' |
|
| 2527 | - . ($url ? ' href="' . spip_htmlspecialchars($url) . '"' : '') |
|
| 2528 | - . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '') |
|
| 2529 | - . ($length ? ' title="' . spip_htmlspecialchars($length) . '"' : '') |
|
| 2530 | - . '>' . $fichier . '</a>'; |
|
| 2526 | + return '<a rel="enclosure"' |
|
| 2527 | + . ($url ? ' href="' . spip_htmlspecialchars($url) . '"' : '') |
|
| 2528 | + . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '') |
|
| 2529 | + . ($length ? ' title="' . spip_htmlspecialchars($length) . '"' : '') |
|
| 2530 | + . '>' . $fichier . '</a>'; |
|
| 2531 | 2531 | } |
| 2532 | 2532 | |
| 2533 | 2533 | /** |
@@ -2545,24 +2545,24 @@ discard block |
||
| 2545 | 2545 | * @return string Tags RSS `<enclosure>`. |
| 2546 | 2546 | **/ |
| 2547 | 2547 | function microformat2enclosure($tags) { |
| 2548 | - $enclosures = []; |
|
| 2549 | - foreach (extraire_balises($tags, 'a') as $e) { |
|
| 2550 | - if (extraire_attribut($e, 'rel') == 'enclosure') { |
|
| 2551 | - $url = filtrer_entites(extraire_attribut($e, 'href')); |
|
| 2552 | - $type = extraire_attribut($e, 'type'); |
|
| 2553 | - if (!$length = intval(extraire_attribut($e, 'title'))) { |
|
| 2554 | - $length = intval(extraire_attribut($e, 'length')); |
|
| 2555 | - } # vieux data |
|
| 2556 | - $fichier = basename($url); |
|
| 2557 | - $enclosures[] = '<enclosure' |
|
| 2558 | - . ($url ? ' url="' . spip_htmlspecialchars($url) . '"' : '') |
|
| 2559 | - . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '') |
|
| 2560 | - . ($length ? ' length="' . $length . '"' : '') |
|
| 2561 | - . ' />'; |
|
| 2562 | - } |
|
| 2563 | - } |
|
| 2548 | + $enclosures = []; |
|
| 2549 | + foreach (extraire_balises($tags, 'a') as $e) { |
|
| 2550 | + if (extraire_attribut($e, 'rel') == 'enclosure') { |
|
| 2551 | + $url = filtrer_entites(extraire_attribut($e, 'href')); |
|
| 2552 | + $type = extraire_attribut($e, 'type'); |
|
| 2553 | + if (!$length = intval(extraire_attribut($e, 'title'))) { |
|
| 2554 | + $length = intval(extraire_attribut($e, 'length')); |
|
| 2555 | + } # vieux data |
|
| 2556 | + $fichier = basename($url); |
|
| 2557 | + $enclosures[] = '<enclosure' |
|
| 2558 | + . ($url ? ' url="' . spip_htmlspecialchars($url) . '"' : '') |
|
| 2559 | + . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '') |
|
| 2560 | + . ($length ? ' length="' . $length . '"' : '') |
|
| 2561 | + . ' />'; |
|
| 2562 | + } |
|
| 2563 | + } |
|
| 2564 | 2564 | |
| 2565 | - return join("\n", $enclosures); |
|
| 2565 | + return join("\n", $enclosures); |
|
| 2566 | 2566 | } |
| 2567 | 2567 | |
| 2568 | 2568 | |
@@ -2578,16 +2578,16 @@ discard block |
||
| 2578 | 2578 | * @return string Tags RSS Atom `<dc:subject>`. |
| 2579 | 2579 | **/ |
| 2580 | 2580 | function tags2dcsubject($tags) { |
| 2581 | - $subjects = ''; |
|
| 2582 | - foreach (extraire_balises($tags, 'a') as $e) { |
|
| 2583 | - if (extraire_attribut($e, 'rel') == 'tag') { |
|
| 2584 | - $subjects .= '<dc:subject>' |
|
| 2585 | - . texte_backend(textebrut($e)) |
|
| 2586 | - . '</dc:subject>' . "\n"; |
|
| 2587 | - } |
|
| 2588 | - } |
|
| 2581 | + $subjects = ''; |
|
| 2582 | + foreach (extraire_balises($tags, 'a') as $e) { |
|
| 2583 | + if (extraire_attribut($e, 'rel') == 'tag') { |
|
| 2584 | + $subjects .= '<dc:subject>' |
|
| 2585 | + . texte_backend(textebrut($e)) |
|
| 2586 | + . '</dc:subject>' . "\n"; |
|
| 2587 | + } |
|
| 2588 | + } |
|
| 2589 | 2589 | |
| 2590 | - return $subjects; |
|
| 2590 | + return $subjects; |
|
| 2591 | 2591 | } |
| 2592 | 2592 | |
| 2593 | 2593 | /** |
@@ -2616,27 +2616,27 @@ discard block |
||
| 2616 | 2616 | * - Tableau de résultats, si tableau en entrée. |
| 2617 | 2617 | **/ |
| 2618 | 2618 | function extraire_balise($texte, $tag = 'a') { |
| 2619 | - if (is_array($texte)) { |
|
| 2620 | - array_walk( |
|
| 2621 | - $texte, |
|
| 2622 | - function (&$a, $key, $t) { |
|
| 2623 | - $a = extraire_balise($a, $t); |
|
| 2624 | - }, |
|
| 2625 | - $tag |
|
| 2626 | - ); |
|
| 2627 | - |
|
| 2628 | - return $texte; |
|
| 2629 | - } |
|
| 2630 | - |
|
| 2631 | - if ( |
|
| 2632 | - preg_match( |
|
| 2633 | - ",<$tag\b[^>]*(/>|>.*</$tag\b[^>]*>|>),UimsS", |
|
| 2634 | - $texte, |
|
| 2635 | - $regs |
|
| 2636 | - ) |
|
| 2637 | - ) { |
|
| 2638 | - return $regs[0]; |
|
| 2639 | - } |
|
| 2619 | + if (is_array($texte)) { |
|
| 2620 | + array_walk( |
|
| 2621 | + $texte, |
|
| 2622 | + function (&$a, $key, $t) { |
|
| 2623 | + $a = extraire_balise($a, $t); |
|
| 2624 | + }, |
|
| 2625 | + $tag |
|
| 2626 | + ); |
|
| 2627 | + |
|
| 2628 | + return $texte; |
|
| 2629 | + } |
|
| 2630 | + |
|
| 2631 | + if ( |
|
| 2632 | + preg_match( |
|
| 2633 | + ",<$tag\b[^>]*(/>|>.*</$tag\b[^>]*>|>),UimsS", |
|
| 2634 | + $texte, |
|
| 2635 | + $regs |
|
| 2636 | + ) |
|
| 2637 | + ) { |
|
| 2638 | + return $regs[0]; |
|
| 2639 | + } |
|
| 2640 | 2640 | } |
| 2641 | 2641 | |
| 2642 | 2642 | /** |
@@ -2664,30 +2664,30 @@ discard block |
||
| 2664 | 2664 | * - Tableau de résultats, si tableau en entrée. |
| 2665 | 2665 | **/ |
| 2666 | 2666 | function extraire_balises($texte, $tag = 'a') { |
| 2667 | - if (is_array($texte)) { |
|
| 2668 | - array_walk( |
|
| 2669 | - $texte, |
|
| 2670 | - function (&$a, $key, $t) { |
|
| 2671 | - $a = extraire_balises($a, $t); |
|
| 2672 | - }, |
|
| 2673 | - $tag |
|
| 2674 | - ); |
|
| 2675 | - |
|
| 2676 | - return $texte; |
|
| 2677 | - } |
|
| 2678 | - |
|
| 2679 | - if ( |
|
| 2680 | - preg_match_all( |
|
| 2681 | - ",<{$tag}\b[^>]*(/>|>.*</{$tag}\b[^>]*>|>),UimsS", |
|
| 2682 | - $texte, |
|
| 2683 | - $regs, |
|
| 2684 | - PREG_PATTERN_ORDER |
|
| 2685 | - ) |
|
| 2686 | - ) { |
|
| 2687 | - return $regs[0]; |
|
| 2688 | - } else { |
|
| 2689 | - return []; |
|
| 2690 | - } |
|
| 2667 | + if (is_array($texte)) { |
|
| 2668 | + array_walk( |
|
| 2669 | + $texte, |
|
| 2670 | + function (&$a, $key, $t) { |
|
| 2671 | + $a = extraire_balises($a, $t); |
|
| 2672 | + }, |
|
| 2673 | + $tag |
|
| 2674 | + ); |
|
| 2675 | + |
|
| 2676 | + return $texte; |
|
| 2677 | + } |
|
| 2678 | + |
|
| 2679 | + if ( |
|
| 2680 | + preg_match_all( |
|
| 2681 | + ",<{$tag}\b[^>]*(/>|>.*</{$tag}\b[^>]*>|>),UimsS", |
|
| 2682 | + $texte, |
|
| 2683 | + $regs, |
|
| 2684 | + PREG_PATTERN_ORDER |
|
| 2685 | + ) |
|
| 2686 | + ) { |
|
| 2687 | + return $regs[0]; |
|
| 2688 | + } else { |
|
| 2689 | + return []; |
|
| 2690 | + } |
|
| 2691 | 2691 | } |
| 2692 | 2692 | |
| 2693 | 2693 | /** |
@@ -2716,11 +2716,11 @@ discard block |
||
| 2716 | 2716 | * - `$def` si on n'a pas transmis de tableau |
| 2717 | 2717 | **/ |
| 2718 | 2718 | function in_any($val, $vals, $def = '') { |
| 2719 | - if (!is_array($vals) and $vals and $v = unserialize($vals)) { |
|
| 2720 | - $vals = $v; |
|
| 2721 | - } |
|
| 2719 | + if (!is_array($vals) and $vals and $v = unserialize($vals)) { |
|
| 2720 | + $vals = $v; |
|
| 2721 | + } |
|
| 2722 | 2722 | |
| 2723 | - return (!is_array($vals) ? $def : (in_array($val, $vals) ? ' ' : '')); |
|
| 2723 | + return (!is_array($vals) ? $def : (in_array($val, $vals) ? ' ' : '')); |
|
| 2724 | 2724 | } |
| 2725 | 2725 | |
| 2726 | 2726 | |
@@ -2741,12 +2741,12 @@ discard block |
||
| 2741 | 2741 | * Résultat du calcul |
| 2742 | 2742 | **/ |
| 2743 | 2743 | function valeur_numerique($expr) { |
| 2744 | - $a = 0; |
|
| 2745 | - if (preg_match(',^[0-9]+(\s*[+*-]\s*[0-9]+)*$,S', trim($expr))) { |
|
| 2746 | - eval("\$a = $expr;"); |
|
| 2747 | - } |
|
| 2744 | + $a = 0; |
|
| 2745 | + if (preg_match(',^[0-9]+(\s*[+*-]\s*[0-9]+)*$,S', trim($expr))) { |
|
| 2746 | + eval("\$a = $expr;"); |
|
| 2747 | + } |
|
| 2748 | 2748 | |
| 2749 | - return intval($a); |
|
| 2749 | + return intval($a); |
|
| 2750 | 2750 | } |
| 2751 | 2751 | |
| 2752 | 2752 | /** |
@@ -2765,7 +2765,7 @@ discard block |
||
| 2765 | 2765 | * Retourne `$a*$b/$c` |
| 2766 | 2766 | **/ |
| 2767 | 2767 | function regledetrois($a, $b, $c) { |
| 2768 | - return round($a * $b / $c); |
|
| 2768 | + return round($a * $b / $c); |
|
| 2769 | 2769 | } |
| 2770 | 2770 | |
| 2771 | 2771 | |
@@ -2788,79 +2788,79 @@ discard block |
||
| 2788 | 2788 | * @return string Suite de champs input hidden |
| 2789 | 2789 | **/ |
| 2790 | 2790 | function form_hidden(?string $action = ''): string { |
| 2791 | - $action ??= ''; |
|
| 2792 | - |
|
| 2793 | - $contexte = []; |
|
| 2794 | - include_spip('inc/urls'); |
|
| 2795 | - if ( |
|
| 2796 | - $p = urls_decoder_url($action, '') |
|
| 2797 | - and reset($p) |
|
| 2798 | - ) { |
|
| 2799 | - $fond = array_shift($p); |
|
| 2800 | - if ($fond != '404') { |
|
| 2801 | - $contexte = array_shift($p); |
|
| 2802 | - $contexte['page'] = $fond; |
|
| 2803 | - $action = preg_replace('/([?]' . preg_quote($fond) . '[^&=]*[0-9]+)(&|$)/', '?&', $action); |
|
| 2804 | - } |
|
| 2805 | - } |
|
| 2806 | - // defaire ce qu'a injecte urls_decoder_url : a revoir en modifiant la signature de urls_decoder_url |
|
| 2807 | - if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) { |
|
| 2808 | - unset($contexte['type']); |
|
| 2809 | - } |
|
| 2810 | - if (!defined('_DEFINIR_CONTEXTE_TYPE_PAGE') or _DEFINIR_CONTEXTE_TYPE_PAGE) { |
|
| 2811 | - unset($contexte['type-page']); |
|
| 2812 | - } |
|
| 2813 | - |
|
| 2814 | - // on va remplir un tableau de valeurs en prenant bien soin de ne pas |
|
| 2815 | - // ecraser les elements de la forme mots[]=1&mots[]=2 |
|
| 2816 | - $values = []; |
|
| 2817 | - |
|
| 2818 | - // d'abord avec celles de l'url |
|
| 2819 | - if (false !== ($p = strpos($action, '?'))) { |
|
| 2820 | - foreach (preg_split('/&(amp;)?/S', substr($action, $p + 1)) as $c) { |
|
| 2821 | - $c = explode('=', $c, 2); |
|
| 2822 | - $var = array_shift($c); |
|
| 2823 | - $val = array_shift($c) ?? ''; |
|
| 2824 | - if ($var) { |
|
| 2825 | - $val = rawurldecode($val); |
|
| 2826 | - $var = rawurldecode($var); // decoder les [] eventuels |
|
| 2827 | - if (preg_match(',\[\]$,S', $var)) { |
|
| 2828 | - $values[] = [$var, $val]; |
|
| 2829 | - } else { |
|
| 2830 | - if (!isset($values[$var])) { |
|
| 2831 | - $values[$var] = [$var, $val]; |
|
| 2832 | - } |
|
| 2833 | - } |
|
| 2834 | - } |
|
| 2835 | - } |
|
| 2836 | - } |
|
| 2837 | - |
|
| 2838 | - // ensuite avec celles du contexte, sans doublonner ! |
|
| 2839 | - foreach ($contexte as $var => $val) { |
|
| 2840 | - if (preg_match(',\[\]$,S', $var)) { |
|
| 2841 | - $values[] = [$var, $val]; |
|
| 2842 | - } else { |
|
| 2843 | - if (!isset($values[$var])) { |
|
| 2844 | - $values[$var] = [$var, $val]; |
|
| 2845 | - } |
|
| 2846 | - } |
|
| 2847 | - } |
|
| 2848 | - |
|
| 2849 | - // puis on rassemble le tout |
|
| 2850 | - $hidden = []; |
|
| 2851 | - foreach ($values as $value) { |
|
| 2852 | - [$var, $val] = $value; |
|
| 2853 | - $hidden[] = '<input name="' |
|
| 2854 | - . entites_html($var) |
|
| 2855 | - . '"' |
|
| 2856 | - . (is_null($val) |
|
| 2857 | - ? '' |
|
| 2858 | - : ' value="' . entites_html($val) . '"' |
|
| 2859 | - ) |
|
| 2860 | - . ' type="hidden"' . "\n/>"; |
|
| 2861 | - } |
|
| 2862 | - |
|
| 2863 | - return join('', $hidden); |
|
| 2791 | + $action ??= ''; |
|
| 2792 | + |
|
| 2793 | + $contexte = []; |
|
| 2794 | + include_spip('inc/urls'); |
|
| 2795 | + if ( |
|
| 2796 | + $p = urls_decoder_url($action, '') |
|
| 2797 | + and reset($p) |
|
| 2798 | + ) { |
|
| 2799 | + $fond = array_shift($p); |
|
| 2800 | + if ($fond != '404') { |
|
| 2801 | + $contexte = array_shift($p); |
|
| 2802 | + $contexte['page'] = $fond; |
|
| 2803 | + $action = preg_replace('/([?]' . preg_quote($fond) . '[^&=]*[0-9]+)(&|$)/', '?&', $action); |
|
| 2804 | + } |
|
| 2805 | + } |
|
| 2806 | + // defaire ce qu'a injecte urls_decoder_url : a revoir en modifiant la signature de urls_decoder_url |
|
| 2807 | + if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) { |
|
| 2808 | + unset($contexte['type']); |
|
| 2809 | + } |
|
| 2810 | + if (!defined('_DEFINIR_CONTEXTE_TYPE_PAGE') or _DEFINIR_CONTEXTE_TYPE_PAGE) { |
|
| 2811 | + unset($contexte['type-page']); |
|
| 2812 | + } |
|
| 2813 | + |
|
| 2814 | + // on va remplir un tableau de valeurs en prenant bien soin de ne pas |
|
| 2815 | + // ecraser les elements de la forme mots[]=1&mots[]=2 |
|
| 2816 | + $values = []; |
|
| 2817 | + |
|
| 2818 | + // d'abord avec celles de l'url |
|
| 2819 | + if (false !== ($p = strpos($action, '?'))) { |
|
| 2820 | + foreach (preg_split('/&(amp;)?/S', substr($action, $p + 1)) as $c) { |
|
| 2821 | + $c = explode('=', $c, 2); |
|
| 2822 | + $var = array_shift($c); |
|
| 2823 | + $val = array_shift($c) ?? ''; |
|
| 2824 | + if ($var) { |
|
| 2825 | + $val = rawurldecode($val); |
|
| 2826 | + $var = rawurldecode($var); // decoder les [] eventuels |
|
| 2827 | + if (preg_match(',\[\]$,S', $var)) { |
|
| 2828 | + $values[] = [$var, $val]; |
|
| 2829 | + } else { |
|
| 2830 | + if (!isset($values[$var])) { |
|
| 2831 | + $values[$var] = [$var, $val]; |
|
| 2832 | + } |
|
| 2833 | + } |
|
| 2834 | + } |
|
| 2835 | + } |
|
| 2836 | + } |
|
| 2837 | + |
|
| 2838 | + // ensuite avec celles du contexte, sans doublonner ! |
|
| 2839 | + foreach ($contexte as $var => $val) { |
|
| 2840 | + if (preg_match(',\[\]$,S', $var)) { |
|
| 2841 | + $values[] = [$var, $val]; |
|
| 2842 | + } else { |
|
| 2843 | + if (!isset($values[$var])) { |
|
| 2844 | + $values[$var] = [$var, $val]; |
|
| 2845 | + } |
|
| 2846 | + } |
|
| 2847 | + } |
|
| 2848 | + |
|
| 2849 | + // puis on rassemble le tout |
|
| 2850 | + $hidden = []; |
|
| 2851 | + foreach ($values as $value) { |
|
| 2852 | + [$var, $val] = $value; |
|
| 2853 | + $hidden[] = '<input name="' |
|
| 2854 | + . entites_html($var) |
|
| 2855 | + . '"' |
|
| 2856 | + . (is_null($val) |
|
| 2857 | + ? '' |
|
| 2858 | + : ' value="' . entites_html($val) . '"' |
|
| 2859 | + ) |
|
| 2860 | + . ' type="hidden"' . "\n/>"; |
|
| 2861 | + } |
|
| 2862 | + |
|
| 2863 | + return join('', $hidden); |
|
| 2864 | 2864 | } |
| 2865 | 2865 | |
| 2866 | 2866 | |
@@ -2882,7 +2882,7 @@ discard block |
||
| 2882 | 2882 | * - la première valeur du tableau sinon. |
| 2883 | 2883 | **/ |
| 2884 | 2884 | function filtre_reset($array) { |
| 2885 | - return !is_array($array) ? null : reset($array); |
|
| 2885 | + return !is_array($array) ? null : reset($array); |
|
| 2886 | 2886 | } |
| 2887 | 2887 | |
| 2888 | 2888 | /** |
@@ -2903,7 +2903,7 @@ discard block |
||
| 2903 | 2903 | * - la dernière valeur du tableau sinon. |
| 2904 | 2904 | **/ |
| 2905 | 2905 | function filtre_end($array) { |
| 2906 | - return !is_array($array) ? null : end($array); |
|
| 2906 | + return !is_array($array) ? null : end($array); |
|
| 2907 | 2907 | } |
| 2908 | 2908 | |
| 2909 | 2909 | /** |
@@ -2923,11 +2923,11 @@ discard block |
||
| 2923 | 2923 | * |
| 2924 | 2924 | **/ |
| 2925 | 2925 | function filtre_push($array, $val) { |
| 2926 | - if (!is_array($array) or !array_push($array, $val)) { |
|
| 2927 | - return ''; |
|
| 2928 | - } |
|
| 2926 | + if (!is_array($array) or !array_push($array, $val)) { |
|
| 2927 | + return ''; |
|
| 2928 | + } |
|
| 2929 | 2929 | |
| 2930 | - return $array; |
|
| 2930 | + return $array; |
|
| 2931 | 2931 | } |
| 2932 | 2932 | |
| 2933 | 2933 | /** |
@@ -2946,7 +2946,7 @@ discard block |
||
| 2946 | 2946 | * - `true` si la valeur existe dans le tableau, `false` sinon. |
| 2947 | 2947 | **/ |
| 2948 | 2948 | function filtre_find($array, $val) { |
| 2949 | - return (is_array($array) and in_array($val, $array)); |
|
| 2949 | + return (is_array($array) and in_array($val, $array)); |
|
| 2950 | 2950 | } |
| 2951 | 2951 | |
| 2952 | 2952 | |
@@ -2963,13 +2963,13 @@ discard block |
||
| 2963 | 2963 | * Contenu avec urls en absolus |
| 2964 | 2964 | **/ |
| 2965 | 2965 | function urls_absolues_css($contenu, $source) { |
| 2966 | - $path = suivre_lien(url_absolue($source), './'); |
|
| 2966 | + $path = suivre_lien(url_absolue($source), './'); |
|
| 2967 | 2967 | |
| 2968 | - return preg_replace_callback( |
|
| 2969 | - ",url\s*\(\s*['\"]?([^'\"/#\s][^:]*)['\"]?\s*\),Uims", |
|
| 2970 | - fn($x) => "url('" . suivre_lien($path, $x[1]) . "')", |
|
| 2971 | - $contenu |
|
| 2972 | - ); |
|
| 2968 | + return preg_replace_callback( |
|
| 2969 | + ",url\s*\(\s*['\"]?([^'\"/#\s][^:]*)['\"]?\s*\),Uims", |
|
| 2970 | + fn($x) => "url('" . suivre_lien($path, $x[1]) . "')", |
|
| 2971 | + $contenu |
|
| 2972 | + ); |
|
| 2973 | 2973 | } |
| 2974 | 2974 | |
| 2975 | 2975 | |
@@ -2998,119 +2998,119 @@ discard block |
||
| 2998 | 2998 | * Chemin du fichier CSS inversé |
| 2999 | 2999 | **/ |
| 3000 | 3000 | function direction_css($css, $voulue = '') { |
| 3001 | - if (!preg_match(',(_rtl)?\.css$,i', $css, $r)) { |
|
| 3002 | - return $css; |
|
| 3003 | - } |
|
| 3004 | - include_spip('inc/lang'); |
|
| 3005 | - // si on a precise le sens voulu en argument, le prendre en compte |
|
| 3006 | - if ($voulue = strtolower($voulue)) { |
|
| 3007 | - if ($voulue != 'rtl' and $voulue != 'ltr') { |
|
| 3008 | - $voulue = lang_dir($voulue); |
|
| 3009 | - } |
|
| 3010 | - } else { |
|
| 3011 | - $voulue = lang_dir(); |
|
| 3012 | - } |
|
| 3013 | - |
|
| 3014 | - $r = count($r) > 1; |
|
| 3015 | - $right = $r ? 'left' : 'right'; // 'right' de la css lue en entree |
|
| 3016 | - $dir = $r ? 'rtl' : 'ltr'; |
|
| 3017 | - $ndir = $r ? 'ltr' : 'rtl'; |
|
| 3018 | - |
|
| 3019 | - if ($voulue == $dir) { |
|
| 3020 | - return $css; |
|
| 3021 | - } |
|
| 3022 | - |
|
| 3023 | - if ( |
|
| 3024 | - // url absolue |
|
| 3025 | - preg_match(',^https?:,i', $css) |
|
| 3026 | - // ou qui contient un ? |
|
| 3027 | - or (($p = strpos($css, '?')) !== false) |
|
| 3028 | - ) { |
|
| 3029 | - $distant = true; |
|
| 3030 | - $cssf = parse_url($css); |
|
| 3031 | - $cssf = $cssf['path'] . ($cssf['query'] ? '?' . $cssf['query'] : ''); |
|
| 3032 | - $cssf = preg_replace(',[?:&=],', '_', $cssf); |
|
| 3033 | - } else { |
|
| 3034 | - $distant = false; |
|
| 3035 | - $cssf = $css; |
|
| 3036 | - // 1. regarder d'abord si un fichier avec la bonne direction n'est pas aussi |
|
| 3037 | - //propose (rien a faire dans ce cas) |
|
| 3038 | - $f = preg_replace(',(_rtl)?\.css$,i', '_' . $ndir . '.css', $css); |
|
| 3039 | - if (@file_exists($f)) { |
|
| 3040 | - return $f; |
|
| 3041 | - } |
|
| 3042 | - } |
|
| 3043 | - |
|
| 3044 | - // 2. |
|
| 3045 | - $dir_var = sous_repertoire(_DIR_VAR, 'cache-css'); |
|
| 3046 | - $f = $dir_var |
|
| 3047 | - . preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $cssf) |
|
| 3048 | - . '.' . substr(md5($cssf), 0, 4) . '_' . $ndir . '.css'; |
|
| 3049 | - |
|
| 3050 | - // la css peut etre distante (url absolue !) |
|
| 3051 | - if ($distant) { |
|
| 3052 | - include_spip('inc/distant'); |
|
| 3053 | - $res = recuperer_url($css); |
|
| 3054 | - if (!$res or !$contenu = $res['page']) { |
|
| 3055 | - return $css; |
|
| 3056 | - } |
|
| 3057 | - } else { |
|
| 3058 | - if ( |
|
| 3059 | - (@filemtime($f) > @filemtime($css)) |
|
| 3060 | - and (_VAR_MODE != 'recalcul') |
|
| 3061 | - ) { |
|
| 3062 | - return $f; |
|
| 3063 | - } |
|
| 3064 | - if (!lire_fichier($css, $contenu)) { |
|
| 3065 | - return $css; |
|
| 3066 | - } |
|
| 3067 | - } |
|
| 3068 | - |
|
| 3069 | - |
|
| 3070 | - // Inverser la direction gauche-droite en utilisant CSSTidy qui gere aussi les shorthands |
|
| 3071 | - include_spip('lib/csstidy/class.csstidy'); |
|
| 3072 | - $parser = new csstidy(); |
|
| 3073 | - $parser->set_cfg('optimise_shorthands', 0); |
|
| 3074 | - $parser->set_cfg('reverse_left_and_right', true); |
|
| 3075 | - $parser->parse($contenu); |
|
| 3076 | - |
|
| 3077 | - $contenu = $parser->print->plain(); |
|
| 3078 | - |
|
| 3079 | - |
|
| 3080 | - // reperer les @import auxquels il faut propager le direction_css |
|
| 3081 | - preg_match_all(",\@import\s*url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims", $contenu, $regs); |
|
| 3082 | - $src = []; |
|
| 3083 | - $src_direction_css = []; |
|
| 3084 | - $src_faux_abs = []; |
|
| 3085 | - $d = dirname($css); |
|
| 3086 | - foreach ($regs[1] as $k => $import_css) { |
|
| 3087 | - $css_direction = direction_css("$d/$import_css", $voulue); |
|
| 3088 | - // si la css_direction est dans le meme path que la css d'origine, on tronque le path, elle sera passee en absolue |
|
| 3089 | - if (substr($css_direction, 0, strlen($d) + 1) == "$d/") { |
|
| 3090 | - $css_direction = substr($css_direction, strlen($d) + 1); |
|
| 3091 | - } // si la css_direction commence par $dir_var on la fait passer pour une absolue |
|
| 3092 | - elseif (substr($css_direction, 0, strlen($dir_var)) == $dir_var) { |
|
| 3093 | - $css_direction = substr($css_direction, strlen($dir_var)); |
|
| 3094 | - $src_faux_abs['/@@@@@@/' . $css_direction] = $css_direction; |
|
| 3095 | - $css_direction = '/@@@@@@/' . $css_direction; |
|
| 3096 | - } |
|
| 3097 | - $src[] = $regs[0][$k]; |
|
| 3098 | - $src_direction_css[] = str_replace($import_css, $css_direction, $regs[0][$k]); |
|
| 3099 | - } |
|
| 3100 | - $contenu = str_replace($src, $src_direction_css, $contenu); |
|
| 3101 | - |
|
| 3102 | - $contenu = urls_absolues_css($contenu, $css); |
|
| 3103 | - |
|
| 3104 | - // virer les fausses url absolues que l'on a mis dans les import |
|
| 3105 | - if (count($src_faux_abs)) { |
|
| 3106 | - $contenu = str_replace(array_keys($src_faux_abs), $src_faux_abs, $contenu); |
|
| 3107 | - } |
|
| 3108 | - |
|
| 3109 | - if (!ecrire_fichier($f, $contenu)) { |
|
| 3110 | - return $css; |
|
| 3111 | - } |
|
| 3112 | - |
|
| 3113 | - return $f; |
|
| 3001 | + if (!preg_match(',(_rtl)?\.css$,i', $css, $r)) { |
|
| 3002 | + return $css; |
|
| 3003 | + } |
|
| 3004 | + include_spip('inc/lang'); |
|
| 3005 | + // si on a precise le sens voulu en argument, le prendre en compte |
|
| 3006 | + if ($voulue = strtolower($voulue)) { |
|
| 3007 | + if ($voulue != 'rtl' and $voulue != 'ltr') { |
|
| 3008 | + $voulue = lang_dir($voulue); |
|
| 3009 | + } |
|
| 3010 | + } else { |
|
| 3011 | + $voulue = lang_dir(); |
|
| 3012 | + } |
|
| 3013 | + |
|
| 3014 | + $r = count($r) > 1; |
|
| 3015 | + $right = $r ? 'left' : 'right'; // 'right' de la css lue en entree |
|
| 3016 | + $dir = $r ? 'rtl' : 'ltr'; |
|
| 3017 | + $ndir = $r ? 'ltr' : 'rtl'; |
|
| 3018 | + |
|
| 3019 | + if ($voulue == $dir) { |
|
| 3020 | + return $css; |
|
| 3021 | + } |
|
| 3022 | + |
|
| 3023 | + if ( |
|
| 3024 | + // url absolue |
|
| 3025 | + preg_match(',^https?:,i', $css) |
|
| 3026 | + // ou qui contient un ? |
|
| 3027 | + or (($p = strpos($css, '?')) !== false) |
|
| 3028 | + ) { |
|
| 3029 | + $distant = true; |
|
| 3030 | + $cssf = parse_url($css); |
|
| 3031 | + $cssf = $cssf['path'] . ($cssf['query'] ? '?' . $cssf['query'] : ''); |
|
| 3032 | + $cssf = preg_replace(',[?:&=],', '_', $cssf); |
|
| 3033 | + } else { |
|
| 3034 | + $distant = false; |
|
| 3035 | + $cssf = $css; |
|
| 3036 | + // 1. regarder d'abord si un fichier avec la bonne direction n'est pas aussi |
|
| 3037 | + //propose (rien a faire dans ce cas) |
|
| 3038 | + $f = preg_replace(',(_rtl)?\.css$,i', '_' . $ndir . '.css', $css); |
|
| 3039 | + if (@file_exists($f)) { |
|
| 3040 | + return $f; |
|
| 3041 | + } |
|
| 3042 | + } |
|
| 3043 | + |
|
| 3044 | + // 2. |
|
| 3045 | + $dir_var = sous_repertoire(_DIR_VAR, 'cache-css'); |
|
| 3046 | + $f = $dir_var |
|
| 3047 | + . preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $cssf) |
|
| 3048 | + . '.' . substr(md5($cssf), 0, 4) . '_' . $ndir . '.css'; |
|
| 3049 | + |
|
| 3050 | + // la css peut etre distante (url absolue !) |
|
| 3051 | + if ($distant) { |
|
| 3052 | + include_spip('inc/distant'); |
|
| 3053 | + $res = recuperer_url($css); |
|
| 3054 | + if (!$res or !$contenu = $res['page']) { |
|
| 3055 | + return $css; |
|
| 3056 | + } |
|
| 3057 | + } else { |
|
| 3058 | + if ( |
|
| 3059 | + (@filemtime($f) > @filemtime($css)) |
|
| 3060 | + and (_VAR_MODE != 'recalcul') |
|
| 3061 | + ) { |
|
| 3062 | + return $f; |
|
| 3063 | + } |
|
| 3064 | + if (!lire_fichier($css, $contenu)) { |
|
| 3065 | + return $css; |
|
| 3066 | + } |
|
| 3067 | + } |
|
| 3068 | + |
|
| 3069 | + |
|
| 3070 | + // Inverser la direction gauche-droite en utilisant CSSTidy qui gere aussi les shorthands |
|
| 3071 | + include_spip('lib/csstidy/class.csstidy'); |
|
| 3072 | + $parser = new csstidy(); |
|
| 3073 | + $parser->set_cfg('optimise_shorthands', 0); |
|
| 3074 | + $parser->set_cfg('reverse_left_and_right', true); |
|
| 3075 | + $parser->parse($contenu); |
|
| 3076 | + |
|
| 3077 | + $contenu = $parser->print->plain(); |
|
| 3078 | + |
|
| 3079 | + |
|
| 3080 | + // reperer les @import auxquels il faut propager le direction_css |
|
| 3081 | + preg_match_all(",\@import\s*url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims", $contenu, $regs); |
|
| 3082 | + $src = []; |
|
| 3083 | + $src_direction_css = []; |
|
| 3084 | + $src_faux_abs = []; |
|
| 3085 | + $d = dirname($css); |
|
| 3086 | + foreach ($regs[1] as $k => $import_css) { |
|
| 3087 | + $css_direction = direction_css("$d/$import_css", $voulue); |
|
| 3088 | + // si la css_direction est dans le meme path que la css d'origine, on tronque le path, elle sera passee en absolue |
|
| 3089 | + if (substr($css_direction, 0, strlen($d) + 1) == "$d/") { |
|
| 3090 | + $css_direction = substr($css_direction, strlen($d) + 1); |
|
| 3091 | + } // si la css_direction commence par $dir_var on la fait passer pour une absolue |
|
| 3092 | + elseif (substr($css_direction, 0, strlen($dir_var)) == $dir_var) { |
|
| 3093 | + $css_direction = substr($css_direction, strlen($dir_var)); |
|
| 3094 | + $src_faux_abs['/@@@@@@/' . $css_direction] = $css_direction; |
|
| 3095 | + $css_direction = '/@@@@@@/' . $css_direction; |
|
| 3096 | + } |
|
| 3097 | + $src[] = $regs[0][$k]; |
|
| 3098 | + $src_direction_css[] = str_replace($import_css, $css_direction, $regs[0][$k]); |
|
| 3099 | + } |
|
| 3100 | + $contenu = str_replace($src, $src_direction_css, $contenu); |
|
| 3101 | + |
|
| 3102 | + $contenu = urls_absolues_css($contenu, $css); |
|
| 3103 | + |
|
| 3104 | + // virer les fausses url absolues que l'on a mis dans les import |
|
| 3105 | + if (count($src_faux_abs)) { |
|
| 3106 | + $contenu = str_replace(array_keys($src_faux_abs), $src_faux_abs, $contenu); |
|
| 3107 | + } |
|
| 3108 | + |
|
| 3109 | + if (!ecrire_fichier($f, $contenu)) { |
|
| 3110 | + return $css; |
|
| 3111 | + } |
|
| 3112 | + |
|
| 3113 | + return $f; |
|
| 3114 | 3114 | } |
| 3115 | 3115 | |
| 3116 | 3116 | |
@@ -3133,46 +3133,46 @@ discard block |
||
| 3133 | 3133 | * - Chemin ou URL du fichier CSS source sinon. |
| 3134 | 3134 | **/ |
| 3135 | 3135 | function url_absolue_css($css) { |
| 3136 | - if (!preg_match(',\.css$,i', $css, $r)) { |
|
| 3137 | - return $css; |
|
| 3138 | - } |
|
| 3136 | + if (!preg_match(',\.css$,i', $css, $r)) { |
|
| 3137 | + return $css; |
|
| 3138 | + } |
|
| 3139 | 3139 | |
| 3140 | - $url_absolue_css = url_absolue($css); |
|
| 3140 | + $url_absolue_css = url_absolue($css); |
|
| 3141 | 3141 | |
| 3142 | - $f = basename($css, '.css'); |
|
| 3143 | - $f = sous_repertoire(_DIR_VAR, 'cache-css') |
|
| 3144 | - . preg_replace(',(.*?)(_rtl|_ltr)?$,', "\\1-urlabs-" . substr(md5("$css-urlabs"), 0, 4) . "\\2", $f) |
|
| 3145 | - . '.css'; |
|
| 3142 | + $f = basename($css, '.css'); |
|
| 3143 | + $f = sous_repertoire(_DIR_VAR, 'cache-css') |
|
| 3144 | + . preg_replace(',(.*?)(_rtl|_ltr)?$,', "\\1-urlabs-" . substr(md5("$css-urlabs"), 0, 4) . "\\2", $f) |
|
| 3145 | + . '.css'; |
|
| 3146 | 3146 | |
| 3147 | - if ((@filemtime($f) > @filemtime($css)) and (_VAR_MODE != 'recalcul')) { |
|
| 3148 | - return $f; |
|
| 3149 | - } |
|
| 3147 | + if ((@filemtime($f) > @filemtime($css)) and (_VAR_MODE != 'recalcul')) { |
|
| 3148 | + return $f; |
|
| 3149 | + } |
|
| 3150 | 3150 | |
| 3151 | - if ($url_absolue_css == $css) { |
|
| 3152 | - if ( |
|
| 3153 | - strncmp($GLOBALS['meta']['adresse_site'], $css, $l = strlen($GLOBALS['meta']['adresse_site'])) != 0 |
|
| 3154 | - or !lire_fichier(_DIR_RACINE . substr($css, $l), $contenu) |
|
| 3155 | - ) { |
|
| 3156 | - include_spip('inc/distant'); |
|
| 3157 | - $contenu = recuperer_url($css); |
|
| 3158 | - $contenu = $contenu['page'] ?? ''; |
|
| 3159 | - if (!$contenu) { |
|
| 3160 | - return $css; |
|
| 3161 | - } |
|
| 3162 | - } |
|
| 3163 | - } elseif (!lire_fichier($css, $contenu)) { |
|
| 3164 | - return $css; |
|
| 3165 | - } |
|
| 3151 | + if ($url_absolue_css == $css) { |
|
| 3152 | + if ( |
|
| 3153 | + strncmp($GLOBALS['meta']['adresse_site'], $css, $l = strlen($GLOBALS['meta']['adresse_site'])) != 0 |
|
| 3154 | + or !lire_fichier(_DIR_RACINE . substr($css, $l), $contenu) |
|
| 3155 | + ) { |
|
| 3156 | + include_spip('inc/distant'); |
|
| 3157 | + $contenu = recuperer_url($css); |
|
| 3158 | + $contenu = $contenu['page'] ?? ''; |
|
| 3159 | + if (!$contenu) { |
|
| 3160 | + return $css; |
|
| 3161 | + } |
|
| 3162 | + } |
|
| 3163 | + } elseif (!lire_fichier($css, $contenu)) { |
|
| 3164 | + return $css; |
|
| 3165 | + } |
|
| 3166 | 3166 | |
| 3167 | - // passer les url relatives a la css d'origine en url absolues |
|
| 3168 | - $contenu = urls_absolues_css($contenu, $css); |
|
| 3167 | + // passer les url relatives a la css d'origine en url absolues |
|
| 3168 | + $contenu = urls_absolues_css($contenu, $css); |
|
| 3169 | 3169 | |
| 3170 | - // ecrire la css |
|
| 3171 | - if (!ecrire_fichier($f, $contenu)) { |
|
| 3172 | - return $css; |
|
| 3173 | - } |
|
| 3170 | + // ecrire la css |
|
| 3171 | + if (!ecrire_fichier($f, $contenu)) { |
|
| 3172 | + return $css; |
|
| 3173 | + } |
|
| 3174 | 3174 | |
| 3175 | - return $f; |
|
| 3175 | + return $f; |
|
| 3176 | 3176 | } |
| 3177 | 3177 | |
| 3178 | 3178 | |
@@ -3206,24 +3206,24 @@ discard block |
||
| 3206 | 3206 | * Valeur trouvée ou valeur par défaut. |
| 3207 | 3207 | **/ |
| 3208 | 3208 | function table_valeur($table, $cle, $defaut = '', $conserver_null = false) { |
| 3209 | - foreach (explode('/', $cle) as $k) { |
|
| 3210 | - $table = (is_string($table) ? @unserialize($table) : $table); |
|
| 3209 | + foreach (explode('/', $cle) as $k) { |
|
| 3210 | + $table = (is_string($table) ? @unserialize($table) : $table); |
|
| 3211 | 3211 | |
| 3212 | - if (is_object($table)) { |
|
| 3213 | - $table = (($k !== '') and isset($table->$k)) ? $table->$k : $defaut; |
|
| 3214 | - } elseif (is_array($table)) { |
|
| 3215 | - if ($conserver_null) { |
|
| 3216 | - $table = array_key_exists($k, $table) ? $table[$k] : $defaut; |
|
| 3217 | - } else { |
|
| 3218 | - $table = ($table[$k] ?? $defaut); |
|
| 3219 | - } |
|
| 3220 | - } else { |
|
| 3221 | - $table = $defaut; |
|
| 3222 | - break; |
|
| 3223 | - } |
|
| 3224 | - } |
|
| 3212 | + if (is_object($table)) { |
|
| 3213 | + $table = (($k !== '') and isset($table->$k)) ? $table->$k : $defaut; |
|
| 3214 | + } elseif (is_array($table)) { |
|
| 3215 | + if ($conserver_null) { |
|
| 3216 | + $table = array_key_exists($k, $table) ? $table[$k] : $defaut; |
|
| 3217 | + } else { |
|
| 3218 | + $table = ($table[$k] ?? $defaut); |
|
| 3219 | + } |
|
| 3220 | + } else { |
|
| 3221 | + $table = $defaut; |
|
| 3222 | + break; |
|
| 3223 | + } |
|
| 3224 | + } |
|
| 3225 | 3225 | |
| 3226 | - return $table; |
|
| 3226 | + return $table; |
|
| 3227 | 3227 | } |
| 3228 | 3228 | |
| 3229 | 3229 | /** |
@@ -3256,22 +3256,22 @@ discard block |
||
| 3256 | 3256 | * - string : expression trouvée. |
| 3257 | 3257 | **/ |
| 3258 | 3258 | function filtre_match_dist(?string $texte, $expression, $modif = 'UuimsS', $capte = 0) { |
| 3259 | - if (intval($modif) and $capte == 0) { |
|
| 3260 | - $capte = $modif; |
|
| 3261 | - $modif = 'UuimsS'; |
|
| 3262 | - } |
|
| 3263 | - $expression = str_replace('\/', '/', $expression); |
|
| 3264 | - $expression = str_replace('/', '\/', $expression); |
|
| 3259 | + if (intval($modif) and $capte == 0) { |
|
| 3260 | + $capte = $modif; |
|
| 3261 | + $modif = 'UuimsS'; |
|
| 3262 | + } |
|
| 3263 | + $expression = str_replace('\/', '/', $expression); |
|
| 3264 | + $expression = str_replace('/', '\/', $expression); |
|
| 3265 | 3265 | |
| 3266 | - if (preg_match('/' . $expression . '/' . $modif, $texte ?? '', $r)) { |
|
| 3267 | - if (isset($r[$capte])) { |
|
| 3268 | - return $r[$capte]; |
|
| 3269 | - } else { |
|
| 3270 | - return true; |
|
| 3271 | - } |
|
| 3272 | - } |
|
| 3266 | + if (preg_match('/' . $expression . '/' . $modif, $texte ?? '', $r)) { |
|
| 3267 | + if (isset($r[$capte])) { |
|
| 3268 | + return $r[$capte]; |
|
| 3269 | + } else { |
|
| 3270 | + return true; |
|
| 3271 | + } |
|
| 3272 | + } |
|
| 3273 | 3273 | |
| 3274 | - return false; |
|
| 3274 | + return false; |
|
| 3275 | 3275 | } |
| 3276 | 3276 | |
| 3277 | 3277 | |
@@ -3298,10 +3298,10 @@ discard block |
||
| 3298 | 3298 | * Texte |
| 3299 | 3299 | **/ |
| 3300 | 3300 | function replace($texte, $expression, $replace = '', $modif = 'UimsS') { |
| 3301 | - $expression = str_replace('\/', '/', $expression); |
|
| 3302 | - $expression = str_replace('/', '\/', $expression); |
|
| 3301 | + $expression = str_replace('\/', '/', $expression); |
|
| 3302 | + $expression = str_replace('/', '\/', $expression); |
|
| 3303 | 3303 | |
| 3304 | - return preg_replace('/' . $expression . '/' . $modif, $replace, $texte); |
|
| 3304 | + return preg_replace('/' . $expression . '/' . $modif, $replace, $texte); |
|
| 3305 | 3305 | } |
| 3306 | 3306 | |
| 3307 | 3307 | |
@@ -3319,25 +3319,25 @@ discard block |
||
| 3319 | 3319 | **/ |
| 3320 | 3320 | function traiter_doublons_documents(&$doublons, $letexte) { |
| 3321 | 3321 | |
| 3322 | - // Verifier dans le texte & les notes (pas beau, helas) |
|
| 3323 | - $t = $letexte . $GLOBALS['les_notes']; |
|
| 3322 | + // Verifier dans le texte & les notes (pas beau, helas) |
|
| 3323 | + $t = $letexte . $GLOBALS['les_notes']; |
|
| 3324 | 3324 | |
| 3325 | - if ( |
|
| 3326 | - strstr($t, 'spip_document_') // evite le preg_match_all si inutile |
|
| 3327 | - and preg_match_all( |
|
| 3328 | - ',<[^>]+\sclass=["\']spip_document_([0-9]+)[\s"\'],imsS', |
|
| 3329 | - $t, |
|
| 3330 | - $matches, |
|
| 3331 | - PREG_PATTERN_ORDER |
|
| 3332 | - ) |
|
| 3333 | - ) { |
|
| 3334 | - if (!isset($doublons['documents'])) { |
|
| 3335 | - $doublons['documents'] = ''; |
|
| 3336 | - } |
|
| 3337 | - $doublons['documents'] .= ',' . join(',', $matches[1]); |
|
| 3338 | - } |
|
| 3325 | + if ( |
|
| 3326 | + strstr($t, 'spip_document_') // evite le preg_match_all si inutile |
|
| 3327 | + and preg_match_all( |
|
| 3328 | + ',<[^>]+\sclass=["\']spip_document_([0-9]+)[\s"\'],imsS', |
|
| 3329 | + $t, |
|
| 3330 | + $matches, |
|
| 3331 | + PREG_PATTERN_ORDER |
|
| 3332 | + ) |
|
| 3333 | + ) { |
|
| 3334 | + if (!isset($doublons['documents'])) { |
|
| 3335 | + $doublons['documents'] = ''; |
|
| 3336 | + } |
|
| 3337 | + $doublons['documents'] .= ',' . join(',', $matches[1]); |
|
| 3338 | + } |
|
| 3339 | 3339 | |
| 3340 | - return $letexte; |
|
| 3340 | + return $letexte; |
|
| 3341 | 3341 | } |
| 3342 | 3342 | |
| 3343 | 3343 | /** |
@@ -3351,7 +3351,7 @@ discard block |
||
| 3351 | 3351 | * @return string Chaîne vide |
| 3352 | 3352 | **/ |
| 3353 | 3353 | function vide($texte) { |
| 3354 | - return ''; |
|
| 3354 | + return ''; |
|
| 3355 | 3355 | } |
| 3356 | 3356 | |
| 3357 | 3357 | // |
@@ -3380,23 +3380,23 @@ discard block |
||
| 3380 | 3380 | * Code HTML résultant |
| 3381 | 3381 | **/ |
| 3382 | 3382 | function env_to_params($env, $ignore_params = []) { |
| 3383 | - $ignore_params = array_merge( |
|
| 3384 | - ['id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'], |
|
| 3385 | - $ignore_params |
|
| 3386 | - ); |
|
| 3387 | - if (!is_array($env)) { |
|
| 3388 | - $env = unserialize($env); |
|
| 3389 | - } |
|
| 3390 | - $texte = ''; |
|
| 3391 | - if ($env) { |
|
| 3392 | - foreach ($env as $i => $j) { |
|
| 3393 | - if (is_string($j) and !in_array($i, $ignore_params)) { |
|
| 3394 | - $texte .= "<param name='" . attribut_html($i) . "'\n\tvalue='" . attribut_html($j) . "' />"; |
|
| 3395 | - } |
|
| 3396 | - } |
|
| 3397 | - } |
|
| 3398 | - |
|
| 3399 | - return $texte; |
|
| 3383 | + $ignore_params = array_merge( |
|
| 3384 | + ['id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'], |
|
| 3385 | + $ignore_params |
|
| 3386 | + ); |
|
| 3387 | + if (!is_array($env)) { |
|
| 3388 | + $env = unserialize($env); |
|
| 3389 | + } |
|
| 3390 | + $texte = ''; |
|
| 3391 | + if ($env) { |
|
| 3392 | + foreach ($env as $i => $j) { |
|
| 3393 | + if (is_string($j) and !in_array($i, $ignore_params)) { |
|
| 3394 | + $texte .= "<param name='" . attribut_html($i) . "'\n\tvalue='" . attribut_html($j) . "' />"; |
|
| 3395 | + } |
|
| 3396 | + } |
|
| 3397 | + } |
|
| 3398 | + |
|
| 3399 | + return $texte; |
|
| 3400 | 3400 | } |
| 3401 | 3401 | |
| 3402 | 3402 | /** |
@@ -3419,23 +3419,23 @@ discard block |
||
| 3419 | 3419 | * Code HTML résultant |
| 3420 | 3420 | **/ |
| 3421 | 3421 | function env_to_attributs($env, $ignore_params = []) { |
| 3422 | - $ignore_params = array_merge( |
|
| 3423 | - ['id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'], |
|
| 3424 | - $ignore_params |
|
| 3425 | - ); |
|
| 3426 | - if (!is_array($env)) { |
|
| 3427 | - $env = unserialize($env); |
|
| 3428 | - } |
|
| 3429 | - $texte = ''; |
|
| 3430 | - if ($env) { |
|
| 3431 | - foreach ($env as $i => $j) { |
|
| 3432 | - if (is_string($j) and !in_array($i, $ignore_params)) { |
|
| 3433 | - $texte .= attribut_html($i) . "='" . attribut_html($j) . "' "; |
|
| 3434 | - } |
|
| 3435 | - } |
|
| 3436 | - } |
|
| 3422 | + $ignore_params = array_merge( |
|
| 3423 | + ['id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'], |
|
| 3424 | + $ignore_params |
|
| 3425 | + ); |
|
| 3426 | + if (!is_array($env)) { |
|
| 3427 | + $env = unserialize($env); |
|
| 3428 | + } |
|
| 3429 | + $texte = ''; |
|
| 3430 | + if ($env) { |
|
| 3431 | + foreach ($env as $i => $j) { |
|
| 3432 | + if (is_string($j) and !in_array($i, $ignore_params)) { |
|
| 3433 | + $texte .= attribut_html($i) . "='" . attribut_html($j) . "' "; |
|
| 3434 | + } |
|
| 3435 | + } |
|
| 3436 | + } |
|
| 3437 | 3437 | |
| 3438 | - return $texte; |
|
| 3438 | + return $texte; |
|
| 3439 | 3439 | } |
| 3440 | 3440 | |
| 3441 | 3441 | |
@@ -3453,7 +3453,7 @@ discard block |
||
| 3453 | 3453 | * @return string Chaînes concaténés |
| 3454 | 3454 | **/ |
| 3455 | 3455 | function concat(...$args): string { |
| 3456 | - return join('', $args); |
|
| 3456 | + return join('', $args); |
|
| 3457 | 3457 | } |
| 3458 | 3458 | |
| 3459 | 3459 | |
@@ -3473,23 +3473,23 @@ discard block |
||
| 3473 | 3473 | * Contenu du ou des fichiers, concaténé |
| 3474 | 3474 | **/ |
| 3475 | 3475 | function charge_scripts($files, $script = true) { |
| 3476 | - $flux = ''; |
|
| 3477 | - foreach (is_array($files) ? $files : explode('|', $files) as $file) { |
|
| 3478 | - if (!is_string($file)) { |
|
| 3479 | - continue; |
|
| 3480 | - } |
|
| 3481 | - if ($script) { |
|
| 3482 | - $file = preg_match(',^\w+$,', $file) ? "javascript/$file.js" : ''; |
|
| 3483 | - } |
|
| 3484 | - if ($file) { |
|
| 3485 | - $path = find_in_path($file); |
|
| 3486 | - if ($path) { |
|
| 3487 | - $flux .= spip_file_get_contents($path); |
|
| 3488 | - } |
|
| 3489 | - } |
|
| 3490 | - } |
|
| 3491 | - |
|
| 3492 | - return $flux; |
|
| 3476 | + $flux = ''; |
|
| 3477 | + foreach (is_array($files) ? $files : explode('|', $files) as $file) { |
|
| 3478 | + if (!is_string($file)) { |
|
| 3479 | + continue; |
|
| 3480 | + } |
|
| 3481 | + if ($script) { |
|
| 3482 | + $file = preg_match(',^\w+$,', $file) ? "javascript/$file.js" : ''; |
|
| 3483 | + } |
|
| 3484 | + if ($file) { |
|
| 3485 | + $path = find_in_path($file); |
|
| 3486 | + if ($path) { |
|
| 3487 | + $flux .= spip_file_get_contents($path); |
|
| 3488 | + } |
|
| 3489 | + } |
|
| 3490 | + } |
|
| 3491 | + |
|
| 3492 | + return $flux; |
|
| 3493 | 3493 | } |
| 3494 | 3494 | |
| 3495 | 3495 | /** |
@@ -3500,22 +3500,22 @@ discard block |
||
| 3500 | 3500 | * @return string |
| 3501 | 3501 | */ |
| 3502 | 3502 | function http_img_variante_svg_si_possible($img_file) { |
| 3503 | - // on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png |
|
| 3504 | - // si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png |
|
| 3505 | - if ( |
|
| 3506 | - preg_match(',-(\d+)[.](png|gif|svg)$,', $img_file, $m) |
|
| 3507 | - and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])) . '-xx.svg' |
|
| 3508 | - and file_exists($variante_svg_generique) |
|
| 3509 | - ) { |
|
| 3510 | - if ($variante_svg_size = substr($variante_svg_generique, 0, -6) . $m[1] . '.svg' and file_exists($variante_svg_size)) { |
|
| 3511 | - $img_file = $variante_svg_size; |
|
| 3512 | - } |
|
| 3513 | - else { |
|
| 3514 | - $img_file = $variante_svg_generique; |
|
| 3515 | - } |
|
| 3516 | - } |
|
| 3503 | + // on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png |
|
| 3504 | + // si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png |
|
| 3505 | + if ( |
|
| 3506 | + preg_match(',-(\d+)[.](png|gif|svg)$,', $img_file, $m) |
|
| 3507 | + and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])) . '-xx.svg' |
|
| 3508 | + and file_exists($variante_svg_generique) |
|
| 3509 | + ) { |
|
| 3510 | + if ($variante_svg_size = substr($variante_svg_generique, 0, -6) . $m[1] . '.svg' and file_exists($variante_svg_size)) { |
|
| 3511 | + $img_file = $variante_svg_size; |
|
| 3512 | + } |
|
| 3513 | + else { |
|
| 3514 | + $img_file = $variante_svg_generique; |
|
| 3515 | + } |
|
| 3516 | + } |
|
| 3517 | 3517 | |
| 3518 | - return $img_file; |
|
| 3518 | + return $img_file; |
|
| 3519 | 3519 | } |
| 3520 | 3520 | |
| 3521 | 3521 | /** |
@@ -3536,54 +3536,54 @@ discard block |
||
| 3536 | 3536 | */ |
| 3537 | 3537 | function http_img_pack($img, $alt, $atts = '', $title = '', $options = []) { |
| 3538 | 3538 | |
| 3539 | - $img_file = $img; |
|
| 3540 | - if ($p = strpos($img_file, '?')) { |
|
| 3541 | - $img_file = substr($img_file, 0, $p); |
|
| 3542 | - } |
|
| 3543 | - if (!isset($options['chemin_image']) or $options['chemin_image'] == true) { |
|
| 3544 | - $img_file = chemin_image($img); |
|
| 3545 | - } |
|
| 3546 | - else { |
|
| 3547 | - if (!isset($options['variante_svg_si_possible']) or $options['variante_svg_si_possible'] == true) { |
|
| 3548 | - $img_file = http_img_variante_svg_si_possible($img_file); |
|
| 3549 | - } |
|
| 3550 | - } |
|
| 3551 | - if (stripos($atts, 'width') === false) { |
|
| 3552 | - // utiliser directement l'info de taille presente dans le nom |
|
| 3553 | - if ( |
|
| 3554 | - (!isset($options['utiliser_suffixe_size']) |
|
| 3555 | - or $options['utiliser_suffixe_size'] == true |
|
| 3556 | - or strpos($img_file, '-xx.svg') !== false) |
|
| 3557 | - and (preg_match(',-([0-9]+)[.](png|gif|svg)$,', $img, $regs) |
|
| 3558 | - or preg_match(',\?([0-9]+)px$,', $img, $regs)) |
|
| 3559 | - ) { |
|
| 3560 | - $largeur = $hauteur = intval($regs[1]); |
|
| 3561 | - } else { |
|
| 3562 | - $taille = taille_image($img_file); |
|
| 3563 | - [$hauteur, $largeur] = $taille; |
|
| 3564 | - if (!$hauteur or !$largeur) { |
|
| 3565 | - return ''; |
|
| 3566 | - } |
|
| 3567 | - } |
|
| 3568 | - $atts .= " width='" . $largeur . "' height='" . $hauteur . "'"; |
|
| 3569 | - } |
|
| 3570 | - |
|
| 3571 | - if (file_exists($img_file)) { |
|
| 3572 | - $img_file = timestamp($img_file); |
|
| 3573 | - } |
|
| 3574 | - if ($alt === false) { |
|
| 3575 | - $alt = ''; |
|
| 3576 | - } |
|
| 3577 | - elseif ($alt or $alt === '') { |
|
| 3578 | - $alt = " alt='" . attribut_html($alt) . "'"; |
|
| 3579 | - } |
|
| 3580 | - else { |
|
| 3581 | - $alt = " alt='" . attribut_html($title) . "'"; |
|
| 3582 | - } |
|
| 3583 | - return "<img src='" . attribut_html($img_file) . "'$alt" |
|
| 3584 | - . ($title ? ' title="' . attribut_html($title) . '"' : '') |
|
| 3585 | - . ' ' . ltrim($atts) |
|
| 3586 | - . ' />'; |
|
| 3539 | + $img_file = $img; |
|
| 3540 | + if ($p = strpos($img_file, '?')) { |
|
| 3541 | + $img_file = substr($img_file, 0, $p); |
|
| 3542 | + } |
|
| 3543 | + if (!isset($options['chemin_image']) or $options['chemin_image'] == true) { |
|
| 3544 | + $img_file = chemin_image($img); |
|
| 3545 | + } |
|
| 3546 | + else { |
|
| 3547 | + if (!isset($options['variante_svg_si_possible']) or $options['variante_svg_si_possible'] == true) { |
|
| 3548 | + $img_file = http_img_variante_svg_si_possible($img_file); |
|
| 3549 | + } |
|
| 3550 | + } |
|
| 3551 | + if (stripos($atts, 'width') === false) { |
|
| 3552 | + // utiliser directement l'info de taille presente dans le nom |
|
| 3553 | + if ( |
|
| 3554 | + (!isset($options['utiliser_suffixe_size']) |
|
| 3555 | + or $options['utiliser_suffixe_size'] == true |
|
| 3556 | + or strpos($img_file, '-xx.svg') !== false) |
|
| 3557 | + and (preg_match(',-([0-9]+)[.](png|gif|svg)$,', $img, $regs) |
|
| 3558 | + or preg_match(',\?([0-9]+)px$,', $img, $regs)) |
|
| 3559 | + ) { |
|
| 3560 | + $largeur = $hauteur = intval($regs[1]); |
|
| 3561 | + } else { |
|
| 3562 | + $taille = taille_image($img_file); |
|
| 3563 | + [$hauteur, $largeur] = $taille; |
|
| 3564 | + if (!$hauteur or !$largeur) { |
|
| 3565 | + return ''; |
|
| 3566 | + } |
|
| 3567 | + } |
|
| 3568 | + $atts .= " width='" . $largeur . "' height='" . $hauteur . "'"; |
|
| 3569 | + } |
|
| 3570 | + |
|
| 3571 | + if (file_exists($img_file)) { |
|
| 3572 | + $img_file = timestamp($img_file); |
|
| 3573 | + } |
|
| 3574 | + if ($alt === false) { |
|
| 3575 | + $alt = ''; |
|
| 3576 | + } |
|
| 3577 | + elseif ($alt or $alt === '') { |
|
| 3578 | + $alt = " alt='" . attribut_html($alt) . "'"; |
|
| 3579 | + } |
|
| 3580 | + else { |
|
| 3581 | + $alt = " alt='" . attribut_html($title) . "'"; |
|
| 3582 | + } |
|
| 3583 | + return "<img src='" . attribut_html($img_file) . "'$alt" |
|
| 3584 | + . ($title ? ' title="' . attribut_html($title) . '"' : '') |
|
| 3585 | + . ' ' . ltrim($atts) |
|
| 3586 | + . ' />'; |
|
| 3587 | 3587 | } |
| 3588 | 3588 | |
| 3589 | 3589 | /** |
@@ -3595,70 +3595,70 @@ discard block |
||
| 3595 | 3595 | * @return string |
| 3596 | 3596 | */ |
| 3597 | 3597 | function http_style_background($img, $att = '', $size = null) { |
| 3598 | - if ($size and is_numeric($size)) { |
|
| 3599 | - $size = trim($size) . 'px'; |
|
| 3600 | - } |
|
| 3601 | - return " style='background" . |
|
| 3602 | - ($att ? '' : '-image') . ': url("' . chemin_image($img) . '")' . ($att ? (' ' . $att) : '') . ';' |
|
| 3603 | - . ($size ? "background-size:{$size};" : '') |
|
| 3604 | - . "'"; |
|
| 3598 | + if ($size and is_numeric($size)) { |
|
| 3599 | + $size = trim($size) . 'px'; |
|
| 3600 | + } |
|
| 3601 | + return " style='background" . |
|
| 3602 | + ($att ? '' : '-image') . ': url("' . chemin_image($img) . '")' . ($att ? (' ' . $att) : '') . ';' |
|
| 3603 | + . ($size ? "background-size:{$size};" : '') |
|
| 3604 | + . "'"; |
|
| 3605 | 3605 | } |
| 3606 | 3606 | |
| 3607 | 3607 | |
| 3608 | 3608 | function helper_filtre_balise_img_svg_arguments($alt_or_size, $class_or_size, $size) { |
| 3609 | - $args = [$alt_or_size, $class_or_size, $size]; |
|
| 3610 | - while (is_null(end($args)) and count($args)) { |
|
| 3611 | - array_pop($args); |
|
| 3612 | - } |
|
| 3613 | - if (!count($args)) { |
|
| 3614 | - return [null, null, null]; |
|
| 3615 | - } |
|
| 3616 | - if (count($args) < 3) { |
|
| 3617 | - $maybe_size = array_pop($args); |
|
| 3618 | - // @2x |
|
| 3619 | - // @1.5x |
|
| 3620 | - // 512 |
|
| 3621 | - // 512x* |
|
| 3622 | - // 512x300 |
|
| 3623 | - if ( |
|
| 3624 | - !strlen($maybe_size) |
|
| 3625 | - or !preg_match(',^(@\d+(\.\d+)?x|\d+(x\*)?|\d+x\d+)$,', trim($maybe_size)) |
|
| 3626 | - ) { |
|
| 3627 | - $args[] = $maybe_size; |
|
| 3628 | - $maybe_size = null; |
|
| 3629 | - } |
|
| 3630 | - while (count($args) < 2) { |
|
| 3631 | - $args[] = null; // default alt or class |
|
| 3632 | - } |
|
| 3633 | - $args[] = $maybe_size; |
|
| 3634 | - } |
|
| 3635 | - return $args; |
|
| 3609 | + $args = [$alt_or_size, $class_or_size, $size]; |
|
| 3610 | + while (is_null(end($args)) and count($args)) { |
|
| 3611 | + array_pop($args); |
|
| 3612 | + } |
|
| 3613 | + if (!count($args)) { |
|
| 3614 | + return [null, null, null]; |
|
| 3615 | + } |
|
| 3616 | + if (count($args) < 3) { |
|
| 3617 | + $maybe_size = array_pop($args); |
|
| 3618 | + // @2x |
|
| 3619 | + // @1.5x |
|
| 3620 | + // 512 |
|
| 3621 | + // 512x* |
|
| 3622 | + // 512x300 |
|
| 3623 | + if ( |
|
| 3624 | + !strlen($maybe_size) |
|
| 3625 | + or !preg_match(',^(@\d+(\.\d+)?x|\d+(x\*)?|\d+x\d+)$,', trim($maybe_size)) |
|
| 3626 | + ) { |
|
| 3627 | + $args[] = $maybe_size; |
|
| 3628 | + $maybe_size = null; |
|
| 3629 | + } |
|
| 3630 | + while (count($args) < 2) { |
|
| 3631 | + $args[] = null; // default alt or class |
|
| 3632 | + } |
|
| 3633 | + $args[] = $maybe_size; |
|
| 3634 | + } |
|
| 3635 | + return $args; |
|
| 3636 | 3636 | } |
| 3637 | 3637 | |
| 3638 | 3638 | function helper_filtre_balise_img_svg_size($img, $size) { |
| 3639 | - // si size est de la forme '@2x' c'est un coeff multiplicateur sur la densite |
|
| 3640 | - if (strpos($size, '@') === 0 and substr($size, -1) === 'x') { |
|
| 3641 | - $coef = floatval(substr($size, 1, -1)); |
|
| 3642 | - [$h, $w] = taille_image($img); |
|
| 3643 | - $height = intval(round($h / $coef)); |
|
| 3644 | - $width = intval(round($w / $coef)); |
|
| 3645 | - } |
|
| 3646 | - // sinon c'est une valeur seule si image caree ou largeurxhauteur |
|
| 3647 | - else { |
|
| 3648 | - $size = explode('x', $size, 2); |
|
| 3649 | - $size = array_map('trim', $size); |
|
| 3650 | - $height = $width = intval(array_shift($size)); |
|
| 3651 | - |
|
| 3652 | - if (count($size) and reset($size)) { |
|
| 3653 | - $height = array_shift($size); |
|
| 3654 | - if ($height === '*') { |
|
| 3655 | - [$h, $w] = taille_image($img); |
|
| 3656 | - $height = intval(round($h * $width / $w)); |
|
| 3657 | - } |
|
| 3658 | - } |
|
| 3659 | - } |
|
| 3660 | - |
|
| 3661 | - return [$width, $height]; |
|
| 3639 | + // si size est de la forme '@2x' c'est un coeff multiplicateur sur la densite |
|
| 3640 | + if (strpos($size, '@') === 0 and substr($size, -1) === 'x') { |
|
| 3641 | + $coef = floatval(substr($size, 1, -1)); |
|
| 3642 | + [$h, $w] = taille_image($img); |
|
| 3643 | + $height = intval(round($h / $coef)); |
|
| 3644 | + $width = intval(round($w / $coef)); |
|
| 3645 | + } |
|
| 3646 | + // sinon c'est une valeur seule si image caree ou largeurxhauteur |
|
| 3647 | + else { |
|
| 3648 | + $size = explode('x', $size, 2); |
|
| 3649 | + $size = array_map('trim', $size); |
|
| 3650 | + $height = $width = intval(array_shift($size)); |
|
| 3651 | + |
|
| 3652 | + if (count($size) and reset($size)) { |
|
| 3653 | + $height = array_shift($size); |
|
| 3654 | + if ($height === '*') { |
|
| 3655 | + [$h, $w] = taille_image($img); |
|
| 3656 | + $height = intval(round($h * $width / $w)); |
|
| 3657 | + } |
|
| 3658 | + } |
|
| 3659 | + } |
|
| 3660 | + |
|
| 3661 | + return [$width, $height]; |
|
| 3662 | 3662 | } |
| 3663 | 3663 | |
| 3664 | 3664 | /** |
@@ -3694,43 +3694,43 @@ discard block |
||
| 3694 | 3694 | */ |
| 3695 | 3695 | function filtre_balise_img_dist($img, $alt = '', $class = null, $size = null) { |
| 3696 | 3696 | |
| 3697 | - [$alt, $class, $size] = helper_filtre_balise_img_svg_arguments($alt, $class, $size); |
|
| 3698 | - |
|
| 3699 | - $img = trim((string) $img); |
|
| 3700 | - if (strpos($img, '<img') === 0) { |
|
| 3701 | - if (!is_null($alt)) { |
|
| 3702 | - $img = inserer_attribut($img, 'alt', $alt); |
|
| 3703 | - } |
|
| 3704 | - if (!is_null($class)) { |
|
| 3705 | - if (strlen($class)) { |
|
| 3706 | - $img = inserer_attribut($img, 'class', $class); |
|
| 3707 | - } |
|
| 3708 | - else { |
|
| 3709 | - $img = vider_attribut($img, 'class'); |
|
| 3710 | - } |
|
| 3711 | - } |
|
| 3712 | - } |
|
| 3713 | - else { |
|
| 3714 | - $img = http_img_pack( |
|
| 3715 | - $img, |
|
| 3716 | - $alt, |
|
| 3717 | - $class ? " class='" . attribut_html($class) . "'" : '', |
|
| 3718 | - '', |
|
| 3719 | - ['chemin_image' => false, 'utiliser_suffixe_size' => false] |
|
| 3720 | - ); |
|
| 3721 | - if (is_null($alt)) { |
|
| 3722 | - $img = vider_attribut($img, 'alt'); |
|
| 3723 | - } |
|
| 3724 | - } |
|
| 3725 | - |
|
| 3726 | - if ($img and !is_null($size) and strlen($size = trim($size))) { |
|
| 3727 | - [$width, $height] = helper_filtre_balise_img_svg_size($img, $size); |
|
| 3728 | - |
|
| 3729 | - $img = inserer_attribut($img, 'width', $width); |
|
| 3730 | - $img = inserer_attribut($img, 'height', $height); |
|
| 3731 | - } |
|
| 3732 | - |
|
| 3733 | - return $img; |
|
| 3697 | + [$alt, $class, $size] = helper_filtre_balise_img_svg_arguments($alt, $class, $size); |
|
| 3698 | + |
|
| 3699 | + $img = trim((string) $img); |
|
| 3700 | + if (strpos($img, '<img') === 0) { |
|
| 3701 | + if (!is_null($alt)) { |
|
| 3702 | + $img = inserer_attribut($img, 'alt', $alt); |
|
| 3703 | + } |
|
| 3704 | + if (!is_null($class)) { |
|
| 3705 | + if (strlen($class)) { |
|
| 3706 | + $img = inserer_attribut($img, 'class', $class); |
|
| 3707 | + } |
|
| 3708 | + else { |
|
| 3709 | + $img = vider_attribut($img, 'class'); |
|
| 3710 | + } |
|
| 3711 | + } |
|
| 3712 | + } |
|
| 3713 | + else { |
|
| 3714 | + $img = http_img_pack( |
|
| 3715 | + $img, |
|
| 3716 | + $alt, |
|
| 3717 | + $class ? " class='" . attribut_html($class) . "'" : '', |
|
| 3718 | + '', |
|
| 3719 | + ['chemin_image' => false, 'utiliser_suffixe_size' => false] |
|
| 3720 | + ); |
|
| 3721 | + if (is_null($alt)) { |
|
| 3722 | + $img = vider_attribut($img, 'alt'); |
|
| 3723 | + } |
|
| 3724 | + } |
|
| 3725 | + |
|
| 3726 | + if ($img and !is_null($size) and strlen($size = trim($size))) { |
|
| 3727 | + [$width, $height] = helper_filtre_balise_img_svg_size($img, $size); |
|
| 3728 | + |
|
| 3729 | + $img = inserer_attribut($img, 'width', $width); |
|
| 3730 | + $img = inserer_attribut($img, 'height', $height); |
|
| 3731 | + } |
|
| 3732 | + |
|
| 3733 | + return $img; |
|
| 3734 | 3734 | } |
| 3735 | 3735 | |
| 3736 | 3736 | |
@@ -3764,80 +3764,80 @@ discard block |
||
| 3764 | 3764 | */ |
| 3765 | 3765 | function filtre_balise_svg_dist($img, $alt = '', $class = null, $size = null) { |
| 3766 | 3766 | |
| 3767 | - $svg = null; |
|
| 3768 | - $img = trim($img); |
|
| 3769 | - $img_file = $img; |
|
| 3770 | - if (strpos($img, '<svg') === false) { |
|
| 3771 | - if ($p = strpos($img_file, '?')) { |
|
| 3772 | - $img_file = substr($img_file, 0, $p); |
|
| 3773 | - } |
|
| 3774 | - |
|
| 3775 | - // ne jamais operer directement sur une image distante pour des raisons de perfo |
|
| 3776 | - // la copie locale a toutes les chances d'etre la ou de resservir |
|
| 3777 | - if (tester_url_absolue($img_file)) { |
|
| 3778 | - include_spip('inc/distant'); |
|
| 3779 | - $fichier = copie_locale($img_file); |
|
| 3780 | - $img_file = ($fichier ? _DIR_RACINE . $fichier : $img_file); |
|
| 3781 | - } |
|
| 3782 | - |
|
| 3783 | - if ( |
|
| 3784 | - !$img_file |
|
| 3785 | - or !file_exists($img_file) |
|
| 3786 | - or !$svg = file_get_contents($img_file) |
|
| 3787 | - ) { |
|
| 3788 | - return ''; |
|
| 3789 | - } |
|
| 3790 | - } |
|
| 3791 | - |
|
| 3792 | - if (!preg_match(",<svg\b[^>]*>,UimsS", $svg, $match)) { |
|
| 3793 | - return ''; |
|
| 3794 | - } |
|
| 3795 | - |
|
| 3796 | - [$alt, $class, $size] = helper_filtre_balise_img_svg_arguments($alt, $class, $size); |
|
| 3797 | - |
|
| 3798 | - $balise_svg = $match[0]; |
|
| 3799 | - $balise_svg_source = $balise_svg; |
|
| 3800 | - |
|
| 3801 | - // entete XML à supprimer |
|
| 3802 | - $svg = preg_replace(',^\s*<\?xml[^>]*\?' . '>,', '', $svg); |
|
| 3803 | - |
|
| 3804 | - // IE est toujours mon ami |
|
| 3805 | - $balise_svg = inserer_attribut($balise_svg, 'focusable', 'false'); |
|
| 3806 | - |
|
| 3807 | - // regler la classe |
|
| 3808 | - if (!is_null($class)) { |
|
| 3809 | - if (strlen($class)) { |
|
| 3810 | - $balise_svg = inserer_attribut($balise_svg, 'class', $class); |
|
| 3811 | - } |
|
| 3812 | - else { |
|
| 3813 | - $balise_svg = vider_attribut($balise_svg, 'class'); |
|
| 3814 | - } |
|
| 3815 | - } |
|
| 3816 | - |
|
| 3817 | - // regler le alt |
|
| 3818 | - if ($alt) { |
|
| 3819 | - $balise_svg = inserer_attribut($balise_svg, 'role', 'img'); |
|
| 3820 | - $id = 'img-svg-title-' . substr(md5("$img_file:$svg:$alt"), 0, 4); |
|
| 3821 | - $balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id); |
|
| 3822 | - $title = "<title id=\"$id\">" . entites_html($alt) . "</title>\n"; |
|
| 3823 | - $balise_svg .= $title; |
|
| 3824 | - } |
|
| 3825 | - else { |
|
| 3826 | - $balise_svg = inserer_attribut($balise_svg, 'aria-hidden', 'true'); |
|
| 3827 | - } |
|
| 3828 | - |
|
| 3829 | - $svg = str_replace($balise_svg_source, $balise_svg, $svg); |
|
| 3830 | - |
|
| 3831 | - if (!is_null($size) and strlen($size = trim($size))) { |
|
| 3832 | - [$width, $height] = helper_filtre_balise_img_svg_size($svg, $size); |
|
| 3833 | - |
|
| 3834 | - if (!function_exists('svg_redimensionner')) { |
|
| 3835 | - include_spip('inc/svg'); |
|
| 3836 | - } |
|
| 3837 | - $svg = svg_redimensionner($svg, $width, $height); |
|
| 3838 | - } |
|
| 3839 | - |
|
| 3840 | - return $svg; |
|
| 3767 | + $svg = null; |
|
| 3768 | + $img = trim($img); |
|
| 3769 | + $img_file = $img; |
|
| 3770 | + if (strpos($img, '<svg') === false) { |
|
| 3771 | + if ($p = strpos($img_file, '?')) { |
|
| 3772 | + $img_file = substr($img_file, 0, $p); |
|
| 3773 | + } |
|
| 3774 | + |
|
| 3775 | + // ne jamais operer directement sur une image distante pour des raisons de perfo |
|
| 3776 | + // la copie locale a toutes les chances d'etre la ou de resservir |
|
| 3777 | + if (tester_url_absolue($img_file)) { |
|
| 3778 | + include_spip('inc/distant'); |
|
| 3779 | + $fichier = copie_locale($img_file); |
|
| 3780 | + $img_file = ($fichier ? _DIR_RACINE . $fichier : $img_file); |
|
| 3781 | + } |
|
| 3782 | + |
|
| 3783 | + if ( |
|
| 3784 | + !$img_file |
|
| 3785 | + or !file_exists($img_file) |
|
| 3786 | + or !$svg = file_get_contents($img_file) |
|
| 3787 | + ) { |
|
| 3788 | + return ''; |
|
| 3789 | + } |
|
| 3790 | + } |
|
| 3791 | + |
|
| 3792 | + if (!preg_match(",<svg\b[^>]*>,UimsS", $svg, $match)) { |
|
| 3793 | + return ''; |
|
| 3794 | + } |
|
| 3795 | + |
|
| 3796 | + [$alt, $class, $size] = helper_filtre_balise_img_svg_arguments($alt, $class, $size); |
|
| 3797 | + |
|
| 3798 | + $balise_svg = $match[0]; |
|
| 3799 | + $balise_svg_source = $balise_svg; |
|
| 3800 | + |
|
| 3801 | + // entete XML à supprimer |
|
| 3802 | + $svg = preg_replace(',^\s*<\?xml[^>]*\?' . '>,', '', $svg); |
|
| 3803 | + |
|
| 3804 | + // IE est toujours mon ami |
|
| 3805 | + $balise_svg = inserer_attribut($balise_svg, 'focusable', 'false'); |
|
| 3806 | + |
|
| 3807 | + // regler la classe |
|
| 3808 | + if (!is_null($class)) { |
|
| 3809 | + if (strlen($class)) { |
|
| 3810 | + $balise_svg = inserer_attribut($balise_svg, 'class', $class); |
|
| 3811 | + } |
|
| 3812 | + else { |
|
| 3813 | + $balise_svg = vider_attribut($balise_svg, 'class'); |
|
| 3814 | + } |
|
| 3815 | + } |
|
| 3816 | + |
|
| 3817 | + // regler le alt |
|
| 3818 | + if ($alt) { |
|
| 3819 | + $balise_svg = inserer_attribut($balise_svg, 'role', 'img'); |
|
| 3820 | + $id = 'img-svg-title-' . substr(md5("$img_file:$svg:$alt"), 0, 4); |
|
| 3821 | + $balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id); |
|
| 3822 | + $title = "<title id=\"$id\">" . entites_html($alt) . "</title>\n"; |
|
| 3823 | + $balise_svg .= $title; |
|
| 3824 | + } |
|
| 3825 | + else { |
|
| 3826 | + $balise_svg = inserer_attribut($balise_svg, 'aria-hidden', 'true'); |
|
| 3827 | + } |
|
| 3828 | + |
|
| 3829 | + $svg = str_replace($balise_svg_source, $balise_svg, $svg); |
|
| 3830 | + |
|
| 3831 | + if (!is_null($size) and strlen($size = trim($size))) { |
|
| 3832 | + [$width, $height] = helper_filtre_balise_img_svg_size($svg, $size); |
|
| 3833 | + |
|
| 3834 | + if (!function_exists('svg_redimensionner')) { |
|
| 3835 | + include_spip('inc/svg'); |
|
| 3836 | + } |
|
| 3837 | + $svg = svg_redimensionner($svg, $width, $height); |
|
| 3838 | + } |
|
| 3839 | + |
|
| 3840 | + return $svg; |
|
| 3841 | 3841 | } |
| 3842 | 3842 | |
| 3843 | 3843 | |
@@ -3863,18 +3863,18 @@ discard block |
||
| 3863 | 3863 | * Code HTML résultant |
| 3864 | 3864 | **/ |
| 3865 | 3865 | function filtre_foreach_dist($tableau, $modele = 'foreach') { |
| 3866 | - $texte = ''; |
|
| 3867 | - if (is_array($tableau)) { |
|
| 3868 | - foreach ($tableau as $k => $v) { |
|
| 3869 | - $res = recuperer_fond( |
|
| 3870 | - 'modeles/' . $modele, |
|
| 3871 | - array_merge(['cle' => $k], (is_array($v) ? $v : ['valeur' => $v])) |
|
| 3872 | - ); |
|
| 3873 | - $texte .= $res; |
|
| 3874 | - } |
|
| 3875 | - } |
|
| 3866 | + $texte = ''; |
|
| 3867 | + if (is_array($tableau)) { |
|
| 3868 | + foreach ($tableau as $k => $v) { |
|
| 3869 | + $res = recuperer_fond( |
|
| 3870 | + 'modeles/' . $modele, |
|
| 3871 | + array_merge(['cle' => $k], (is_array($v) ? $v : ['valeur' => $v])) |
|
| 3872 | + ); |
|
| 3873 | + $texte .= $res; |
|
| 3874 | + } |
|
| 3875 | + } |
|
| 3876 | 3876 | |
| 3877 | - return $texte; |
|
| 3877 | + return $texte; |
|
| 3878 | 3878 | } |
| 3879 | 3879 | |
| 3880 | 3880 | |
@@ -3899,37 +3899,37 @@ discard block |
||
| 3899 | 3899 | * - tout : retourne toutes les informations du plugin actif |
| 3900 | 3900 | **/ |
| 3901 | 3901 | function filtre_info_plugin_dist($plugin, $type_info, $reload = false) { |
| 3902 | - include_spip('inc/plugin'); |
|
| 3903 | - $plugin = strtoupper($plugin); |
|
| 3904 | - $plugins_actifs = liste_plugin_actifs(); |
|
| 3905 | - |
|
| 3906 | - if (!$plugin) { |
|
| 3907 | - return serialize(array_keys($plugins_actifs)); |
|
| 3908 | - } elseif (empty($plugins_actifs[$plugin]) and !$reload) { |
|
| 3909 | - return ''; |
|
| 3910 | - } elseif (($type_info == 'est_actif') and !$reload) { |
|
| 3911 | - return $plugins_actifs[$plugin] ? 1 : 0; |
|
| 3912 | - } elseif (isset($plugins_actifs[$plugin][$type_info]) and !$reload) { |
|
| 3913 | - return $plugins_actifs[$plugin][$type_info]; |
|
| 3914 | - } else { |
|
| 3915 | - $get_infos = charger_fonction('get_infos', 'plugins'); |
|
| 3916 | - // On prend en compte les extensions |
|
| 3917 | - if (!is_dir($plugins_actifs[$plugin]['dir_type'])) { |
|
| 3918 | - $dir_plugins = constant($plugins_actifs[$plugin]['dir_type']); |
|
| 3919 | - } else { |
|
| 3920 | - $dir_plugins = $plugins_actifs[$plugin]['dir_type']; |
|
| 3921 | - } |
|
| 3922 | - if (!$infos = $get_infos($plugins_actifs[$plugin]['dir'], $reload, $dir_plugins)) { |
|
| 3923 | - return ''; |
|
| 3924 | - } |
|
| 3925 | - if ($type_info == 'tout') { |
|
| 3926 | - return $infos; |
|
| 3927 | - } elseif ($type_info == 'est_actif') { |
|
| 3928 | - return $infos ? 1 : 0; |
|
| 3929 | - } else { |
|
| 3930 | - return strval($infos[$type_info]); |
|
| 3931 | - } |
|
| 3932 | - } |
|
| 3902 | + include_spip('inc/plugin'); |
|
| 3903 | + $plugin = strtoupper($plugin); |
|
| 3904 | + $plugins_actifs = liste_plugin_actifs(); |
|
| 3905 | + |
|
| 3906 | + if (!$plugin) { |
|
| 3907 | + return serialize(array_keys($plugins_actifs)); |
|
| 3908 | + } elseif (empty($plugins_actifs[$plugin]) and !$reload) { |
|
| 3909 | + return ''; |
|
| 3910 | + } elseif (($type_info == 'est_actif') and !$reload) { |
|
| 3911 | + return $plugins_actifs[$plugin] ? 1 : 0; |
|
| 3912 | + } elseif (isset($plugins_actifs[$plugin][$type_info]) and !$reload) { |
|
| 3913 | + return $plugins_actifs[$plugin][$type_info]; |
|
| 3914 | + } else { |
|
| 3915 | + $get_infos = charger_fonction('get_infos', 'plugins'); |
|
| 3916 | + // On prend en compte les extensions |
|
| 3917 | + if (!is_dir($plugins_actifs[$plugin]['dir_type'])) { |
|
| 3918 | + $dir_plugins = constant($plugins_actifs[$plugin]['dir_type']); |
|
| 3919 | + } else { |
|
| 3920 | + $dir_plugins = $plugins_actifs[$plugin]['dir_type']; |
|
| 3921 | + } |
|
| 3922 | + if (!$infos = $get_infos($plugins_actifs[$plugin]['dir'], $reload, $dir_plugins)) { |
|
| 3923 | + return ''; |
|
| 3924 | + } |
|
| 3925 | + if ($type_info == 'tout') { |
|
| 3926 | + return $infos; |
|
| 3927 | + } elseif ($type_info == 'est_actif') { |
|
| 3928 | + return $infos ? 1 : 0; |
|
| 3929 | + } else { |
|
| 3930 | + return strval($infos[$type_info]); |
|
| 3931 | + } |
|
| 3932 | + } |
|
| 3933 | 3933 | } |
| 3934 | 3934 | |
| 3935 | 3935 | |
@@ -3956,9 +3956,9 @@ discard block |
||
| 3956 | 3956 | * Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent) |
| 3957 | 3957 | */ |
| 3958 | 3958 | function puce_changement_statut($id_objet, $statut, $id_rubrique, $type, $ajax = false) { |
| 3959 | - $puce_statut = charger_fonction('puce_statut', 'inc'); |
|
| 3959 | + $puce_statut = charger_fonction('puce_statut', 'inc'); |
|
| 3960 | 3960 | |
| 3961 | - return $puce_statut($id_objet, $statut, $id_rubrique, $type, $ajax); |
|
| 3961 | + return $puce_statut($id_objet, $statut, $id_rubrique, $type, $ajax); |
|
| 3962 | 3962 | } |
| 3963 | 3963 | |
| 3964 | 3964 | |
@@ -3988,19 +3988,19 @@ discard block |
||
| 3988 | 3988 | * Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent) |
| 3989 | 3989 | */ |
| 3990 | 3990 | function filtre_puce_statut_dist($statut, $objet, $id_objet = 0, $id_parent = 0) { |
| 3991 | - static $puce_statut = null; |
|
| 3992 | - if (!$puce_statut) { |
|
| 3993 | - $puce_statut = charger_fonction('puce_statut', 'inc'); |
|
| 3994 | - } |
|
| 3991 | + static $puce_statut = null; |
|
| 3992 | + if (!$puce_statut) { |
|
| 3993 | + $puce_statut = charger_fonction('puce_statut', 'inc'); |
|
| 3994 | + } |
|
| 3995 | 3995 | |
| 3996 | - return $puce_statut( |
|
| 3997 | - $id_objet, |
|
| 3998 | - $statut, |
|
| 3999 | - $id_parent, |
|
| 4000 | - $objet, |
|
| 4001 | - false, |
|
| 4002 | - objet_info($objet, 'editable') ? _ACTIVER_PUCE_RAPIDE : false |
|
| 4003 | - ); |
|
| 3996 | + return $puce_statut( |
|
| 3997 | + $id_objet, |
|
| 3998 | + $statut, |
|
| 3999 | + $id_parent, |
|
| 4000 | + $objet, |
|
| 4001 | + false, |
|
| 4002 | + objet_info($objet, 'editable') ? _ACTIVER_PUCE_RAPIDE : false |
|
| 4003 | + ); |
|
| 4004 | 4004 | } |
| 4005 | 4005 | |
| 4006 | 4006 | |
@@ -4027,98 +4027,98 @@ discard block |
||
| 4027 | 4027 | * hash du contexte |
| 4028 | 4028 | */ |
| 4029 | 4029 | function encoder_contexte_ajax($c, $form = '', $emboite = null, $ajaxid = '') { |
| 4030 | - $env = null; |
|
| 4031 | - if ( |
|
| 4032 | - is_string($c) |
|
| 4033 | - and @unserialize($c) !== false |
|
| 4034 | - ) { |
|
| 4035 | - $c = unserialize($c); |
|
| 4036 | - } |
|
| 4037 | - |
|
| 4038 | - // supprimer les parametres debut_x |
|
| 4039 | - // pour que la pagination ajax ne soit pas plantee |
|
| 4040 | - // si on charge la page &debut_x=1 : car alors en cliquant sur l'item 0, |
|
| 4041 | - // le debut_x=0 n'existe pas, et on resterait sur 1 |
|
| 4042 | - if (is_array($c)) { |
|
| 4043 | - foreach ($c as $k => $v) { |
|
| 4044 | - if (strpos($k, 'debut_') === 0) { |
|
| 4045 | - unset($c[$k]); |
|
| 4046 | - } |
|
| 4047 | - } |
|
| 4048 | - } |
|
| 4049 | - |
|
| 4050 | - if (!function_exists('calculer_cle_action')) { |
|
| 4051 | - include_spip('inc/securiser_action'); |
|
| 4052 | - } |
|
| 4053 | - |
|
| 4054 | - $c = serialize($c); |
|
| 4055 | - $cle = calculer_cle_action($form . $c); |
|
| 4056 | - $c = "$cle:$c"; |
|
| 4057 | - |
|
| 4058 | - // on ne stocke pas les contextes dans des fichiers en cache |
|
| 4059 | - // par defaut, sauf si cette configuration a été forcée |
|
| 4060 | - // OU que la longueur de l’argument géneré est plus long |
|
| 4061 | - // que ce qui est toléré. |
|
| 4062 | - $cache_contextes_ajax = (defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX); |
|
| 4063 | - if (!$cache_contextes_ajax) { |
|
| 4064 | - $env = $c; |
|
| 4065 | - if (function_exists('gzdeflate') && function_exists('gzinflate')) { |
|
| 4066 | - $env = gzdeflate($env); |
|
| 4067 | - } |
|
| 4068 | - $env = _xor($env); |
|
| 4069 | - $env = base64_encode($env); |
|
| 4070 | - $len = strlen($env); |
|
| 4071 | - // Si l’url est trop longue pour le navigateur |
|
| 4072 | - $max_len = _CACHE_CONTEXTES_AJAX_SUR_LONGUEUR; |
|
| 4073 | - if ($len > $max_len) { |
|
| 4074 | - $cache_contextes_ajax = true; |
|
| 4075 | - spip_log( |
|
| 4076 | - 'Contextes AJAX forces en fichiers !' |
|
| 4077 | - . ' Cela arrive lorsque la valeur du contexte' |
|
| 4078 | - . " depasse la longueur maximale autorisee ($max_len). Ici : $len.", |
|
| 4079 | - _LOG_AVERTISSEMENT |
|
| 4080 | - ); |
|
| 4081 | - } |
|
| 4082 | - // Sinon si Suhosin est actif et a une la valeur maximale des variables en GET... |
|
| 4083 | - elseif ( |
|
| 4084 | - $max_len = @ini_get('suhosin.get.max_value_length') |
|
| 4085 | - and $max_len < $len |
|
| 4086 | - ) { |
|
| 4087 | - $cache_contextes_ajax = true; |
|
| 4088 | - spip_log('Contextes AJAX forces en fichiers !' |
|
| 4089 | - . ' Cela arrive lorsque la valeur du contexte' |
|
| 4090 | - . ' depasse la longueur maximale autorisee par Suhosin' |
|
| 4091 | - . " ($max_len) dans 'suhosin.get.max_value_length'. Ici : $len." |
|
| 4092 | - . ' Vous devriez modifier les parametres de Suhosin' |
|
| 4093 | - . ' pour accepter au moins 1024 caracteres.', _LOG_AVERTISSEMENT); |
|
| 4094 | - } |
|
| 4095 | - } |
|
| 4096 | - |
|
| 4097 | - if ($cache_contextes_ajax) { |
|
| 4098 | - $dir = sous_repertoire(_DIR_CACHE, 'contextes'); |
|
| 4099 | - // stocker les contextes sur disque et ne passer qu'un hash dans l'url |
|
| 4100 | - $md5 = md5($c); |
|
| 4101 | - ecrire_fichier("$dir/c$md5", $c); |
|
| 4102 | - $env = $md5; |
|
| 4103 | - } |
|
| 4104 | - |
|
| 4105 | - if ($emboite === null) { |
|
| 4106 | - return $env; |
|
| 4107 | - } |
|
| 4108 | - if (!trim($emboite)) { |
|
| 4109 | - return ''; |
|
| 4110 | - } |
|
| 4111 | - // toujours encoder l'url source dans le bloc ajax |
|
| 4112 | - $r = self(); |
|
| 4113 | - $r = ' data-origin="' . $r . '"'; |
|
| 4114 | - $class = 'ajaxbloc'; |
|
| 4115 | - if ($ajaxid and is_string($ajaxid)) { |
|
| 4116 | - // ajaxid est normalement conforme a un nom de classe css |
|
| 4117 | - // on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution |
|
| 4118 | - $class .= ' ajax-id-' . entites_html($ajaxid); |
|
| 4119 | - } |
|
| 4120 | - |
|
| 4121 | - return "<div class='$class' " . "data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n"; |
|
| 4030 | + $env = null; |
|
| 4031 | + if ( |
|
| 4032 | + is_string($c) |
|
| 4033 | + and @unserialize($c) !== false |
|
| 4034 | + ) { |
|
| 4035 | + $c = unserialize($c); |
|
| 4036 | + } |
|
| 4037 | + |
|
| 4038 | + // supprimer les parametres debut_x |
|
| 4039 | + // pour que la pagination ajax ne soit pas plantee |
|
| 4040 | + // si on charge la page &debut_x=1 : car alors en cliquant sur l'item 0, |
|
| 4041 | + // le debut_x=0 n'existe pas, et on resterait sur 1 |
|
| 4042 | + if (is_array($c)) { |
|
| 4043 | + foreach ($c as $k => $v) { |
|
| 4044 | + if (strpos($k, 'debut_') === 0) { |
|
| 4045 | + unset($c[$k]); |
|
| 4046 | + } |
|
| 4047 | + } |
|
| 4048 | + } |
|
| 4049 | + |
|
| 4050 | + if (!function_exists('calculer_cle_action')) { |
|
| 4051 | + include_spip('inc/securiser_action'); |
|
| 4052 | + } |
|
| 4053 | + |
|
| 4054 | + $c = serialize($c); |
|
| 4055 | + $cle = calculer_cle_action($form . $c); |
|
| 4056 | + $c = "$cle:$c"; |
|
| 4057 | + |
|
| 4058 | + // on ne stocke pas les contextes dans des fichiers en cache |
|
| 4059 | + // par defaut, sauf si cette configuration a été forcée |
|
| 4060 | + // OU que la longueur de l’argument géneré est plus long |
|
| 4061 | + // que ce qui est toléré. |
|
| 4062 | + $cache_contextes_ajax = (defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX); |
|
| 4063 | + if (!$cache_contextes_ajax) { |
|
| 4064 | + $env = $c; |
|
| 4065 | + if (function_exists('gzdeflate') && function_exists('gzinflate')) { |
|
| 4066 | + $env = gzdeflate($env); |
|
| 4067 | + } |
|
| 4068 | + $env = _xor($env); |
|
| 4069 | + $env = base64_encode($env); |
|
| 4070 | + $len = strlen($env); |
|
| 4071 | + // Si l’url est trop longue pour le navigateur |
|
| 4072 | + $max_len = _CACHE_CONTEXTES_AJAX_SUR_LONGUEUR; |
|
| 4073 | + if ($len > $max_len) { |
|
| 4074 | + $cache_contextes_ajax = true; |
|
| 4075 | + spip_log( |
|
| 4076 | + 'Contextes AJAX forces en fichiers !' |
|
| 4077 | + . ' Cela arrive lorsque la valeur du contexte' |
|
| 4078 | + . " depasse la longueur maximale autorisee ($max_len). Ici : $len.", |
|
| 4079 | + _LOG_AVERTISSEMENT |
|
| 4080 | + ); |
|
| 4081 | + } |
|
| 4082 | + // Sinon si Suhosin est actif et a une la valeur maximale des variables en GET... |
|
| 4083 | + elseif ( |
|
| 4084 | + $max_len = @ini_get('suhosin.get.max_value_length') |
|
| 4085 | + and $max_len < $len |
|
| 4086 | + ) { |
|
| 4087 | + $cache_contextes_ajax = true; |
|
| 4088 | + spip_log('Contextes AJAX forces en fichiers !' |
|
| 4089 | + . ' Cela arrive lorsque la valeur du contexte' |
|
| 4090 | + . ' depasse la longueur maximale autorisee par Suhosin' |
|
| 4091 | + . " ($max_len) dans 'suhosin.get.max_value_length'. Ici : $len." |
|
| 4092 | + . ' Vous devriez modifier les parametres de Suhosin' |
|
| 4093 | + . ' pour accepter au moins 1024 caracteres.', _LOG_AVERTISSEMENT); |
|
| 4094 | + } |
|
| 4095 | + } |
|
| 4096 | + |
|
| 4097 | + if ($cache_contextes_ajax) { |
|
| 4098 | + $dir = sous_repertoire(_DIR_CACHE, 'contextes'); |
|
| 4099 | + // stocker les contextes sur disque et ne passer qu'un hash dans l'url |
|
| 4100 | + $md5 = md5($c); |
|
| 4101 | + ecrire_fichier("$dir/c$md5", $c); |
|
| 4102 | + $env = $md5; |
|
| 4103 | + } |
|
| 4104 | + |
|
| 4105 | + if ($emboite === null) { |
|
| 4106 | + return $env; |
|
| 4107 | + } |
|
| 4108 | + if (!trim($emboite)) { |
|
| 4109 | + return ''; |
|
| 4110 | + } |
|
| 4111 | + // toujours encoder l'url source dans le bloc ajax |
|
| 4112 | + $r = self(); |
|
| 4113 | + $r = ' data-origin="' . $r . '"'; |
|
| 4114 | + $class = 'ajaxbloc'; |
|
| 4115 | + if ($ajaxid and is_string($ajaxid)) { |
|
| 4116 | + // ajaxid est normalement conforme a un nom de classe css |
|
| 4117 | + // on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution |
|
| 4118 | + $class .= ' ajax-id-' . entites_html($ajaxid); |
|
| 4119 | + } |
|
| 4120 | + |
|
| 4121 | + return "<div class='$class' " . "data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n"; |
|
| 4122 | 4122 | } |
| 4123 | 4123 | |
| 4124 | 4124 | /** |
@@ -4138,37 +4138,37 @@ discard block |
||
| 4138 | 4138 | * - false : erreur de décodage |
| 4139 | 4139 | */ |
| 4140 | 4140 | function decoder_contexte_ajax($c, $form = '') { |
| 4141 | - if (!function_exists('calculer_cle_action')) { |
|
| 4142 | - include_spip('inc/securiser_action'); |
|
| 4143 | - } |
|
| 4144 | - if ( |
|
| 4145 | - ((defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX) or strlen($c) == 32) |
|
| 4146 | - and $dir = sous_repertoire(_DIR_CACHE, 'contextes') |
|
| 4147 | - and lire_fichier("$dir/c$c", $contexte) |
|
| 4148 | - ) { |
|
| 4149 | - $c = $contexte; |
|
| 4150 | - } else { |
|
| 4151 | - $c = @base64_decode($c); |
|
| 4152 | - $c = _xor($c); |
|
| 4153 | - if (function_exists('gzdeflate') && function_exists('gzinflate')) { |
|
| 4154 | - $c = @gzinflate($c); |
|
| 4155 | - } |
|
| 4156 | - } |
|
| 4157 | - |
|
| 4158 | - // extraire la signature en debut de contexte |
|
| 4159 | - // et la verifier avant de deserializer |
|
| 4160 | - // format : signature:donneesserializees |
|
| 4161 | - if ($p = strpos($c, ':')) { |
|
| 4162 | - $cle = substr($c, 0, $p); |
|
| 4163 | - $c = substr($c, $p + 1); |
|
| 4164 | - |
|
| 4165 | - if ($cle == calculer_cle_action($form . $c)) { |
|
| 4166 | - $env = @unserialize($c); |
|
| 4167 | - return $env; |
|
| 4168 | - } |
|
| 4169 | - } |
|
| 4170 | - |
|
| 4171 | - return false; |
|
| 4141 | + if (!function_exists('calculer_cle_action')) { |
|
| 4142 | + include_spip('inc/securiser_action'); |
|
| 4143 | + } |
|
| 4144 | + if ( |
|
| 4145 | + ((defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX) or strlen($c) == 32) |
|
| 4146 | + and $dir = sous_repertoire(_DIR_CACHE, 'contextes') |
|
| 4147 | + and lire_fichier("$dir/c$c", $contexte) |
|
| 4148 | + ) { |
|
| 4149 | + $c = $contexte; |
|
| 4150 | + } else { |
|
| 4151 | + $c = @base64_decode($c); |
|
| 4152 | + $c = _xor($c); |
|
| 4153 | + if (function_exists('gzdeflate') && function_exists('gzinflate')) { |
|
| 4154 | + $c = @gzinflate($c); |
|
| 4155 | + } |
|
| 4156 | + } |
|
| 4157 | + |
|
| 4158 | + // extraire la signature en debut de contexte |
|
| 4159 | + // et la verifier avant de deserializer |
|
| 4160 | + // format : signature:donneesserializees |
|
| 4161 | + if ($p = strpos($c, ':')) { |
|
| 4162 | + $cle = substr($c, 0, $p); |
|
| 4163 | + $c = substr($c, $p + 1); |
|
| 4164 | + |
|
| 4165 | + if ($cle == calculer_cle_action($form . $c)) { |
|
| 4166 | + $env = @unserialize($c); |
|
| 4167 | + return $env; |
|
| 4168 | + } |
|
| 4169 | + } |
|
| 4170 | + |
|
| 4171 | + return false; |
|
| 4172 | 4172 | } |
| 4173 | 4173 | |
| 4174 | 4174 | |
@@ -4186,20 +4186,20 @@ discard block |
||
| 4186 | 4186 | * Message décrypté ou encrypté |
| 4187 | 4187 | **/ |
| 4188 | 4188 | function _xor($message, $key = null) { |
| 4189 | - if (is_null($key)) { |
|
| 4190 | - if (!function_exists('calculer_cle_action')) { |
|
| 4191 | - include_spip('inc/securiser_action'); |
|
| 4192 | - } |
|
| 4193 | - $key = pack('H*', calculer_cle_action('_xor')); |
|
| 4194 | - } |
|
| 4189 | + if (is_null($key)) { |
|
| 4190 | + if (!function_exists('calculer_cle_action')) { |
|
| 4191 | + include_spip('inc/securiser_action'); |
|
| 4192 | + } |
|
| 4193 | + $key = pack('H*', calculer_cle_action('_xor')); |
|
| 4194 | + } |
|
| 4195 | 4195 | |
| 4196 | - $keylen = strlen($key); |
|
| 4197 | - $messagelen = strlen($message); |
|
| 4198 | - for ($i = 0; $i < $messagelen; $i++) { |
|
| 4199 | - $message[$i] = ~($message[$i] ^ $key[$i % $keylen]); |
|
| 4200 | - } |
|
| 4196 | + $keylen = strlen($key); |
|
| 4197 | + $messagelen = strlen($message); |
|
| 4198 | + for ($i = 0; $i < $messagelen; $i++) { |
|
| 4199 | + $message[$i] = ~($message[$i] ^ $key[$i % $keylen]); |
|
| 4200 | + } |
|
| 4201 | 4201 | |
| 4202 | - return $message; |
|
| 4202 | + return $message; |
|
| 4203 | 4203 | } |
| 4204 | 4204 | |
| 4205 | 4205 | /** |
@@ -4213,7 +4213,7 @@ discard block |
||
| 4213 | 4213 | * @return string |
| 4214 | 4214 | */ |
| 4215 | 4215 | function url_reponse_forum($texte) { |
| 4216 | - return $texte; |
|
| 4216 | + return $texte; |
|
| 4217 | 4217 | } |
| 4218 | 4218 | |
| 4219 | 4219 | /** |
@@ -4227,7 +4227,7 @@ discard block |
||
| 4227 | 4227 | * @return string |
| 4228 | 4228 | */ |
| 4229 | 4229 | function url_rss_forum($texte) { |
| 4230 | - return $texte; |
|
| 4230 | + return $texte; |
|
| 4231 | 4231 | } |
| 4232 | 4232 | |
| 4233 | 4233 | |
@@ -4266,37 +4266,37 @@ discard block |
||
| 4266 | 4266 | * Code HTML |
| 4267 | 4267 | */ |
| 4268 | 4268 | function lien_ou_expose($url, $libelle = null, $on = false, $class = '', $title = '', $rel = '', $evt = '') { |
| 4269 | - if ($on) { |
|
| 4270 | - $bal = 'strong'; |
|
| 4271 | - $class = ''; |
|
| 4272 | - $att = ''; |
|
| 4273 | - // si $on passe la balise et optionnelement une ou ++classe |
|
| 4274 | - // a.active span.selected.active etc.... |
|
| 4275 | - if (is_string($on) and (strncmp($on, 'a', 1) == 0 or strncmp($on, 'span', 4) == 0 or strncmp($on, 'strong', 6) == 0)) { |
|
| 4276 | - $on = explode('.', $on); |
|
| 4277 | - // on verifie que c'est exactement une des 3 balises a, span ou strong |
|
| 4278 | - if (in_array(reset($on), ['a', 'span', 'strong'])) { |
|
| 4279 | - $bal = array_shift($on); |
|
| 4280 | - $class = implode(' ', $on); |
|
| 4281 | - if ($bal == 'a') { |
|
| 4282 | - $att = 'href="#" '; |
|
| 4283 | - } |
|
| 4284 | - } |
|
| 4285 | - } |
|
| 4286 | - $att .= 'class="' . ($class ? attribut_html($class) . ' ' : '') . (defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on') . '"'; |
|
| 4287 | - } else { |
|
| 4288 | - $bal = 'a'; |
|
| 4289 | - $att = "href='$url'" |
|
| 4290 | - . ($title ? " title='" . attribut_html($title) . "'" : '') |
|
| 4291 | - . ($class ? " class='" . attribut_html($class) . "'" : '') |
|
| 4292 | - . ($rel ? " rel='" . attribut_html($rel) . "'" : '') |
|
| 4293 | - . $evt; |
|
| 4294 | - } |
|
| 4295 | - if ($libelle === null) { |
|
| 4296 | - $libelle = $url; |
|
| 4297 | - } |
|
| 4298 | - |
|
| 4299 | - return "<$bal $att>$libelle</$bal>"; |
|
| 4269 | + if ($on) { |
|
| 4270 | + $bal = 'strong'; |
|
| 4271 | + $class = ''; |
|
| 4272 | + $att = ''; |
|
| 4273 | + // si $on passe la balise et optionnelement une ou ++classe |
|
| 4274 | + // a.active span.selected.active etc.... |
|
| 4275 | + if (is_string($on) and (strncmp($on, 'a', 1) == 0 or strncmp($on, 'span', 4) == 0 or strncmp($on, 'strong', 6) == 0)) { |
|
| 4276 | + $on = explode('.', $on); |
|
| 4277 | + // on verifie que c'est exactement une des 3 balises a, span ou strong |
|
| 4278 | + if (in_array(reset($on), ['a', 'span', 'strong'])) { |
|
| 4279 | + $bal = array_shift($on); |
|
| 4280 | + $class = implode(' ', $on); |
|
| 4281 | + if ($bal == 'a') { |
|
| 4282 | + $att = 'href="#" '; |
|
| 4283 | + } |
|
| 4284 | + } |
|
| 4285 | + } |
|
| 4286 | + $att .= 'class="' . ($class ? attribut_html($class) . ' ' : '') . (defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on') . '"'; |
|
| 4287 | + } else { |
|
| 4288 | + $bal = 'a'; |
|
| 4289 | + $att = "href='$url'" |
|
| 4290 | + . ($title ? " title='" . attribut_html($title) . "'" : '') |
|
| 4291 | + . ($class ? " class='" . attribut_html($class) . "'" : '') |
|
| 4292 | + . ($rel ? " rel='" . attribut_html($rel) . "'" : '') |
|
| 4293 | + . $evt; |
|
| 4294 | + } |
|
| 4295 | + if ($libelle === null) { |
|
| 4296 | + $libelle = $url; |
|
| 4297 | + } |
|
| 4298 | + |
|
| 4299 | + return "<$bal $att>$libelle</$bal>"; |
|
| 4300 | 4300 | } |
| 4301 | 4301 | |
| 4302 | 4302 | |
@@ -4313,39 +4313,39 @@ discard block |
||
| 4313 | 4313 | * @return string : la chaine de langue finale en utilisant la fonction _T() |
| 4314 | 4314 | */ |
| 4315 | 4315 | function singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $vars = []) { |
| 4316 | - static $local_singulier_ou_pluriel = []; |
|
| 4317 | - |
|
| 4318 | - // si nb=0 ou pas de $vars valide on retourne une chaine vide, a traiter par un |sinon |
|
| 4319 | - if (!is_numeric($nb) or $nb == 0) { |
|
| 4320 | - return ''; |
|
| 4321 | - } |
|
| 4322 | - if (!is_array($vars)) { |
|
| 4323 | - return ''; |
|
| 4324 | - } |
|
| 4325 | - |
|
| 4326 | - $langue = $GLOBALS['spip_lang']; |
|
| 4327 | - if (!isset($local_singulier_ou_pluriel[$langue])) { |
|
| 4328 | - $local_singulier_ou_pluriel[$langue] = false; |
|
| 4329 | - if ( |
|
| 4330 | - $f = charger_fonction("singulier_ou_pluriel_{$langue}", 'inc', true) |
|
| 4331 | - or $f = charger_fonction('singulier_ou_pluriel', 'inc', true) |
|
| 4332 | - ) { |
|
| 4333 | - $local_singulier_ou_pluriel[$langue] = $f; |
|
| 4334 | - } |
|
| 4335 | - } |
|
| 4336 | - |
|
| 4337 | - // si on a une surcharge on l'utilise |
|
| 4338 | - if ($local_singulier_ou_pluriel[$langue]) { |
|
| 4339 | - return ($local_singulier_ou_pluriel[$langue])($nb, $chaine_un, $chaine_plusieurs, $var, $vars); |
|
| 4340 | - } |
|
| 4341 | - |
|
| 4342 | - // sinon traitement par defaut |
|
| 4343 | - $vars[$var] = $nb; |
|
| 4344 | - if ($nb >= 2) { |
|
| 4345 | - return _T($chaine_plusieurs, $vars); |
|
| 4346 | - } else { |
|
| 4347 | - return _T($chaine_un, $vars); |
|
| 4348 | - } |
|
| 4316 | + static $local_singulier_ou_pluriel = []; |
|
| 4317 | + |
|
| 4318 | + // si nb=0 ou pas de $vars valide on retourne une chaine vide, a traiter par un |sinon |
|
| 4319 | + if (!is_numeric($nb) or $nb == 0) { |
|
| 4320 | + return ''; |
|
| 4321 | + } |
|
| 4322 | + if (!is_array($vars)) { |
|
| 4323 | + return ''; |
|
| 4324 | + } |
|
| 4325 | + |
|
| 4326 | + $langue = $GLOBALS['spip_lang']; |
|
| 4327 | + if (!isset($local_singulier_ou_pluriel[$langue])) { |
|
| 4328 | + $local_singulier_ou_pluriel[$langue] = false; |
|
| 4329 | + if ( |
|
| 4330 | + $f = charger_fonction("singulier_ou_pluriel_{$langue}", 'inc', true) |
|
| 4331 | + or $f = charger_fonction('singulier_ou_pluriel', 'inc', true) |
|
| 4332 | + ) { |
|
| 4333 | + $local_singulier_ou_pluriel[$langue] = $f; |
|
| 4334 | + } |
|
| 4335 | + } |
|
| 4336 | + |
|
| 4337 | + // si on a une surcharge on l'utilise |
|
| 4338 | + if ($local_singulier_ou_pluriel[$langue]) { |
|
| 4339 | + return ($local_singulier_ou_pluriel[$langue])($nb, $chaine_un, $chaine_plusieurs, $var, $vars); |
|
| 4340 | + } |
|
| 4341 | + |
|
| 4342 | + // sinon traitement par defaut |
|
| 4343 | + $vars[$var] = $nb; |
|
| 4344 | + if ($nb >= 2) { |
|
| 4345 | + return _T($chaine_plusieurs, $vars); |
|
| 4346 | + } else { |
|
| 4347 | + return _T($chaine_un, $vars); |
|
| 4348 | + } |
|
| 4349 | 4349 | } |
| 4350 | 4350 | |
| 4351 | 4351 | |
@@ -4373,73 +4373,73 @@ discard block |
||
| 4373 | 4373 | */ |
| 4374 | 4374 | function prepare_icone_base($type, $lien, $texte, $fond, $fonction = '', $class = '', $javascript = '') { |
| 4375 | 4375 | |
| 4376 | - $class_lien = $class_bouton = $class; |
|
| 4377 | - |
|
| 4378 | - // Normaliser la fonction et compléter la classe en fonction |
|
| 4379 | - if (in_array($fonction, ['del', 'supprimer.gif'])) { |
|
| 4380 | - $class_lien .= ' danger'; |
|
| 4381 | - $class_bouton .= ' btn_danger'; |
|
| 4382 | - } elseif ($fonction == 'rien.gif') { |
|
| 4383 | - $fonction = ''; |
|
| 4384 | - } elseif ($fonction == 'delsafe') { |
|
| 4385 | - $fonction = 'del'; |
|
| 4386 | - } |
|
| 4387 | - |
|
| 4388 | - $fond_origine = $fond; |
|
| 4389 | - // Remappage des icone : article-24.png+new => article-new-24.png |
|
| 4390 | - if ($icone_renommer = charger_fonction('icone_renommer', 'inc', true)) { |
|
| 4391 | - [$fond, $fonction] = $icone_renommer($fond, $fonction); |
|
| 4392 | - } |
|
| 4393 | - |
|
| 4394 | - // Ajouter le type d'objet dans la classe |
|
| 4395 | - $objet_type = substr(basename($fond), 0, -4); |
|
| 4396 | - $class_lien .= " $objet_type"; |
|
| 4397 | - $class_bouton .= " $objet_type"; |
|
| 4398 | - |
|
| 4399 | - // Texte |
|
| 4400 | - $alt = attribut_html($texte); |
|
| 4401 | - $title = " title=\"$alt\""; // est-ce pertinent de doubler le alt par un title ? |
|
| 4402 | - |
|
| 4403 | - // Liens : préparer les classes ajax |
|
| 4404 | - $ajax = ''; |
|
| 4405 | - if ($type === 'lien') { |
|
| 4406 | - if (strpos($class_lien, 'ajax') !== false) { |
|
| 4407 | - $ajax = 'ajax'; |
|
| 4408 | - if (strpos($class_lien, 'preload') !== false) { |
|
| 4409 | - $ajax .= ' preload'; |
|
| 4410 | - } |
|
| 4411 | - if (strpos($class_lien, 'nocache') !== false) { |
|
| 4412 | - $ajax .= ' nocache'; |
|
| 4413 | - } |
|
| 4414 | - $ajax = " class='$ajax'"; |
|
| 4415 | - } |
|
| 4416 | - } |
|
| 4417 | - |
|
| 4418 | - // Repérer la taille et l'ajouter dans la classe |
|
| 4419 | - $size = 24; |
|
| 4420 | - if ( |
|
| 4421 | - preg_match('/-([0-9]{1,3})[.](gif|png|svg)$/i', $fond, $match) |
|
| 4422 | - or preg_match('/-([0-9]{1,3})([.](gif|png|svg))?$/i', $fond_origine, $match) |
|
| 4423 | - ) { |
|
| 4424 | - $size = $match[1]; |
|
| 4425 | - } |
|
| 4426 | - $class_lien .= " s$size"; |
|
| 4427 | - $class_bouton .= " s$size"; |
|
| 4428 | - |
|
| 4429 | - // Icône |
|
| 4430 | - $icone = http_img_pack($fond, $alt, "width='$size' height='$size'"); |
|
| 4431 | - $icone = '<span class="icone-image' . ($fonction ? " icone-fonction icone-fonction-$fonction" : '') . "\">$icone</span>"; |
|
| 4432 | - |
|
| 4433 | - // Markup final |
|
| 4434 | - if ($type == 'lien') { |
|
| 4435 | - return "<span class='icone $class_lien'>" |
|
| 4436 | - . "<a href='$lien'$title$ajax$javascript>" |
|
| 4437 | - . $icone |
|
| 4438 | - . "<b>$texte</b>" |
|
| 4439 | - . "</a></span>\n"; |
|
| 4440 | - } else { |
|
| 4441 | - return bouton_action("$icone $texte", $lien, $class_bouton, $javascript, $alt); |
|
| 4442 | - } |
|
| 4376 | + $class_lien = $class_bouton = $class; |
|
| 4377 | + |
|
| 4378 | + // Normaliser la fonction et compléter la classe en fonction |
|
| 4379 | + if (in_array($fonction, ['del', 'supprimer.gif'])) { |
|
| 4380 | + $class_lien .= ' danger'; |
|
| 4381 | + $class_bouton .= ' btn_danger'; |
|
| 4382 | + } elseif ($fonction == 'rien.gif') { |
|
| 4383 | + $fonction = ''; |
|
| 4384 | + } elseif ($fonction == 'delsafe') { |
|
| 4385 | + $fonction = 'del'; |
|
| 4386 | + } |
|
| 4387 | + |
|
| 4388 | + $fond_origine = $fond; |
|
| 4389 | + // Remappage des icone : article-24.png+new => article-new-24.png |
|
| 4390 | + if ($icone_renommer = charger_fonction('icone_renommer', 'inc', true)) { |
|
| 4391 | + [$fond, $fonction] = $icone_renommer($fond, $fonction); |
|
| 4392 | + } |
|
| 4393 | + |
|
| 4394 | + // Ajouter le type d'objet dans la classe |
|
| 4395 | + $objet_type = substr(basename($fond), 0, -4); |
|
| 4396 | + $class_lien .= " $objet_type"; |
|
| 4397 | + $class_bouton .= " $objet_type"; |
|
| 4398 | + |
|
| 4399 | + // Texte |
|
| 4400 | + $alt = attribut_html($texte); |
|
| 4401 | + $title = " title=\"$alt\""; // est-ce pertinent de doubler le alt par un title ? |
|
| 4402 | + |
|
| 4403 | + // Liens : préparer les classes ajax |
|
| 4404 | + $ajax = ''; |
|
| 4405 | + if ($type === 'lien') { |
|
| 4406 | + if (strpos($class_lien, 'ajax') !== false) { |
|
| 4407 | + $ajax = 'ajax'; |
|
| 4408 | + if (strpos($class_lien, 'preload') !== false) { |
|
| 4409 | + $ajax .= ' preload'; |
|
| 4410 | + } |
|
| 4411 | + if (strpos($class_lien, 'nocache') !== false) { |
|
| 4412 | + $ajax .= ' nocache'; |
|
| 4413 | + } |
|
| 4414 | + $ajax = " class='$ajax'"; |
|
| 4415 | + } |
|
| 4416 | + } |
|
| 4417 | + |
|
| 4418 | + // Repérer la taille et l'ajouter dans la classe |
|
| 4419 | + $size = 24; |
|
| 4420 | + if ( |
|
| 4421 | + preg_match('/-([0-9]{1,3})[.](gif|png|svg)$/i', $fond, $match) |
|
| 4422 | + or preg_match('/-([0-9]{1,3})([.](gif|png|svg))?$/i', $fond_origine, $match) |
|
| 4423 | + ) { |
|
| 4424 | + $size = $match[1]; |
|
| 4425 | + } |
|
| 4426 | + $class_lien .= " s$size"; |
|
| 4427 | + $class_bouton .= " s$size"; |
|
| 4428 | + |
|
| 4429 | + // Icône |
|
| 4430 | + $icone = http_img_pack($fond, $alt, "width='$size' height='$size'"); |
|
| 4431 | + $icone = '<span class="icone-image' . ($fonction ? " icone-fonction icone-fonction-$fonction" : '') . "\">$icone</span>"; |
|
| 4432 | + |
|
| 4433 | + // Markup final |
|
| 4434 | + if ($type == 'lien') { |
|
| 4435 | + return "<span class='icone $class_lien'>" |
|
| 4436 | + . "<a href='$lien'$title$ajax$javascript>" |
|
| 4437 | + . $icone |
|
| 4438 | + . "<b>$texte</b>" |
|
| 4439 | + . "</a></span>\n"; |
|
| 4440 | + } else { |
|
| 4441 | + return bouton_action("$icone $texte", $lien, $class_bouton, $javascript, $alt); |
|
| 4442 | + } |
|
| 4443 | 4443 | } |
| 4444 | 4444 | |
| 4445 | 4445 | /** |
@@ -4463,7 +4463,7 @@ discard block |
||
| 4463 | 4463 | * Code HTML du lien |
| 4464 | 4464 | **/ |
| 4465 | 4465 | function icone_base($lien, $texte, $fond, $fonction = '', $class = '', $javascript = '') { |
| 4466 | - return prepare_icone_base('lien', $lien, $texte, $fond, $fonction, $class, $javascript); |
|
| 4466 | + return prepare_icone_base('lien', $lien, $texte, $fond, $fonction, $class, $javascript); |
|
| 4467 | 4467 | } |
| 4468 | 4468 | |
| 4469 | 4469 | /** |
@@ -4498,7 +4498,7 @@ discard block |
||
| 4498 | 4498 | * Code HTML du lien |
| 4499 | 4499 | **/ |
| 4500 | 4500 | function filtre_icone_verticale_dist($lien, $texte, $fond, $fonction = '', $class = '', $javascript = '') { |
| 4501 | - return icone_base($lien, $texte, $fond, $fonction, "verticale $class", $javascript); |
|
| 4501 | + return icone_base($lien, $texte, $fond, $fonction, "verticale $class", $javascript); |
|
| 4502 | 4502 | } |
| 4503 | 4503 | |
| 4504 | 4504 | /** |
@@ -4543,7 +4543,7 @@ discard block |
||
| 4543 | 4543 | * Code HTML du lien |
| 4544 | 4544 | **/ |
| 4545 | 4545 | function filtre_icone_horizontale_dist($lien, $texte, $fond, $fonction = '', $class = '', $javascript = '') { |
| 4546 | - return icone_base($lien, $texte, $fond, $fonction, "horizontale $class", $javascript); |
|
| 4546 | + return icone_base($lien, $texte, $fond, $fonction, "horizontale $class", $javascript); |
|
| 4547 | 4547 | } |
| 4548 | 4548 | |
| 4549 | 4549 | /** |
@@ -4574,7 +4574,7 @@ discard block |
||
| 4574 | 4574 | * Code HTML du lien |
| 4575 | 4575 | **/ |
| 4576 | 4576 | function filtre_bouton_action_horizontal_dist($lien, $texte, $fond, $fonction = '', $class = '', $confirm = '') { |
| 4577 | - return prepare_icone_base('bouton', $lien, $texte, $fond, $fonction, $class, $confirm); |
|
| 4577 | + return prepare_icone_base('bouton', $lien, $texte, $fond, $fonction, $class, $confirm); |
|
| 4578 | 4578 | } |
| 4579 | 4579 | |
| 4580 | 4580 | /** |
@@ -4605,7 +4605,7 @@ discard block |
||
| 4605 | 4605 | * Code HTML du lien |
| 4606 | 4606 | */ |
| 4607 | 4607 | function filtre_icone_dist($lien, $texte, $fond, $align = '', $fonction = '', $class = '', $javascript = '') { |
| 4608 | - return icone_base($lien, $texte, $fond, $fonction, "verticale $align $class", $javascript); |
|
| 4608 | + return icone_base($lien, $texte, $fond, $fonction, "verticale $align $class", $javascript); |
|
| 4609 | 4609 | } |
| 4610 | 4610 | |
| 4611 | 4611 | |
@@ -4627,7 +4627,7 @@ discard block |
||
| 4627 | 4627 | * @return array Liste des éléments |
| 4628 | 4628 | */ |
| 4629 | 4629 | function filtre_explode_dist($a, $b) { |
| 4630 | - return explode($b, (string) $a); |
|
| 4630 | + return explode($b, (string) $a); |
|
| 4631 | 4631 | } |
| 4632 | 4632 | |
| 4633 | 4633 | /** |
@@ -4648,7 +4648,7 @@ discard block |
||
| 4648 | 4648 | * @return string Texte |
| 4649 | 4649 | */ |
| 4650 | 4650 | function filtre_implode_dist($a, $b) { |
| 4651 | - return is_array($a) ? implode($b, $a) : $a; |
|
| 4651 | + return is_array($a) ? implode($b, $a) : $a; |
|
| 4652 | 4652 | } |
| 4653 | 4653 | |
| 4654 | 4654 | /** |
@@ -4657,22 +4657,22 @@ discard block |
||
| 4657 | 4657 | * @return string Code CSS |
| 4658 | 4658 | */ |
| 4659 | 4659 | function bando_images_background() { |
| 4660 | - include_spip('inc/bandeau'); |
|
| 4661 | - // recuperer tous les boutons et leurs images |
|
| 4662 | - $boutons = definir_barre_boutons(definir_barre_contexte(), true, false); |
|
| 4660 | + include_spip('inc/bandeau'); |
|
| 4661 | + // recuperer tous les boutons et leurs images |
|
| 4662 | + $boutons = definir_barre_boutons(definir_barre_contexte(), true, false); |
|
| 4663 | 4663 | |
| 4664 | - $res = ''; |
|
| 4665 | - foreach ($boutons as $page => $detail) { |
|
| 4666 | - $selecteur = (in_array($page, ['outils_rapides', 'outils_collaboratifs']) ? '' : '.navigation_avec_icones '); |
|
| 4667 | - foreach ($detail->sousmenu as $souspage => $sousdetail) { |
|
| 4668 | - if ($sousdetail->icone and strlen(trim($sousdetail->icone))) { |
|
| 4669 | - $img = http_img_variante_svg_si_possible($sousdetail->icone); |
|
| 4670 | - $res .= "\n$selecteur.bando2_$souspage {background-image:url($img);}"; |
|
| 4671 | - } |
|
| 4672 | - } |
|
| 4673 | - } |
|
| 4664 | + $res = ''; |
|
| 4665 | + foreach ($boutons as $page => $detail) { |
|
| 4666 | + $selecteur = (in_array($page, ['outils_rapides', 'outils_collaboratifs']) ? '' : '.navigation_avec_icones '); |
|
| 4667 | + foreach ($detail->sousmenu as $souspage => $sousdetail) { |
|
| 4668 | + if ($sousdetail->icone and strlen(trim($sousdetail->icone))) { |
|
| 4669 | + $img = http_img_variante_svg_si_possible($sousdetail->icone); |
|
| 4670 | + $res .= "\n$selecteur.bando2_$souspage {background-image:url($img);}"; |
|
| 4671 | + } |
|
| 4672 | + } |
|
| 4673 | + } |
|
| 4674 | 4674 | |
| 4675 | - return $res; |
|
| 4675 | + return $res; |
|
| 4676 | 4676 | } |
| 4677 | 4677 | |
| 4678 | 4678 | /** |
@@ -4697,27 +4697,27 @@ discard block |
||
| 4697 | 4697 | */ |
| 4698 | 4698 | function bouton_action($libelle, $url, $class = '', $confirm = '', $title = '', $callback = '') { |
| 4699 | 4699 | |
| 4700 | - // Classes : dispatcher `ajax` sur le formulaire |
|
| 4701 | - $class_form = ''; |
|
| 4702 | - if (strpos($class, 'ajax') !== false) { |
|
| 4703 | - $class_form = 'ajax'; |
|
| 4704 | - $class = str_replace('ajax', '', $class); |
|
| 4705 | - } |
|
| 4706 | - $class_btn = 'submit ' . trim($class); |
|
| 4700 | + // Classes : dispatcher `ajax` sur le formulaire |
|
| 4701 | + $class_form = ''; |
|
| 4702 | + if (strpos($class, 'ajax') !== false) { |
|
| 4703 | + $class_form = 'ajax'; |
|
| 4704 | + $class = str_replace('ajax', '', $class); |
|
| 4705 | + } |
|
| 4706 | + $class_btn = 'submit ' . trim($class); |
|
| 4707 | 4707 | |
| 4708 | - if ($confirm) { |
|
| 4709 | - $confirm = 'confirm("' . attribut_html($confirm) . '")'; |
|
| 4710 | - if ($callback) { |
|
| 4711 | - $callback = "$confirm?($callback):false"; |
|
| 4712 | - } else { |
|
| 4713 | - $callback = $confirm; |
|
| 4714 | - } |
|
| 4715 | - } |
|
| 4716 | - $onclick = $callback ? " onclick='return " . addcslashes($callback, "'") . "'" : ''; |
|
| 4717 | - $title = $title ? " title='$title'" : ''; |
|
| 4708 | + if ($confirm) { |
|
| 4709 | + $confirm = 'confirm("' . attribut_html($confirm) . '")'; |
|
| 4710 | + if ($callback) { |
|
| 4711 | + $callback = "$confirm?($callback):false"; |
|
| 4712 | + } else { |
|
| 4713 | + $callback = $confirm; |
|
| 4714 | + } |
|
| 4715 | + } |
|
| 4716 | + $onclick = $callback ? " onclick='return " . addcslashes($callback, "'") . "'" : ''; |
|
| 4717 | + $title = $title ? " title='$title'" : ''; |
|
| 4718 | 4718 | |
| 4719 | - return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>" . form_hidden($url) |
|
| 4720 | - . "<button type='submit' class='$class_btn'$title$onclick>$libelle</button></div></form>"; |
|
| 4719 | + return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>" . form_hidden($url) |
|
| 4720 | + . "<button type='submit' class='$class_btn'$title$onclick>$libelle</button></div></form>"; |
|
| 4721 | 4721 | } |
| 4722 | 4722 | |
| 4723 | 4723 | /** |
@@ -4740,101 +4740,101 @@ discard block |
||
| 4740 | 4740 | * @return string |
| 4741 | 4741 | */ |
| 4742 | 4742 | function generer_objet_info($id_objet, string $type_objet, string $info, string $etoile = '', array $params = []): string { |
| 4743 | - static $trouver_table = null; |
|
| 4744 | - static $objets; |
|
| 4745 | - |
|
| 4746 | - // On verifie qu'on a tout ce qu'il faut |
|
| 4747 | - $id_objet = intval($id_objet); |
|
| 4748 | - if (!($id_objet and $type_objet and $info)) { |
|
| 4749 | - return ''; |
|
| 4750 | - } |
|
| 4751 | - |
|
| 4752 | - // si on a deja note que l'objet n'existe pas, ne pas aller plus loin |
|
| 4753 | - if (isset($objets[$type_objet]) and $objets[$type_objet] === false) { |
|
| 4754 | - return ''; |
|
| 4755 | - } |
|
| 4756 | - |
|
| 4757 | - // Si on demande l'url, on retourne direct la fonction |
|
| 4758 | - if ($info == 'url') { |
|
| 4759 | - return generer_objet_url($id_objet, $type_objet, ...$params); |
|
| 4760 | - } |
|
| 4761 | - |
|
| 4762 | - // Sinon on va tout chercher dans la table et on garde en memoire |
|
| 4763 | - $demande_titre = ($info === 'titre'); |
|
| 4764 | - $demande_introduction = ($info === 'introduction'); |
|
| 4765 | - |
|
| 4766 | - // On ne fait la requete que si on a pas deja l'objet ou si on demande le titre mais qu'on ne l'a pas encore |
|
| 4767 | - if ( |
|
| 4768 | - !isset($objets[$type_objet][$id_objet]) |
|
| 4769 | - or |
|
| 4770 | - ($demande_titre and !isset($objets[$type_objet][$id_objet]['titre'])) |
|
| 4771 | - ) { |
|
| 4772 | - if (!$trouver_table) { |
|
| 4773 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 4774 | - } |
|
| 4775 | - $desc = $trouver_table(table_objet_sql($type_objet)); |
|
| 4776 | - if (!$desc) { |
|
| 4777 | - return $objets[$type_objet] = false; |
|
| 4778 | - } |
|
| 4779 | - |
|
| 4780 | - // Si on demande le titre, on le gere en interne |
|
| 4781 | - $champ_titre = ''; |
|
| 4782 | - if ($demande_titre) { |
|
| 4783 | - // si pas de titre declare mais champ titre, il sera peuple par le select * |
|
| 4784 | - $champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre'] : ''; |
|
| 4785 | - } |
|
| 4786 | - include_spip('base/abstract_sql'); |
|
| 4787 | - include_spip('base/connect_sql'); |
|
| 4788 | - $objets[$type_objet][$id_objet] = sql_fetsel( |
|
| 4789 | - '*' . $champ_titre, |
|
| 4790 | - $desc['table_sql'], |
|
| 4791 | - id_table_objet($type_objet) . ' = ' . intval($id_objet) |
|
| 4792 | - ); |
|
| 4793 | - |
|
| 4794 | - // Toujours noter la longueur d'introduction, même si pas demandé cette fois-ci |
|
| 4795 | - $objets[$type_objet]['introduction_longueur'] = $desc['introduction_longueur'] ?? null; |
|
| 4796 | - } |
|
| 4797 | - |
|
| 4798 | - // Pour les fonction generer_xxx, si on demande l'introduction, |
|
| 4799 | - // ajouter la longueur au début des params supplémentaires |
|
| 4800 | - if ($demande_introduction) { |
|
| 4801 | - $introduction_longueur = $objets[$type_objet]['introduction_longueur']; |
|
| 4802 | - array_unshift($params, $introduction_longueur); |
|
| 4803 | - } |
|
| 4804 | - |
|
| 4805 | - // Si la fonction generer_TYPE_TRUC existe, on l'utilise pour formater $info_generee |
|
| 4806 | - if ( |
|
| 4807 | - $generer = charger_fonction("generer_{$type_objet}_{$info}", '', true) |
|
| 4808 | - // @deprecated 4.1 generer_TRUC_TYPE |
|
| 4809 | - or $generer = charger_fonction("generer_{$info}_{$type_objet}", '', true) |
|
| 4810 | - ) { |
|
| 4811 | - $info_generee = $generer($id_objet, $objets[$type_objet][$id_objet], ...$params); |
|
| 4812 | - } |
|
| 4813 | - // Si la fonction generer_objet_TRUC existe, on l'utilise pour formater $info_generee |
|
| 4814 | - elseif ( |
|
| 4815 | - $generer = charger_fonction("generer_objet_{$info}", '', true) |
|
| 4816 | - // @deprecated 4.1 generer_TRUC_entite |
|
| 4817 | - or $generer = charger_fonction("generer_{$info}_entite", '', true) |
|
| 4818 | - ) { |
|
| 4819 | - $info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet], ...$params); |
|
| 4820 | - } // Sinon on prend directement le champ SQL tel quel |
|
| 4821 | - else { |
|
| 4822 | - $info_generee = ($objets[$type_objet][$id_objet][$info] ?? ''); |
|
| 4823 | - } |
|
| 4824 | - |
|
| 4825 | - // On va ensuite appliquer les traitements automatiques si besoin |
|
| 4826 | - if (!$etoile) { |
|
| 4827 | - // FIXME: on fournit un ENV minimum avec id et type et connect='' |
|
| 4828 | - // mais ce fonctionnement est a ameliorer ! |
|
| 4829 | - $info_generee = appliquer_traitement_champ( |
|
| 4830 | - $info_generee, |
|
| 4831 | - $info, |
|
| 4832 | - table_objet($type_objet), |
|
| 4833 | - ['id_objet' => $id_objet, 'objet' => $type_objet, ''] |
|
| 4834 | - ); |
|
| 4835 | - } |
|
| 4836 | - |
|
| 4837 | - return $info_generee; |
|
| 4743 | + static $trouver_table = null; |
|
| 4744 | + static $objets; |
|
| 4745 | + |
|
| 4746 | + // On verifie qu'on a tout ce qu'il faut |
|
| 4747 | + $id_objet = intval($id_objet); |
|
| 4748 | + if (!($id_objet and $type_objet and $info)) { |
|
| 4749 | + return ''; |
|
| 4750 | + } |
|
| 4751 | + |
|
| 4752 | + // si on a deja note que l'objet n'existe pas, ne pas aller plus loin |
|
| 4753 | + if (isset($objets[$type_objet]) and $objets[$type_objet] === false) { |
|
| 4754 | + return ''; |
|
| 4755 | + } |
|
| 4756 | + |
|
| 4757 | + // Si on demande l'url, on retourne direct la fonction |
|
| 4758 | + if ($info == 'url') { |
|
| 4759 | + return generer_objet_url($id_objet, $type_objet, ...$params); |
|
| 4760 | + } |
|
| 4761 | + |
|
| 4762 | + // Sinon on va tout chercher dans la table et on garde en memoire |
|
| 4763 | + $demande_titre = ($info === 'titre'); |
|
| 4764 | + $demande_introduction = ($info === 'introduction'); |
|
| 4765 | + |
|
| 4766 | + // On ne fait la requete que si on a pas deja l'objet ou si on demande le titre mais qu'on ne l'a pas encore |
|
| 4767 | + if ( |
|
| 4768 | + !isset($objets[$type_objet][$id_objet]) |
|
| 4769 | + or |
|
| 4770 | + ($demande_titre and !isset($objets[$type_objet][$id_objet]['titre'])) |
|
| 4771 | + ) { |
|
| 4772 | + if (!$trouver_table) { |
|
| 4773 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 4774 | + } |
|
| 4775 | + $desc = $trouver_table(table_objet_sql($type_objet)); |
|
| 4776 | + if (!$desc) { |
|
| 4777 | + return $objets[$type_objet] = false; |
|
| 4778 | + } |
|
| 4779 | + |
|
| 4780 | + // Si on demande le titre, on le gere en interne |
|
| 4781 | + $champ_titre = ''; |
|
| 4782 | + if ($demande_titre) { |
|
| 4783 | + // si pas de titre declare mais champ titre, il sera peuple par le select * |
|
| 4784 | + $champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre'] : ''; |
|
| 4785 | + } |
|
| 4786 | + include_spip('base/abstract_sql'); |
|
| 4787 | + include_spip('base/connect_sql'); |
|
| 4788 | + $objets[$type_objet][$id_objet] = sql_fetsel( |
|
| 4789 | + '*' . $champ_titre, |
|
| 4790 | + $desc['table_sql'], |
|
| 4791 | + id_table_objet($type_objet) . ' = ' . intval($id_objet) |
|
| 4792 | + ); |
|
| 4793 | + |
|
| 4794 | + // Toujours noter la longueur d'introduction, même si pas demandé cette fois-ci |
|
| 4795 | + $objets[$type_objet]['introduction_longueur'] = $desc['introduction_longueur'] ?? null; |
|
| 4796 | + } |
|
| 4797 | + |
|
| 4798 | + // Pour les fonction generer_xxx, si on demande l'introduction, |
|
| 4799 | + // ajouter la longueur au début des params supplémentaires |
|
| 4800 | + if ($demande_introduction) { |
|
| 4801 | + $introduction_longueur = $objets[$type_objet]['introduction_longueur']; |
|
| 4802 | + array_unshift($params, $introduction_longueur); |
|
| 4803 | + } |
|
| 4804 | + |
|
| 4805 | + // Si la fonction generer_TYPE_TRUC existe, on l'utilise pour formater $info_generee |
|
| 4806 | + if ( |
|
| 4807 | + $generer = charger_fonction("generer_{$type_objet}_{$info}", '', true) |
|
| 4808 | + // @deprecated 4.1 generer_TRUC_TYPE |
|
| 4809 | + or $generer = charger_fonction("generer_{$info}_{$type_objet}", '', true) |
|
| 4810 | + ) { |
|
| 4811 | + $info_generee = $generer($id_objet, $objets[$type_objet][$id_objet], ...$params); |
|
| 4812 | + } |
|
| 4813 | + // Si la fonction generer_objet_TRUC existe, on l'utilise pour formater $info_generee |
|
| 4814 | + elseif ( |
|
| 4815 | + $generer = charger_fonction("generer_objet_{$info}", '', true) |
|
| 4816 | + // @deprecated 4.1 generer_TRUC_entite |
|
| 4817 | + or $generer = charger_fonction("generer_{$info}_entite", '', true) |
|
| 4818 | + ) { |
|
| 4819 | + $info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet], ...$params); |
|
| 4820 | + } // Sinon on prend directement le champ SQL tel quel |
|
| 4821 | + else { |
|
| 4822 | + $info_generee = ($objets[$type_objet][$id_objet][$info] ?? ''); |
|
| 4823 | + } |
|
| 4824 | + |
|
| 4825 | + // On va ensuite appliquer les traitements automatiques si besoin |
|
| 4826 | + if (!$etoile) { |
|
| 4827 | + // FIXME: on fournit un ENV minimum avec id et type et connect='' |
|
| 4828 | + // mais ce fonctionnement est a ameliorer ! |
|
| 4829 | + $info_generee = appliquer_traitement_champ( |
|
| 4830 | + $info_generee, |
|
| 4831 | + $info, |
|
| 4832 | + table_objet($type_objet), |
|
| 4833 | + ['id_objet' => $id_objet, 'objet' => $type_objet, ''] |
|
| 4834 | + ); |
|
| 4835 | + } |
|
| 4836 | + |
|
| 4837 | + return $info_generee; |
|
| 4838 | 4838 | } |
| 4839 | 4839 | |
| 4840 | 4840 | /** |
@@ -4842,7 +4842,7 @@ discard block |
||
| 4842 | 4842 | * @see generer_objet_info |
| 4843 | 4843 | */ |
| 4844 | 4844 | function generer_info_entite($id_objet, $type_objet, $info, $etoile = '', $params = []) { |
| 4845 | - return generer_objet_info(intval($id_objet), $type_objet, $info, $etoile, $params); |
|
| 4845 | + return generer_objet_info(intval($id_objet), $type_objet, $info, $etoile, $params); |
|
| 4846 | 4846 | } |
| 4847 | 4847 | |
| 4848 | 4848 | /** |
@@ -4875,36 +4875,36 @@ discard block |
||
| 4875 | 4875 | */ |
| 4876 | 4876 | function generer_objet_introduction(int $id_objet, string $type_objet, array $ligne_sql, ?int $introduction_longueur = null, $longueur_ou_suite = null, ?string $suite = null, string $connect = ''): string { |
| 4877 | 4877 | |
| 4878 | - $descriptif = $ligne_sql['descriptif'] ?? ''; |
|
| 4879 | - $texte = $ligne_sql['texte'] ?? ''; |
|
| 4880 | - // En absence de descriptif, on se rabat sur chapo + texte |
|
| 4881 | - if (isset($ligne_sql['chapo'])) { |
|
| 4882 | - $chapo = $ligne_sql['chapo']; |
|
| 4883 | - $texte = strlen($descriptif) ? |
|
| 4884 | - '' : |
|
| 4885 | - "$chapo \n\n $texte"; |
|
| 4886 | - } |
|
| 4878 | + $descriptif = $ligne_sql['descriptif'] ?? ''; |
|
| 4879 | + $texte = $ligne_sql['texte'] ?? ''; |
|
| 4880 | + // En absence de descriptif, on se rabat sur chapo + texte |
|
| 4881 | + if (isset($ligne_sql['chapo'])) { |
|
| 4882 | + $chapo = $ligne_sql['chapo']; |
|
| 4883 | + $texte = strlen($descriptif) ? |
|
| 4884 | + '' : |
|
| 4885 | + "$chapo \n\n $texte"; |
|
| 4886 | + } |
|
| 4887 | 4887 | |
| 4888 | - // Longueur en paramètre, sinon celle renseignée dans la description de l'objet, sinon valeur en dur |
|
| 4889 | - if (!intval($longueur_ou_suite)) { |
|
| 4890 | - $longueur = intval($introduction_longueur ?: 600); |
|
| 4891 | - } else { |
|
| 4892 | - $longueur = intval($longueur_ou_suite); |
|
| 4893 | - } |
|
| 4888 | + // Longueur en paramètre, sinon celle renseignée dans la description de l'objet, sinon valeur en dur |
|
| 4889 | + if (!intval($longueur_ou_suite)) { |
|
| 4890 | + $longueur = intval($introduction_longueur ?: 600); |
|
| 4891 | + } else { |
|
| 4892 | + $longueur = intval($longueur_ou_suite); |
|
| 4893 | + } |
|
| 4894 | 4894 | |
| 4895 | - // On peut optionnellement passer la suite en 1er paramètre de la balise |
|
| 4896 | - // Ex : #INTRODUCTION{...} |
|
| 4897 | - if ( |
|
| 4898 | - is_null($suite) |
|
| 4899 | - and !intval($longueur_ou_suite) |
|
| 4900 | - ) { |
|
| 4901 | - $suite = $longueur_ou_suite; |
|
| 4902 | - } |
|
| 4895 | + // On peut optionnellement passer la suite en 1er paramètre de la balise |
|
| 4896 | + // Ex : #INTRODUCTION{...} |
|
| 4897 | + if ( |
|
| 4898 | + is_null($suite) |
|
| 4899 | + and !intval($longueur_ou_suite) |
|
| 4900 | + ) { |
|
| 4901 | + $suite = $longueur_ou_suite; |
|
| 4902 | + } |
|
| 4903 | 4903 | |
| 4904 | - $f = chercher_filtre('introduction'); |
|
| 4905 | - $introduction = $f($descriptif, $texte, $longueur, $connect, $suite); |
|
| 4904 | + $f = chercher_filtre('introduction'); |
|
| 4905 | + $introduction = $f($descriptif, $texte, $longueur, $connect, $suite); |
|
| 4906 | 4906 | |
| 4907 | - return $introduction; |
|
| 4907 | + return $introduction; |
|
| 4908 | 4908 | } |
| 4909 | 4909 | |
| 4910 | 4910 | /** |
@@ -4912,7 +4912,7 @@ discard block |
||
| 4912 | 4912 | * @see generer_objet_introduction |
| 4913 | 4913 | */ |
| 4914 | 4914 | function generer_introduction_entite($id_objet, $type_objet, $ligne_sql, $introduction_longueur = null, $longueur_ou_suite = null, $suite = null, string $connect = '') { |
| 4915 | - return generer_objet_introduction(intval($id_objet), $type_objet, $ligne_sql, $introduction_longueur, $longueur_ou_suite, $suite, $connect); |
|
| 4915 | + return generer_objet_introduction(intval($id_objet), $type_objet, $ligne_sql, $introduction_longueur, $longueur_ou_suite, $suite, $connect); |
|
| 4916 | 4916 | } |
| 4917 | 4917 | |
| 4918 | 4918 | /** |
@@ -4926,49 +4926,49 @@ discard block |
||
| 4926 | 4926 | * @return string |
| 4927 | 4927 | */ |
| 4928 | 4928 | function appliquer_traitement_champ($texte, $champ, $table_objet = '', $env = [], string $connect = '') { |
| 4929 | - if (!$champ) { |
|
| 4930 | - return $texte; |
|
| 4931 | - } |
|
| 4929 | + if (!$champ) { |
|
| 4930 | + return $texte; |
|
| 4931 | + } |
|
| 4932 | 4932 | |
| 4933 | - // On charge les définitions des traitements (inc/texte et fichiers de fonctions) |
|
| 4934 | - // car il ne faut pas partir du principe que c'est déjà chargé (form ajax, etc) |
|
| 4935 | - include_fichiers_fonctions(); |
|
| 4933 | + // On charge les définitions des traitements (inc/texte et fichiers de fonctions) |
|
| 4934 | + // car il ne faut pas partir du principe que c'est déjà chargé (form ajax, etc) |
|
| 4935 | + include_fichiers_fonctions(); |
|
| 4936 | 4936 | |
| 4937 | - $champ = strtoupper($champ); |
|
| 4938 | - $traitements = $GLOBALS['table_des_traitements'][$champ] ?? false; |
|
| 4939 | - if (!$traitements or !is_array($traitements)) { |
|
| 4940 | - return $texte; |
|
| 4941 | - } |
|
| 4937 | + $champ = strtoupper($champ); |
|
| 4938 | + $traitements = $GLOBALS['table_des_traitements'][$champ] ?? false; |
|
| 4939 | + if (!$traitements or !is_array($traitements)) { |
|
| 4940 | + return $texte; |
|
| 4941 | + } |
|
| 4942 | 4942 | |
| 4943 | - $traitement = ''; |
|
| 4944 | - if ($table_objet and (!isset($traitements[0]) or count($traitements) > 1)) { |
|
| 4945 | - // necessaire pour prendre en charge les vieux appels avec un table_objet_sql en 3e arg |
|
| 4946 | - $table_objet = table_objet($table_objet); |
|
| 4947 | - if (isset($traitements[$table_objet])) { |
|
| 4948 | - $traitement = $traitements[$table_objet]; |
|
| 4949 | - } |
|
| 4950 | - } |
|
| 4951 | - if (!$traitement and isset($traitements[0])) { |
|
| 4952 | - $traitement = $traitements[0]; |
|
| 4953 | - } |
|
| 4954 | - // (sinon prendre le premier de la liste par defaut ?) |
|
| 4943 | + $traitement = ''; |
|
| 4944 | + if ($table_objet and (!isset($traitements[0]) or count($traitements) > 1)) { |
|
| 4945 | + // necessaire pour prendre en charge les vieux appels avec un table_objet_sql en 3e arg |
|
| 4946 | + $table_objet = table_objet($table_objet); |
|
| 4947 | + if (isset($traitements[$table_objet])) { |
|
| 4948 | + $traitement = $traitements[$table_objet]; |
|
| 4949 | + } |
|
| 4950 | + } |
|
| 4951 | + if (!$traitement and isset($traitements[0])) { |
|
| 4952 | + $traitement = $traitements[0]; |
|
| 4953 | + } |
|
| 4954 | + // (sinon prendre le premier de la liste par defaut ?) |
|
| 4955 | 4955 | |
| 4956 | - if (!$traitement) { |
|
| 4957 | - return $texte; |
|
| 4958 | - } |
|
| 4956 | + if (!$traitement) { |
|
| 4957 | + return $texte; |
|
| 4958 | + } |
|
| 4959 | 4959 | |
| 4960 | - $traitement = str_replace('%s', "'" . texte_script($texte) . "'", $traitement); |
|
| 4960 | + $traitement = str_replace('%s', "'" . texte_script($texte) . "'", $traitement); |
|
| 4961 | 4961 | |
| 4962 | - // signaler qu'on est dans l'espace prive pour les filtres qui se servent de ce flag |
|
| 4963 | - if (test_espace_prive()) { |
|
| 4964 | - $env['espace_prive'] = 1; |
|
| 4965 | - } |
|
| 4962 | + // signaler qu'on est dans l'espace prive pour les filtres qui se servent de ce flag |
|
| 4963 | + if (test_espace_prive()) { |
|
| 4964 | + $env['espace_prive'] = 1; |
|
| 4965 | + } |
|
| 4966 | 4966 | |
| 4967 | - // Fournir $connect et $Pile[0] au traitement si besoin |
|
| 4968 | - $Pile = [0 => $env]; |
|
| 4969 | - eval("\$texte = $traitement;"); |
|
| 4967 | + // Fournir $connect et $Pile[0] au traitement si besoin |
|
| 4968 | + $Pile = [0 => $env]; |
|
| 4969 | + eval("\$texte = $traitement;"); |
|
| 4970 | 4970 | |
| 4971 | - return $texte; |
|
| 4971 | + return $texte; |
|
| 4972 | 4972 | } |
| 4973 | 4973 | |
| 4974 | 4974 | |
@@ -4982,21 +4982,21 @@ discard block |
||
| 4982 | 4982 | * @return string |
| 4983 | 4983 | */ |
| 4984 | 4984 | function generer_objet_lien(int $id_objet, string $objet, int $longueur = 80, string $connect = ''): string { |
| 4985 | - include_spip('inc/liens'); |
|
| 4986 | - $titre = traiter_raccourci_titre($id_objet, $objet, $connect); |
|
| 4987 | - // lorsque l'objet n'est plus declare (plugin desactive par exemple) |
|
| 4988 | - // le raccourcis n'est plus valide |
|
| 4989 | - $titre = typo($titre['titre'] ?? ''); |
|
| 4990 | - // on essaye avec generer_info_entite ? |
|
| 4991 | - if (!strlen($titre) and !$connect) { |
|
| 4992 | - $titre = generer_objet_info($id_objet, $objet, 'titre'); |
|
| 4993 | - } |
|
| 4994 | - if (!strlen($titre)) { |
|
| 4995 | - $titre = _T('info_sans_titre'); |
|
| 4996 | - } |
|
| 4997 | - $url = generer_objet_url($id_objet, $objet, '', '', null, '', $connect); |
|
| 4985 | + include_spip('inc/liens'); |
|
| 4986 | + $titre = traiter_raccourci_titre($id_objet, $objet, $connect); |
|
| 4987 | + // lorsque l'objet n'est plus declare (plugin desactive par exemple) |
|
| 4988 | + // le raccourcis n'est plus valide |
|
| 4989 | + $titre = typo($titre['titre'] ?? ''); |
|
| 4990 | + // on essaye avec generer_info_entite ? |
|
| 4991 | + if (!strlen($titre) and !$connect) { |
|
| 4992 | + $titre = generer_objet_info($id_objet, $objet, 'titre'); |
|
| 4993 | + } |
|
| 4994 | + if (!strlen($titre)) { |
|
| 4995 | + $titre = _T('info_sans_titre'); |
|
| 4996 | + } |
|
| 4997 | + $url = generer_objet_url($id_objet, $objet, '', '', null, '', $connect); |
|
| 4998 | 4998 | |
| 4999 | - return "<a href='$url' class='$objet'>" . couper($titre, $longueur) . '</a>'; |
|
| 4999 | + return "<a href='$url' class='$objet'>" . couper($titre, $longueur) . '</a>'; |
|
| 5000 | 5000 | } |
| 5001 | 5001 | |
| 5002 | 5002 | /** |
@@ -5004,7 +5004,7 @@ discard block |
||
| 5004 | 5004 | * @see generer_objet_lien |
| 5005 | 5005 | */ |
| 5006 | 5006 | function generer_lien_entite($id_objet, $objet, $longueur = 80, $connect = null) { |
| 5007 | - return generer_objet_lien(intval($id_objet), $objet, $longueur, $connect ?? ''); |
|
| 5007 | + return generer_objet_lien(intval($id_objet), $objet, $longueur, $connect ?? ''); |
|
| 5008 | 5008 | } |
| 5009 | 5009 | |
| 5010 | 5010 | /** |
@@ -5020,15 +5020,15 @@ discard block |
||
| 5020 | 5020 | * @return string |
| 5021 | 5021 | */ |
| 5022 | 5022 | function wrap($texte, $wrap) { |
| 5023 | - $balises = extraire_balises($wrap); |
|
| 5024 | - if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS", $wrap, $regs, PREG_PATTERN_ORDER)) { |
|
| 5025 | - $texte = $wrap . $texte; |
|
| 5026 | - $regs = array_reverse($regs[1]); |
|
| 5027 | - $wrap = '</' . implode('></', $regs) . '>'; |
|
| 5028 | - $texte = $texte . $wrap; |
|
| 5029 | - } |
|
| 5023 | + $balises = extraire_balises($wrap); |
|
| 5024 | + if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS", $wrap, $regs, PREG_PATTERN_ORDER)) { |
|
| 5025 | + $texte = $wrap . $texte; |
|
| 5026 | + $regs = array_reverse($regs[1]); |
|
| 5027 | + $wrap = '</' . implode('></', $regs) . '>'; |
|
| 5028 | + $texte = $texte . $wrap; |
|
| 5029 | + } |
|
| 5030 | 5030 | |
| 5031 | - return $texte; |
|
| 5031 | + return $texte; |
|
| 5032 | 5032 | } |
| 5033 | 5033 | |
| 5034 | 5034 | |
@@ -5048,44 +5048,44 @@ discard block |
||
| 5048 | 5048 | * @return array|mixed|string |
| 5049 | 5049 | */ |
| 5050 | 5050 | function filtre_print_dist($u, $join = '<br />', $indent = 0) { |
| 5051 | - if (is_string($u)) { |
|
| 5052 | - $u = typo($u); |
|
| 5051 | + if (is_string($u)) { |
|
| 5052 | + $u = typo($u); |
|
| 5053 | 5053 | |
| 5054 | - return $u; |
|
| 5055 | - } |
|
| 5054 | + return $u; |
|
| 5055 | + } |
|
| 5056 | 5056 | |
| 5057 | - // caster $u en array si besoin |
|
| 5058 | - if (is_object($u)) { |
|
| 5059 | - $u = (array)$u; |
|
| 5060 | - } |
|
| 5057 | + // caster $u en array si besoin |
|
| 5058 | + if (is_object($u)) { |
|
| 5059 | + $u = (array)$u; |
|
| 5060 | + } |
|
| 5061 | 5061 | |
| 5062 | - if (is_array($u)) { |
|
| 5063 | - $out = ''; |
|
| 5064 | - // toutes les cles sont numeriques ? |
|
| 5065 | - // et aucun enfant n'est un tableau |
|
| 5066 | - // liste simple separee par des virgules |
|
| 5067 | - $numeric_keys = array_map('is_numeric', array_keys($u)); |
|
| 5068 | - $array_values = array_map('is_array', $u); |
|
| 5069 | - $object_values = array_map('is_object', $u); |
|
| 5070 | - if ( |
|
| 5071 | - array_sum($numeric_keys) == count($numeric_keys) |
|
| 5072 | - and !array_sum($array_values) |
|
| 5073 | - and !array_sum($object_values) |
|
| 5074 | - ) { |
|
| 5075 | - return join(', ', array_map('filtre_print_dist', $u)); |
|
| 5076 | - } |
|
| 5062 | + if (is_array($u)) { |
|
| 5063 | + $out = ''; |
|
| 5064 | + // toutes les cles sont numeriques ? |
|
| 5065 | + // et aucun enfant n'est un tableau |
|
| 5066 | + // liste simple separee par des virgules |
|
| 5067 | + $numeric_keys = array_map('is_numeric', array_keys($u)); |
|
| 5068 | + $array_values = array_map('is_array', $u); |
|
| 5069 | + $object_values = array_map('is_object', $u); |
|
| 5070 | + if ( |
|
| 5071 | + array_sum($numeric_keys) == count($numeric_keys) |
|
| 5072 | + and !array_sum($array_values) |
|
| 5073 | + and !array_sum($object_values) |
|
| 5074 | + ) { |
|
| 5075 | + return join(', ', array_map('filtre_print_dist', $u)); |
|
| 5076 | + } |
|
| 5077 | 5077 | |
| 5078 | - // sinon on passe a la ligne et on indente |
|
| 5079 | - $i_str = str_pad('', $indent, ' '); |
|
| 5080 | - foreach ($u as $k => $v) { |
|
| 5081 | - $out .= $join . $i_str . "$k: " . filtre_print_dist($v, $join, $indent + 2); |
|
| 5082 | - } |
|
| 5078 | + // sinon on passe a la ligne et on indente |
|
| 5079 | + $i_str = str_pad('', $indent, ' '); |
|
| 5080 | + foreach ($u as $k => $v) { |
|
| 5081 | + $out .= $join . $i_str . "$k: " . filtre_print_dist($v, $join, $indent + 2); |
|
| 5082 | + } |
|
| 5083 | 5083 | |
| 5084 | - return $out; |
|
| 5085 | - } |
|
| 5084 | + return $out; |
|
| 5085 | + } |
|
| 5086 | 5086 | |
| 5087 | - // on sait pas quoi faire... |
|
| 5088 | - return $u; |
|
| 5087 | + // on sait pas quoi faire... |
|
| 5088 | + return $u; |
|
| 5089 | 5089 | } |
| 5090 | 5090 | |
| 5091 | 5091 | |
@@ -5098,10 +5098,10 @@ discard block |
||
| 5098 | 5098 | * @return string|array |
| 5099 | 5099 | */ |
| 5100 | 5100 | function objet_info($objet, $info) { |
| 5101 | - $table = table_objet_sql($objet); |
|
| 5102 | - $infos = lister_tables_objets_sql($table); |
|
| 5101 | + $table = table_objet_sql($objet); |
|
| 5102 | + $infos = lister_tables_objets_sql($table); |
|
| 5103 | 5103 | |
| 5104 | - return ($infos[$info] ?? ''); |
|
| 5104 | + return ($infos[$info] ?? ''); |
|
| 5105 | 5105 | } |
| 5106 | 5106 | |
| 5107 | 5107 | /** |
@@ -5116,11 +5116,11 @@ discard block |
||
| 5116 | 5116 | * Texte traduit du comptage, tel que '3 articles' |
| 5117 | 5117 | */ |
| 5118 | 5118 | function objet_afficher_nb($nb, $objet) { |
| 5119 | - if (!$nb) { |
|
| 5120 | - return _T(objet_info($objet, 'info_aucun_objet')); |
|
| 5121 | - } else { |
|
| 5122 | - return _T(objet_info($objet, $nb == 1 ? 'info_1_objet' : 'info_nb_objets'), ['nb' => $nb]); |
|
| 5123 | - } |
|
| 5119 | + if (!$nb) { |
|
| 5120 | + return _T(objet_info($objet, 'info_aucun_objet')); |
|
| 5121 | + } else { |
|
| 5122 | + return _T(objet_info($objet, $nb == 1 ? 'info_1_objet' : 'info_nb_objets'), ['nb' => $nb]); |
|
| 5123 | + } |
|
| 5124 | 5124 | } |
| 5125 | 5125 | |
| 5126 | 5126 | /** |
@@ -5132,11 +5132,11 @@ discard block |
||
| 5132 | 5132 | * @return string |
| 5133 | 5133 | */ |
| 5134 | 5134 | function objet_icone($objet, $taille = 24, $class = '') { |
| 5135 | - $icone = objet_info($objet, 'icone_objet') . '-' . $taille . '.png'; |
|
| 5136 | - $icone = chemin_image($icone); |
|
| 5137 | - $balise_img = charger_filtre('balise_img'); |
|
| 5135 | + $icone = objet_info($objet, 'icone_objet') . '-' . $taille . '.png'; |
|
| 5136 | + $icone = chemin_image($icone); |
|
| 5137 | + $balise_img = charger_filtre('balise_img'); |
|
| 5138 | 5138 | |
| 5139 | - return $icone ? $balise_img($icone, _T(objet_info($objet, 'texte_objet')), $class, $taille) : ''; |
|
| 5139 | + return $icone ? $balise_img($icone, _T(objet_info($objet, 'texte_objet')), $class, $taille) : ''; |
|
| 5140 | 5140 | } |
| 5141 | 5141 | |
| 5142 | 5142 | /** |
@@ -5157,12 +5157,12 @@ discard block |
||
| 5157 | 5157 | * @return string |
| 5158 | 5158 | */ |
| 5159 | 5159 | function objet_T($objet, $chaine, $args = [], $options = []) { |
| 5160 | - $chaine = explode(':', $chaine); |
|
| 5161 | - if ($t = _T($objet . ':' . end($chaine), $args, array_merge($options, ['force' => false]))) { |
|
| 5162 | - return $t; |
|
| 5163 | - } |
|
| 5164 | - $chaine = implode(':', $chaine); |
|
| 5165 | - return _T($chaine, $args, $options); |
|
| 5160 | + $chaine = explode(':', $chaine); |
|
| 5161 | + if ($t = _T($objet . ':' . end($chaine), $args, array_merge($options, ['force' => false]))) { |
|
| 5162 | + return $t; |
|
| 5163 | + } |
|
| 5164 | + $chaine = implode(':', $chaine); |
|
| 5165 | + return _T($chaine, $args, $options); |
|
| 5166 | 5166 | } |
| 5167 | 5167 | |
| 5168 | 5168 | /** |
@@ -5176,18 +5176,18 @@ discard block |
||
| 5176 | 5176 | * @return string Code HTML |
| 5177 | 5177 | */ |
| 5178 | 5178 | function insert_head_css_conditionnel($flux) { |
| 5179 | - if ( |
|
| 5180 | - strpos($flux, '<!-- insert_head_css -->') === false |
|
| 5181 | - and $p = strpos($flux, '<!-- insert_head -->') |
|
| 5182 | - ) { |
|
| 5183 | - // plutot avant le premier js externe (jquery) pour etre non bloquant |
|
| 5184 | - if ($p1 = stripos($flux, '<script src=') and $p1 < $p) { |
|
| 5185 | - $p = $p1; |
|
| 5186 | - } |
|
| 5187 | - $flux = substr_replace($flux, pipeline('insert_head_css', '<!-- insert_head_css -->'), $p, 0); |
|
| 5188 | - } |
|
| 5179 | + if ( |
|
| 5180 | + strpos($flux, '<!-- insert_head_css -->') === false |
|
| 5181 | + and $p = strpos($flux, '<!-- insert_head -->') |
|
| 5182 | + ) { |
|
| 5183 | + // plutot avant le premier js externe (jquery) pour etre non bloquant |
|
| 5184 | + if ($p1 = stripos($flux, '<script src=') and $p1 < $p) { |
|
| 5185 | + $p = $p1; |
|
| 5186 | + } |
|
| 5187 | + $flux = substr_replace($flux, pipeline('insert_head_css', '<!-- insert_head_css -->'), $p, 0); |
|
| 5188 | + } |
|
| 5189 | 5189 | |
| 5190 | - return $flux; |
|
| 5190 | + return $flux; |
|
| 5191 | 5191 | } |
| 5192 | 5192 | |
| 5193 | 5193 | /** |
@@ -5210,75 +5210,75 @@ discard block |
||
| 5210 | 5210 | * @return string |
| 5211 | 5211 | */ |
| 5212 | 5212 | function produire_fond_statique($fond, $contexte = [], $options = [], string $connect = '') { |
| 5213 | - if (isset($contexte['format'])) { |
|
| 5214 | - $extension = $contexte['format']; |
|
| 5215 | - unset($contexte['format']); |
|
| 5216 | - } else { |
|
| 5217 | - $extension = 'html'; |
|
| 5218 | - if (preg_match(',[.](css|js|json|xml|svg)$,', $fond, $m)) { |
|
| 5219 | - $extension = $m[1]; |
|
| 5220 | - } |
|
| 5221 | - } |
|
| 5222 | - // recuperer le contenu produit par le squelette |
|
| 5223 | - $options['raw'] = true; |
|
| 5224 | - $cache = recuperer_fond($fond, $contexte, $options, $connect); |
|
| 5225 | - |
|
| 5226 | - // calculer le nom de la css |
|
| 5227 | - $dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension); |
|
| 5228 | - $nom_safe = preg_replace(',\W,', '_', str_replace('.', '_', $fond)); |
|
| 5229 | - $contexte_implicite = calculer_contexte_implicite(); |
|
| 5230 | - |
|
| 5231 | - // par defaut on hash selon les contextes qui sont a priori moins variables |
|
| 5232 | - // mais on peut hasher selon le contenu a la demande, si plusieurs contextes produisent un meme contenu |
|
| 5233 | - // reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine |
|
| 5234 | - if (isset($options['hash_on_content']) and $options['hash_on_content']) { |
|
| 5235 | - $hash = md5($contexte_implicite['host'] . '::' . $cache); |
|
| 5236 | - } |
|
| 5237 | - else { |
|
| 5238 | - unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js |
|
| 5239 | - ksort($contexte); |
|
| 5240 | - $hash = md5($fond . json_encode($contexte_implicite, JSON_THROW_ON_ERROR) . json_encode($contexte, JSON_THROW_ON_ERROR) . $connect); |
|
| 5241 | - } |
|
| 5242 | - $filename = $dir_var . $extension . "dyn-$nom_safe-" . substr($hash, 0, 8) . ".$extension"; |
|
| 5243 | - |
|
| 5244 | - // mettre a jour le fichier si il n'existe pas |
|
| 5245 | - // ou trop ancien |
|
| 5246 | - // le dernier fichier produit est toujours suffixe par .last |
|
| 5247 | - // et recopie sur le fichier cible uniquement si il change |
|
| 5248 | - if ( |
|
| 5249 | - !file_exists($filename) |
|
| 5250 | - or !file_exists($filename . '.last') |
|
| 5251 | - or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . '.last') < $cache['lastmodified']) |
|
| 5252 | - or (defined('_VAR_MODE') and _VAR_MODE == 'recalcul') |
|
| 5253 | - ) { |
|
| 5254 | - $contenu = $cache['texte']; |
|
| 5255 | - // passer les urls en absolu si c'est une css |
|
| 5256 | - if ($extension == 'css') { |
|
| 5257 | - $contenu = urls_absolues_css( |
|
| 5258 | - $contenu, |
|
| 5259 | - test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond) |
|
| 5260 | - ); |
|
| 5261 | - } |
|
| 5262 | - |
|
| 5263 | - $comment = ''; |
|
| 5264 | - // ne pas insérer de commentaire sur certains formats |
|
| 5265 | - if (!in_array($extension, ['json', 'xml', 'svg'])) { |
|
| 5266 | - $comment = "/* #PRODUIRE{fond=$fond"; |
|
| 5267 | - foreach ($contexte as $k => $v) { |
|
| 5268 | - if (is_array($v)) { |
|
| 5269 | - $v = var_export($v, true); |
|
| 5270 | - } |
|
| 5271 | - $comment .= ",$k=$v"; |
|
| 5272 | - } |
|
| 5273 | - // pas de date dans le commentaire car sinon ca invalide le md5 et force la maj |
|
| 5274 | - // mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non |
|
| 5275 | - $comment .= "}\n md5:" . md5($contenu) . " */\n"; |
|
| 5276 | - } |
|
| 5277 | - // et ecrire le fichier si il change |
|
| 5278 | - ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu, false, true); |
|
| 5279 | - } |
|
| 5280 | - |
|
| 5281 | - return timestamp($filename); |
|
| 5213 | + if (isset($contexte['format'])) { |
|
| 5214 | + $extension = $contexte['format']; |
|
| 5215 | + unset($contexte['format']); |
|
| 5216 | + } else { |
|
| 5217 | + $extension = 'html'; |
|
| 5218 | + if (preg_match(',[.](css|js|json|xml|svg)$,', $fond, $m)) { |
|
| 5219 | + $extension = $m[1]; |
|
| 5220 | + } |
|
| 5221 | + } |
|
| 5222 | + // recuperer le contenu produit par le squelette |
|
| 5223 | + $options['raw'] = true; |
|
| 5224 | + $cache = recuperer_fond($fond, $contexte, $options, $connect); |
|
| 5225 | + |
|
| 5226 | + // calculer le nom de la css |
|
| 5227 | + $dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension); |
|
| 5228 | + $nom_safe = preg_replace(',\W,', '_', str_replace('.', '_', $fond)); |
|
| 5229 | + $contexte_implicite = calculer_contexte_implicite(); |
|
| 5230 | + |
|
| 5231 | + // par defaut on hash selon les contextes qui sont a priori moins variables |
|
| 5232 | + // mais on peut hasher selon le contenu a la demande, si plusieurs contextes produisent un meme contenu |
|
| 5233 | + // reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine |
|
| 5234 | + if (isset($options['hash_on_content']) and $options['hash_on_content']) { |
|
| 5235 | + $hash = md5($contexte_implicite['host'] . '::' . $cache); |
|
| 5236 | + } |
|
| 5237 | + else { |
|
| 5238 | + unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js |
|
| 5239 | + ksort($contexte); |
|
| 5240 | + $hash = md5($fond . json_encode($contexte_implicite, JSON_THROW_ON_ERROR) . json_encode($contexte, JSON_THROW_ON_ERROR) . $connect); |
|
| 5241 | + } |
|
| 5242 | + $filename = $dir_var . $extension . "dyn-$nom_safe-" . substr($hash, 0, 8) . ".$extension"; |
|
| 5243 | + |
|
| 5244 | + // mettre a jour le fichier si il n'existe pas |
|
| 5245 | + // ou trop ancien |
|
| 5246 | + // le dernier fichier produit est toujours suffixe par .last |
|
| 5247 | + // et recopie sur le fichier cible uniquement si il change |
|
| 5248 | + if ( |
|
| 5249 | + !file_exists($filename) |
|
| 5250 | + or !file_exists($filename . '.last') |
|
| 5251 | + or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . '.last') < $cache['lastmodified']) |
|
| 5252 | + or (defined('_VAR_MODE') and _VAR_MODE == 'recalcul') |
|
| 5253 | + ) { |
|
| 5254 | + $contenu = $cache['texte']; |
|
| 5255 | + // passer les urls en absolu si c'est une css |
|
| 5256 | + if ($extension == 'css') { |
|
| 5257 | + $contenu = urls_absolues_css( |
|
| 5258 | + $contenu, |
|
| 5259 | + test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond) |
|
| 5260 | + ); |
|
| 5261 | + } |
|
| 5262 | + |
|
| 5263 | + $comment = ''; |
|
| 5264 | + // ne pas insérer de commentaire sur certains formats |
|
| 5265 | + if (!in_array($extension, ['json', 'xml', 'svg'])) { |
|
| 5266 | + $comment = "/* #PRODUIRE{fond=$fond"; |
|
| 5267 | + foreach ($contexte as $k => $v) { |
|
| 5268 | + if (is_array($v)) { |
|
| 5269 | + $v = var_export($v, true); |
|
| 5270 | + } |
|
| 5271 | + $comment .= ",$k=$v"; |
|
| 5272 | + } |
|
| 5273 | + // pas de date dans le commentaire car sinon ca invalide le md5 et force la maj |
|
| 5274 | + // mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non |
|
| 5275 | + $comment .= "}\n md5:" . md5($contenu) . " */\n"; |
|
| 5276 | + } |
|
| 5277 | + // et ecrire le fichier si il change |
|
| 5278 | + ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu, false, true); |
|
| 5279 | + } |
|
| 5280 | + |
|
| 5281 | + return timestamp($filename); |
|
| 5282 | 5282 | } |
| 5283 | 5283 | |
| 5284 | 5284 | /** |
@@ -5291,15 +5291,15 @@ discard block |
||
| 5291 | 5291 | * $fichier auquel on a ajouté le timestamp |
| 5292 | 5292 | */ |
| 5293 | 5293 | function timestamp($fichier) { |
| 5294 | - if ( |
|
| 5295 | - !$fichier |
|
| 5296 | - or !file_exists($fichier) |
|
| 5297 | - or !$m = filemtime($fichier) |
|
| 5298 | - ) { |
|
| 5299 | - return $fichier; |
|
| 5300 | - } |
|
| 5294 | + if ( |
|
| 5295 | + !$fichier |
|
| 5296 | + or !file_exists($fichier) |
|
| 5297 | + or !$m = filemtime($fichier) |
|
| 5298 | + ) { |
|
| 5299 | + return $fichier; |
|
| 5300 | + } |
|
| 5301 | 5301 | |
| 5302 | - return "$fichier?$m"; |
|
| 5302 | + return "$fichier?$m"; |
|
| 5303 | 5303 | } |
| 5304 | 5304 | |
| 5305 | 5305 | /** |
@@ -5309,11 +5309,11 @@ discard block |
||
| 5309 | 5309 | * @return string |
| 5310 | 5310 | */ |
| 5311 | 5311 | function supprimer_timestamp($url) { |
| 5312 | - if (strpos($url, '?') === false) { |
|
| 5313 | - return $url; |
|
| 5314 | - } |
|
| 5312 | + if (strpos($url, '?') === false) { |
|
| 5313 | + return $url; |
|
| 5314 | + } |
|
| 5315 | 5315 | |
| 5316 | - return preg_replace(',\?[[:digit:]]+$,', '', $url); |
|
| 5316 | + return preg_replace(',\?[[:digit:]]+$,', '', $url); |
|
| 5317 | 5317 | } |
| 5318 | 5318 | |
| 5319 | 5319 | /** |
@@ -5328,15 +5328,15 @@ discard block |
||
| 5328 | 5328 | * @return string |
| 5329 | 5329 | */ |
| 5330 | 5330 | function filtre_nettoyer_titre_email_dist($titre) { |
| 5331 | - include_spip('inc/envoyer_mail'); |
|
| 5331 | + include_spip('inc/envoyer_mail'); |
|
| 5332 | 5332 | |
| 5333 | - $titre = nettoyer_titre_email($titre); |
|
| 5334 | - // on est dans un squelette : securiser le retour |
|
| 5335 | - if (strpos($titre, '<') !== false) { |
|
| 5336 | - $titre = interdire_scripts($titre); |
|
| 5337 | - } |
|
| 5333 | + $titre = nettoyer_titre_email($titre); |
|
| 5334 | + // on est dans un squelette : securiser le retour |
|
| 5335 | + if (strpos($titre, '<') !== false) { |
|
| 5336 | + $titre = interdire_scripts($titre); |
|
| 5337 | + } |
|
| 5338 | 5338 | |
| 5339 | - return $titre; |
|
| 5339 | + return $titre; |
|
| 5340 | 5340 | } |
| 5341 | 5341 | |
| 5342 | 5342 | /** |
@@ -5358,27 +5358,27 @@ discard block |
||
| 5358 | 5358 | * @return string |
| 5359 | 5359 | */ |
| 5360 | 5360 | function filtre_chercher_rubrique_dist( |
| 5361 | - $titre, |
|
| 5362 | - $id_objet, |
|
| 5363 | - $id_parent, |
|
| 5364 | - $objet, |
|
| 5365 | - $id_secteur, |
|
| 5366 | - $restreint, |
|
| 5367 | - $actionable = false, |
|
| 5368 | - $retour_sans_cadre = false |
|
| 5361 | + $titre, |
|
| 5362 | + $id_objet, |
|
| 5363 | + $id_parent, |
|
| 5364 | + $objet, |
|
| 5365 | + $id_secteur, |
|
| 5366 | + $restreint, |
|
| 5367 | + $actionable = false, |
|
| 5368 | + $retour_sans_cadre = false |
|
| 5369 | 5369 | ) { |
| 5370 | - include_spip('inc/filtres_ecrire'); |
|
| 5370 | + include_spip('inc/filtres_ecrire'); |
|
| 5371 | 5371 | |
| 5372 | - return chercher_rubrique( |
|
| 5373 | - $titre, |
|
| 5374 | - $id_objet, |
|
| 5375 | - $id_parent, |
|
| 5376 | - $objet, |
|
| 5377 | - $id_secteur, |
|
| 5378 | - $restreint, |
|
| 5379 | - $actionable, |
|
| 5380 | - $retour_sans_cadre |
|
| 5381 | - ); |
|
| 5372 | + return chercher_rubrique( |
|
| 5373 | + $titre, |
|
| 5374 | + $id_objet, |
|
| 5375 | + $id_parent, |
|
| 5376 | + $objet, |
|
| 5377 | + $id_secteur, |
|
| 5378 | + $restreint, |
|
| 5379 | + $actionable, |
|
| 5380 | + $retour_sans_cadre |
|
| 5381 | + ); |
|
| 5382 | 5382 | } |
| 5383 | 5383 | |
| 5384 | 5384 | /** |
@@ -5407,56 +5407,56 @@ discard block |
||
| 5407 | 5407 | * Chaîne vide si l'accès est autorisé |
| 5408 | 5408 | */ |
| 5409 | 5409 | function sinon_interdire_acces($ok = false, $url = '', $statut = 0, $message = null) { |
| 5410 | - if ($ok) { |
|
| 5411 | - return ''; |
|
| 5412 | - } |
|
| 5413 | - |
|
| 5414 | - // Vider tous les tampons |
|
| 5415 | - $level = @ob_get_level(); |
|
| 5416 | - while ($level--) { |
|
| 5417 | - @ob_end_clean(); |
|
| 5418 | - } |
|
| 5419 | - |
|
| 5420 | - include_spip('inc/headers'); |
|
| 5421 | - |
|
| 5422 | - // S'il y a une URL, on redirige (si pas de statut, la fonction mettra 302 par défaut) |
|
| 5423 | - if ($url) { |
|
| 5424 | - redirige_par_entete($url, '', $statut); |
|
| 5425 | - } |
|
| 5426 | - |
|
| 5427 | - // ecriture simplifiee avec message en 3eme argument (= statut 403) |
|
| 5428 | - if (!is_numeric($statut) and is_null($message)) { |
|
| 5429 | - $message = $statut; |
|
| 5430 | - $statut = 0; |
|
| 5431 | - } |
|
| 5432 | - if (!$message) { |
|
| 5433 | - $message = ''; |
|
| 5434 | - } |
|
| 5435 | - $statut = intval($statut); |
|
| 5436 | - |
|
| 5437 | - // Si on est dans l'espace privé, on génère du 403 Forbidden par defaut ou du 404 |
|
| 5438 | - if (test_espace_prive()) { |
|
| 5439 | - if (!$statut or !in_array($statut, [404, 403])) { |
|
| 5440 | - $statut = 403; |
|
| 5441 | - } |
|
| 5442 | - http_response_code(403); |
|
| 5443 | - $echec = charger_fonction('403', 'exec'); |
|
| 5444 | - $echec($message); |
|
| 5445 | - } else { |
|
| 5446 | - // Sinon dans l'espace public on redirige vers une 404 par défaut, car elle toujours présente normalement |
|
| 5447 | - if (!$statut) { |
|
| 5448 | - $statut = 404; |
|
| 5449 | - } |
|
| 5450 | - // Dans tous les cas on modifie l'entité avec ce qui est demandé |
|
| 5451 | - http_response_code($statut); |
|
| 5452 | - // Si le statut est une erreur et qu'il n'y a pas de redirection on va chercher le squelette du même nom |
|
| 5453 | - if ($statut >= 400) { |
|
| 5454 | - echo recuperer_fond("$statut", ['erreur' => $message]); |
|
| 5455 | - } |
|
| 5456 | - } |
|
| 5457 | - |
|
| 5458 | - |
|
| 5459 | - exit; |
|
| 5410 | + if ($ok) { |
|
| 5411 | + return ''; |
|
| 5412 | + } |
|
| 5413 | + |
|
| 5414 | + // Vider tous les tampons |
|
| 5415 | + $level = @ob_get_level(); |
|
| 5416 | + while ($level--) { |
|
| 5417 | + @ob_end_clean(); |
|
| 5418 | + } |
|
| 5419 | + |
|
| 5420 | + include_spip('inc/headers'); |
|
| 5421 | + |
|
| 5422 | + // S'il y a une URL, on redirige (si pas de statut, la fonction mettra 302 par défaut) |
|
| 5423 | + if ($url) { |
|
| 5424 | + redirige_par_entete($url, '', $statut); |
|
| 5425 | + } |
|
| 5426 | + |
|
| 5427 | + // ecriture simplifiee avec message en 3eme argument (= statut 403) |
|
| 5428 | + if (!is_numeric($statut) and is_null($message)) { |
|
| 5429 | + $message = $statut; |
|
| 5430 | + $statut = 0; |
|
| 5431 | + } |
|
| 5432 | + if (!$message) { |
|
| 5433 | + $message = ''; |
|
| 5434 | + } |
|
| 5435 | + $statut = intval($statut); |
|
| 5436 | + |
|
| 5437 | + // Si on est dans l'espace privé, on génère du 403 Forbidden par defaut ou du 404 |
|
| 5438 | + if (test_espace_prive()) { |
|
| 5439 | + if (!$statut or !in_array($statut, [404, 403])) { |
|
| 5440 | + $statut = 403; |
|
| 5441 | + } |
|
| 5442 | + http_response_code(403); |
|
| 5443 | + $echec = charger_fonction('403', 'exec'); |
|
| 5444 | + $echec($message); |
|
| 5445 | + } else { |
|
| 5446 | + // Sinon dans l'espace public on redirige vers une 404 par défaut, car elle toujours présente normalement |
|
| 5447 | + if (!$statut) { |
|
| 5448 | + $statut = 404; |
|
| 5449 | + } |
|
| 5450 | + // Dans tous les cas on modifie l'entité avec ce qui est demandé |
|
| 5451 | + http_response_code($statut); |
|
| 5452 | + // Si le statut est une erreur et qu'il n'y a pas de redirection on va chercher le squelette du même nom |
|
| 5453 | + if ($statut >= 400) { |
|
| 5454 | + echo recuperer_fond("$statut", ['erreur' => $message]); |
|
| 5455 | + } |
|
| 5456 | + } |
|
| 5457 | + |
|
| 5458 | + |
|
| 5459 | + exit; |
|
| 5460 | 5460 | } |
| 5461 | 5461 | |
| 5462 | 5462 | /** |
@@ -5467,11 +5467,11 @@ discard block |
||
| 5467 | 5467 | * @return string |
| 5468 | 5468 | */ |
| 5469 | 5469 | function filtre_compacte_dist($source, $format = null) { |
| 5470 | - if (function_exists('minifier')) { |
|
| 5471 | - return minifier($source, $format); |
|
| 5472 | - } |
|
| 5470 | + if (function_exists('minifier')) { |
|
| 5471 | + return minifier($source, $format); |
|
| 5472 | + } |
|
| 5473 | 5473 | |
| 5474 | - return $source; |
|
| 5474 | + return $source; |
|
| 5475 | 5475 | } |
| 5476 | 5476 | |
| 5477 | 5477 | |
@@ -5483,32 +5483,32 @@ discard block |
||
| 5483 | 5483 | * @return string |
| 5484 | 5484 | */ |
| 5485 | 5485 | function spip_affiche_mot_de_passe_masque(?string $passe, bool $afficher_partiellement = false, ?int $portion_pourcent = null): string { |
| 5486 | - $passe ??= ''; |
|
| 5487 | - $l = strlen($passe); |
|
| 5488 | - |
|
| 5489 | - if ($l <= 8 or !$afficher_partiellement) { |
|
| 5490 | - if (!$l) { |
|
| 5491 | - return ''; // montrer qu'il y a pas de mot de passe si il y en a pas |
|
| 5492 | - } |
|
| 5493 | - return str_pad('', $afficher_partiellement ? $l : 16, '*'); |
|
| 5494 | - } |
|
| 5495 | - |
|
| 5496 | - if (is_null($portion_pourcent)) { |
|
| 5497 | - if (!defined('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT')) { |
|
| 5498 | - define('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT', 20); // 20% |
|
| 5499 | - } |
|
| 5500 | - $portion_pourcent = _SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT; |
|
| 5501 | - } |
|
| 5502 | - if ($portion_pourcent >= 100) { |
|
| 5503 | - return $passe; |
|
| 5504 | - } |
|
| 5505 | - $e = intval(ceil($l * $portion_pourcent / 100 / 2)); |
|
| 5506 | - $e = max($e, 0); |
|
| 5507 | - $mid = str_pad('', $l - 2 * $e, '*'); |
|
| 5508 | - if ($e > 0 and strlen($mid) > 8) { |
|
| 5509 | - $mid = '***...***'; |
|
| 5510 | - } |
|
| 5511 | - return substr($passe, 0, $e) . $mid . ($e > 0 ? substr($passe, -$e) : ''); |
|
| 5486 | + $passe ??= ''; |
|
| 5487 | + $l = strlen($passe); |
|
| 5488 | + |
|
| 5489 | + if ($l <= 8 or !$afficher_partiellement) { |
|
| 5490 | + if (!$l) { |
|
| 5491 | + return ''; // montrer qu'il y a pas de mot de passe si il y en a pas |
|
| 5492 | + } |
|
| 5493 | + return str_pad('', $afficher_partiellement ? $l : 16, '*'); |
|
| 5494 | + } |
|
| 5495 | + |
|
| 5496 | + if (is_null($portion_pourcent)) { |
|
| 5497 | + if (!defined('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT')) { |
|
| 5498 | + define('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT', 20); // 20% |
|
| 5499 | + } |
|
| 5500 | + $portion_pourcent = _SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT; |
|
| 5501 | + } |
|
| 5502 | + if ($portion_pourcent >= 100) { |
|
| 5503 | + return $passe; |
|
| 5504 | + } |
|
| 5505 | + $e = intval(ceil($l * $portion_pourcent / 100 / 2)); |
|
| 5506 | + $e = max($e, 0); |
|
| 5507 | + $mid = str_pad('', $l - 2 * $e, '*'); |
|
| 5508 | + if ($e > 0 and strlen($mid) > 8) { |
|
| 5509 | + $mid = '***...***'; |
|
| 5510 | + } |
|
| 5511 | + return substr($passe, 0, $e) . $mid . ($e > 0 ? substr($passe, -$e) : ''); |
|
| 5512 | 5512 | } |
| 5513 | 5513 | |
| 5514 | 5514 | |
@@ -5529,64 +5529,64 @@ discard block |
||
| 5529 | 5529 | */ |
| 5530 | 5530 | function identifiant_slug($texte, $type = '', $options = []) { |
| 5531 | 5531 | |
| 5532 | - $original = $texte; |
|
| 5533 | - $separateur = ($options['separateur'] ?? '_'); |
|
| 5534 | - $longueur_maxi = ($options['longueur_maxi'] ?? 60); |
|
| 5535 | - $longueur_mini = ($options['longueur_mini'] ?? 0); |
|
| 5532 | + $original = $texte; |
|
| 5533 | + $separateur = ($options['separateur'] ?? '_'); |
|
| 5534 | + $longueur_maxi = ($options['longueur_maxi'] ?? 60); |
|
| 5535 | + $longueur_mini = ($options['longueur_mini'] ?? 0); |
|
| 5536 | 5536 | |
| 5537 | - if (!function_exists('translitteration')) { |
|
| 5538 | - include_spip('inc/charsets'); |
|
| 5539 | - } |
|
| 5537 | + if (!function_exists('translitteration')) { |
|
| 5538 | + include_spip('inc/charsets'); |
|
| 5539 | + } |
|
| 5540 | 5540 | |
| 5541 | - // pas de balise html |
|
| 5542 | - if (strpos($texte, '<') !== false) { |
|
| 5543 | - $texte = strip_tags($texte); |
|
| 5544 | - } |
|
| 5545 | - if (strpos($texte, '&') !== false) { |
|
| 5546 | - $texte = unicode2charset($texte); |
|
| 5547 | - } |
|
| 5548 | - // On enlève les espaces indésirables |
|
| 5549 | - $texte = trim($texte); |
|
| 5541 | + // pas de balise html |
|
| 5542 | + if (strpos($texte, '<') !== false) { |
|
| 5543 | + $texte = strip_tags($texte); |
|
| 5544 | + } |
|
| 5545 | + if (strpos($texte, '&') !== false) { |
|
| 5546 | + $texte = unicode2charset($texte); |
|
| 5547 | + } |
|
| 5548 | + // On enlève les espaces indésirables |
|
| 5549 | + $texte = trim($texte); |
|
| 5550 | 5550 | |
| 5551 | - // On enlève les accents et cie |
|
| 5552 | - $texte = translitteration($texte); |
|
| 5551 | + // On enlève les accents et cie |
|
| 5552 | + $texte = translitteration($texte); |
|
| 5553 | 5553 | |
| 5554 | - // On remplace tout ce qui n'est pas un mot par un séparateur |
|
| 5555 | - $texte = preg_replace(',[\W_]+,ms', $separateur, $texte); |
|
| 5554 | + // On remplace tout ce qui n'est pas un mot par un séparateur |
|
| 5555 | + $texte = preg_replace(',[\W_]+,ms', $separateur, $texte); |
|
| 5556 | 5556 | |
| 5557 | - // nettoyer les doubles occurences du separateur si besoin |
|
| 5558 | - while (strpos($texte, (string) "$separateur$separateur") !== false) { |
|
| 5559 | - $texte = str_replace("$separateur$separateur", $separateur, $texte); |
|
| 5560 | - } |
|
| 5557 | + // nettoyer les doubles occurences du separateur si besoin |
|
| 5558 | + while (strpos($texte, (string) "$separateur$separateur") !== false) { |
|
| 5559 | + $texte = str_replace("$separateur$separateur", $separateur, $texte); |
|
| 5560 | + } |
|
| 5561 | 5561 | |
| 5562 | - // pas de separateur au debut ni a la fin |
|
| 5563 | - $texte = trim($texte, $separateur); |
|
| 5562 | + // pas de separateur au debut ni a la fin |
|
| 5563 | + $texte = trim($texte, $separateur); |
|
| 5564 | 5564 | |
| 5565 | - // en minuscules |
|
| 5566 | - $texte = strtolower($texte); |
|
| 5565 | + // en minuscules |
|
| 5566 | + $texte = strtolower($texte); |
|
| 5567 | 5567 | |
| 5568 | - switch ($type) { |
|
| 5569 | - case 'class': |
|
| 5570 | - case 'id': |
|
| 5571 | - case 'anchor': |
|
| 5572 | - if (preg_match(',^\d,', $texte)) { |
|
| 5573 | - $texte = substr($type, 0, 1) . $texte; |
|
| 5574 | - } |
|
| 5575 | - } |
|
| 5568 | + switch ($type) { |
|
| 5569 | + case 'class': |
|
| 5570 | + case 'id': |
|
| 5571 | + case 'anchor': |
|
| 5572 | + if (preg_match(',^\d,', $texte)) { |
|
| 5573 | + $texte = substr($type, 0, 1) . $texte; |
|
| 5574 | + } |
|
| 5575 | + } |
|
| 5576 | 5576 | |
| 5577 | - if (strlen($texte) > $longueur_maxi) { |
|
| 5578 | - $texte = substr($texte, 0, $longueur_maxi); |
|
| 5579 | - } |
|
| 5577 | + if (strlen($texte) > $longueur_maxi) { |
|
| 5578 | + $texte = substr($texte, 0, $longueur_maxi); |
|
| 5579 | + } |
|
| 5580 | 5580 | |
| 5581 | - if (strlen($texte) < $longueur_mini and $longueur_mini < $longueur_maxi) { |
|
| 5582 | - if (preg_match(',^\d,', $texte)) { |
|
| 5583 | - $texte = ($type ? substr($type, 0, 1) : 's') . $texte; |
|
| 5584 | - } |
|
| 5585 | - $texte .= $separateur . md5($original); |
|
| 5586 | - $texte = substr($texte, 0, $longueur_mini); |
|
| 5587 | - } |
|
| 5581 | + if (strlen($texte) < $longueur_mini and $longueur_mini < $longueur_maxi) { |
|
| 5582 | + if (preg_match(',^\d,', $texte)) { |
|
| 5583 | + $texte = ($type ? substr($type, 0, 1) : 's') . $texte; |
|
| 5584 | + } |
|
| 5585 | + $texte .= $separateur . md5($original); |
|
| 5586 | + $texte = substr($texte, 0, $longueur_mini); |
|
| 5587 | + } |
|
| 5588 | 5588 | |
| 5589 | - return $texte; |
|
| 5589 | + return $texte; |
|
| 5590 | 5590 | } |
| 5591 | 5591 | |
| 5592 | 5592 | |
@@ -5607,11 +5607,11 @@ discard block |
||
| 5607 | 5607 | * @exemple `<:info_maximum|label_nettoyer:>` |
| 5608 | 5608 | */ |
| 5609 | 5609 | function label_nettoyer(string $text, bool $ucfirst = true): string { |
| 5610 | - $label = preg_replace('#([\s:]|\ )+$#u', '', $text); |
|
| 5611 | - if ($ucfirst) { |
|
| 5612 | - $label = spip_ucfirst($label); |
|
| 5613 | - } |
|
| 5614 | - return $label; |
|
| 5610 | + $label = preg_replace('#([\s:]|\ )+$#u', '', $text); |
|
| 5611 | + if ($ucfirst) { |
|
| 5612 | + $label = spip_ucfirst($label); |
|
| 5613 | + } |
|
| 5614 | + return $label; |
|
| 5615 | 5615 | } |
| 5616 | 5616 | |
| 5617 | 5617 | /** |
@@ -5624,8 +5624,8 @@ discard block |
||
| 5624 | 5624 | * @exemple `<:info_maximum|label_ponctuer:>` |
| 5625 | 5625 | */ |
| 5626 | 5626 | function label_ponctuer(string $text, bool $ucfirst = true): string { |
| 5627 | - $label = label_nettoyer($text, $ucfirst); |
|
| 5628 | - return _T('label_ponctuer', ['label' => $label]); |
|
| 5627 | + $label = label_nettoyer($text, $ucfirst); |
|
| 5628 | + return _T('label_ponctuer', ['label' => $label]); |
|
| 5629 | 5629 | } |
| 5630 | 5630 | |
| 5631 | 5631 | |
@@ -5638,19 +5638,19 @@ discard block |
||
| 5638 | 5638 | * @return array |
| 5639 | 5639 | */ |
| 5640 | 5640 | function helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, $fonction) { |
| 5641 | - if (!in_array($fonction, ['objet_lister_parents', 'objet_lister_enfants', 'objet_lister_parents_par_type', 'objet_lister_enfants_par_type'])) { |
|
| 5642 | - return []; |
|
| 5643 | - } |
|
| 5641 | + if (!in_array($fonction, ['objet_lister_parents', 'objet_lister_enfants', 'objet_lister_parents_par_type', 'objet_lister_enfants_par_type'])) { |
|
| 5642 | + return []; |
|
| 5643 | + } |
|
| 5644 | 5644 | |
| 5645 | - // compatibilite signature inversee |
|
| 5646 | - if (is_numeric($objet) and !is_numeric($id_objet)) { |
|
| 5647 | - [$objet, $id_objet] = [$id_objet, $objet]; |
|
| 5648 | - } |
|
| 5645 | + // compatibilite signature inversee |
|
| 5646 | + if (is_numeric($objet) and !is_numeric($id_objet)) { |
|
| 5647 | + [$objet, $id_objet] = [$id_objet, $objet]; |
|
| 5648 | + } |
|
| 5649 | 5649 | |
| 5650 | - if (!function_exists($fonction)) { |
|
| 5651 | - include_spip('base/objets'); |
|
| 5652 | - } |
|
| 5653 | - return $fonction($objet, $id_objet); |
|
| 5650 | + if (!function_exists($fonction)) { |
|
| 5651 | + include_spip('base/objets'); |
|
| 5652 | + } |
|
| 5653 | + return $fonction($objet, $id_objet); |
|
| 5654 | 5654 | } |
| 5655 | 5655 | |
| 5656 | 5656 | |
@@ -5665,7 +5665,7 @@ discard block |
||
| 5665 | 5665 | * @return array |
| 5666 | 5666 | */ |
| 5667 | 5667 | function filtre_objet_lister_parents_dist($objet, $id_objet) { |
| 5668 | - return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents'); |
|
| 5668 | + return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents'); |
|
| 5669 | 5669 | } |
| 5670 | 5670 | |
| 5671 | 5671 | /** |
@@ -5679,7 +5679,7 @@ discard block |
||
| 5679 | 5679 | * @return array |
| 5680 | 5680 | */ |
| 5681 | 5681 | function filtre_objet_lister_parents_par_type_dist($objet, $id_objet) { |
| 5682 | - return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents_par_type'); |
|
| 5682 | + return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents_par_type'); |
|
| 5683 | 5683 | } |
| 5684 | 5684 | |
| 5685 | 5685 | /** |
@@ -5693,7 +5693,7 @@ discard block |
||
| 5693 | 5693 | * @return array |
| 5694 | 5694 | */ |
| 5695 | 5695 | function filtre_objet_lister_enfants_dist($objet, $id_objet) { |
| 5696 | - return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants'); |
|
| 5696 | + return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants'); |
|
| 5697 | 5697 | } |
| 5698 | 5698 | |
| 5699 | 5699 | /** |
@@ -5707,5 +5707,5 @@ discard block |
||
| 5707 | 5707 | * @return array |
| 5708 | 5708 | */ |
| 5709 | 5709 | function filtre_objet_lister_enfants_par_type_dist($objet, $id_objet) { |
| 5710 | - return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants_par_type'); |
|
| 5710 | + return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants_par_type'); |
|
| 5711 | 5711 | } |
@@ -96,7 +96,7 @@ discard block |
||
| 96 | 96 | } |
| 97 | 97 | |
| 98 | 98 | include_fichiers_fonctions(); |
| 99 | - foreach (['filtre_' . $fonc, 'filtre_' . $fonc . '_dist', $fonc] as $f) { |
|
| 99 | + foreach (['filtre_'.$fonc, 'filtre_'.$fonc.'_dist', $fonc] as $f) { |
|
| 100 | 100 | trouver_filtre_matrice($f); // charge des fichiers spécifiques éventuels |
| 101 | 101 | if (is_callable($f)) { |
| 102 | 102 | return $f; |
@@ -234,7 +234,7 @@ discard block |
||
| 234 | 234 | // affichage "GIT [master: abcdef]" |
| 235 | 235 | $commit = $desc['commit_short'] ?? $desc['commit']; |
| 236 | 236 | if ($desc['branch']) { |
| 237 | - $commit = $desc['branch'] . ': ' . $commit; |
|
| 237 | + $commit = $desc['branch'].': '.$commit; |
|
| 238 | 238 | } |
| 239 | 239 | return "{$desc['vcs']} [$commit]"; |
| 240 | 240 | } |
@@ -253,9 +253,9 @@ discard block |
||
| 253 | 253 | } |
| 254 | 254 | |
| 255 | 255 | // version installee par GIT |
| 256 | - if (lire_fichier($dir . '/.git/HEAD', $c)) { |
|
| 256 | + if (lire_fichier($dir.'/.git/HEAD', $c)) { |
|
| 257 | 257 | $currentHead = trim(substr($c, 4)); |
| 258 | - if (lire_fichier($dir . '/.git/' . $currentHead, $hash)) { |
|
| 258 | + if (lire_fichier($dir.'/.git/'.$currentHead, $hash)) { |
|
| 259 | 259 | return [ |
| 260 | 260 | 'vcs' => 'GIT', |
| 261 | 261 | 'branch' => basename($currentHead), |
@@ -282,8 +282,8 @@ discard block |
||
| 282 | 282 | $dir = '.'; |
| 283 | 283 | } |
| 284 | 284 | // version installee par SVN |
| 285 | - if (file_exists($dir . '/.svn/wc.db') && class_exists(\SQLite3::class)) { |
|
| 286 | - $db = new SQLite3($dir . '/.svn/wc.db'); |
|
| 285 | + if (file_exists($dir.'/.svn/wc.db') && class_exists(\SQLite3::class)) { |
|
| 286 | + $db = new SQLite3($dir.'/.svn/wc.db'); |
|
| 287 | 287 | $result = $db->query('SELECT changed_revision FROM nodes WHERE local_relpath = "" LIMIT 1'); |
| 288 | 288 | if ($result) { |
| 289 | 289 | $row = $result->fetchArray(); |
@@ -301,12 +301,12 @@ discard block |
||
| 301 | 301 | |
| 302 | 302 | // La matrice est necessaire pour ne filtrer _que_ des fonctions definies dans filtres_images |
| 303 | 303 | // et laisser passer les fonctions personnelles baptisees image_... |
| 304 | -$GLOBALS['spip_matrice']['image_graver'] = true;//'inc/filtres_images_mini.php'; |
|
| 305 | -$GLOBALS['spip_matrice']['image_select'] = true;//'inc/filtres_images_mini.php'; |
|
| 306 | -$GLOBALS['spip_matrice']['image_reduire'] = true;//'inc/filtres_images_mini.php'; |
|
| 307 | -$GLOBALS['spip_matrice']['image_reduire_par'] = true;//'inc/filtres_images_mini.php'; |
|
| 308 | -$GLOBALS['spip_matrice']['image_passe_partout'] = true;//'inc/filtres_images_mini.php'; |
|
| 309 | -$GLOBALS['spip_matrice']['image_recadre_avec_fallback'] = true;//'inc/filtres_images_mini.php'; |
|
| 304 | +$GLOBALS['spip_matrice']['image_graver'] = true; //'inc/filtres_images_mini.php'; |
|
| 305 | +$GLOBALS['spip_matrice']['image_select'] = true; //'inc/filtres_images_mini.php'; |
|
| 306 | +$GLOBALS['spip_matrice']['image_reduire'] = true; //'inc/filtres_images_mini.php'; |
|
| 307 | +$GLOBALS['spip_matrice']['image_reduire_par'] = true; //'inc/filtres_images_mini.php'; |
|
| 308 | +$GLOBALS['spip_matrice']['image_passe_partout'] = true; //'inc/filtres_images_mini.php'; |
|
| 309 | +$GLOBALS['spip_matrice']['image_recadre_avec_fallback'] = true; //'inc/filtres_images_mini.php'; |
|
| 310 | 310 | |
| 311 | 311 | $GLOBALS['spip_matrice']['couleur_html_to_hex'] = 'inc/filtres_images_mini.php'; |
| 312 | 312 | $GLOBALS['spip_matrice']['couleur_hex_to_hsl'] = 'inc/filtres_images_mini.php'; |
@@ -465,8 +465,8 @@ discard block |
||
| 465 | 465 | */ |
| 466 | 466 | function filtre_debug($val, $key = null) { |
| 467 | 467 | $debug = ( |
| 468 | - is_null($key) ? '' : (var_export($key, true) . ' = ') |
|
| 469 | - ) . var_export($val, true); |
|
| 468 | + is_null($key) ? '' : (var_export($key, true).' = ') |
|
| 469 | + ).var_export($val, true); |
|
| 470 | 470 | |
| 471 | 471 | include_spip('inc/autoriser'); |
| 472 | 472 | if (autoriser('webmestre')) { |
@@ -522,7 +522,7 @@ discard block |
||
| 522 | 522 | $is_file = false; |
| 523 | 523 | } |
| 524 | 524 | if ($is_file) { |
| 525 | - $is_local_file = function ($path) { |
|
| 525 | + $is_local_file = function($path) { |
|
| 526 | 526 | if (strpos($path, '?') !== false) { |
| 527 | 527 | $path = supprimer_timestamp($path); |
| 528 | 528 | // remove ?24px added by find_in_theme on .svg files |
@@ -571,7 +571,7 @@ discard block |
||
| 571 | 571 | if ($mouseover = extraire_attribut($reduit, 'onmouseover')) { |
| 572 | 572 | if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)) { |
| 573 | 573 | $srcover = $match[1]; |
| 574 | - $srcover_filter = $filtre("<img src='" . $match[1] . "' />", ...$args); |
|
| 574 | + $srcover_filter = $filtre("<img src='".$match[1]."' />", ...$args); |
|
| 575 | 575 | $srcover_filter = extraire_attribut($srcover_filter, 'src'); |
| 576 | 576 | $reduit = str_replace($srcover, $srcover_filter, $reduit); |
| 577 | 577 | } |
@@ -973,7 +973,7 @@ discard block |
||
| 973 | 973 | // " -> " et tout ce genre de choses |
| 974 | 974 | $u = $GLOBALS['meta']['pcre_u']; |
| 975 | 975 | $texte = str_replace(' ', ' ', $texte); |
| 976 | - $texte = preg_replace('/\s{2,}/S' . $u, ' ', $texte); |
|
| 976 | + $texte = preg_replace('/\s{2,}/S'.$u, ' ', $texte); |
|
| 977 | 977 | // ne pas echapper les sinqle quotes car certains outils de syndication gerent mal |
| 978 | 978 | $texte = entites_html($texte, false, false); |
| 979 | 979 | // mais bien echapper les double quotes ! |
@@ -1033,7 +1033,7 @@ discard block |
||
| 1033 | 1033 | **/ |
| 1034 | 1034 | function supprimer_numero($texte) { |
| 1035 | 1035 | return preg_replace( |
| 1036 | - ',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S', |
|
| 1036 | + ',^[[:space:]]*([0-9]+)([.)]|'.chr(194).'?'.chr(176).')[[:space:]]+,S', |
|
| 1037 | 1037 | '', |
| 1038 | 1038 | $texte |
| 1039 | 1039 | ); |
@@ -1062,7 +1062,7 @@ discard block |
||
| 1062 | 1062 | if ( |
| 1063 | 1063 | $texte and |
| 1064 | 1064 | preg_match( |
| 1065 | - ',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S', |
|
| 1065 | + ',^[[:space:]]*([0-9]+)([.)]|'.chr(194).'?'.chr(176).')[[:space:]]+,S', |
|
| 1066 | 1066 | $texte, |
| 1067 | 1067 | $regs |
| 1068 | 1068 | ) |
@@ -1153,8 +1153,8 @@ discard block |
||
| 1153 | 1153 | **/ |
| 1154 | 1154 | function textebrut($texte) { |
| 1155 | 1155 | $u = $GLOBALS['meta']['pcre_u']; |
| 1156 | - $texte = preg_replace('/\s+/S' . $u, ' ', $texte); |
|
| 1157 | - $texte = preg_replace('/<(p|br)( [^>]*)?' . '>/iS', "\n\n", $texte); |
|
| 1156 | + $texte = preg_replace('/\s+/S'.$u, ' ', $texte); |
|
| 1157 | + $texte = preg_replace('/<(p|br)( [^>]*)?'.'>/iS', "\n\n", $texte); |
|
| 1158 | 1158 | $texte = preg_replace("/^\n+/", '', $texte); |
| 1159 | 1159 | $texte = preg_replace("/\n+$/", '', $texte); |
| 1160 | 1160 | $texte = preg_replace("/\n +/", "\n", $texte); |
@@ -1188,7 +1188,7 @@ discard block |
||
| 1188 | 1188 | ) |
| 1189 | 1189 | ) { |
| 1190 | 1190 | foreach ($liens[0] as $a) { |
| 1191 | - $rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel'); |
|
| 1191 | + $rel = 'noopener noreferrer '.extraire_attribut($a, 'rel'); |
|
| 1192 | 1192 | $ablank = inserer_attribut($a, 'rel', $rel); |
| 1193 | 1193 | $ablank = inserer_attribut($ablank, 'target', '_blank'); |
| 1194 | 1194 | $texte = str_replace($a, $ablank, $texte); |
@@ -1213,7 +1213,7 @@ discard block |
||
| 1213 | 1213 | foreach ($regs[0] as $a) { |
| 1214 | 1214 | $rel = extraire_attribut($a, 'rel') ?? ''; |
| 1215 | 1215 | if (strpos($rel, 'nofollow') === false) { |
| 1216 | - $rel = 'nofollow' . ($rel ? " $rel" : ''); |
|
| 1216 | + $rel = 'nofollow'.($rel ? " $rel" : ''); |
|
| 1217 | 1217 | $anofollow = inserer_attribut($a, 'rel', $rel); |
| 1218 | 1218 | $texte = str_replace($a, $anofollow, $texte); |
| 1219 | 1219 | } |
@@ -1242,7 +1242,7 @@ discard block |
||
| 1242 | 1242 | $u = $GLOBALS['meta']['pcre_u']; |
| 1243 | 1243 | $texte = preg_replace('@</p>@iS', "\n", $texte); |
| 1244 | 1244 | $texte = preg_replace("@<p\b.*>@UiS", '<br />', $texte); |
| 1245 | - $texte = preg_replace('@^\s*<br />@S' . $u, '', $texte); |
|
| 1245 | + $texte = preg_replace('@^\s*<br />@S'.$u, '', $texte); |
|
| 1246 | 1246 | |
| 1247 | 1247 | return $texte; |
| 1248 | 1248 | } |
@@ -1273,7 +1273,7 @@ discard block |
||
| 1273 | 1273 | return $texte; |
| 1274 | 1274 | } |
| 1275 | 1275 | include_spip('inc/texte'); |
| 1276 | - $tag = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $texte) ? |
|
| 1276 | + $tag = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $texte) ? |
|
| 1277 | 1277 | 'div' : 'span'; |
| 1278 | 1278 | |
| 1279 | 1279 | return "<$tag style='word-wrap:break-word;'>$texte</$tag>"; |
@@ -1385,7 +1385,7 @@ discard block |
||
| 1385 | 1385 | } |
| 1386 | 1386 | $u = $GLOBALS['meta']['pcre_u']; |
| 1387 | 1387 | if ($textebrut) { |
| 1388 | - $texte = preg_replace([",\n,", ',\s(?=\s),msS' . $u], [' ', ''], textebrut($texte)); |
|
| 1388 | + $texte = preg_replace([",\n,", ',\s(?=\s),msS'.$u], [' ', ''], textebrut($texte)); |
|
| 1389 | 1389 | } |
| 1390 | 1390 | $texte = texte_backend($texte); |
| 1391 | 1391 | $texte = str_replace(["'", '"'], [''', '"'], $texte); |
@@ -1420,7 +1420,7 @@ discard block |
||
| 1420 | 1420 | # un message pour abs_url |
| 1421 | 1421 | $GLOBALS['mode_abs_url'] = 'url'; |
| 1422 | 1422 | $url = trim($url); |
| 1423 | - $r = ',^(?:' . _PROTOCOLES_STD . '):?/?/?$,iS'; |
|
| 1423 | + $r = ',^(?:'._PROTOCOLES_STD.'):?/?/?$,iS'; |
|
| 1424 | 1424 | |
| 1425 | 1425 | return preg_match($r, $url) ? '' : ($entites ? entites_html($url) : $url); |
| 1426 | 1426 | } |
@@ -1620,14 +1620,14 @@ discard block |
||
| 1620 | 1620 | if (strpos($texte, '<') !== false) { |
| 1621 | 1621 | include_spip('inc/lien'); |
| 1622 | 1622 | if (defined('_PREG_MODELE')) { |
| 1623 | - $preg_modeles = '@' . _PREG_MODELE . '@imsS'; |
|
| 1623 | + $preg_modeles = '@'._PREG_MODELE.'@imsS'; |
|
| 1624 | 1624 | $texte = echappe_html($texte, '', true, $preg_modeles); |
| 1625 | 1625 | } |
| 1626 | 1626 | } |
| 1627 | 1627 | |
| 1628 | 1628 | $debut = ''; |
| 1629 | 1629 | $suite = $texte; |
| 1630 | - while ($t = strpos('-' . $suite, "\n", 1)) { |
|
| 1630 | + while ($t = strpos('-'.$suite, "\n", 1)) { |
|
| 1631 | 1631 | $debut .= substr($suite, 0, $t - 1); |
| 1632 | 1632 | $suite = substr($suite, $t); |
| 1633 | 1633 | $car = substr($suite, 0, 1); |
@@ -1645,11 +1645,11 @@ discard block |
||
| 1645 | 1645 | $suite = substr($suite, strlen($regs[0])); |
| 1646 | 1646 | } |
| 1647 | 1647 | } |
| 1648 | - $texte = $debut . $suite; |
|
| 1648 | + $texte = $debut.$suite; |
|
| 1649 | 1649 | |
| 1650 | 1650 | $texte = echappe_retour($texte); |
| 1651 | 1651 | |
| 1652 | - return $texte . $fin; |
|
| 1652 | + return $texte.$fin; |
|
| 1653 | 1653 | } |
| 1654 | 1654 | |
| 1655 | 1655 | |
@@ -1711,7 +1711,7 @@ discard block |
||
| 1711 | 1711 | } |
| 1712 | 1712 | |
| 1713 | 1713 | foreach ($regs as $reg) { |
| 1714 | - $cle = ($reg[1] ? $reg[1] . ':' : '') . $reg[2]; |
|
| 1714 | + $cle = ($reg[1] ? $reg[1].':' : '').$reg[2]; |
|
| 1715 | 1715 | $desc = $traduire($cle, $lang, true); |
| 1716 | 1716 | $l = $desc->langue; |
| 1717 | 1717 | // si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte. |
@@ -1825,9 +1825,9 @@ discard block |
||
| 1825 | 1825 | // il ne faut pas echapper en div si propre produit un seul paragraphe |
| 1826 | 1826 | include_spip('inc/texte'); |
| 1827 | 1827 | $trad_propre = preg_replace(',(^<p[^>]*>|</p>$),Uims', '', propre($trad)); |
| 1828 | - $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; |
|
| 1828 | + $mode = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; |
|
| 1829 | 1829 | if ($mode === 'div') { |
| 1830 | - $trad = rtrim($trad) . "\n\n"; |
|
| 1830 | + $trad = rtrim($trad)."\n\n"; |
|
| 1831 | 1831 | } |
| 1832 | 1832 | $trad = code_echappement($trad, 'multi', false, $mode); |
| 1833 | 1833 | $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); |
@@ -2027,7 +2027,7 @@ discard block |
||
| 2027 | 2027 | if (is_array($balise)) { |
| 2028 | 2028 | array_walk( |
| 2029 | 2029 | $balise, |
| 2030 | - function (&$a, $key, $t) { |
|
| 2030 | + function(&$a, $key, $t) { |
|
| 2031 | 2031 | $a = extraire_attribut($a, $t); |
| 2032 | 2032 | }, |
| 2033 | 2033 | $attribut |
@@ -2124,14 +2124,14 @@ discard block |
||
| 2124 | 2124 | |
| 2125 | 2125 | if ($old !== null) { |
| 2126 | 2126 | // Remplacer l'ancien attribut du meme nom |
| 2127 | - $balise = $r[1] . $insert . $r[5]; |
|
| 2127 | + $balise = $r[1].$insert.$r[5]; |
|
| 2128 | 2128 | } else { |
| 2129 | 2129 | // preferer une balise " />" (comme <img />) |
| 2130 | 2130 | if (preg_match(',/>,', $balise)) { |
| 2131 | - $balise = preg_replace(',\s?/>,S', $insert . ' />', $balise, 1); |
|
| 2131 | + $balise = preg_replace(',\s?/>,S', $insert.' />', $balise, 1); |
|
| 2132 | 2132 | } // sinon une balise <a ...> ... </a> |
| 2133 | 2133 | else { |
| 2134 | - $balise = preg_replace(',\s?>,S', $insert . '>', $balise, 1); |
|
| 2134 | + $balise = preg_replace(',\s?>,S', $insert.'>', $balise, 1); |
|
| 2135 | 2135 | } |
| 2136 | 2136 | } |
| 2137 | 2137 | |
@@ -2186,7 +2186,7 @@ discard block |
||
| 2186 | 2186 | if ( |
| 2187 | 2187 | $class_courante |
| 2188 | 2188 | and strpos($class_courante, (string) $c) !== false |
| 2189 | - and preg_match('/(^|\s)' . preg_quote($c) . '($|\s)/', $class_courante) |
|
| 2189 | + and preg_match('/(^|\s)'.preg_quote($c).'($|\s)/', $class_courante) |
|
| 2190 | 2190 | ) { |
| 2191 | 2191 | $is_class_presente = true; |
| 2192 | 2192 | } |
@@ -2194,12 +2194,12 @@ discard block |
||
| 2194 | 2194 | in_array($operation, ['ajouter', 'commuter']) |
| 2195 | 2195 | and !$is_class_presente |
| 2196 | 2196 | ) { |
| 2197 | - $class_new = ltrim(rtrim($class_new ?? '') . ' ' . $c); |
|
| 2197 | + $class_new = ltrim(rtrim($class_new ?? '').' '.$c); |
|
| 2198 | 2198 | } elseif ( |
| 2199 | 2199 | in_array($operation, ['supprimer', 'commuter']) |
| 2200 | 2200 | and $is_class_presente |
| 2201 | 2201 | ) { |
| 2202 | - $class_new = trim(preg_replace('/(^|\s)' . preg_quote($c) . '($|\s)/', "\\1", $class_new)); |
|
| 2202 | + $class_new = trim(preg_replace('/(^|\s)'.preg_quote($c).'($|\s)/', "\\1", $class_new)); |
|
| 2203 | 2203 | } |
| 2204 | 2204 | } |
| 2205 | 2205 | |
@@ -2262,7 +2262,7 @@ discard block |
||
| 2262 | 2262 | // Quelques fonctions de calcul arithmetique |
| 2263 | 2263 | // |
| 2264 | 2264 | function floatstr($a) { |
| 2265 | - return str_replace(',', '.', (string)floatval($a)); |
|
| 2265 | + return str_replace(',', '.', (string) floatval($a)); |
|
| 2266 | 2266 | } |
| 2267 | 2267 | function strize($f, $a, $b) { |
| 2268 | 2268 | return floatstr($f(floatstr($a), floatstr($b))); |
@@ -2398,13 +2398,13 @@ discard block |
||
| 2398 | 2398 | if (!defined('_TAGS_NOM_AUTEUR')) { |
| 2399 | 2399 | define('_TAGS_NOM_AUTEUR', ''); |
| 2400 | 2400 | } |
| 2401 | - $tags_acceptes = array_unique(explode(',', 'multi,' . _TAGS_NOM_AUTEUR)); |
|
| 2401 | + $tags_acceptes = array_unique(explode(',', 'multi,'._TAGS_NOM_AUTEUR)); |
|
| 2402 | 2402 | foreach ($tags_acceptes as $tag) { |
| 2403 | 2403 | if (strlen($tag)) { |
| 2404 | - $remp1[] = '<' . trim($tag) . '>'; |
|
| 2405 | - $remp1[] = '</' . trim($tag) . '>'; |
|
| 2406 | - $remp2[] = '\x60' . trim($tag) . '\x61'; |
|
| 2407 | - $remp2[] = '\x60/' . trim($tag) . '\x61'; |
|
| 2404 | + $remp1[] = '<'.trim($tag).'>'; |
|
| 2405 | + $remp1[] = '</'.trim($tag).'>'; |
|
| 2406 | + $remp2[] = '\x60'.trim($tag).'\x61'; |
|
| 2407 | + $remp2[] = '\x60/'.trim($tag).'\x61'; |
|
| 2408 | 2408 | } |
| 2409 | 2409 | } |
| 2410 | 2410 | $v_nom = str_replace($remp2, $remp1, supprimer_tags(str_replace($remp1, $remp2, $nom))); |
@@ -2524,10 +2524,10 @@ discard block |
||
| 2524 | 2524 | $fichier = basename($url); |
| 2525 | 2525 | |
| 2526 | 2526 | return '<a rel="enclosure"' |
| 2527 | - . ($url ? ' href="' . spip_htmlspecialchars($url) . '"' : '') |
|
| 2528 | - . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '') |
|
| 2529 | - . ($length ? ' title="' . spip_htmlspecialchars($length) . '"' : '') |
|
| 2530 | - . '>' . $fichier . '</a>'; |
|
| 2527 | + . ($url ? ' href="'.spip_htmlspecialchars($url).'"' : '') |
|
| 2528 | + . ($type ? ' type="'.spip_htmlspecialchars($type).'"' : '') |
|
| 2529 | + . ($length ? ' title="'.spip_htmlspecialchars($length).'"' : '') |
|
| 2530 | + . '>'.$fichier.'</a>'; |
|
| 2531 | 2531 | } |
| 2532 | 2532 | |
| 2533 | 2533 | /** |
@@ -2555,9 +2555,9 @@ discard block |
||
| 2555 | 2555 | } # vieux data |
| 2556 | 2556 | $fichier = basename($url); |
| 2557 | 2557 | $enclosures[] = '<enclosure' |
| 2558 | - . ($url ? ' url="' . spip_htmlspecialchars($url) . '"' : '') |
|
| 2559 | - . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '') |
|
| 2560 | - . ($length ? ' length="' . $length . '"' : '') |
|
| 2558 | + . ($url ? ' url="'.spip_htmlspecialchars($url).'"' : '') |
|
| 2559 | + . ($type ? ' type="'.spip_htmlspecialchars($type).'"' : '') |
|
| 2560 | + . ($length ? ' length="'.$length.'"' : '') |
|
| 2561 | 2561 | . ' />'; |
| 2562 | 2562 | } |
| 2563 | 2563 | } |
@@ -2583,7 +2583,7 @@ discard block |
||
| 2583 | 2583 | if (extraire_attribut($e, 'rel') == 'tag') { |
| 2584 | 2584 | $subjects .= '<dc:subject>' |
| 2585 | 2585 | . texte_backend(textebrut($e)) |
| 2586 | - . '</dc:subject>' . "\n"; |
|
| 2586 | + . '</dc:subject>'."\n"; |
|
| 2587 | 2587 | } |
| 2588 | 2588 | } |
| 2589 | 2589 | |
@@ -2619,7 +2619,7 @@ discard block |
||
| 2619 | 2619 | if (is_array($texte)) { |
| 2620 | 2620 | array_walk( |
| 2621 | 2621 | $texte, |
| 2622 | - function (&$a, $key, $t) { |
|
| 2622 | + function(&$a, $key, $t) { |
|
| 2623 | 2623 | $a = extraire_balise($a, $t); |
| 2624 | 2624 | }, |
| 2625 | 2625 | $tag |
@@ -2667,7 +2667,7 @@ discard block |
||
| 2667 | 2667 | if (is_array($texte)) { |
| 2668 | 2668 | array_walk( |
| 2669 | 2669 | $texte, |
| 2670 | - function (&$a, $key, $t) { |
|
| 2670 | + function(&$a, $key, $t) { |
|
| 2671 | 2671 | $a = extraire_balises($a, $t); |
| 2672 | 2672 | }, |
| 2673 | 2673 | $tag |
@@ -2800,7 +2800,7 @@ discard block |
||
| 2800 | 2800 | if ($fond != '404') { |
| 2801 | 2801 | $contexte = array_shift($p); |
| 2802 | 2802 | $contexte['page'] = $fond; |
| 2803 | - $action = preg_replace('/([?]' . preg_quote($fond) . '[^&=]*[0-9]+)(&|$)/', '?&', $action); |
|
| 2803 | + $action = preg_replace('/([?]'.preg_quote($fond).'[^&=]*[0-9]+)(&|$)/', '?&', $action); |
|
| 2804 | 2804 | } |
| 2805 | 2805 | } |
| 2806 | 2806 | // defaire ce qu'a injecte urls_decoder_url : a revoir en modifiant la signature de urls_decoder_url |
@@ -2855,9 +2855,9 @@ discard block |
||
| 2855 | 2855 | . '"' |
| 2856 | 2856 | . (is_null($val) |
| 2857 | 2857 | ? '' |
| 2858 | - : ' value="' . entites_html($val) . '"' |
|
| 2858 | + : ' value="'.entites_html($val).'"' |
|
| 2859 | 2859 | ) |
| 2860 | - . ' type="hidden"' . "\n/>"; |
|
| 2860 | + . ' type="hidden"'."\n/>"; |
|
| 2861 | 2861 | } |
| 2862 | 2862 | |
| 2863 | 2863 | return join('', $hidden); |
@@ -2967,7 +2967,7 @@ discard block |
||
| 2967 | 2967 | |
| 2968 | 2968 | return preg_replace_callback( |
| 2969 | 2969 | ",url\s*\(\s*['\"]?([^'\"/#\s][^:]*)['\"]?\s*\),Uims", |
| 2970 | - fn($x) => "url('" . suivre_lien($path, $x[1]) . "')", |
|
| 2970 | + fn($x) => "url('".suivre_lien($path, $x[1])."')", |
|
| 2971 | 2971 | $contenu |
| 2972 | 2972 | ); |
| 2973 | 2973 | } |
@@ -3028,14 +3028,14 @@ discard block |
||
| 3028 | 3028 | ) { |
| 3029 | 3029 | $distant = true; |
| 3030 | 3030 | $cssf = parse_url($css); |
| 3031 | - $cssf = $cssf['path'] . ($cssf['query'] ? '?' . $cssf['query'] : ''); |
|
| 3031 | + $cssf = $cssf['path'].($cssf['query'] ? '?'.$cssf['query'] : ''); |
|
| 3032 | 3032 | $cssf = preg_replace(',[?:&=],', '_', $cssf); |
| 3033 | 3033 | } else { |
| 3034 | 3034 | $distant = false; |
| 3035 | 3035 | $cssf = $css; |
| 3036 | 3036 | // 1. regarder d'abord si un fichier avec la bonne direction n'est pas aussi |
| 3037 | 3037 | //propose (rien a faire dans ce cas) |
| 3038 | - $f = preg_replace(',(_rtl)?\.css$,i', '_' . $ndir . '.css', $css); |
|
| 3038 | + $f = preg_replace(',(_rtl)?\.css$,i', '_'.$ndir.'.css', $css); |
|
| 3039 | 3039 | if (@file_exists($f)) { |
| 3040 | 3040 | return $f; |
| 3041 | 3041 | } |
@@ -3045,7 +3045,7 @@ discard block |
||
| 3045 | 3045 | $dir_var = sous_repertoire(_DIR_VAR, 'cache-css'); |
| 3046 | 3046 | $f = $dir_var |
| 3047 | 3047 | . preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $cssf) |
| 3048 | - . '.' . substr(md5($cssf), 0, 4) . '_' . $ndir . '.css'; |
|
| 3048 | + . '.'.substr(md5($cssf), 0, 4).'_'.$ndir.'.css'; |
|
| 3049 | 3049 | |
| 3050 | 3050 | // la css peut etre distante (url absolue !) |
| 3051 | 3051 | if ($distant) { |
@@ -3091,8 +3091,8 @@ discard block |
||
| 3091 | 3091 | } // si la css_direction commence par $dir_var on la fait passer pour une absolue |
| 3092 | 3092 | elseif (substr($css_direction, 0, strlen($dir_var)) == $dir_var) { |
| 3093 | 3093 | $css_direction = substr($css_direction, strlen($dir_var)); |
| 3094 | - $src_faux_abs['/@@@@@@/' . $css_direction] = $css_direction; |
|
| 3095 | - $css_direction = '/@@@@@@/' . $css_direction; |
|
| 3094 | + $src_faux_abs['/@@@@@@/'.$css_direction] = $css_direction; |
|
| 3095 | + $css_direction = '/@@@@@@/'.$css_direction; |
|
| 3096 | 3096 | } |
| 3097 | 3097 | $src[] = $regs[0][$k]; |
| 3098 | 3098 | $src_direction_css[] = str_replace($import_css, $css_direction, $regs[0][$k]); |
@@ -3141,7 +3141,7 @@ discard block |
||
| 3141 | 3141 | |
| 3142 | 3142 | $f = basename($css, '.css'); |
| 3143 | 3143 | $f = sous_repertoire(_DIR_VAR, 'cache-css') |
| 3144 | - . preg_replace(',(.*?)(_rtl|_ltr)?$,', "\\1-urlabs-" . substr(md5("$css-urlabs"), 0, 4) . "\\2", $f) |
|
| 3144 | + . preg_replace(',(.*?)(_rtl|_ltr)?$,', "\\1-urlabs-".substr(md5("$css-urlabs"), 0, 4)."\\2", $f) |
|
| 3145 | 3145 | . '.css'; |
| 3146 | 3146 | |
| 3147 | 3147 | if ((@filemtime($f) > @filemtime($css)) and (_VAR_MODE != 'recalcul')) { |
@@ -3151,7 +3151,7 @@ discard block |
||
| 3151 | 3151 | if ($url_absolue_css == $css) { |
| 3152 | 3152 | if ( |
| 3153 | 3153 | strncmp($GLOBALS['meta']['adresse_site'], $css, $l = strlen($GLOBALS['meta']['adresse_site'])) != 0 |
| 3154 | - or !lire_fichier(_DIR_RACINE . substr($css, $l), $contenu) |
|
| 3154 | + or !lire_fichier(_DIR_RACINE.substr($css, $l), $contenu) |
|
| 3155 | 3155 | ) { |
| 3156 | 3156 | include_spip('inc/distant'); |
| 3157 | 3157 | $contenu = recuperer_url($css); |
@@ -3263,7 +3263,7 @@ discard block |
||
| 3263 | 3263 | $expression = str_replace('\/', '/', $expression); |
| 3264 | 3264 | $expression = str_replace('/', '\/', $expression); |
| 3265 | 3265 | |
| 3266 | - if (preg_match('/' . $expression . '/' . $modif, $texte ?? '', $r)) { |
|
| 3266 | + if (preg_match('/'.$expression.'/'.$modif, $texte ?? '', $r)) { |
|
| 3267 | 3267 | if (isset($r[$capte])) { |
| 3268 | 3268 | return $r[$capte]; |
| 3269 | 3269 | } else { |
@@ -3301,7 +3301,7 @@ discard block |
||
| 3301 | 3301 | $expression = str_replace('\/', '/', $expression); |
| 3302 | 3302 | $expression = str_replace('/', '\/', $expression); |
| 3303 | 3303 | |
| 3304 | - return preg_replace('/' . $expression . '/' . $modif, $replace, $texte); |
|
| 3304 | + return preg_replace('/'.$expression.'/'.$modif, $replace, $texte); |
|
| 3305 | 3305 | } |
| 3306 | 3306 | |
| 3307 | 3307 | |
@@ -3320,7 +3320,7 @@ discard block |
||
| 3320 | 3320 | function traiter_doublons_documents(&$doublons, $letexte) { |
| 3321 | 3321 | |
| 3322 | 3322 | // Verifier dans le texte & les notes (pas beau, helas) |
| 3323 | - $t = $letexte . $GLOBALS['les_notes']; |
|
| 3323 | + $t = $letexte.$GLOBALS['les_notes']; |
|
| 3324 | 3324 | |
| 3325 | 3325 | if ( |
| 3326 | 3326 | strstr($t, 'spip_document_') // evite le preg_match_all si inutile |
@@ -3334,7 +3334,7 @@ discard block |
||
| 3334 | 3334 | if (!isset($doublons['documents'])) { |
| 3335 | 3335 | $doublons['documents'] = ''; |
| 3336 | 3336 | } |
| 3337 | - $doublons['documents'] .= ',' . join(',', $matches[1]); |
|
| 3337 | + $doublons['documents'] .= ','.join(',', $matches[1]); |
|
| 3338 | 3338 | } |
| 3339 | 3339 | |
| 3340 | 3340 | return $letexte; |
@@ -3391,7 +3391,7 @@ discard block |
||
| 3391 | 3391 | if ($env) { |
| 3392 | 3392 | foreach ($env as $i => $j) { |
| 3393 | 3393 | if (is_string($j) and !in_array($i, $ignore_params)) { |
| 3394 | - $texte .= "<param name='" . attribut_html($i) . "'\n\tvalue='" . attribut_html($j) . "' />"; |
|
| 3394 | + $texte .= "<param name='".attribut_html($i)."'\n\tvalue='".attribut_html($j)."' />"; |
|
| 3395 | 3395 | } |
| 3396 | 3396 | } |
| 3397 | 3397 | } |
@@ -3430,7 +3430,7 @@ discard block |
||
| 3430 | 3430 | if ($env) { |
| 3431 | 3431 | foreach ($env as $i => $j) { |
| 3432 | 3432 | if (is_string($j) and !in_array($i, $ignore_params)) { |
| 3433 | - $texte .= attribut_html($i) . "='" . attribut_html($j) . "' "; |
|
| 3433 | + $texte .= attribut_html($i)."='".attribut_html($j)."' "; |
|
| 3434 | 3434 | } |
| 3435 | 3435 | } |
| 3436 | 3436 | } |
@@ -3504,10 +3504,10 @@ discard block |
||
| 3504 | 3504 | // si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png |
| 3505 | 3505 | if ( |
| 3506 | 3506 | preg_match(',-(\d+)[.](png|gif|svg)$,', $img_file, $m) |
| 3507 | - and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])) . '-xx.svg' |
|
| 3507 | + and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])).'-xx.svg' |
|
| 3508 | 3508 | and file_exists($variante_svg_generique) |
| 3509 | 3509 | ) { |
| 3510 | - if ($variante_svg_size = substr($variante_svg_generique, 0, -6) . $m[1] . '.svg' and file_exists($variante_svg_size)) { |
|
| 3510 | + if ($variante_svg_size = substr($variante_svg_generique, 0, -6).$m[1].'.svg' and file_exists($variante_svg_size)) { |
|
| 3511 | 3511 | $img_file = $variante_svg_size; |
| 3512 | 3512 | } |
| 3513 | 3513 | else { |
@@ -3565,7 +3565,7 @@ discard block |
||
| 3565 | 3565 | return ''; |
| 3566 | 3566 | } |
| 3567 | 3567 | } |
| 3568 | - $atts .= " width='" . $largeur . "' height='" . $hauteur . "'"; |
|
| 3568 | + $atts .= " width='".$largeur."' height='".$hauteur."'"; |
|
| 3569 | 3569 | } |
| 3570 | 3570 | |
| 3571 | 3571 | if (file_exists($img_file)) { |
@@ -3575,14 +3575,14 @@ discard block |
||
| 3575 | 3575 | $alt = ''; |
| 3576 | 3576 | } |
| 3577 | 3577 | elseif ($alt or $alt === '') { |
| 3578 | - $alt = " alt='" . attribut_html($alt) . "'"; |
|
| 3578 | + $alt = " alt='".attribut_html($alt)."'"; |
|
| 3579 | 3579 | } |
| 3580 | 3580 | else { |
| 3581 | - $alt = " alt='" . attribut_html($title) . "'"; |
|
| 3581 | + $alt = " alt='".attribut_html($title)."'"; |
|
| 3582 | 3582 | } |
| 3583 | - return "<img src='" . attribut_html($img_file) . "'$alt" |
|
| 3584 | - . ($title ? ' title="' . attribut_html($title) . '"' : '') |
|
| 3585 | - . ' ' . ltrim($atts) |
|
| 3583 | + return "<img src='".attribut_html($img_file)."'$alt" |
|
| 3584 | + . ($title ? ' title="'.attribut_html($title).'"' : '') |
|
| 3585 | + . ' '.ltrim($atts) |
|
| 3586 | 3586 | . ' />'; |
| 3587 | 3587 | } |
| 3588 | 3588 | |
@@ -3596,10 +3596,10 @@ discard block |
||
| 3596 | 3596 | */ |
| 3597 | 3597 | function http_style_background($img, $att = '', $size = null) { |
| 3598 | 3598 | if ($size and is_numeric($size)) { |
| 3599 | - $size = trim($size) . 'px'; |
|
| 3599 | + $size = trim($size).'px'; |
|
| 3600 | 3600 | } |
| 3601 | - return " style='background" . |
|
| 3602 | - ($att ? '' : '-image') . ': url("' . chemin_image($img) . '")' . ($att ? (' ' . $att) : '') . ';' |
|
| 3601 | + return " style='background". |
|
| 3602 | + ($att ? '' : '-image').': url("'.chemin_image($img).'")'.($att ? (' '.$att) : '').';' |
|
| 3603 | 3603 | . ($size ? "background-size:{$size};" : '') |
| 3604 | 3604 | . "'"; |
| 3605 | 3605 | } |
@@ -3714,7 +3714,7 @@ discard block |
||
| 3714 | 3714 | $img = http_img_pack( |
| 3715 | 3715 | $img, |
| 3716 | 3716 | $alt, |
| 3717 | - $class ? " class='" . attribut_html($class) . "'" : '', |
|
| 3717 | + $class ? " class='".attribut_html($class)."'" : '', |
|
| 3718 | 3718 | '', |
| 3719 | 3719 | ['chemin_image' => false, 'utiliser_suffixe_size' => false] |
| 3720 | 3720 | ); |
@@ -3799,7 +3799,7 @@ discard block |
||
| 3799 | 3799 | $balise_svg_source = $balise_svg; |
| 3800 | 3800 | |
| 3801 | 3801 | // entete XML à supprimer |
| 3802 | - $svg = preg_replace(',^\s*<\?xml[^>]*\?' . '>,', '', $svg); |
|
| 3802 | + $svg = preg_replace(',^\s*<\?xml[^>]*\?'.'>,', '', $svg); |
|
| 3803 | 3803 | |
| 3804 | 3804 | // IE est toujours mon ami |
| 3805 | 3805 | $balise_svg = inserer_attribut($balise_svg, 'focusable', 'false'); |
@@ -3817,9 +3817,9 @@ discard block |
||
| 3817 | 3817 | // regler le alt |
| 3818 | 3818 | if ($alt) { |
| 3819 | 3819 | $balise_svg = inserer_attribut($balise_svg, 'role', 'img'); |
| 3820 | - $id = 'img-svg-title-' . substr(md5("$img_file:$svg:$alt"), 0, 4); |
|
| 3820 | + $id = 'img-svg-title-'.substr(md5("$img_file:$svg:$alt"), 0, 4); |
|
| 3821 | 3821 | $balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id); |
| 3822 | - $title = "<title id=\"$id\">" . entites_html($alt) . "</title>\n"; |
|
| 3822 | + $title = "<title id=\"$id\">".entites_html($alt)."</title>\n"; |
|
| 3823 | 3823 | $balise_svg .= $title; |
| 3824 | 3824 | } |
| 3825 | 3825 | else { |
@@ -3867,7 +3867,7 @@ discard block |
||
| 3867 | 3867 | if (is_array($tableau)) { |
| 3868 | 3868 | foreach ($tableau as $k => $v) { |
| 3869 | 3869 | $res = recuperer_fond( |
| 3870 | - 'modeles/' . $modele, |
|
| 3870 | + 'modeles/'.$modele, |
|
| 3871 | 3871 | array_merge(['cle' => $k], (is_array($v) ? $v : ['valeur' => $v])) |
| 3872 | 3872 | ); |
| 3873 | 3873 | $texte .= $res; |
@@ -4052,7 +4052,7 @@ discard block |
||
| 4052 | 4052 | } |
| 4053 | 4053 | |
| 4054 | 4054 | $c = serialize($c); |
| 4055 | - $cle = calculer_cle_action($form . $c); |
|
| 4055 | + $cle = calculer_cle_action($form.$c); |
|
| 4056 | 4056 | $c = "$cle:$c"; |
| 4057 | 4057 | |
| 4058 | 4058 | // on ne stocke pas les contextes dans des fichiers en cache |
@@ -4110,15 +4110,15 @@ discard block |
||
| 4110 | 4110 | } |
| 4111 | 4111 | // toujours encoder l'url source dans le bloc ajax |
| 4112 | 4112 | $r = self(); |
| 4113 | - $r = ' data-origin="' . $r . '"'; |
|
| 4113 | + $r = ' data-origin="'.$r.'"'; |
|
| 4114 | 4114 | $class = 'ajaxbloc'; |
| 4115 | 4115 | if ($ajaxid and is_string($ajaxid)) { |
| 4116 | 4116 | // ajaxid est normalement conforme a un nom de classe css |
| 4117 | 4117 | // on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution |
| 4118 | - $class .= ' ajax-id-' . entites_html($ajaxid); |
|
| 4118 | + $class .= ' ajax-id-'.entites_html($ajaxid); |
|
| 4119 | 4119 | } |
| 4120 | 4120 | |
| 4121 | - return "<div class='$class' " . "data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n"; |
|
| 4121 | + return "<div class='$class' "."data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n"; |
|
| 4122 | 4122 | } |
| 4123 | 4123 | |
| 4124 | 4124 | /** |
@@ -4162,7 +4162,7 @@ discard block |
||
| 4162 | 4162 | $cle = substr($c, 0, $p); |
| 4163 | 4163 | $c = substr($c, $p + 1); |
| 4164 | 4164 | |
| 4165 | - if ($cle == calculer_cle_action($form . $c)) { |
|
| 4165 | + if ($cle == calculer_cle_action($form.$c)) { |
|
| 4166 | 4166 | $env = @unserialize($c); |
| 4167 | 4167 | return $env; |
| 4168 | 4168 | } |
@@ -4283,13 +4283,13 @@ discard block |
||
| 4283 | 4283 | } |
| 4284 | 4284 | } |
| 4285 | 4285 | } |
| 4286 | - $att .= 'class="' . ($class ? attribut_html($class) . ' ' : '') . (defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on') . '"'; |
|
| 4286 | + $att .= 'class="'.($class ? attribut_html($class).' ' : '').(defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on').'"'; |
|
| 4287 | 4287 | } else { |
| 4288 | 4288 | $bal = 'a'; |
| 4289 | 4289 | $att = "href='$url'" |
| 4290 | - . ($title ? " title='" . attribut_html($title) . "'" : '') |
|
| 4291 | - . ($class ? " class='" . attribut_html($class) . "'" : '') |
|
| 4292 | - . ($rel ? " rel='" . attribut_html($rel) . "'" : '') |
|
| 4290 | + . ($title ? " title='".attribut_html($title)."'" : '') |
|
| 4291 | + . ($class ? " class='".attribut_html($class)."'" : '') |
|
| 4292 | + . ($rel ? " rel='".attribut_html($rel)."'" : '') |
|
| 4293 | 4293 | . $evt; |
| 4294 | 4294 | } |
| 4295 | 4295 | if ($libelle === null) { |
@@ -4428,7 +4428,7 @@ discard block |
||
| 4428 | 4428 | |
| 4429 | 4429 | // Icône |
| 4430 | 4430 | $icone = http_img_pack($fond, $alt, "width='$size' height='$size'"); |
| 4431 | - $icone = '<span class="icone-image' . ($fonction ? " icone-fonction icone-fonction-$fonction" : '') . "\">$icone</span>"; |
|
| 4431 | + $icone = '<span class="icone-image'.($fonction ? " icone-fonction icone-fonction-$fonction" : '')."\">$icone</span>"; |
|
| 4432 | 4432 | |
| 4433 | 4433 | // Markup final |
| 4434 | 4434 | if ($type == 'lien') { |
@@ -4703,20 +4703,20 @@ discard block |
||
| 4703 | 4703 | $class_form = 'ajax'; |
| 4704 | 4704 | $class = str_replace('ajax', '', $class); |
| 4705 | 4705 | } |
| 4706 | - $class_btn = 'submit ' . trim($class); |
|
| 4706 | + $class_btn = 'submit '.trim($class); |
|
| 4707 | 4707 | |
| 4708 | 4708 | if ($confirm) { |
| 4709 | - $confirm = 'confirm("' . attribut_html($confirm) . '")'; |
|
| 4709 | + $confirm = 'confirm("'.attribut_html($confirm).'")'; |
|
| 4710 | 4710 | if ($callback) { |
| 4711 | 4711 | $callback = "$confirm?($callback):false"; |
| 4712 | 4712 | } else { |
| 4713 | 4713 | $callback = $confirm; |
| 4714 | 4714 | } |
| 4715 | 4715 | } |
| 4716 | - $onclick = $callback ? " onclick='return " . addcslashes($callback, "'") . "'" : ''; |
|
| 4716 | + $onclick = $callback ? " onclick='return ".addcslashes($callback, "'")."'" : ''; |
|
| 4717 | 4717 | $title = $title ? " title='$title'" : ''; |
| 4718 | 4718 | |
| 4719 | - return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>" . form_hidden($url) |
|
| 4719 | + return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>".form_hidden($url) |
|
| 4720 | 4720 | . "<button type='submit' class='$class_btn'$title$onclick>$libelle</button></div></form>"; |
| 4721 | 4721 | } |
| 4722 | 4722 | |
@@ -4781,14 +4781,14 @@ discard block |
||
| 4781 | 4781 | $champ_titre = ''; |
| 4782 | 4782 | if ($demande_titre) { |
| 4783 | 4783 | // si pas de titre declare mais champ titre, il sera peuple par le select * |
| 4784 | - $champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre'] : ''; |
|
| 4784 | + $champ_titre = (!empty($desc['titre'])) ? ', '.$desc['titre'] : ''; |
|
| 4785 | 4785 | } |
| 4786 | 4786 | include_spip('base/abstract_sql'); |
| 4787 | 4787 | include_spip('base/connect_sql'); |
| 4788 | 4788 | $objets[$type_objet][$id_objet] = sql_fetsel( |
| 4789 | - '*' . $champ_titre, |
|
| 4789 | + '*'.$champ_titre, |
|
| 4790 | 4790 | $desc['table_sql'], |
| 4791 | - id_table_objet($type_objet) . ' = ' . intval($id_objet) |
|
| 4791 | + id_table_objet($type_objet).' = '.intval($id_objet) |
|
| 4792 | 4792 | ); |
| 4793 | 4793 | |
| 4794 | 4794 | // Toujours noter la longueur d'introduction, même si pas demandé cette fois-ci |
@@ -4881,8 +4881,7 @@ discard block |
||
| 4881 | 4881 | if (isset($ligne_sql['chapo'])) { |
| 4882 | 4882 | $chapo = $ligne_sql['chapo']; |
| 4883 | 4883 | $texte = strlen($descriptif) ? |
| 4884 | - '' : |
|
| 4885 | - "$chapo \n\n $texte"; |
|
| 4884 | + '' : "$chapo \n\n $texte"; |
|
| 4886 | 4885 | } |
| 4887 | 4886 | |
| 4888 | 4887 | // Longueur en paramètre, sinon celle renseignée dans la description de l'objet, sinon valeur en dur |
@@ -4957,7 +4956,7 @@ discard block |
||
| 4957 | 4956 | return $texte; |
| 4958 | 4957 | } |
| 4959 | 4958 | |
| 4960 | - $traitement = str_replace('%s', "'" . texte_script($texte) . "'", $traitement); |
|
| 4959 | + $traitement = str_replace('%s', "'".texte_script($texte)."'", $traitement); |
|
| 4961 | 4960 | |
| 4962 | 4961 | // signaler qu'on est dans l'espace prive pour les filtres qui se servent de ce flag |
| 4963 | 4962 | if (test_espace_prive()) { |
@@ -4996,7 +4995,7 @@ discard block |
||
| 4996 | 4995 | } |
| 4997 | 4996 | $url = generer_objet_url($id_objet, $objet, '', '', null, '', $connect); |
| 4998 | 4997 | |
| 4999 | - return "<a href='$url' class='$objet'>" . couper($titre, $longueur) . '</a>'; |
|
| 4998 | + return "<a href='$url' class='$objet'>".couper($titre, $longueur).'</a>'; |
|
| 5000 | 4999 | } |
| 5001 | 5000 | |
| 5002 | 5001 | /** |
@@ -5022,10 +5021,10 @@ discard block |
||
| 5022 | 5021 | function wrap($texte, $wrap) { |
| 5023 | 5022 | $balises = extraire_balises($wrap); |
| 5024 | 5023 | if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS", $wrap, $regs, PREG_PATTERN_ORDER)) { |
| 5025 | - $texte = $wrap . $texte; |
|
| 5024 | + $texte = $wrap.$texte; |
|
| 5026 | 5025 | $regs = array_reverse($regs[1]); |
| 5027 | - $wrap = '</' . implode('></', $regs) . '>'; |
|
| 5028 | - $texte = $texte . $wrap; |
|
| 5026 | + $wrap = '</'.implode('></', $regs).'>'; |
|
| 5027 | + $texte = $texte.$wrap; |
|
| 5029 | 5028 | } |
| 5030 | 5029 | |
| 5031 | 5030 | return $texte; |
@@ -5056,7 +5055,7 @@ discard block |
||
| 5056 | 5055 | |
| 5057 | 5056 | // caster $u en array si besoin |
| 5058 | 5057 | if (is_object($u)) { |
| 5059 | - $u = (array)$u; |
|
| 5058 | + $u = (array) $u; |
|
| 5060 | 5059 | } |
| 5061 | 5060 | |
| 5062 | 5061 | if (is_array($u)) { |
@@ -5078,7 +5077,7 @@ discard block |
||
| 5078 | 5077 | // sinon on passe a la ligne et on indente |
| 5079 | 5078 | $i_str = str_pad('', $indent, ' '); |
| 5080 | 5079 | foreach ($u as $k => $v) { |
| 5081 | - $out .= $join . $i_str . "$k: " . filtre_print_dist($v, $join, $indent + 2); |
|
| 5080 | + $out .= $join.$i_str."$k: ".filtre_print_dist($v, $join, $indent + 2); |
|
| 5082 | 5081 | } |
| 5083 | 5082 | |
| 5084 | 5083 | return $out; |
@@ -5132,7 +5131,7 @@ discard block |
||
| 5132 | 5131 | * @return string |
| 5133 | 5132 | */ |
| 5134 | 5133 | function objet_icone($objet, $taille = 24, $class = '') { |
| 5135 | - $icone = objet_info($objet, 'icone_objet') . '-' . $taille . '.png'; |
|
| 5134 | + $icone = objet_info($objet, 'icone_objet').'-'.$taille.'.png'; |
|
| 5136 | 5135 | $icone = chemin_image($icone); |
| 5137 | 5136 | $balise_img = charger_filtre('balise_img'); |
| 5138 | 5137 | |
@@ -5158,7 +5157,7 @@ discard block |
||
| 5158 | 5157 | */ |
| 5159 | 5158 | function objet_T($objet, $chaine, $args = [], $options = []) { |
| 5160 | 5159 | $chaine = explode(':', $chaine); |
| 5161 | - if ($t = _T($objet . ':' . end($chaine), $args, array_merge($options, ['force' => false]))) { |
|
| 5160 | + if ($t = _T($objet.':'.end($chaine), $args, array_merge($options, ['force' => false]))) { |
|
| 5162 | 5161 | return $t; |
| 5163 | 5162 | } |
| 5164 | 5163 | $chaine = implode(':', $chaine); |
@@ -5224,7 +5223,7 @@ discard block |
||
| 5224 | 5223 | $cache = recuperer_fond($fond, $contexte, $options, $connect); |
| 5225 | 5224 | |
| 5226 | 5225 | // calculer le nom de la css |
| 5227 | - $dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension); |
|
| 5226 | + $dir_var = sous_repertoire(_DIR_VAR, 'cache-'.$extension); |
|
| 5228 | 5227 | $nom_safe = preg_replace(',\W,', '_', str_replace('.', '_', $fond)); |
| 5229 | 5228 | $contexte_implicite = calculer_contexte_implicite(); |
| 5230 | 5229 | |
@@ -5232,14 +5231,14 @@ discard block |
||
| 5232 | 5231 | // mais on peut hasher selon le contenu a la demande, si plusieurs contextes produisent un meme contenu |
| 5233 | 5232 | // reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine |
| 5234 | 5233 | if (isset($options['hash_on_content']) and $options['hash_on_content']) { |
| 5235 | - $hash = md5($contexte_implicite['host'] . '::' . $cache); |
|
| 5234 | + $hash = md5($contexte_implicite['host'].'::'.$cache); |
|
| 5236 | 5235 | } |
| 5237 | 5236 | else { |
| 5238 | 5237 | unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js |
| 5239 | 5238 | ksort($contexte); |
| 5240 | - $hash = md5($fond . json_encode($contexte_implicite, JSON_THROW_ON_ERROR) . json_encode($contexte, JSON_THROW_ON_ERROR) . $connect); |
|
| 5239 | + $hash = md5($fond.json_encode($contexte_implicite, JSON_THROW_ON_ERROR).json_encode($contexte, JSON_THROW_ON_ERROR).$connect); |
|
| 5241 | 5240 | } |
| 5242 | - $filename = $dir_var . $extension . "dyn-$nom_safe-" . substr($hash, 0, 8) . ".$extension"; |
|
| 5241 | + $filename = $dir_var.$extension."dyn-$nom_safe-".substr($hash, 0, 8).".$extension"; |
|
| 5243 | 5242 | |
| 5244 | 5243 | // mettre a jour le fichier si il n'existe pas |
| 5245 | 5244 | // ou trop ancien |
@@ -5247,8 +5246,8 @@ discard block |
||
| 5247 | 5246 | // et recopie sur le fichier cible uniquement si il change |
| 5248 | 5247 | if ( |
| 5249 | 5248 | !file_exists($filename) |
| 5250 | - or !file_exists($filename . '.last') |
|
| 5251 | - or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . '.last') < $cache['lastmodified']) |
|
| 5249 | + or !file_exists($filename.'.last') |
|
| 5250 | + or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename.'.last') < $cache['lastmodified']) |
|
| 5252 | 5251 | or (defined('_VAR_MODE') and _VAR_MODE == 'recalcul') |
| 5253 | 5252 | ) { |
| 5254 | 5253 | $contenu = $cache['texte']; |
@@ -5272,10 +5271,10 @@ discard block |
||
| 5272 | 5271 | } |
| 5273 | 5272 | // pas de date dans le commentaire car sinon ca invalide le md5 et force la maj |
| 5274 | 5273 | // mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non |
| 5275 | - $comment .= "}\n md5:" . md5($contenu) . " */\n"; |
|
| 5274 | + $comment .= "}\n md5:".md5($contenu)." */\n"; |
|
| 5276 | 5275 | } |
| 5277 | 5276 | // et ecrire le fichier si il change |
| 5278 | - ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu, false, true); |
|
| 5277 | + ecrire_fichier_calcule_si_modifie($filename, $comment.$contenu, false, true); |
|
| 5279 | 5278 | } |
| 5280 | 5279 | |
| 5281 | 5280 | return timestamp($filename); |
@@ -5508,7 +5507,7 @@ discard block |
||
| 5508 | 5507 | if ($e > 0 and strlen($mid) > 8) { |
| 5509 | 5508 | $mid = '***...***'; |
| 5510 | 5509 | } |
| 5511 | - return substr($passe, 0, $e) . $mid . ($e > 0 ? substr($passe, -$e) : ''); |
|
| 5510 | + return substr($passe, 0, $e).$mid.($e > 0 ? substr($passe, -$e) : ''); |
|
| 5512 | 5511 | } |
| 5513 | 5512 | |
| 5514 | 5513 | |
@@ -5570,7 +5569,7 @@ discard block |
||
| 5570 | 5569 | case 'id': |
| 5571 | 5570 | case 'anchor': |
| 5572 | 5571 | if (preg_match(',^\d,', $texte)) { |
| 5573 | - $texte = substr($type, 0, 1) . $texte; |
|
| 5572 | + $texte = substr($type, 0, 1).$texte; |
|
| 5574 | 5573 | } |
| 5575 | 5574 | } |
| 5576 | 5575 | |
@@ -5580,9 +5579,9 @@ discard block |
||
| 5580 | 5579 | |
| 5581 | 5580 | if (strlen($texte) < $longueur_mini and $longueur_mini < $longueur_maxi) { |
| 5582 | 5581 | if (preg_match(',^\d,', $texte)) { |
| 5583 | - $texte = ($type ? substr($type, 0, 1) : 's') . $texte; |
|
| 5582 | + $texte = ($type ? substr($type, 0, 1) : 's').$texte; |
|
| 5584 | 5583 | } |
| 5585 | - $texte .= $separateur . md5($original); |
|
| 5584 | + $texte .= $separateur.md5($original); |
|
| 5586 | 5585 | $texte = substr($texte, 0, $longueur_mini); |
| 5587 | 5586 | } |
| 5588 | 5587 | |
@@ -14,171 +14,171 @@ |
||
| 14 | 14 | |
| 15 | 15 | /** Gestion des clés d’authentification / chiffrement de SPIP */ |
| 16 | 16 | final class SpipCles { |
| 17 | - private static array $instances = []; |
|
| 18 | - |
|
| 19 | - private string $file = _DIR_ETC . 'cles.php'; |
|
| 20 | - private Cles $cles; |
|
| 21 | - |
|
| 22 | - public static function instance(string $file = ''): self { |
|
| 23 | - if (empty(self::$instances[$file])) { |
|
| 24 | - self::$instances[$file] = new self($file); |
|
| 25 | - } |
|
| 26 | - return self::$instances[$file]; |
|
| 27 | - } |
|
| 28 | - |
|
| 29 | - /** |
|
| 30 | - * Retourne le secret du site (shorthand) |
|
| 31 | - * @uses self::getSecretSite() |
|
| 32 | - */ |
|
| 33 | - public static function secret_du_site(): ?string { |
|
| 34 | - return (self::instance())->getSecretSite(); |
|
| 35 | - } |
|
| 36 | - |
|
| 37 | - private function __construct(string $file = '') { |
|
| 38 | - if ($file) { |
|
| 39 | - $this->file = $file; |
|
| 40 | - } |
|
| 41 | - $this->cles = new Cles($this->read()); |
|
| 42 | - } |
|
| 43 | - |
|
| 44 | - /** |
|
| 45 | - * Renvoyer le secret du site |
|
| 46 | - * |
|
| 47 | - * Le secret du site doit rester aussi secret que possible, et est eternel |
|
| 48 | - * On ne doit pas l'exporter |
|
| 49 | - * |
|
| 50 | - * Le secret est partagé entre une clé disque et une clé bdd |
|
| 51 | - * |
|
| 52 | - * @return string |
|
| 53 | - */ |
|
| 54 | - public function getSecretSite(bool $autoInit = true): ?string { |
|
| 55 | - $key = $this->getKey('secret_du_site', $autoInit); |
|
| 56 | - $meta = $this->getMetaKey('secret_du_site', $autoInit); |
|
| 57 | - // conserve la même longeur. |
|
| 58 | - return $key ^ $meta; |
|
| 59 | - } |
|
| 60 | - |
|
| 61 | - /** Renvoyer le secret des authentifications */ |
|
| 62 | - public function getSecretAuth(bool $autoInit = false): ?string { |
|
| 63 | - return $this->getKey('secret_des_auth', $autoInit); |
|
| 64 | - } |
|
| 65 | - public function save(): bool { |
|
| 66 | - return ecrire_fichier_securise($this->file, $this->cles->toJson()); |
|
| 67 | - } |
|
| 68 | - |
|
| 69 | - /** |
|
| 70 | - * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur) |
|
| 71 | - * |
|
| 72 | - * @param string $withKey Clé de chiffrage de la sauvegarde |
|
| 73 | - * @return string Contenu de la sauvegarde chiffrée générée |
|
| 74 | - */ |
|
| 75 | - public function backup( |
|
| 76 | - #[\SensitiveParameter] |
|
| 77 | - string $withKey |
|
| 78 | - ): string { |
|
| 79 | - if (count($this->cles)) { |
|
| 80 | - return Chiffrement::chiffrer($this->cles->toJson(), $withKey); |
|
| 81 | - } |
|
| 82 | - return ''; |
|
| 83 | - } |
|
| 84 | - |
|
| 85 | - /** |
|
| 86 | - * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles |
|
| 87 | - * (si la sauvegarde est bien valide) |
|
| 88 | - * |
|
| 89 | - * @param string $backup Sauvegarde chiffrée (générée par backup()) |
|
| 90 | - * @param int $id_auteur |
|
| 91 | - * @param string $pass |
|
| 92 | - * @return void |
|
| 93 | - */ |
|
| 94 | - public function restore( |
|
| 95 | - string $backup, |
|
| 96 | - #[\SensitiveParameter] |
|
| 97 | - string $password_clair, |
|
| 98 | - #[\SensitiveParameter] |
|
| 99 | - string $password_hash, |
|
| 100 | - int $id_auteur |
|
| 101 | - ): bool { |
|
| 102 | - if (empty($backup)) { |
|
| 103 | - return false; |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - $sauvegarde = Chiffrement::dechiffrer($backup, $password_clair); |
|
| 107 | - $json = json_decode($sauvegarde, true); |
|
| 108 | - if (!$json) { |
|
| 109 | - return false; |
|
| 110 | - } |
|
| 111 | - |
|
| 112 | - // cela semble une sauvegarde valide |
|
| 113 | - $cles_potentielles = array_map('base64_decode', $json); |
|
| 114 | - |
|
| 115 | - // il faut faire une double verif sur secret_des_auth |
|
| 116 | - // pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde |
|
| 117 | - // et par extension tous les passwords |
|
| 118 | - if (!empty($cles_potentielles['secret_des_auth'])) { |
|
| 119 | - if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) { |
|
| 120 | - spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 121 | - unset($cles_potentielles['secret_des_auth']); |
|
| 122 | - } |
|
| 123 | - } |
|
| 124 | - |
|
| 125 | - // on merge les cles pour recuperer les cles manquantes |
|
| 126 | - $restauration = false; |
|
| 127 | - foreach ($cles_potentielles as $name => $key) { |
|
| 128 | - if (!$this->cles->has($name)) { |
|
| 129 | - $this->cles->set($name, $key); |
|
| 130 | - spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 131 | - $restauration = true; |
|
| 132 | - } |
|
| 133 | - } |
|
| 134 | - return $restauration; |
|
| 135 | - } |
|
| 136 | - |
|
| 137 | - private function getKey(string $name, bool $autoInit): ?string { |
|
| 138 | - if ($this->cles->has($name)) { |
|
| 139 | - return $this->cles->get($name); |
|
| 140 | - } |
|
| 141 | - if ($autoInit) { |
|
| 142 | - $this->cles->generate($name); |
|
| 143 | - // si l'ecriture de fichier a bien marche on peut utiliser la cle |
|
| 144 | - if ($this->save()) { |
|
| 145 | - return $this->cles->get($name); |
|
| 146 | - } |
|
| 147 | - // sinon loger et annule la cle generee car il ne faut pas l'utiliser |
|
| 148 | - spip_log('Echec ecriture du fichier cle ' . $this->file . " ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR); |
|
| 149 | - $this->cles->delete($name); |
|
| 150 | - } |
|
| 151 | - return null; |
|
| 152 | - } |
|
| 153 | - |
|
| 154 | - private function getMetaKey(string $name, bool $autoInit = true): ?string { |
|
| 155 | - if (!isset($GLOBALS['meta'][$name])) { |
|
| 156 | - include_spip('base/abstract_sql'); |
|
| 157 | - $GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string')); |
|
| 158 | - } |
|
| 159 | - $key = base64_decode($GLOBALS['meta'][$name] ?? ''); |
|
| 160 | - if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) { |
|
| 161 | - return $key; |
|
| 162 | - } |
|
| 163 | - if (!$autoInit) { |
|
| 164 | - return null; |
|
| 165 | - } |
|
| 166 | - $key = Chiffrement::keygen(); |
|
| 167 | - ecrire_meta($name, base64_encode($key), 'non'); |
|
| 168 | - lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas |
|
| 169 | - |
|
| 170 | - return $key; |
|
| 171 | - } |
|
| 172 | - |
|
| 173 | - private function read(): array { |
|
| 174 | - lire_fichier_securise($this->file, $json); |
|
| 175 | - if ( |
|
| 176 | - $json |
|
| 177 | - and $json = \json_decode($json, true) |
|
| 178 | - and is_array($json) |
|
| 179 | - ) { |
|
| 180 | - return array_map('base64_decode', $json); |
|
| 181 | - } |
|
| 182 | - return []; |
|
| 183 | - } |
|
| 17 | + private static array $instances = []; |
|
| 18 | + |
|
| 19 | + private string $file = _DIR_ETC . 'cles.php'; |
|
| 20 | + private Cles $cles; |
|
| 21 | + |
|
| 22 | + public static function instance(string $file = ''): self { |
|
| 23 | + if (empty(self::$instances[$file])) { |
|
| 24 | + self::$instances[$file] = new self($file); |
|
| 25 | + } |
|
| 26 | + return self::$instances[$file]; |
|
| 27 | + } |
|
| 28 | + |
|
| 29 | + /** |
|
| 30 | + * Retourne le secret du site (shorthand) |
|
| 31 | + * @uses self::getSecretSite() |
|
| 32 | + */ |
|
| 33 | + public static function secret_du_site(): ?string { |
|
| 34 | + return (self::instance())->getSecretSite(); |
|
| 35 | + } |
|
| 36 | + |
|
| 37 | + private function __construct(string $file = '') { |
|
| 38 | + if ($file) { |
|
| 39 | + $this->file = $file; |
|
| 40 | + } |
|
| 41 | + $this->cles = new Cles($this->read()); |
|
| 42 | + } |
|
| 43 | + |
|
| 44 | + /** |
|
| 45 | + * Renvoyer le secret du site |
|
| 46 | + * |
|
| 47 | + * Le secret du site doit rester aussi secret que possible, et est eternel |
|
| 48 | + * On ne doit pas l'exporter |
|
| 49 | + * |
|
| 50 | + * Le secret est partagé entre une clé disque et une clé bdd |
|
| 51 | + * |
|
| 52 | + * @return string |
|
| 53 | + */ |
|
| 54 | + public function getSecretSite(bool $autoInit = true): ?string { |
|
| 55 | + $key = $this->getKey('secret_du_site', $autoInit); |
|
| 56 | + $meta = $this->getMetaKey('secret_du_site', $autoInit); |
|
| 57 | + // conserve la même longeur. |
|
| 58 | + return $key ^ $meta; |
|
| 59 | + } |
|
| 60 | + |
|
| 61 | + /** Renvoyer le secret des authentifications */ |
|
| 62 | + public function getSecretAuth(bool $autoInit = false): ?string { |
|
| 63 | + return $this->getKey('secret_des_auth', $autoInit); |
|
| 64 | + } |
|
| 65 | + public function save(): bool { |
|
| 66 | + return ecrire_fichier_securise($this->file, $this->cles->toJson()); |
|
| 67 | + } |
|
| 68 | + |
|
| 69 | + /** |
|
| 70 | + * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur) |
|
| 71 | + * |
|
| 72 | + * @param string $withKey Clé de chiffrage de la sauvegarde |
|
| 73 | + * @return string Contenu de la sauvegarde chiffrée générée |
|
| 74 | + */ |
|
| 75 | + public function backup( |
|
| 76 | + #[\SensitiveParameter] |
|
| 77 | + string $withKey |
|
| 78 | + ): string { |
|
| 79 | + if (count($this->cles)) { |
|
| 80 | + return Chiffrement::chiffrer($this->cles->toJson(), $withKey); |
|
| 81 | + } |
|
| 82 | + return ''; |
|
| 83 | + } |
|
| 84 | + |
|
| 85 | + /** |
|
| 86 | + * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles |
|
| 87 | + * (si la sauvegarde est bien valide) |
|
| 88 | + * |
|
| 89 | + * @param string $backup Sauvegarde chiffrée (générée par backup()) |
|
| 90 | + * @param int $id_auteur |
|
| 91 | + * @param string $pass |
|
| 92 | + * @return void |
|
| 93 | + */ |
|
| 94 | + public function restore( |
|
| 95 | + string $backup, |
|
| 96 | + #[\SensitiveParameter] |
|
| 97 | + string $password_clair, |
|
| 98 | + #[\SensitiveParameter] |
|
| 99 | + string $password_hash, |
|
| 100 | + int $id_auteur |
|
| 101 | + ): bool { |
|
| 102 | + if (empty($backup)) { |
|
| 103 | + return false; |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + $sauvegarde = Chiffrement::dechiffrer($backup, $password_clair); |
|
| 107 | + $json = json_decode($sauvegarde, true); |
|
| 108 | + if (!$json) { |
|
| 109 | + return false; |
|
| 110 | + } |
|
| 111 | + |
|
| 112 | + // cela semble une sauvegarde valide |
|
| 113 | + $cles_potentielles = array_map('base64_decode', $json); |
|
| 114 | + |
|
| 115 | + // il faut faire une double verif sur secret_des_auth |
|
| 116 | + // pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde |
|
| 117 | + // et par extension tous les passwords |
|
| 118 | + if (!empty($cles_potentielles['secret_des_auth'])) { |
|
| 119 | + if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) { |
|
| 120 | + spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 121 | + unset($cles_potentielles['secret_des_auth']); |
|
| 122 | + } |
|
| 123 | + } |
|
| 124 | + |
|
| 125 | + // on merge les cles pour recuperer les cles manquantes |
|
| 126 | + $restauration = false; |
|
| 127 | + foreach ($cles_potentielles as $name => $key) { |
|
| 128 | + if (!$this->cles->has($name)) { |
|
| 129 | + $this->cles->set($name, $key); |
|
| 130 | + spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 131 | + $restauration = true; |
|
| 132 | + } |
|
| 133 | + } |
|
| 134 | + return $restauration; |
|
| 135 | + } |
|
| 136 | + |
|
| 137 | + private function getKey(string $name, bool $autoInit): ?string { |
|
| 138 | + if ($this->cles->has($name)) { |
|
| 139 | + return $this->cles->get($name); |
|
| 140 | + } |
|
| 141 | + if ($autoInit) { |
|
| 142 | + $this->cles->generate($name); |
|
| 143 | + // si l'ecriture de fichier a bien marche on peut utiliser la cle |
|
| 144 | + if ($this->save()) { |
|
| 145 | + return $this->cles->get($name); |
|
| 146 | + } |
|
| 147 | + // sinon loger et annule la cle generee car il ne faut pas l'utiliser |
|
| 148 | + spip_log('Echec ecriture du fichier cle ' . $this->file . " ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR); |
|
| 149 | + $this->cles->delete($name); |
|
| 150 | + } |
|
| 151 | + return null; |
|
| 152 | + } |
|
| 153 | + |
|
| 154 | + private function getMetaKey(string $name, bool $autoInit = true): ?string { |
|
| 155 | + if (!isset($GLOBALS['meta'][$name])) { |
|
| 156 | + include_spip('base/abstract_sql'); |
|
| 157 | + $GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string')); |
|
| 158 | + } |
|
| 159 | + $key = base64_decode($GLOBALS['meta'][$name] ?? ''); |
|
| 160 | + if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) { |
|
| 161 | + return $key; |
|
| 162 | + } |
|
| 163 | + if (!$autoInit) { |
|
| 164 | + return null; |
|
| 165 | + } |
|
| 166 | + $key = Chiffrement::keygen(); |
|
| 167 | + ecrire_meta($name, base64_encode($key), 'non'); |
|
| 168 | + lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas |
|
| 169 | + |
|
| 170 | + return $key; |
|
| 171 | + } |
|
| 172 | + |
|
| 173 | + private function read(): array { |
|
| 174 | + lire_fichier_securise($this->file, $json); |
|
| 175 | + if ( |
|
| 176 | + $json |
|
| 177 | + and $json = \json_decode($json, true) |
|
| 178 | + and is_array($json) |
|
| 179 | + ) { |
|
| 180 | + return array_map('base64_decode', $json); |
|
| 181 | + } |
|
| 182 | + return []; |
|
| 183 | + } |
|
| 184 | 184 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | final class SpipCles { |
| 17 | 17 | private static array $instances = []; |
| 18 | 18 | |
| 19 | - private string $file = _DIR_ETC . 'cles.php'; |
|
| 19 | + private string $file = _DIR_ETC.'cles.php'; |
|
| 20 | 20 | private Cles $cles; |
| 21 | 21 | |
| 22 | 22 | public static function instance(string $file = ''): self { |
@@ -117,7 +117,7 @@ discard block |
||
| 117 | 117 | // et par extension tous les passwords |
| 118 | 118 | if (!empty($cles_potentielles['secret_des_auth'])) { |
| 119 | 119 | if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) { |
| 120 | - spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 120 | + spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer'._LOG_INFO_IMPORTANTE); |
|
| 121 | 121 | unset($cles_potentielles['secret_des_auth']); |
| 122 | 122 | } |
| 123 | 123 | } |
@@ -127,7 +127,7 @@ discard block |
||
| 127 | 127 | foreach ($cles_potentielles as $name => $key) { |
| 128 | 128 | if (!$this->cles->has($name)) { |
| 129 | 129 | $this->cles->set($name, $key); |
| 130 | - spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 130 | + spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer'._LOG_INFO_IMPORTANTE); |
|
| 131 | 131 | $restauration = true; |
| 132 | 132 | } |
| 133 | 133 | } |
@@ -145,7 +145,7 @@ discard block |
||
| 145 | 145 | return $this->cles->get($name); |
| 146 | 146 | } |
| 147 | 147 | // sinon loger et annule la cle generee car il ne faut pas l'utiliser |
| 148 | - spip_log('Echec ecriture du fichier cle ' . $this->file . " ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR); |
|
| 148 | + spip_log('Echec ecriture du fichier cle '.$this->file." ; impossible de generer une cle $name", 'chiffrer'._LOG_ERREUR); |
|
| 149 | 149 | $this->cles->delete($name); |
| 150 | 150 | } |
| 151 | 151 | return null; |
@@ -154,7 +154,7 @@ discard block |
||
| 154 | 154 | private function getMetaKey(string $name, bool $autoInit = true): ?string { |
| 155 | 155 | if (!isset($GLOBALS['meta'][$name])) { |
| 156 | 156 | include_spip('base/abstract_sql'); |
| 157 | - $GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string')); |
|
| 157 | + $GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = '.sql_quote($name, '', 'string')); |
|
| 158 | 158 | } |
| 159 | 159 | $key = base64_decode($GLOBALS['meta'][$name] ?? ''); |
| 160 | 160 | if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) { |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | /** |
@@ -39,28 +39,28 @@ discard block |
||
| 39 | 39 | * Tableau des champs et valeurs collectées |
| 40 | 40 | */ |
| 41 | 41 | function collecter_requests($include_list, $exclude_list = [], $set = null, $tous = false) { |
| 42 | - $c = $set; |
|
| 43 | - if (!$c) { |
|
| 44 | - $c = []; |
|
| 45 | - foreach ($include_list as $champ) { |
|
| 46 | - // on ne collecte que les champs reellement envoyes par defaut. |
|
| 47 | - // le cas d'un envoi de valeur NULL peut du coup poser probleme. |
|
| 48 | - $val = _request($champ); |
|
| 49 | - if ($tous or $val !== null) { |
|
| 50 | - $c[$champ] = $val; |
|
| 51 | - } |
|
| 52 | - } |
|
| 53 | - // on ajoute toujours la lang en saisie possible |
|
| 54 | - // meme si pas prevu au depart pour l'objet concerne |
|
| 55 | - if ($l = _request('changer_lang')) { |
|
| 56 | - $c['lang'] = $l; |
|
| 57 | - } |
|
| 58 | - } |
|
| 59 | - foreach ($exclude_list as $champ) { |
|
| 60 | - unset($c[$champ]); |
|
| 61 | - } |
|
| 62 | - |
|
| 63 | - return $c; |
|
| 42 | + $c = $set; |
|
| 43 | + if (!$c) { |
|
| 44 | + $c = []; |
|
| 45 | + foreach ($include_list as $champ) { |
|
| 46 | + // on ne collecte que les champs reellement envoyes par defaut. |
|
| 47 | + // le cas d'un envoi de valeur NULL peut du coup poser probleme. |
|
| 48 | + $val = _request($champ); |
|
| 49 | + if ($tous or $val !== null) { |
|
| 50 | + $c[$champ] = $val; |
|
| 51 | + } |
|
| 52 | + } |
|
| 53 | + // on ajoute toujours la lang en saisie possible |
|
| 54 | + // meme si pas prevu au depart pour l'objet concerne |
|
| 55 | + if ($l = _request('changer_lang')) { |
|
| 56 | + $c['lang'] = $l; |
|
| 57 | + } |
|
| 58 | + } |
|
| 59 | + foreach ($exclude_list as $champ) { |
|
| 60 | + unset($c[$champ]); |
|
| 61 | + } |
|
| 62 | + |
|
| 63 | + return $c; |
|
| 64 | 64 | } |
| 65 | 65 | |
| 66 | 66 | /** |
@@ -97,242 +97,242 @@ discard block |
||
| 97 | 97 | * - chaîne : Texte d'un message d'erreur |
| 98 | 98 | */ |
| 99 | 99 | function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur = '') { |
| 100 | - if (!$id_objet = intval($id_objet)) { |
|
| 101 | - spip_log('Erreur $id_objet non defini', 'warn'); |
|
| 102 | - |
|
| 103 | - return _T('erreur_technique_enregistrement_impossible'); |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - include_spip('inc/filtres'); |
|
| 107 | - |
|
| 108 | - $table_objet = table_objet($objet, $serveur); |
|
| 109 | - $spip_table_objet = table_objet_sql($objet, $serveur); |
|
| 110 | - $id_table_objet = id_table_objet($objet, $serveur); |
|
| 111 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 112 | - $desc = $trouver_table($spip_table_objet, $serveur); |
|
| 113 | - |
|
| 114 | - // Appels incomplets (sans $c) |
|
| 115 | - if (!is_array($c)) { |
|
| 116 | - spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c'); |
|
| 117 | - |
|
| 118 | - return _T('erreur_technique_enregistrement_impossible'); |
|
| 119 | - } |
|
| 120 | - |
|
| 121 | - // Securite : certaines variables ne sont jamais acceptees ici |
|
| 122 | - // car elles ne relevent pas de autoriser(xxx, modifier) ; |
|
| 123 | - // il faut passer par instituer_XX() |
|
| 124 | - // TODO: faut-il passer ces variables interdites |
|
| 125 | - // dans un fichier de description separe ? |
|
| 126 | - unset($c['statut']); |
|
| 127 | - unset($c['id_parent']); |
|
| 128 | - unset($c['id_rubrique']); |
|
| 129 | - unset($c['id_secteur']); |
|
| 130 | - |
|
| 131 | - // Gerer les champs non vides |
|
| 132 | - if (isset($options['nonvide']) and is_array($options['nonvide'])) { |
|
| 133 | - foreach ($options['nonvide'] as $champ => $sinon) { |
|
| 134 | - if (isset($c[$champ]) and $c[$champ] === '') { |
|
| 135 | - $c[$champ] = $sinon; |
|
| 136 | - } |
|
| 137 | - } |
|
| 138 | - } |
|
| 139 | - |
|
| 140 | - // N'accepter que les champs qui existent dans la table |
|
| 141 | - $champs = array_intersect_key($c, $desc['field']); |
|
| 142 | - // et dont la valeur n'est pas null |
|
| 143 | - $champs = array_filter($champs, static function ($var) { |
|
| 144 | - return $var !== null; |
|
| 145 | - }); |
|
| 146 | - // TODO: ici aussi on peut valider les contenus |
|
| 147 | - // en fonction du type |
|
| 148 | - |
|
| 149 | - // Nettoyer les valeurs |
|
| 150 | - $champs = array_map('corriger_caracteres', $champs); |
|
| 151 | - |
|
| 152 | - // On récupère l'état avant toute modification |
|
| 153 | - $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet); |
|
| 154 | - |
|
| 155 | - // Envoyer aux plugins |
|
| 156 | - $champs = pipeline( |
|
| 157 | - 'pre_edition', |
|
| 158 | - [ |
|
| 159 | - 'args' => [ |
|
| 160 | - 'table' => $spip_table_objet, // compatibilite |
|
| 161 | - 'table_objet' => $table_objet, |
|
| 162 | - 'spip_table_objet' => $spip_table_objet, |
|
| 163 | - 'desc' => $desc, |
|
| 164 | - 'type' => $objet, |
|
| 165 | - 'id_objet' => $id_objet, |
|
| 166 | - 'data' => $options['data'] ?? null, |
|
| 167 | - 'champs' => $options['champs'] ?? [], // [doc] c'est quoi ? |
|
| 168 | - 'champs_anciens' => $row, // état du contenu avant modif |
|
| 169 | - 'serveur' => $serveur, |
|
| 170 | - 'action' => $options['action'] ?? 'modifier' |
|
| 171 | - ], |
|
| 172 | - 'data' => $champs |
|
| 173 | - ] |
|
| 174 | - ); |
|
| 175 | - |
|
| 176 | - if (!$champs) { |
|
| 177 | - return false; |
|
| 178 | - } |
|
| 179 | - |
|
| 180 | - |
|
| 181 | - // marquer le fait que l'objet est travaille par toto a telle date |
|
| 182 | - include_spip('inc/config'); |
|
| 183 | - if (lire_config('articles_modif', 'non') !== 'non') { |
|
| 184 | - include_spip('inc/drapeau_edition'); |
|
| 185 | - signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet); |
|
| 186 | - } |
|
| 187 | - |
|
| 188 | - // Verifier si les mises a jour sont pertinentes, datees, en conflit etc |
|
| 189 | - include_spip('inc/editer'); |
|
| 190 | - if (!isset($options['data']) or is_null($options['data'])) { |
|
| 191 | - $options['data'] = &$_POST; |
|
| 192 | - } |
|
| 193 | - $conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur); |
|
| 194 | - // cas hypothetique : normalement inc/editer verifie en amont le conflit edition |
|
| 195 | - // et gere l'interface |
|
| 196 | - // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme |
|
| 197 | - if ($conflits) { |
|
| 198 | - return _T('titre_conflit_edition'); |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - if ($champs) { |
|
| 202 | - // cas particulier de la langue : passer par instituer_langue_objet |
|
| 203 | - if (isset($champs['lang'])) { |
|
| 204 | - if ($changer_lang = $champs['lang']) { |
|
| 205 | - $id_rubrique = 0; |
|
| 206 | - if (isset($desc['field']['id_rubrique'])) { |
|
| 207 | - $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique'; |
|
| 208 | - $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet)); |
|
| 209 | - } |
|
| 210 | - $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action'); |
|
| 211 | - $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur); |
|
| 212 | - } |
|
| 213 | - // on laisse 'lang' dans $champs, |
|
| 214 | - // ca permet de passer dans le pipeline post_edition et de journaliser |
|
| 215 | - // et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir |
|
| 216 | - // deja pris en compte |
|
| 217 | - } |
|
| 218 | - |
|
| 219 | - // la modif peut avoir lieu |
|
| 220 | - |
|
| 221 | - // faut-il ajouter date_modif ? |
|
| 222 | - if ( |
|
| 223 | - !empty($options['date_modif']) |
|
| 224 | - and !isset($champs[$options['date_modif']]) |
|
| 225 | - ) { |
|
| 226 | - $champs[$options['date_modif']] = date('Y-m-d H:i:s'); |
|
| 227 | - } |
|
| 228 | - |
|
| 229 | - // allez on commit la modif |
|
| 230 | - sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), [], $serveur); |
|
| 231 | - |
|
| 232 | - // on verifie si elle est bien passee |
|
| 233 | - $moof = sql_fetsel( |
|
| 234 | - array_keys($champs), |
|
| 235 | - $spip_table_objet, |
|
| 236 | - "$id_table_objet=" . intval($id_objet), |
|
| 237 | - [], |
|
| 238 | - [], |
|
| 239 | - '', |
|
| 240 | - [], |
|
| 241 | - $serveur |
|
| 242 | - ); |
|
| 243 | - // si difference entre les champs, reperer les champs mal enregistres |
|
| 244 | - if ($moof != $champs) { |
|
| 245 | - $liste = []; |
|
| 246 | - foreach ($moof as $k => $v) { |
|
| 247 | - if ( |
|
| 248 | - $v !== $champs[$k] |
|
| 249 | - // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes |
|
| 250 | - and (!is_numeric($v) or intval($v) !== intval($champs[$k])) |
|
| 251 | - // ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle |
|
| 252 | - and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00'])) |
|
| 253 | - ) { |
|
| 254 | - $liste[] = $k; |
|
| 255 | - $conflits[$k]['post'] = $champs[$k]; |
|
| 256 | - $conflits[$k]['save'] = $v; |
|
| 257 | - |
|
| 258 | - // cas specifique MySQL+emoji : si l'un est la |
|
| 259 | - // conversion utf8_noplanes de l'autre alors c'est OK |
|
| 260 | - if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) { |
|
| 261 | - include_spip('inc/charsets'); |
|
| 262 | - if ($v == utf8_noplanes($champs[$k])) { |
|
| 263 | - array_pop($liste); |
|
| 264 | - } |
|
| 265 | - } |
|
| 266 | - } |
|
| 267 | - } |
|
| 268 | - // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur |
|
| 269 | - // c'est un cas exceptionnel |
|
| 270 | - if (count($liste)) { |
|
| 271 | - spip_log( |
|
| 272 | - "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true), |
|
| 273 | - 'modifier.' . _LOG_CRITIQUE |
|
| 274 | - ); |
|
| 275 | - |
|
| 276 | - return _T( |
|
| 277 | - 'erreur_technique_enregistrement_champs', |
|
| 278 | - ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"] |
|
| 279 | - ); |
|
| 280 | - } |
|
| 281 | - } |
|
| 282 | - |
|
| 283 | - // Invalider les caches |
|
| 284 | - if (isset($options['invalideur']) and $options['invalideur']) { |
|
| 285 | - include_spip('inc/invalideur'); |
|
| 286 | - if (is_array($options['invalideur'])) { |
|
| 287 | - array_map('suivre_invalideur', $options['invalideur']); |
|
| 288 | - } else { |
|
| 289 | - suivre_invalideur($options['invalideur']); |
|
| 290 | - } |
|
| 291 | - } |
|
| 292 | - |
|
| 293 | - // Notifications, gestion des revisions... |
|
| 294 | - // en standard, appelle |nouvelle_revision ci-dessous |
|
| 295 | - pipeline( |
|
| 296 | - 'post_edition', |
|
| 297 | - [ |
|
| 298 | - 'args' => [ |
|
| 299 | - 'table' => $spip_table_objet, |
|
| 300 | - 'table_objet' => $table_objet, |
|
| 301 | - 'spip_table_objet' => $spip_table_objet, |
|
| 302 | - 'desc' => $desc, |
|
| 303 | - 'type' => $objet, |
|
| 304 | - 'id_objet' => $id_objet, |
|
| 305 | - 'champs' => $options['champs'] ?? [], // [doc] kesako ? |
|
| 306 | - 'champs_anciens' => $row, // état du contenu avant modif |
|
| 307 | - 'serveur' => $serveur, |
|
| 308 | - 'action' => $options['action'] ?? 'modifier' |
|
| 309 | - ], |
|
| 310 | - 'data' => $champs |
|
| 311 | - ] |
|
| 312 | - ); |
|
| 313 | - } |
|
| 314 | - |
|
| 315 | - // journaliser l'affaire |
|
| 316 | - // message a affiner :-) |
|
| 317 | - include_spip('inc/filtres_mini'); |
|
| 318 | - $qui = ''; |
|
| 319 | - if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 320 | - $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#'; |
|
| 321 | - } |
|
| 322 | - if (!empty($GLOBALS['visiteur_session']['nom'])) { |
|
| 323 | - $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#'; |
|
| 324 | - } |
|
| 325 | - if ($qui == '') { |
|
| 326 | - $qui = '#ip:' . $GLOBALS['ip'] . '#'; |
|
| 327 | - } |
|
| 328 | - journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join( |
|
| 329 | - '+', |
|
| 330 | - array_diff(array_keys($champs), ['date_modif']) |
|
| 331 | - ) . ')'), [ |
|
| 332 | - 'faire' => 'modifier', |
|
| 333 | - 'quoi' => $objet, |
|
| 334 | - 'id' => $id_objet |
|
| 335 | - ]); |
|
| 336 | - |
|
| 337 | - return ''; |
|
| 100 | + if (!$id_objet = intval($id_objet)) { |
|
| 101 | + spip_log('Erreur $id_objet non defini', 'warn'); |
|
| 102 | + |
|
| 103 | + return _T('erreur_technique_enregistrement_impossible'); |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + include_spip('inc/filtres'); |
|
| 107 | + |
|
| 108 | + $table_objet = table_objet($objet, $serveur); |
|
| 109 | + $spip_table_objet = table_objet_sql($objet, $serveur); |
|
| 110 | + $id_table_objet = id_table_objet($objet, $serveur); |
|
| 111 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 112 | + $desc = $trouver_table($spip_table_objet, $serveur); |
|
| 113 | + |
|
| 114 | + // Appels incomplets (sans $c) |
|
| 115 | + if (!is_array($c)) { |
|
| 116 | + spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c'); |
|
| 117 | + |
|
| 118 | + return _T('erreur_technique_enregistrement_impossible'); |
|
| 119 | + } |
|
| 120 | + |
|
| 121 | + // Securite : certaines variables ne sont jamais acceptees ici |
|
| 122 | + // car elles ne relevent pas de autoriser(xxx, modifier) ; |
|
| 123 | + // il faut passer par instituer_XX() |
|
| 124 | + // TODO: faut-il passer ces variables interdites |
|
| 125 | + // dans un fichier de description separe ? |
|
| 126 | + unset($c['statut']); |
|
| 127 | + unset($c['id_parent']); |
|
| 128 | + unset($c['id_rubrique']); |
|
| 129 | + unset($c['id_secteur']); |
|
| 130 | + |
|
| 131 | + // Gerer les champs non vides |
|
| 132 | + if (isset($options['nonvide']) and is_array($options['nonvide'])) { |
|
| 133 | + foreach ($options['nonvide'] as $champ => $sinon) { |
|
| 134 | + if (isset($c[$champ]) and $c[$champ] === '') { |
|
| 135 | + $c[$champ] = $sinon; |
|
| 136 | + } |
|
| 137 | + } |
|
| 138 | + } |
|
| 139 | + |
|
| 140 | + // N'accepter que les champs qui existent dans la table |
|
| 141 | + $champs = array_intersect_key($c, $desc['field']); |
|
| 142 | + // et dont la valeur n'est pas null |
|
| 143 | + $champs = array_filter($champs, static function ($var) { |
|
| 144 | + return $var !== null; |
|
| 145 | + }); |
|
| 146 | + // TODO: ici aussi on peut valider les contenus |
|
| 147 | + // en fonction du type |
|
| 148 | + |
|
| 149 | + // Nettoyer les valeurs |
|
| 150 | + $champs = array_map('corriger_caracteres', $champs); |
|
| 151 | + |
|
| 152 | + // On récupère l'état avant toute modification |
|
| 153 | + $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet); |
|
| 154 | + |
|
| 155 | + // Envoyer aux plugins |
|
| 156 | + $champs = pipeline( |
|
| 157 | + 'pre_edition', |
|
| 158 | + [ |
|
| 159 | + 'args' => [ |
|
| 160 | + 'table' => $spip_table_objet, // compatibilite |
|
| 161 | + 'table_objet' => $table_objet, |
|
| 162 | + 'spip_table_objet' => $spip_table_objet, |
|
| 163 | + 'desc' => $desc, |
|
| 164 | + 'type' => $objet, |
|
| 165 | + 'id_objet' => $id_objet, |
|
| 166 | + 'data' => $options['data'] ?? null, |
|
| 167 | + 'champs' => $options['champs'] ?? [], // [doc] c'est quoi ? |
|
| 168 | + 'champs_anciens' => $row, // état du contenu avant modif |
|
| 169 | + 'serveur' => $serveur, |
|
| 170 | + 'action' => $options['action'] ?? 'modifier' |
|
| 171 | + ], |
|
| 172 | + 'data' => $champs |
|
| 173 | + ] |
|
| 174 | + ); |
|
| 175 | + |
|
| 176 | + if (!$champs) { |
|
| 177 | + return false; |
|
| 178 | + } |
|
| 179 | + |
|
| 180 | + |
|
| 181 | + // marquer le fait que l'objet est travaille par toto a telle date |
|
| 182 | + include_spip('inc/config'); |
|
| 183 | + if (lire_config('articles_modif', 'non') !== 'non') { |
|
| 184 | + include_spip('inc/drapeau_edition'); |
|
| 185 | + signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet); |
|
| 186 | + } |
|
| 187 | + |
|
| 188 | + // Verifier si les mises a jour sont pertinentes, datees, en conflit etc |
|
| 189 | + include_spip('inc/editer'); |
|
| 190 | + if (!isset($options['data']) or is_null($options['data'])) { |
|
| 191 | + $options['data'] = &$_POST; |
|
| 192 | + } |
|
| 193 | + $conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur); |
|
| 194 | + // cas hypothetique : normalement inc/editer verifie en amont le conflit edition |
|
| 195 | + // et gere l'interface |
|
| 196 | + // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme |
|
| 197 | + if ($conflits) { |
|
| 198 | + return _T('titre_conflit_edition'); |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + if ($champs) { |
|
| 202 | + // cas particulier de la langue : passer par instituer_langue_objet |
|
| 203 | + if (isset($champs['lang'])) { |
|
| 204 | + if ($changer_lang = $champs['lang']) { |
|
| 205 | + $id_rubrique = 0; |
|
| 206 | + if (isset($desc['field']['id_rubrique'])) { |
|
| 207 | + $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique'; |
|
| 208 | + $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet)); |
|
| 209 | + } |
|
| 210 | + $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action'); |
|
| 211 | + $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur); |
|
| 212 | + } |
|
| 213 | + // on laisse 'lang' dans $champs, |
|
| 214 | + // ca permet de passer dans le pipeline post_edition et de journaliser |
|
| 215 | + // et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir |
|
| 216 | + // deja pris en compte |
|
| 217 | + } |
|
| 218 | + |
|
| 219 | + // la modif peut avoir lieu |
|
| 220 | + |
|
| 221 | + // faut-il ajouter date_modif ? |
|
| 222 | + if ( |
|
| 223 | + !empty($options['date_modif']) |
|
| 224 | + and !isset($champs[$options['date_modif']]) |
|
| 225 | + ) { |
|
| 226 | + $champs[$options['date_modif']] = date('Y-m-d H:i:s'); |
|
| 227 | + } |
|
| 228 | + |
|
| 229 | + // allez on commit la modif |
|
| 230 | + sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), [], $serveur); |
|
| 231 | + |
|
| 232 | + // on verifie si elle est bien passee |
|
| 233 | + $moof = sql_fetsel( |
|
| 234 | + array_keys($champs), |
|
| 235 | + $spip_table_objet, |
|
| 236 | + "$id_table_objet=" . intval($id_objet), |
|
| 237 | + [], |
|
| 238 | + [], |
|
| 239 | + '', |
|
| 240 | + [], |
|
| 241 | + $serveur |
|
| 242 | + ); |
|
| 243 | + // si difference entre les champs, reperer les champs mal enregistres |
|
| 244 | + if ($moof != $champs) { |
|
| 245 | + $liste = []; |
|
| 246 | + foreach ($moof as $k => $v) { |
|
| 247 | + if ( |
|
| 248 | + $v !== $champs[$k] |
|
| 249 | + // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes |
|
| 250 | + and (!is_numeric($v) or intval($v) !== intval($champs[$k])) |
|
| 251 | + // ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle |
|
| 252 | + and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00'])) |
|
| 253 | + ) { |
|
| 254 | + $liste[] = $k; |
|
| 255 | + $conflits[$k]['post'] = $champs[$k]; |
|
| 256 | + $conflits[$k]['save'] = $v; |
|
| 257 | + |
|
| 258 | + // cas specifique MySQL+emoji : si l'un est la |
|
| 259 | + // conversion utf8_noplanes de l'autre alors c'est OK |
|
| 260 | + if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) { |
|
| 261 | + include_spip('inc/charsets'); |
|
| 262 | + if ($v == utf8_noplanes($champs[$k])) { |
|
| 263 | + array_pop($liste); |
|
| 264 | + } |
|
| 265 | + } |
|
| 266 | + } |
|
| 267 | + } |
|
| 268 | + // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur |
|
| 269 | + // c'est un cas exceptionnel |
|
| 270 | + if (count($liste)) { |
|
| 271 | + spip_log( |
|
| 272 | + "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true), |
|
| 273 | + 'modifier.' . _LOG_CRITIQUE |
|
| 274 | + ); |
|
| 275 | + |
|
| 276 | + return _T( |
|
| 277 | + 'erreur_technique_enregistrement_champs', |
|
| 278 | + ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"] |
|
| 279 | + ); |
|
| 280 | + } |
|
| 281 | + } |
|
| 282 | + |
|
| 283 | + // Invalider les caches |
|
| 284 | + if (isset($options['invalideur']) and $options['invalideur']) { |
|
| 285 | + include_spip('inc/invalideur'); |
|
| 286 | + if (is_array($options['invalideur'])) { |
|
| 287 | + array_map('suivre_invalideur', $options['invalideur']); |
|
| 288 | + } else { |
|
| 289 | + suivre_invalideur($options['invalideur']); |
|
| 290 | + } |
|
| 291 | + } |
|
| 292 | + |
|
| 293 | + // Notifications, gestion des revisions... |
|
| 294 | + // en standard, appelle |nouvelle_revision ci-dessous |
|
| 295 | + pipeline( |
|
| 296 | + 'post_edition', |
|
| 297 | + [ |
|
| 298 | + 'args' => [ |
|
| 299 | + 'table' => $spip_table_objet, |
|
| 300 | + 'table_objet' => $table_objet, |
|
| 301 | + 'spip_table_objet' => $spip_table_objet, |
|
| 302 | + 'desc' => $desc, |
|
| 303 | + 'type' => $objet, |
|
| 304 | + 'id_objet' => $id_objet, |
|
| 305 | + 'champs' => $options['champs'] ?? [], // [doc] kesako ? |
|
| 306 | + 'champs_anciens' => $row, // état du contenu avant modif |
|
| 307 | + 'serveur' => $serveur, |
|
| 308 | + 'action' => $options['action'] ?? 'modifier' |
|
| 309 | + ], |
|
| 310 | + 'data' => $champs |
|
| 311 | + ] |
|
| 312 | + ); |
|
| 313 | + } |
|
| 314 | + |
|
| 315 | + // journaliser l'affaire |
|
| 316 | + // message a affiner :-) |
|
| 317 | + include_spip('inc/filtres_mini'); |
|
| 318 | + $qui = ''; |
|
| 319 | + if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 320 | + $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#'; |
|
| 321 | + } |
|
| 322 | + if (!empty($GLOBALS['visiteur_session']['nom'])) { |
|
| 323 | + $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#'; |
|
| 324 | + } |
|
| 325 | + if ($qui == '') { |
|
| 326 | + $qui = '#ip:' . $GLOBALS['ip'] . '#'; |
|
| 327 | + } |
|
| 328 | + journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join( |
|
| 329 | + '+', |
|
| 330 | + array_diff(array_keys($champs), ['date_modif']) |
|
| 331 | + ) . ')'), [ |
|
| 332 | + 'faire' => 'modifier', |
|
| 333 | + 'quoi' => $objet, |
|
| 334 | + 'id' => $id_objet |
|
| 335 | + ]); |
|
| 336 | + |
|
| 337 | + return ''; |
|
| 338 | 338 | } |
@@ -113,7 +113,7 @@ discard block |
||
| 113 | 113 | |
| 114 | 114 | // Appels incomplets (sans $c) |
| 115 | 115 | if (!is_array($c)) { |
| 116 | - spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c'); |
|
| 116 | + spip_log('erreur appel objet_modifier_champs('.$objet.'), manque $c'); |
|
| 117 | 117 | |
| 118 | 118 | return _T('erreur_technique_enregistrement_impossible'); |
| 119 | 119 | } |
@@ -140,7 +140,7 @@ discard block |
||
| 140 | 140 | // N'accepter que les champs qui existent dans la table |
| 141 | 141 | $champs = array_intersect_key($c, $desc['field']); |
| 142 | 142 | // et dont la valeur n'est pas null |
| 143 | - $champs = array_filter($champs, static function ($var) { |
|
| 143 | + $champs = array_filter($champs, static function($var) { |
|
| 144 | 144 | return $var !== null; |
| 145 | 145 | }); |
| 146 | 146 | // TODO: ici aussi on peut valider les contenus |
@@ -150,7 +150,7 @@ discard block |
||
| 150 | 150 | $champs = array_map('corriger_caracteres', $champs); |
| 151 | 151 | |
| 152 | 152 | // On récupère l'état avant toute modification |
| 153 | - $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet); |
|
| 153 | + $row = sql_fetsel('*', $spip_table_objet, $id_table_objet.'='.$id_objet); |
|
| 154 | 154 | |
| 155 | 155 | // Envoyer aux plugins |
| 156 | 156 | $champs = pipeline( |
@@ -205,7 +205,7 @@ discard block |
||
| 205 | 205 | $id_rubrique = 0; |
| 206 | 206 | if (isset($desc['field']['id_rubrique'])) { |
| 207 | 207 | $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique'; |
| 208 | - $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet)); |
|
| 208 | + $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet)); |
|
| 209 | 209 | } |
| 210 | 210 | $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action'); |
| 211 | 211 | $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur); |
@@ -227,13 +227,13 @@ discard block |
||
| 227 | 227 | } |
| 228 | 228 | |
| 229 | 229 | // allez on commit la modif |
| 230 | - sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), [], $serveur); |
|
| 230 | + sql_updateq($spip_table_objet, $champs, "$id_table_objet=".intval($id_objet), [], $serveur); |
|
| 231 | 231 | |
| 232 | 232 | // on verifie si elle est bien passee |
| 233 | 233 | $moof = sql_fetsel( |
| 234 | 234 | array_keys($champs), |
| 235 | 235 | $spip_table_objet, |
| 236 | - "$id_table_objet=" . intval($id_objet), |
|
| 236 | + "$id_table_objet=".intval($id_objet), |
|
| 237 | 237 | [], |
| 238 | 238 | [], |
| 239 | 239 | '', |
@@ -269,13 +269,13 @@ discard block |
||
| 269 | 269 | // c'est un cas exceptionnel |
| 270 | 270 | if (count($liste)) { |
| 271 | 271 | spip_log( |
| 272 | - "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true), |
|
| 273 | - 'modifier.' . _LOG_CRITIQUE |
|
| 272 | + "Erreur enregistrement en base $objet/$id_objet champs :".var_export($conflits, true), |
|
| 273 | + 'modifier.'._LOG_CRITIQUE |
|
| 274 | 274 | ); |
| 275 | 275 | |
| 276 | 276 | return _T( |
| 277 | 277 | 'erreur_technique_enregistrement_champs', |
| 278 | - ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"] |
|
| 278 | + ['champs' => "<i>'".implode("'</i>,<i>'", $liste)."'</i>"] |
|
| 279 | 279 | ); |
| 280 | 280 | } |
| 281 | 281 | } |
@@ -317,18 +317,18 @@ discard block |
||
| 317 | 317 | include_spip('inc/filtres_mini'); |
| 318 | 318 | $qui = ''; |
| 319 | 319 | if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
| 320 | - $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#'; |
|
| 320 | + $qui .= ' #id_auteur:'.$GLOBALS['visiteur_session']['id_auteur'].'#'; |
|
| 321 | 321 | } |
| 322 | 322 | if (!empty($GLOBALS['visiteur_session']['nom'])) { |
| 323 | - $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#'; |
|
| 323 | + $qui .= ' #nom:'.$GLOBALS['visiteur_session']['nom'].'#'; |
|
| 324 | 324 | } |
| 325 | 325 | if ($qui == '') { |
| 326 | - $qui = '#ip:' . $GLOBALS['ip'] . '#'; |
|
| 326 | + $qui = '#ip:'.$GLOBALS['ip'].'#'; |
|
| 327 | 327 | } |
| 328 | - journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join( |
|
| 328 | + journal(_L($qui.' a édité '.$objet.' '.$id_objet.' ('.join( |
|
| 329 | 329 | '+', |
| 330 | 330 | array_diff(array_keys($champs), ['date_modif']) |
| 331 | - ) . ')'), [ |
|
| 331 | + ).')'), [ |
|
| 332 | 332 | 'faire' => 'modifier', |
| 333 | 333 | 'quoi' => $objet, |
| 334 | 334 | 'id' => $id_objet |
@@ -19,7 +19,7 @@ discard block |
||
| 19 | 19 | use Spip\Chiffrer\SpipCles; |
| 20 | 20 | |
| 21 | 21 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 22 | - return; |
|
| 22 | + return; |
|
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | /** |
@@ -34,170 +34,170 @@ discard block |
||
| 34 | 34 | */ |
| 35 | 35 | function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { |
| 36 | 36 | |
| 37 | - // retrouver le login |
|
| 38 | - $login = auth_spip_retrouver_login($login); |
|
| 39 | - // login inconnu, n'allons pas plus loin |
|
| 40 | - if (!$login) { |
|
| 41 | - return []; |
|
| 42 | - } |
|
| 43 | - |
|
| 44 | - $md5pass = ''; |
|
| 45 | - $shapass = $shanext = ''; |
|
| 46 | - $auteur_peut_sauver_cles = false; |
|
| 47 | - |
|
| 48 | - if ($pass) { |
|
| 49 | - $row = sql_fetsel( |
|
| 50 | - '*', |
|
| 51 | - 'spip_auteurs', |
|
| 52 | - 'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'", |
|
| 53 | - '', |
|
| 54 | - '', |
|
| 55 | - '', |
|
| 56 | - '', |
|
| 57 | - $serveur |
|
| 58 | - ); |
|
| 59 | - |
|
| 60 | - // lever un flag si cet auteur peut sauver les cles |
|
| 61 | - if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) { |
|
| 62 | - $auteur_peut_sauver_cles = true; |
|
| 63 | - } |
|
| 64 | - } |
|
| 65 | - |
|
| 66 | - // login inexistant ou mot de passe vide |
|
| 67 | - if (!$pass or !$row) { |
|
| 68 | - return []; |
|
| 69 | - } |
|
| 70 | - |
|
| 71 | - include_spip('inc/chiffrer'); |
|
| 72 | - $cles = SpipCles::instance(); |
|
| 73 | - $secret = $cles->getSecretAuth(); |
|
| 74 | - |
|
| 75 | - $hash = null; |
|
| 76 | - switch (strlen($row['pass'])) { |
|
| 77 | - // legacy = md5 ou sha256 |
|
| 78 | - case 32: |
|
| 79 | - // tres anciens mots de passe encodes en md5(alea.pass) |
|
| 80 | - $hash = md5($row['alea_actuel'] . $pass); |
|
| 81 | - $methode = 'md5'; |
|
| 82 | - case 64: |
|
| 83 | - if (empty($hash)) { |
|
| 84 | - // anciens mots de passe encodes en sha256(alea.pass) |
|
| 85 | - include_spip('auth/sha256.inc'); |
|
| 86 | - $hash = spip_sha256($row['alea_actuel'] . $pass); |
|
| 87 | - $methode = 'sha256'; |
|
| 88 | - } |
|
| 89 | - if ($row['pass'] === $hash) { |
|
| 90 | - spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG); |
|
| 91 | - // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth |
|
| 92 | - if (!empty($row['backup_cles'])) { |
|
| 93 | - sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 94 | - } |
|
| 95 | - break; |
|
| 96 | - } |
|
| 97 | - |
|
| 98 | - // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long |
|
| 99 | - |
|
| 100 | - case 60: |
|
| 101 | - case 98: |
|
| 102 | - default: |
|
| 103 | - // doit-on restaurer un backup des cles ? |
|
| 104 | - // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass |
|
| 105 | - if ( |
|
| 106 | - !$secret |
|
| 107 | - and $auteur_peut_sauver_cles |
|
| 108 | - and !empty($row['backup_cles']) |
|
| 109 | - ) { |
|
| 110 | - if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) { |
|
| 111 | - spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 112 | - if ($cles->save()) { |
|
| 113 | - $secret = $cles->getSecretAuth(); |
|
| 114 | - } |
|
| 115 | - else { |
|
| 116 | - spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 117 | - // et on echoue car on ne veut pas que la situation reste telle quelle |
|
| 118 | - raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 119 | - } |
|
| 120 | - } |
|
| 121 | - else { |
|
| 122 | - spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR); |
|
| 123 | - sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 124 | - } |
|
| 125 | - } |
|
| 126 | - |
|
| 127 | - if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) { |
|
| 128 | - unset($row); |
|
| 129 | - } |
|
| 130 | - else { |
|
| 131 | - spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG); |
|
| 132 | - } |
|
| 133 | - break; |
|
| 134 | - } |
|
| 135 | - |
|
| 136 | - // Migration depuis ancienne version : si on a pas encore de cle |
|
| 137 | - // ET si c'est le login d'un auteur qui peut sauver la cle |
|
| 138 | - // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php) |
|
| 139 | - // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre |
|
| 140 | - if (!$secret and $auteur_peut_sauver_cles) { |
|
| 141 | - if (auth_spip_initialiser_secret()) { |
|
| 142 | - $secret = $cles->getSecretAuth(); |
|
| 143 | - } |
|
| 144 | - } |
|
| 145 | - |
|
| 146 | - // login/mot de passe incorrect |
|
| 147 | - if (empty($row)) { |
|
| 148 | - return []; |
|
| 149 | - } |
|
| 150 | - |
|
| 151 | - // fait tourner le codage du pass dans la base |
|
| 152 | - // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action() |
|
| 153 | - if (!$phpauth and $secret) { |
|
| 154 | - include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess |
|
| 155 | - $pass_hash_next = Password::hacher($pass, $secret); |
|
| 156 | - if ($pass_hash_next) { |
|
| 157 | - $set = [ |
|
| 158 | - 'alea_actuel' => 'alea_futur', // @deprecated 4.1 |
|
| 159 | - 'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1 |
|
| 160 | - 'pass' => sql_quote($pass_hash_next, $serveur, 'text'), |
|
| 161 | - ]; |
|
| 162 | - |
|
| 163 | - // regenerer un htpass si on a active/desactive le plugin htpasswd |
|
| 164 | - // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo |
|
| 165 | - $htpass = generer_htpass($pass); |
|
| 166 | - if (strlen($htpass) !== strlen($row['htpass'])) { |
|
| 167 | - $set['htpass'] = sql_quote($htpass, $serveur, 'text'); |
|
| 168 | - } |
|
| 169 | - |
|
| 170 | - // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre) |
|
| 171 | - if ($auteur_peut_sauver_cles) { |
|
| 172 | - $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text'); |
|
| 173 | - } |
|
| 174 | - |
|
| 175 | - @sql_update( |
|
| 176 | - 'spip_auteurs', |
|
| 177 | - $set, |
|
| 178 | - 'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote( |
|
| 179 | - $row['pass'], |
|
| 180 | - $serveur, |
|
| 181 | - 'text' |
|
| 182 | - ), |
|
| 183 | - [], |
|
| 184 | - $serveur |
|
| 185 | - ); |
|
| 186 | - |
|
| 187 | - // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd |
|
| 188 | - if (isset($set['htpass'])) { |
|
| 189 | - ecrire_acces(); |
|
| 190 | - } |
|
| 191 | - } |
|
| 192 | - |
|
| 193 | - // En profiter pour verifier la securite de tmp/ |
|
| 194 | - // Si elle ne fonctionne pas a l'installation, prevenir |
|
| 195 | - if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) { |
|
| 196 | - return false; |
|
| 197 | - } |
|
| 198 | - } |
|
| 199 | - |
|
| 200 | - return $row; |
|
| 37 | + // retrouver le login |
|
| 38 | + $login = auth_spip_retrouver_login($login); |
|
| 39 | + // login inconnu, n'allons pas plus loin |
|
| 40 | + if (!$login) { |
|
| 41 | + return []; |
|
| 42 | + } |
|
| 43 | + |
|
| 44 | + $md5pass = ''; |
|
| 45 | + $shapass = $shanext = ''; |
|
| 46 | + $auteur_peut_sauver_cles = false; |
|
| 47 | + |
|
| 48 | + if ($pass) { |
|
| 49 | + $row = sql_fetsel( |
|
| 50 | + '*', |
|
| 51 | + 'spip_auteurs', |
|
| 52 | + 'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'", |
|
| 53 | + '', |
|
| 54 | + '', |
|
| 55 | + '', |
|
| 56 | + '', |
|
| 57 | + $serveur |
|
| 58 | + ); |
|
| 59 | + |
|
| 60 | + // lever un flag si cet auteur peut sauver les cles |
|
| 61 | + if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) { |
|
| 62 | + $auteur_peut_sauver_cles = true; |
|
| 63 | + } |
|
| 64 | + } |
|
| 65 | + |
|
| 66 | + // login inexistant ou mot de passe vide |
|
| 67 | + if (!$pass or !$row) { |
|
| 68 | + return []; |
|
| 69 | + } |
|
| 70 | + |
|
| 71 | + include_spip('inc/chiffrer'); |
|
| 72 | + $cles = SpipCles::instance(); |
|
| 73 | + $secret = $cles->getSecretAuth(); |
|
| 74 | + |
|
| 75 | + $hash = null; |
|
| 76 | + switch (strlen($row['pass'])) { |
|
| 77 | + // legacy = md5 ou sha256 |
|
| 78 | + case 32: |
|
| 79 | + // tres anciens mots de passe encodes en md5(alea.pass) |
|
| 80 | + $hash = md5($row['alea_actuel'] . $pass); |
|
| 81 | + $methode = 'md5'; |
|
| 82 | + case 64: |
|
| 83 | + if (empty($hash)) { |
|
| 84 | + // anciens mots de passe encodes en sha256(alea.pass) |
|
| 85 | + include_spip('auth/sha256.inc'); |
|
| 86 | + $hash = spip_sha256($row['alea_actuel'] . $pass); |
|
| 87 | + $methode = 'sha256'; |
|
| 88 | + } |
|
| 89 | + if ($row['pass'] === $hash) { |
|
| 90 | + spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG); |
|
| 91 | + // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth |
|
| 92 | + if (!empty($row['backup_cles'])) { |
|
| 93 | + sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 94 | + } |
|
| 95 | + break; |
|
| 96 | + } |
|
| 97 | + |
|
| 98 | + // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long |
|
| 99 | + |
|
| 100 | + case 60: |
|
| 101 | + case 98: |
|
| 102 | + default: |
|
| 103 | + // doit-on restaurer un backup des cles ? |
|
| 104 | + // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass |
|
| 105 | + if ( |
|
| 106 | + !$secret |
|
| 107 | + and $auteur_peut_sauver_cles |
|
| 108 | + and !empty($row['backup_cles']) |
|
| 109 | + ) { |
|
| 110 | + if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) { |
|
| 111 | + spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 112 | + if ($cles->save()) { |
|
| 113 | + $secret = $cles->getSecretAuth(); |
|
| 114 | + } |
|
| 115 | + else { |
|
| 116 | + spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 117 | + // et on echoue car on ne veut pas que la situation reste telle quelle |
|
| 118 | + raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 119 | + } |
|
| 120 | + } |
|
| 121 | + else { |
|
| 122 | + spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR); |
|
| 123 | + sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 124 | + } |
|
| 125 | + } |
|
| 126 | + |
|
| 127 | + if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) { |
|
| 128 | + unset($row); |
|
| 129 | + } |
|
| 130 | + else { |
|
| 131 | + spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG); |
|
| 132 | + } |
|
| 133 | + break; |
|
| 134 | + } |
|
| 135 | + |
|
| 136 | + // Migration depuis ancienne version : si on a pas encore de cle |
|
| 137 | + // ET si c'est le login d'un auteur qui peut sauver la cle |
|
| 138 | + // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php) |
|
| 139 | + // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre |
|
| 140 | + if (!$secret and $auteur_peut_sauver_cles) { |
|
| 141 | + if (auth_spip_initialiser_secret()) { |
|
| 142 | + $secret = $cles->getSecretAuth(); |
|
| 143 | + } |
|
| 144 | + } |
|
| 145 | + |
|
| 146 | + // login/mot de passe incorrect |
|
| 147 | + if (empty($row)) { |
|
| 148 | + return []; |
|
| 149 | + } |
|
| 150 | + |
|
| 151 | + // fait tourner le codage du pass dans la base |
|
| 152 | + // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action() |
|
| 153 | + if (!$phpauth and $secret) { |
|
| 154 | + include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess |
|
| 155 | + $pass_hash_next = Password::hacher($pass, $secret); |
|
| 156 | + if ($pass_hash_next) { |
|
| 157 | + $set = [ |
|
| 158 | + 'alea_actuel' => 'alea_futur', // @deprecated 4.1 |
|
| 159 | + 'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1 |
|
| 160 | + 'pass' => sql_quote($pass_hash_next, $serveur, 'text'), |
|
| 161 | + ]; |
|
| 162 | + |
|
| 163 | + // regenerer un htpass si on a active/desactive le plugin htpasswd |
|
| 164 | + // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo |
|
| 165 | + $htpass = generer_htpass($pass); |
|
| 166 | + if (strlen($htpass) !== strlen($row['htpass'])) { |
|
| 167 | + $set['htpass'] = sql_quote($htpass, $serveur, 'text'); |
|
| 168 | + } |
|
| 169 | + |
|
| 170 | + // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre) |
|
| 171 | + if ($auteur_peut_sauver_cles) { |
|
| 172 | + $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text'); |
|
| 173 | + } |
|
| 174 | + |
|
| 175 | + @sql_update( |
|
| 176 | + 'spip_auteurs', |
|
| 177 | + $set, |
|
| 178 | + 'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote( |
|
| 179 | + $row['pass'], |
|
| 180 | + $serveur, |
|
| 181 | + 'text' |
|
| 182 | + ), |
|
| 183 | + [], |
|
| 184 | + $serveur |
|
| 185 | + ); |
|
| 186 | + |
|
| 187 | + // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd |
|
| 188 | + if (isset($set['htpass'])) { |
|
| 189 | + ecrire_acces(); |
|
| 190 | + } |
|
| 191 | + } |
|
| 192 | + |
|
| 193 | + // En profiter pour verifier la securite de tmp/ |
|
| 194 | + // Si elle ne fonctionne pas a l'installation, prevenir |
|
| 195 | + if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) { |
|
| 196 | + return false; |
|
| 197 | + } |
|
| 198 | + } |
|
| 199 | + |
|
| 200 | + return $row; |
|
| 201 | 201 | } |
| 202 | 202 | |
| 203 | 203 | /** |
@@ -212,37 +212,37 @@ discard block |
||
| 212 | 212 | * @return bool |
| 213 | 213 | */ |
| 214 | 214 | function auth_spip_initialiser_secret(bool $force = false): bool { |
| 215 | - include_spip('inc/chiffrer'); |
|
| 216 | - $cles = SpipCles::instance(); |
|
| 217 | - $secret = $cles->getSecretAuth(); |
|
| 218 | - |
|
| 219 | - // on ne fait rien si on a un secret dispo |
|
| 220 | - if ($secret) { |
|
| 221 | - return false; |
|
| 222 | - } |
|
| 223 | - |
|
| 224 | - // si force, on ne verifie pas la presence d'un backup chez un webmestre |
|
| 225 | - if ($force) { |
|
| 226 | - spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 227 | - $secret = $cles->getSecretAuth(true); |
|
| 228 | - return true; |
|
| 229 | - } |
|
| 230 | - |
|
| 231 | - $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''"); |
|
| 232 | - $has_backup = array_column($has_backup, 'id_auteur'); |
|
| 233 | - if (empty($has_backup)) { |
|
| 234 | - spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 235 | - if ($secret = $cles->getSecretAuth(true)) { |
|
| 236 | - return true; |
|
| 237 | - } |
|
| 238 | - spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 239 | - // et on echoue car on ne veut pas que la situation reste telle quelle |
|
| 240 | - raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 241 | - } |
|
| 242 | - else { |
|
| 243 | - spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR); |
|
| 244 | - } |
|
| 245 | - return false; |
|
| 215 | + include_spip('inc/chiffrer'); |
|
| 216 | + $cles = SpipCles::instance(); |
|
| 217 | + $secret = $cles->getSecretAuth(); |
|
| 218 | + |
|
| 219 | + // on ne fait rien si on a un secret dispo |
|
| 220 | + if ($secret) { |
|
| 221 | + return false; |
|
| 222 | + } |
|
| 223 | + |
|
| 224 | + // si force, on ne verifie pas la presence d'un backup chez un webmestre |
|
| 225 | + if ($force) { |
|
| 226 | + spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 227 | + $secret = $cles->getSecretAuth(true); |
|
| 228 | + return true; |
|
| 229 | + } |
|
| 230 | + |
|
| 231 | + $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''"); |
|
| 232 | + $has_backup = array_column($has_backup, 'id_auteur'); |
|
| 233 | + if (empty($has_backup)) { |
|
| 234 | + spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 235 | + if ($secret = $cles->getSecretAuth(true)) { |
|
| 236 | + return true; |
|
| 237 | + } |
|
| 238 | + spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 239 | + // et on echoue car on ne veut pas que la situation reste telle quelle |
|
| 240 | + raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 241 | + } |
|
| 242 | + else { |
|
| 243 | + spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR); |
|
| 244 | + } |
|
| 245 | + return false; |
|
| 246 | 246 | } |
| 247 | 247 | |
| 248 | 248 | /** |
@@ -252,19 +252,19 @@ discard block |
||
| 252 | 252 | * @return array |
| 253 | 253 | */ |
| 254 | 254 | function auth_spip_formulaire_login($flux) { |
| 255 | - // javascript qui gere la securite du login en evitant de faire circuler le pass en clair |
|
| 256 | - $js = file_get_contents(find_in_path('prive/javascript/login.js')); |
|
| 257 | - $flux['data'] .= |
|
| 258 | - '<script type="text/javascript">/*<![CDATA[*/' |
|
| 259 | - . "$js\n" |
|
| 260 | - . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "'," |
|
| 261 | - . "'page_auteur': '" . generer_url_public('informer_auteur') . "'," |
|
| 262 | - . "'informe_auteur_en_cours':false," |
|
| 263 | - . "'attente_informe':0};" |
|
| 264 | - . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});" |
|
| 265 | - . '/*]]>*/</script>'; |
|
| 266 | - |
|
| 267 | - return $flux; |
|
| 255 | + // javascript qui gere la securite du login en evitant de faire circuler le pass en clair |
|
| 256 | + $js = file_get_contents(find_in_path('prive/javascript/login.js')); |
|
| 257 | + $flux['data'] .= |
|
| 258 | + '<script type="text/javascript">/*<![CDATA[*/' |
|
| 259 | + . "$js\n" |
|
| 260 | + . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "'," |
|
| 261 | + . "'page_auteur': '" . generer_url_public('informer_auteur') . "'," |
|
| 262 | + . "'informe_auteur_en_cours':false," |
|
| 263 | + . "'attente_informe':0};" |
|
| 264 | + . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});" |
|
| 265 | + . '/*]]>*/</script>'; |
|
| 266 | + |
|
| 267 | + return $flux; |
|
| 268 | 268 | } |
| 269 | 269 | |
| 270 | 270 | |
@@ -276,11 +276,11 @@ discard block |
||
| 276 | 276 | * toujours true pour un auteur cree dans SPIP |
| 277 | 277 | */ |
| 278 | 278 | function auth_spip_autoriser_modifier_login(string $serveur = ''): bool { |
| 279 | - // les fonctions d'ecriture sur base distante sont encore incompletes |
|
| 280 | - if (strlen($serveur)) { |
|
| 281 | - return false; |
|
| 282 | - } |
|
| 283 | - return true; |
|
| 279 | + // les fonctions d'ecriture sur base distante sont encore incompletes |
|
| 280 | + if (strlen($serveur)) { |
|
| 281 | + return false; |
|
| 282 | + } |
|
| 283 | + return true; |
|
| 284 | 284 | } |
| 285 | 285 | |
| 286 | 286 | /** |
@@ -294,25 +294,25 @@ discard block |
||
| 294 | 294 | * message d'erreur si login non valide, chaine vide sinon |
| 295 | 295 | */ |
| 296 | 296 | function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') { |
| 297 | - // login et mot de passe |
|
| 298 | - if (strlen($new_login)) { |
|
| 299 | - if (strlen($new_login) < _LOGIN_TROP_COURT) { |
|
| 300 | - return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]); |
|
| 301 | - } else { |
|
| 302 | - $n = sql_countsel( |
|
| 303 | - 'spip_auteurs', |
|
| 304 | - 'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'", |
|
| 305 | - '', |
|
| 306 | - '', |
|
| 307 | - $serveur |
|
| 308 | - ); |
|
| 309 | - if ($n) { |
|
| 310 | - return _T('info_login_existant'); |
|
| 311 | - } |
|
| 312 | - } |
|
| 313 | - } |
|
| 314 | - |
|
| 315 | - return ''; |
|
| 297 | + // login et mot de passe |
|
| 298 | + if (strlen($new_login)) { |
|
| 299 | + if (strlen($new_login) < _LOGIN_TROP_COURT) { |
|
| 300 | + return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]); |
|
| 301 | + } else { |
|
| 302 | + $n = sql_countsel( |
|
| 303 | + 'spip_auteurs', |
|
| 304 | + 'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'", |
|
| 305 | + '', |
|
| 306 | + '', |
|
| 307 | + $serveur |
|
| 308 | + ); |
|
| 309 | + if ($n) { |
|
| 310 | + return _T('info_login_existant'); |
|
| 311 | + } |
|
| 312 | + } |
|
| 313 | + } |
|
| 314 | + |
|
| 315 | + return ''; |
|
| 316 | 316 | } |
| 317 | 317 | |
| 318 | 318 | /** |
@@ -324,41 +324,41 @@ discard block |
||
| 324 | 324 | * @return bool |
| 325 | 325 | */ |
| 326 | 326 | function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') { |
| 327 | - if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') { |
|
| 328 | - return false; |
|
| 329 | - } |
|
| 330 | - if ( |
|
| 331 | - !$id_auteur = intval($id_auteur) |
|
| 332 | - or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 333 | - ) { |
|
| 334 | - return false; |
|
| 335 | - } |
|
| 336 | - if ($new_login == $auteur['login']) { |
|
| 337 | - return true; |
|
| 338 | - } // on a rien fait mais c'est bon ! |
|
| 339 | - |
|
| 340 | - include_spip('action/editer_auteur'); |
|
| 341 | - |
|
| 342 | - // vider le login des auteurs a la poubelle qui avaient ce meme login |
|
| 343 | - if (strlen($new_login)) { |
|
| 344 | - $anciens = sql_allfetsel( |
|
| 345 | - 'id_auteur', |
|
| 346 | - 'spip_auteurs', |
|
| 347 | - 'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'", |
|
| 348 | - '', |
|
| 349 | - '', |
|
| 350 | - '', |
|
| 351 | - '', |
|
| 352 | - $serveur |
|
| 353 | - ); |
|
| 354 | - while ($row = array_pop($anciens)) { |
|
| 355 | - auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur |
|
| 356 | - } |
|
| 357 | - } |
|
| 358 | - |
|
| 359 | - auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur |
|
| 360 | - |
|
| 361 | - return true; |
|
| 327 | + if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') { |
|
| 328 | + return false; |
|
| 329 | + } |
|
| 330 | + if ( |
|
| 331 | + !$id_auteur = intval($id_auteur) |
|
| 332 | + or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 333 | + ) { |
|
| 334 | + return false; |
|
| 335 | + } |
|
| 336 | + if ($new_login == $auteur['login']) { |
|
| 337 | + return true; |
|
| 338 | + } // on a rien fait mais c'est bon ! |
|
| 339 | + |
|
| 340 | + include_spip('action/editer_auteur'); |
|
| 341 | + |
|
| 342 | + // vider le login des auteurs a la poubelle qui avaient ce meme login |
|
| 343 | + if (strlen($new_login)) { |
|
| 344 | + $anciens = sql_allfetsel( |
|
| 345 | + 'id_auteur', |
|
| 346 | + 'spip_auteurs', |
|
| 347 | + 'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'", |
|
| 348 | + '', |
|
| 349 | + '', |
|
| 350 | + '', |
|
| 351 | + '', |
|
| 352 | + $serveur |
|
| 353 | + ); |
|
| 354 | + while ($row = array_pop($anciens)) { |
|
| 355 | + auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur |
|
| 356 | + } |
|
| 357 | + } |
|
| 358 | + |
|
| 359 | + auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur |
|
| 360 | + |
|
| 361 | + return true; |
|
| 362 | 362 | } |
| 363 | 363 | |
| 364 | 364 | /** |
@@ -370,44 +370,44 @@ discard block |
||
| 370 | 370 | * @return string |
| 371 | 371 | */ |
| 372 | 372 | function auth_spip_retrouver_login($login, $serveur = '') { |
| 373 | - if (!strlen($login)) { |
|
| 374 | - return null; |
|
| 375 | - } // pas la peine de requeter |
|
| 376 | - $l = sql_quote($login, $serveur, 'text'); |
|
| 377 | - if ( |
|
| 378 | - $r = sql_getfetsel( |
|
| 379 | - 'login', |
|
| 380 | - 'spip_auteurs', |
|
| 381 | - "statut<>'5poubelle'" . |
|
| 382 | - ' AND (length(pass)>0)' . |
|
| 383 | - " AND (login=$l)", |
|
| 384 | - '', |
|
| 385 | - '', |
|
| 386 | - '', |
|
| 387 | - '', |
|
| 388 | - $serveur |
|
| 389 | - ) |
|
| 390 | - ) { |
|
| 391 | - return $r; |
|
| 392 | - } |
|
| 393 | - // Si pas d'auteur avec ce login |
|
| 394 | - // regarder s'il a saisi son nom ou son mail. |
|
| 395 | - // Ne pas fusionner avec la requete precedente |
|
| 396 | - // car un nom peut etre homonyme d'un autre login |
|
| 397 | - else { |
|
| 398 | - return sql_getfetsel( |
|
| 399 | - 'login', |
|
| 400 | - 'spip_auteurs', |
|
| 401 | - "statut<>'5poubelle'" . |
|
| 402 | - ' AND (length(pass)>0)' . |
|
| 403 | - " AND (login<>'' AND (nom=$l OR email=$l))", |
|
| 404 | - '', |
|
| 405 | - '', |
|
| 406 | - '', |
|
| 407 | - '', |
|
| 408 | - $serveur |
|
| 409 | - ); |
|
| 410 | - } |
|
| 373 | + if (!strlen($login)) { |
|
| 374 | + return null; |
|
| 375 | + } // pas la peine de requeter |
|
| 376 | + $l = sql_quote($login, $serveur, 'text'); |
|
| 377 | + if ( |
|
| 378 | + $r = sql_getfetsel( |
|
| 379 | + 'login', |
|
| 380 | + 'spip_auteurs', |
|
| 381 | + "statut<>'5poubelle'" . |
|
| 382 | + ' AND (length(pass)>0)' . |
|
| 383 | + " AND (login=$l)", |
|
| 384 | + '', |
|
| 385 | + '', |
|
| 386 | + '', |
|
| 387 | + '', |
|
| 388 | + $serveur |
|
| 389 | + ) |
|
| 390 | + ) { |
|
| 391 | + return $r; |
|
| 392 | + } |
|
| 393 | + // Si pas d'auteur avec ce login |
|
| 394 | + // regarder s'il a saisi son nom ou son mail. |
|
| 395 | + // Ne pas fusionner avec la requete precedente |
|
| 396 | + // car un nom peut etre homonyme d'un autre login |
|
| 397 | + else { |
|
| 398 | + return sql_getfetsel( |
|
| 399 | + 'login', |
|
| 400 | + 'spip_auteurs', |
|
| 401 | + "statut<>'5poubelle'" . |
|
| 402 | + ' AND (length(pass)>0)' . |
|
| 403 | + " AND (login<>'' AND (nom=$l OR email=$l))", |
|
| 404 | + '', |
|
| 405 | + '', |
|
| 406 | + '', |
|
| 407 | + '', |
|
| 408 | + $serveur |
|
| 409 | + ); |
|
| 410 | + } |
|
| 411 | 411 | } |
| 412 | 412 | |
| 413 | 413 | /** |
@@ -418,11 +418,11 @@ discard block |
||
| 418 | 418 | * toujours true pour un auteur cree dans SPIP |
| 419 | 419 | */ |
| 420 | 420 | function auth_spip_autoriser_modifier_pass(string $serveur = ''): bool { |
| 421 | - // les fonctions d'ecriture sur base distante sont encore incompletes |
|
| 422 | - if (strlen($serveur)) { |
|
| 423 | - return false; |
|
| 424 | - } |
|
| 425 | - return true; |
|
| 421 | + // les fonctions d'ecriture sur base distante sont encore incompletes |
|
| 422 | + if (strlen($serveur)) { |
|
| 423 | + return false; |
|
| 424 | + } |
|
| 425 | + return true; |
|
| 426 | 426 | } |
| 427 | 427 | |
| 428 | 428 | |
@@ -443,12 +443,12 @@ discard block |
||
| 443 | 443 | * message d'erreur si login non valide, chaine vide sinon |
| 444 | 444 | */ |
| 445 | 445 | function auth_spip_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = '') { |
| 446 | - // login et mot de passe |
|
| 447 | - if (strlen($new_pass) < _PASS_LONGUEUR_MINI) { |
|
| 448 | - return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]); |
|
| 449 | - } |
|
| 446 | + // login et mot de passe |
|
| 447 | + if (strlen($new_pass) < _PASS_LONGUEUR_MINI) { |
|
| 448 | + return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]); |
|
| 449 | + } |
|
| 450 | 450 | |
| 451 | - return ''; |
|
| 451 | + return ''; |
|
| 452 | 452 | } |
| 453 | 453 | |
| 454 | 454 | /** |
@@ -462,48 +462,48 @@ discard block |
||
| 462 | 462 | * @return bool |
| 463 | 463 | */ |
| 464 | 464 | function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') { |
| 465 | - if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { |
|
| 466 | - return false; |
|
| 467 | - } |
|
| 468 | - |
|
| 469 | - if ( |
|
| 470 | - !$id_auteur = intval($id_auteur) |
|
| 471 | - or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 472 | - ) { |
|
| 473 | - return false; |
|
| 474 | - } |
|
| 475 | - |
|
| 476 | - include_spip('inc/chiffrer'); |
|
| 477 | - $cles = SpipCles::instance(); |
|
| 478 | - $secret = $cles->getSecretAuth(); |
|
| 479 | - if (!$secret) { |
|
| 480 | - if (auth_spip_initialiser_secret()) { |
|
| 481 | - $secret = $cles->getSecretAuth(); |
|
| 482 | - } |
|
| 483 | - else { |
|
| 484 | - return false; |
|
| 485 | - } |
|
| 486 | - } |
|
| 487 | - |
|
| 488 | - |
|
| 489 | - include_spip('inc/acces'); |
|
| 490 | - $set = [ |
|
| 491 | - 'pass' => Password::hacher($new_pass, $secret), |
|
| 492 | - 'htpass' => generer_htpass($new_pass), |
|
| 493 | - 'alea_actuel' => creer_uniqid(), // @deprecated 4.1 |
|
| 494 | - 'alea_futur' => creer_uniqid(), // @deprecated 4.1 |
|
| 495 | - 'low_sec' => '', |
|
| 496 | - ]; |
|
| 497 | - |
|
| 498 | - // si c'est un webmestre, on met a jour son backup des cles |
|
| 499 | - if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') { |
|
| 500 | - $set['backup_cles'] = $cles->backup($new_pass); |
|
| 501 | - } |
|
| 502 | - |
|
| 503 | - include_spip('action/editer_auteur'); |
|
| 504 | - auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur |
|
| 505 | - |
|
| 506 | - return true; // on a bien modifie le pass |
|
| 465 | + if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { |
|
| 466 | + return false; |
|
| 467 | + } |
|
| 468 | + |
|
| 469 | + if ( |
|
| 470 | + !$id_auteur = intval($id_auteur) |
|
| 471 | + or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 472 | + ) { |
|
| 473 | + return false; |
|
| 474 | + } |
|
| 475 | + |
|
| 476 | + include_spip('inc/chiffrer'); |
|
| 477 | + $cles = SpipCles::instance(); |
|
| 478 | + $secret = $cles->getSecretAuth(); |
|
| 479 | + if (!$secret) { |
|
| 480 | + if (auth_spip_initialiser_secret()) { |
|
| 481 | + $secret = $cles->getSecretAuth(); |
|
| 482 | + } |
|
| 483 | + else { |
|
| 484 | + return false; |
|
| 485 | + } |
|
| 486 | + } |
|
| 487 | + |
|
| 488 | + |
|
| 489 | + include_spip('inc/acces'); |
|
| 490 | + $set = [ |
|
| 491 | + 'pass' => Password::hacher($new_pass, $secret), |
|
| 492 | + 'htpass' => generer_htpass($new_pass), |
|
| 493 | + 'alea_actuel' => creer_uniqid(), // @deprecated 4.1 |
|
| 494 | + 'alea_futur' => creer_uniqid(), // @deprecated 4.1 |
|
| 495 | + 'low_sec' => '', |
|
| 496 | + ]; |
|
| 497 | + |
|
| 498 | + // si c'est un webmestre, on met a jour son backup des cles |
|
| 499 | + if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') { |
|
| 500 | + $set['backup_cles'] = $cles->backup($new_pass); |
|
| 501 | + } |
|
| 502 | + |
|
| 503 | + include_spip('action/editer_auteur'); |
|
| 504 | + auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur |
|
| 505 | + |
|
| 506 | + return true; // on a bien modifie le pass |
|
| 507 | 507 | } |
| 508 | 508 | |
| 509 | 509 | /** |
@@ -517,58 +517,58 @@ discard block |
||
| 517 | 517 | * @return void |
| 518 | 518 | */ |
| 519 | 519 | function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void { |
| 520 | - // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess |
|
| 521 | - if (strlen($serveur)) { |
|
| 522 | - return; |
|
| 523 | - } |
|
| 524 | - // si un login, pass ou statut a ete modifie |
|
| 525 | - // regenerer les fichier htpass |
|
| 526 | - if ( |
|
| 527 | - isset($champs['login']) |
|
| 528 | - or isset($champs['pass']) |
|
| 529 | - or isset($champs['statut']) |
|
| 530 | - or (isset($options['all']) and $options['all']) |
|
| 531 | - ) { |
|
| 532 | - $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME; |
|
| 533 | - $htpasswd = _DIR_TMP . _AUTH_USER_FILE; |
|
| 534 | - |
|
| 535 | - // Cette variable de configuration peut etre posee par un plugin |
|
| 536 | - // par exemple acces_restreint ; |
|
| 537 | - // si .htaccess existe, outrepasser spip_meta |
|
| 538 | - if ( |
|
| 539 | - (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui')) |
|
| 540 | - and !@file_exists($htaccess) |
|
| 541 | - ) { |
|
| 542 | - spip_unlink($htpasswd); |
|
| 543 | - spip_unlink($htpasswd . '-admin'); |
|
| 544 | - |
|
| 545 | - return; |
|
| 546 | - } |
|
| 547 | - |
|
| 548 | - # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre |
|
| 549 | - # de devenir redacteur le cas echeant (auth http)... a nettoyer |
|
| 550 | - // attention, il faut au prealable se connecter a la base (necessaire car utilise par install) |
|
| 551 | - |
|
| 552 | - $p1 = ''; // login:htpass pour tous |
|
| 553 | - $p2 = ''; // login:htpass pour les admins |
|
| 554 | - $s = sql_select( |
|
| 555 | - 'login, htpass, statut', |
|
| 556 | - 'spip_auteurs', |
|
| 557 | - sql_in('statut', ['1comite', '0minirezo', 'nouveau']) |
|
| 558 | - ); |
|
| 559 | - while ($t = sql_fetch($s)) { |
|
| 560 | - if (strlen($t['login']) and strlen($t['htpass'])) { |
|
| 561 | - $p1 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 562 | - if ($t['statut'] == '0minirezo') { |
|
| 563 | - $p2 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 564 | - } |
|
| 565 | - } |
|
| 566 | - } |
|
| 567 | - sql_free($s); |
|
| 568 | - if ($p1) { |
|
| 569 | - ecrire_fichier($htpasswd, $p1); |
|
| 570 | - ecrire_fichier($htpasswd . '-admin', $p2); |
|
| 571 | - spip_log("Ecriture de $htpasswd et $htpasswd-admin"); |
|
| 572 | - } |
|
| 573 | - } |
|
| 520 | + // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess |
|
| 521 | + if (strlen($serveur)) { |
|
| 522 | + return; |
|
| 523 | + } |
|
| 524 | + // si un login, pass ou statut a ete modifie |
|
| 525 | + // regenerer les fichier htpass |
|
| 526 | + if ( |
|
| 527 | + isset($champs['login']) |
|
| 528 | + or isset($champs['pass']) |
|
| 529 | + or isset($champs['statut']) |
|
| 530 | + or (isset($options['all']) and $options['all']) |
|
| 531 | + ) { |
|
| 532 | + $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME; |
|
| 533 | + $htpasswd = _DIR_TMP . _AUTH_USER_FILE; |
|
| 534 | + |
|
| 535 | + // Cette variable de configuration peut etre posee par un plugin |
|
| 536 | + // par exemple acces_restreint ; |
|
| 537 | + // si .htaccess existe, outrepasser spip_meta |
|
| 538 | + if ( |
|
| 539 | + (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui')) |
|
| 540 | + and !@file_exists($htaccess) |
|
| 541 | + ) { |
|
| 542 | + spip_unlink($htpasswd); |
|
| 543 | + spip_unlink($htpasswd . '-admin'); |
|
| 544 | + |
|
| 545 | + return; |
|
| 546 | + } |
|
| 547 | + |
|
| 548 | + # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre |
|
| 549 | + # de devenir redacteur le cas echeant (auth http)... a nettoyer |
|
| 550 | + // attention, il faut au prealable se connecter a la base (necessaire car utilise par install) |
|
| 551 | + |
|
| 552 | + $p1 = ''; // login:htpass pour tous |
|
| 553 | + $p2 = ''; // login:htpass pour les admins |
|
| 554 | + $s = sql_select( |
|
| 555 | + 'login, htpass, statut', |
|
| 556 | + 'spip_auteurs', |
|
| 557 | + sql_in('statut', ['1comite', '0minirezo', 'nouveau']) |
|
| 558 | + ); |
|
| 559 | + while ($t = sql_fetch($s)) { |
|
| 560 | + if (strlen($t['login']) and strlen($t['htpass'])) { |
|
| 561 | + $p1 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 562 | + if ($t['statut'] == '0minirezo') { |
|
| 563 | + $p2 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 564 | + } |
|
| 565 | + } |
|
| 566 | + } |
|
| 567 | + sql_free($s); |
|
| 568 | + if ($p1) { |
|
| 569 | + ecrire_fichier($htpasswd, $p1); |
|
| 570 | + ecrire_fichier($htpasswd . '-admin', $p2); |
|
| 571 | + spip_log("Ecriture de $htpasswd et $htpasswd-admin"); |
|
| 572 | + } |
|
| 573 | + } |
|
| 574 | 574 | } |
@@ -49,7 +49,7 @@ discard block |
||
| 49 | 49 | $row = sql_fetsel( |
| 50 | 50 | '*', |
| 51 | 51 | 'spip_auteurs', |
| 52 | - 'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'", |
|
| 52 | + 'login='.sql_quote($login, $serveur, 'text')." AND statut<>'5poubelle'", |
|
| 53 | 53 | '', |
| 54 | 54 | '', |
| 55 | 55 | '', |
@@ -77,20 +77,20 @@ discard block |
||
| 77 | 77 | // legacy = md5 ou sha256 |
| 78 | 78 | case 32: |
| 79 | 79 | // tres anciens mots de passe encodes en md5(alea.pass) |
| 80 | - $hash = md5($row['alea_actuel'] . $pass); |
|
| 80 | + $hash = md5($row['alea_actuel'].$pass); |
|
| 81 | 81 | $methode = 'md5'; |
| 82 | 82 | case 64: |
| 83 | 83 | if (empty($hash)) { |
| 84 | 84 | // anciens mots de passe encodes en sha256(alea.pass) |
| 85 | 85 | include_spip('auth/sha256.inc'); |
| 86 | - $hash = spip_sha256($row['alea_actuel'] . $pass); |
|
| 86 | + $hash = spip_sha256($row['alea_actuel'].$pass); |
|
| 87 | 87 | $methode = 'sha256'; |
| 88 | 88 | } |
| 89 | 89 | if ($row['pass'] === $hash) { |
| 90 | - spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG); |
|
| 90 | + spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via $methode", 'auth'._LOG_DEBUG); |
|
| 91 | 91 | // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth |
| 92 | 92 | if (!empty($row['backup_cles'])) { |
| 93 | - sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 93 | + sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur='.intval($row['id_auteur'])); |
|
| 94 | 94 | } |
| 95 | 95 | break; |
| 96 | 96 | } |
@@ -108,19 +108,19 @@ discard block |
||
| 108 | 108 | and !empty($row['backup_cles']) |
| 109 | 109 | ) { |
| 110 | 110 | if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) { |
| 111 | - spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 111 | + spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #'.$row['id_auteur'], 'auth'._LOG_INFO_IMPORTANTE); |
|
| 112 | 112 | if ($cles->save()) { |
| 113 | 113 | $secret = $cles->getSecretAuth(); |
| 114 | 114 | } |
| 115 | 115 | else { |
| 116 | - spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 116 | + spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth'._LOG_ERREUR); |
|
| 117 | 117 | // et on echoue car on ne veut pas que la situation reste telle quelle |
| 118 | - raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 118 | + raler_fichier(_DIR_ETC.'cles.php'); |
|
| 119 | 119 | } |
| 120 | 120 | } |
| 121 | 121 | else { |
| 122 | - spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR); |
|
| 123 | - sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 122 | + spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #'.$row['id_auteur']." n'est pas valide", 'auth'._LOG_ERREUR); |
|
| 123 | + sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur='.intval($row['id_auteur'])); |
|
| 124 | 124 | } |
| 125 | 125 | } |
| 126 | 126 | |
@@ -128,7 +128,7 @@ discard block |
||
| 128 | 128 | unset($row); |
| 129 | 129 | } |
| 130 | 130 | else { |
| 131 | - spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG); |
|
| 131 | + spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via Password::verifier", 'auth'._LOG_DEBUG); |
|
| 132 | 132 | } |
| 133 | 133 | break; |
| 134 | 134 | } |
@@ -175,7 +175,7 @@ discard block |
||
| 175 | 175 | @sql_update( |
| 176 | 176 | 'spip_auteurs', |
| 177 | 177 | $set, |
| 178 | - 'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote( |
|
| 178 | + 'id_auteur='.intval($row['id_auteur']).' AND pass='.sql_quote( |
|
| 179 | 179 | $row['pass'], |
| 180 | 180 | $serveur, |
| 181 | 181 | 'text' |
@@ -223,24 +223,24 @@ discard block |
||
| 223 | 223 | |
| 224 | 224 | // si force, on ne verifie pas la presence d'un backup chez un webmestre |
| 225 | 225 | if ($force) { |
| 226 | - spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 226 | + spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth'._LOG_INFO_IMPORTANTE); |
|
| 227 | 227 | $secret = $cles->getSecretAuth(true); |
| 228 | 228 | return true; |
| 229 | 229 | } |
| 230 | 230 | |
| 231 | - $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''"); |
|
| 231 | + $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut='.sql_quote('0minirezo').' AND webmestre='.sql_quote('oui')." AND backup_cles!=''"); |
|
| 232 | 232 | $has_backup = array_column($has_backup, 'id_auteur'); |
| 233 | 233 | if (empty($has_backup)) { |
| 234 | - spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 234 | + spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth'._LOG_INFO_IMPORTANTE); |
|
| 235 | 235 | if ($secret = $cles->getSecretAuth(true)) { |
| 236 | 236 | return true; |
| 237 | 237 | } |
| 238 | - spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 238 | + spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth'._LOG_ERREUR); |
|
| 239 | 239 | // et on echoue car on ne veut pas que la situation reste telle quelle |
| 240 | - raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 240 | + raler_fichier(_DIR_ETC.'cles.php'); |
|
| 241 | 241 | } |
| 242 | 242 | else { |
| 243 | - spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR); |
|
| 243 | + spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #'.implode(', #', $has_backup).' doit se connecter pour restaurer son backup des cles', 'auth'._LOG_ERREUR); |
|
| 244 | 244 | } |
| 245 | 245 | return false; |
| 246 | 246 | } |
@@ -257,8 +257,8 @@ discard block |
||
| 257 | 257 | $flux['data'] .= |
| 258 | 258 | '<script type="text/javascript">/*<![CDATA[*/' |
| 259 | 259 | . "$js\n" |
| 260 | - . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "'," |
|
| 261 | - . "'page_auteur': '" . generer_url_public('informer_auteur') . "'," |
|
| 260 | + . "var login_info={'login':'".$flux['args']['contexte']['var_login']."'," |
|
| 261 | + . "'page_auteur': '".generer_url_public('informer_auteur')."'," |
|
| 262 | 262 | . "'informe_auteur_en_cours':false," |
| 263 | 263 | . "'attente_informe':0};" |
| 264 | 264 | . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});" |
@@ -301,7 +301,7 @@ discard block |
||
| 301 | 301 | } else { |
| 302 | 302 | $n = sql_countsel( |
| 303 | 303 | 'spip_auteurs', |
| 304 | - 'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'", |
|
| 304 | + 'login='.sql_quote($new_login).' AND id_auteur!='.intval($id_auteur)." AND statut!='5poubelle'", |
|
| 305 | 305 | '', |
| 306 | 306 | '', |
| 307 | 307 | $serveur |
@@ -329,7 +329,7 @@ discard block |
||
| 329 | 329 | } |
| 330 | 330 | if ( |
| 331 | 331 | !$id_auteur = intval($id_auteur) |
| 332 | - or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 332 | + or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur='.intval($id_auteur), '', '', '', '', $serveur) |
|
| 333 | 333 | ) { |
| 334 | 334 | return false; |
| 335 | 335 | } |
@@ -344,7 +344,7 @@ discard block |
||
| 344 | 344 | $anciens = sql_allfetsel( |
| 345 | 345 | 'id_auteur', |
| 346 | 346 | 'spip_auteurs', |
| 347 | - 'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'", |
|
| 347 | + 'login='.sql_quote($new_login, $serveur, 'text')." AND statut='5poubelle'", |
|
| 348 | 348 | '', |
| 349 | 349 | '', |
| 350 | 350 | '', |
@@ -378,8 +378,8 @@ discard block |
||
| 378 | 378 | $r = sql_getfetsel( |
| 379 | 379 | 'login', |
| 380 | 380 | 'spip_auteurs', |
| 381 | - "statut<>'5poubelle'" . |
|
| 382 | - ' AND (length(pass)>0)' . |
|
| 381 | + "statut<>'5poubelle'". |
|
| 382 | + ' AND (length(pass)>0)'. |
|
| 383 | 383 | " AND (login=$l)", |
| 384 | 384 | '', |
| 385 | 385 | '', |
@@ -398,8 +398,8 @@ discard block |
||
| 398 | 398 | return sql_getfetsel( |
| 399 | 399 | 'login', |
| 400 | 400 | 'spip_auteurs', |
| 401 | - "statut<>'5poubelle'" . |
|
| 402 | - ' AND (length(pass)>0)' . |
|
| 401 | + "statut<>'5poubelle'". |
|
| 402 | + ' AND (length(pass)>0)'. |
|
| 403 | 403 | " AND (login<>'' AND (nom=$l OR email=$l))", |
| 404 | 404 | '', |
| 405 | 405 | '', |
@@ -468,7 +468,7 @@ discard block |
||
| 468 | 468 | |
| 469 | 469 | if ( |
| 470 | 470 | !$id_auteur = intval($id_auteur) |
| 471 | - or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 471 | + or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur='.intval($id_auteur), '', '', '', '', $serveur) |
|
| 472 | 472 | ) { |
| 473 | 473 | return false; |
| 474 | 474 | } |
@@ -529,8 +529,8 @@ discard block |
||
| 529 | 529 | or isset($champs['statut']) |
| 530 | 530 | or (isset($options['all']) and $options['all']) |
| 531 | 531 | ) { |
| 532 | - $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME; |
|
| 533 | - $htpasswd = _DIR_TMP . _AUTH_USER_FILE; |
|
| 532 | + $htaccess = _DIR_RESTREINT._ACCESS_FILE_NAME; |
|
| 533 | + $htpasswd = _DIR_TMP._AUTH_USER_FILE; |
|
| 534 | 534 | |
| 535 | 535 | // Cette variable de configuration peut etre posee par un plugin |
| 536 | 536 | // par exemple acces_restreint ; |
@@ -540,7 +540,7 @@ discard block |
||
| 540 | 540 | and !@file_exists($htaccess) |
| 541 | 541 | ) { |
| 542 | 542 | spip_unlink($htpasswd); |
| 543 | - spip_unlink($htpasswd . '-admin'); |
|
| 543 | + spip_unlink($htpasswd.'-admin'); |
|
| 544 | 544 | |
| 545 | 545 | return; |
| 546 | 546 | } |
@@ -558,16 +558,16 @@ discard block |
||
| 558 | 558 | ); |
| 559 | 559 | while ($t = sql_fetch($s)) { |
| 560 | 560 | if (strlen($t['login']) and strlen($t['htpass'])) { |
| 561 | - $p1 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 561 | + $p1 .= $t['login'].':'.$t['htpass']."\n"; |
|
| 562 | 562 | if ($t['statut'] == '0minirezo') { |
| 563 | - $p2 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 563 | + $p2 .= $t['login'].':'.$t['htpass']."\n"; |
|
| 564 | 564 | } |
| 565 | 565 | } |
| 566 | 566 | } |
| 567 | 567 | sql_free($s); |
| 568 | 568 | if ($p1) { |
| 569 | 569 | ecrire_fichier($htpasswd, $p1); |
| 570 | - ecrire_fichier($htpasswd . '-admin', $p2); |
|
| 570 | + ecrire_fichier($htpasswd.'-admin', $p2); |
|
| 571 | 571 | spip_log("Ecriture de $htpasswd et $htpasswd-admin"); |
| 572 | 572 | } |
| 573 | 573 | } |
@@ -111,14 +111,12 @@ discard block |
||
| 111 | 111 | spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE); |
| 112 | 112 | if ($cles->save()) { |
| 113 | 113 | $secret = $cles->getSecretAuth(); |
| 114 | - } |
|
| 115 | - else { |
|
| 114 | + } else { |
|
| 116 | 115 | spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
| 117 | 116 | // et on echoue car on ne veut pas que la situation reste telle quelle |
| 118 | 117 | raler_fichier(_DIR_ETC . 'cles.php'); |
| 119 | 118 | } |
| 120 | - } |
|
| 121 | - else { |
|
| 119 | + } else { |
|
| 122 | 120 | spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR); |
| 123 | 121 | sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
| 124 | 122 | } |
@@ -126,8 +124,7 @@ discard block |
||
| 126 | 124 | |
| 127 | 125 | if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) { |
| 128 | 126 | unset($row); |
| 129 | - } |
|
| 130 | - else { |
|
| 127 | + } else { |
|
| 131 | 128 | spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG); |
| 132 | 129 | } |
| 133 | 130 | break; |
@@ -238,8 +235,7 @@ discard block |
||
| 238 | 235 | spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
| 239 | 236 | // et on echoue car on ne veut pas que la situation reste telle quelle |
| 240 | 237 | raler_fichier(_DIR_ETC . 'cles.php'); |
| 241 | - } |
|
| 242 | - else { |
|
| 238 | + } else { |
|
| 243 | 239 | spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR); |
| 244 | 240 | } |
| 245 | 241 | return false; |
@@ -479,8 +475,7 @@ discard block |
||
| 479 | 475 | if (!$secret) { |
| 480 | 476 | if (auth_spip_initialiser_secret()) { |
| 481 | 477 | $secret = $cles->getSecretAuth(); |
| 482 | - } |
|
| 483 | - else { |
|
| 478 | + } else { |
|
| 484 | 479 | return false; |
| 485 | 480 | } |
| 486 | 481 | } |
@@ -11,77 +11,77 @@ |
||
| 11 | 11 | \***************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 14 | - return; |
|
| 14 | + return; |
|
| 15 | 15 | } |
| 16 | 16 | |
| 17 | 17 | # Les information d'une rubrique selectionnee dans le mini navigateur |
| 18 | 18 | |
| 19 | 19 | function inc_informer_dist($id, $col, $exclus, $rac, $type, $do = 'aff') { |
| 20 | - include_spip('inc/texte'); |
|
| 21 | - $titre = $descriptif = ''; |
|
| 22 | - if ($type === 'rubrique') { |
|
| 23 | - $row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = ' . intval($id)); |
|
| 24 | - if ($row) { |
|
| 25 | - $titre = typo($row['titre']); |
|
| 26 | - $descriptif = propre($row['descriptif']); |
|
| 27 | - } else { |
|
| 28 | - $titre = _T('info_racine_site'); |
|
| 29 | - } |
|
| 30 | - } |
|
| 20 | + include_spip('inc/texte'); |
|
| 21 | + $titre = $descriptif = ''; |
|
| 22 | + if ($type === 'rubrique') { |
|
| 23 | + $row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = ' . intval($id)); |
|
| 24 | + if ($row) { |
|
| 25 | + $titre = typo($row['titre']); |
|
| 26 | + $descriptif = propre($row['descriptif']); |
|
| 27 | + } else { |
|
| 28 | + $titre = _T('info_racine_site'); |
|
| 29 | + } |
|
| 30 | + } |
|
| 31 | 31 | |
| 32 | - $res = ''; |
|
| 33 | - if ( |
|
| 34 | - $type === 'rubrique' |
|
| 35 | - and intval($GLOBALS['visiteur_session']['prefs']['display'] ?? 0) !== 1 |
|
| 36 | - and isset($GLOBALS['meta']['image_process']) |
|
| 37 | - ) { |
|
| 38 | - if ($GLOBALS['meta']['image_process'] !== 'non') { |
|
| 39 | - $chercher_logo = charger_fonction('chercher_logo', 'inc'); |
|
| 40 | - if ($res = $chercher_logo($id, 'id_rubrique', 'on')) { |
|
| 41 | - [$fid, $dir, $nom, $format] = $res; |
|
| 42 | - include_spip('inc/filtres_images_mini'); |
|
| 43 | - $res = image_reduire("<img src='$fid' alt='' />", 100, 48); |
|
| 44 | - if ($res) { |
|
| 45 | - $res = "<div class='informer__media' style='float: " . $GLOBALS['spip_lang_right'] . '; margin-' . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>"; |
|
| 46 | - } |
|
| 47 | - } |
|
| 48 | - } |
|
| 49 | - } |
|
| 32 | + $res = ''; |
|
| 33 | + if ( |
|
| 34 | + $type === 'rubrique' |
|
| 35 | + and intval($GLOBALS['visiteur_session']['prefs']['display'] ?? 0) !== 1 |
|
| 36 | + and isset($GLOBALS['meta']['image_process']) |
|
| 37 | + ) { |
|
| 38 | + if ($GLOBALS['meta']['image_process'] !== 'non') { |
|
| 39 | + $chercher_logo = charger_fonction('chercher_logo', 'inc'); |
|
| 40 | + if ($res = $chercher_logo($id, 'id_rubrique', 'on')) { |
|
| 41 | + [$fid, $dir, $nom, $format] = $res; |
|
| 42 | + include_spip('inc/filtres_images_mini'); |
|
| 43 | + $res = image_reduire("<img src='$fid' alt='' />", 100, 48); |
|
| 44 | + if ($res) { |
|
| 45 | + $res = "<div class='informer__media' style='float: " . $GLOBALS['spip_lang_right'] . '; margin-' . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>"; |
|
| 46 | + } |
|
| 47 | + } |
|
| 48 | + } |
|
| 49 | + } |
|
| 50 | 50 | |
| 51 | - $rac = spip_htmlentities($rac, ENT_QUOTES); |
|
| 52 | - $do = spip_htmlentities($do, ENT_QUOTES); |
|
| 53 | - $id = intval($id); |
|
| 51 | + $rac = spip_htmlentities($rac, ENT_QUOTES); |
|
| 52 | + $do = spip_htmlentities($do, ENT_QUOTES); |
|
| 53 | + $id = intval($id); |
|
| 54 | 54 | |
| 55 | 55 | # ce lien provoque la selection (directe) de la rubrique cliquee |
| 56 | 56 | # et l'affichage de son titre dans le bandeau |
| 57 | - $titre = strtr( |
|
| 58 | - str_replace( |
|
| 59 | - "'", |
|
| 60 | - '’', |
|
| 61 | - str_replace('"', '"', textebrut($titre)) |
|
| 62 | - ), |
|
| 63 | - "\n\r", |
|
| 64 | - ' ' |
|
| 65 | - ); |
|
| 57 | + $titre = strtr( |
|
| 58 | + str_replace( |
|
| 59 | + "'", |
|
| 60 | + '’', |
|
| 61 | + str_replace('"', '"', textebrut($titre)) |
|
| 62 | + ), |
|
| 63 | + "\n\r", |
|
| 64 | + ' ' |
|
| 65 | + ); |
|
| 66 | 66 | |
| 67 | - $js_func = $do . '_selection_titre'; |
|
| 67 | + $js_func = $do . '_selection_titre'; |
|
| 68 | 68 | |
| 69 | - return "<div style='display: none;'>" |
|
| 70 | - . "<input type='text' id='" . $rac . "_sel' value='$id' />" |
|
| 71 | - . "<input type='text' id='" . $rac . "_sel2' value=\"" |
|
| 72 | - . entites_html($titre) |
|
| 73 | - . '" />' |
|
| 74 | - . '</div>' |
|
| 75 | - . "<div class='informer' style='padding: 5px; border-top: 0px;'>" |
|
| 76 | - . '<div class="informer__item">' |
|
| 77 | - . (!$res ? '' : $res) |
|
| 78 | - . "<p class='informer__titre'><b>" . safehtml($titre) . '</b></p>' |
|
| 79 | - . (!$descriptif ? '' : "<div class='informer__descriptif'>" . safehtml($descriptif) . '</div>') |
|
| 80 | - . '</div>' |
|
| 81 | - . "<div class='informer__action' style='clear:both; text-align: " . $GLOBALS['spip_lang_right'] . ";'>" |
|
| 82 | - . "<input type='submit' class='fondo btn submit' value='" |
|
| 83 | - . _T('bouton_choisir') |
|
| 84 | - . "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />" |
|
| 85 | - . '</div>' |
|
| 86 | - . '</div>'; |
|
| 69 | + return "<div style='display: none;'>" |
|
| 70 | + . "<input type='text' id='" . $rac . "_sel' value='$id' />" |
|
| 71 | + . "<input type='text' id='" . $rac . "_sel2' value=\"" |
|
| 72 | + . entites_html($titre) |
|
| 73 | + . '" />' |
|
| 74 | + . '</div>' |
|
| 75 | + . "<div class='informer' style='padding: 5px; border-top: 0px;'>" |
|
| 76 | + . '<div class="informer__item">' |
|
| 77 | + . (!$res ? '' : $res) |
|
| 78 | + . "<p class='informer__titre'><b>" . safehtml($titre) . '</b></p>' |
|
| 79 | + . (!$descriptif ? '' : "<div class='informer__descriptif'>" . safehtml($descriptif) . '</div>') |
|
| 80 | + . '</div>' |
|
| 81 | + . "<div class='informer__action' style='clear:both; text-align: " . $GLOBALS['spip_lang_right'] . ";'>" |
|
| 82 | + . "<input type='submit' class='fondo btn submit' value='" |
|
| 83 | + . _T('bouton_choisir') |
|
| 84 | + . "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />" |
|
| 85 | + . '</div>' |
|
| 86 | + . '</div>'; |
|
| 87 | 87 | } |
@@ -20,7 +20,7 @@ discard block |
||
| 20 | 20 | include_spip('inc/texte'); |
| 21 | 21 | $titre = $descriptif = ''; |
| 22 | 22 | if ($type === 'rubrique') { |
| 23 | - $row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = ' . intval($id)); |
|
| 23 | + $row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = '.intval($id)); |
|
| 24 | 24 | if ($row) { |
| 25 | 25 | $titre = typo($row['titre']); |
| 26 | 26 | $descriptif = propre($row['descriptif']); |
@@ -42,7 +42,7 @@ discard block |
||
| 42 | 42 | include_spip('inc/filtres_images_mini'); |
| 43 | 43 | $res = image_reduire("<img src='$fid' alt='' />", 100, 48); |
| 44 | 44 | if ($res) { |
| 45 | - $res = "<div class='informer__media' style='float: " . $GLOBALS['spip_lang_right'] . '; margin-' . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>"; |
|
| 45 | + $res = "<div class='informer__media' style='float: ".$GLOBALS['spip_lang_right'].'; margin-'.$GLOBALS['spip_lang_right'].": -5px; margin-top: -5px;'>$res</div>"; |
|
| 46 | 46 | } |
| 47 | 47 | } |
| 48 | 48 | } |
@@ -64,21 +64,21 @@ discard block |
||
| 64 | 64 | ' ' |
| 65 | 65 | ); |
| 66 | 66 | |
| 67 | - $js_func = $do . '_selection_titre'; |
|
| 67 | + $js_func = $do.'_selection_titre'; |
|
| 68 | 68 | |
| 69 | 69 | return "<div style='display: none;'>" |
| 70 | - . "<input type='text' id='" . $rac . "_sel' value='$id' />" |
|
| 71 | - . "<input type='text' id='" . $rac . "_sel2' value=\"" |
|
| 70 | + . "<input type='text' id='".$rac."_sel' value='$id' />" |
|
| 71 | + . "<input type='text' id='".$rac."_sel2' value=\"" |
|
| 72 | 72 | . entites_html($titre) |
| 73 | 73 | . '" />' |
| 74 | 74 | . '</div>' |
| 75 | 75 | . "<div class='informer' style='padding: 5px; border-top: 0px;'>" |
| 76 | 76 | . '<div class="informer__item">' |
| 77 | 77 | . (!$res ? '' : $res) |
| 78 | - . "<p class='informer__titre'><b>" . safehtml($titre) . '</b></p>' |
|
| 79 | - . (!$descriptif ? '' : "<div class='informer__descriptif'>" . safehtml($descriptif) . '</div>') |
|
| 78 | + . "<p class='informer__titre'><b>".safehtml($titre).'</b></p>' |
|
| 79 | + . (!$descriptif ? '' : "<div class='informer__descriptif'>".safehtml($descriptif).'</div>') |
|
| 80 | 80 | . '</div>' |
| 81 | - . "<div class='informer__action' style='clear:both; text-align: " . $GLOBALS['spip_lang_right'] . ";'>" |
|
| 81 | + . "<div class='informer__action' style='clear:both; text-align: ".$GLOBALS['spip_lang_right'].";'>" |
|
| 82 | 82 | . "<input type='submit' class='fondo btn submit' value='" |
| 83 | 83 | . _T('bouton_choisir') |
| 84 | 84 | . "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />" |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | /** |
@@ -43,25 +43,25 @@ discard block |
||
| 43 | 43 | * @return string Code HTML |
| 44 | 44 | **/ |
| 45 | 45 | function inc_commencer_page_dist( |
| 46 | - $titre = '', |
|
| 47 | - $rubrique = 'accueil', |
|
| 48 | - $sous_rubrique = 'accueil', |
|
| 49 | - $id_rubrique = '', |
|
| 50 | - $menu = true, |
|
| 51 | - $minipres = false, |
|
| 52 | - $alertes = true |
|
| 46 | + $titre = '', |
|
| 47 | + $rubrique = 'accueil', |
|
| 48 | + $sous_rubrique = 'accueil', |
|
| 49 | + $id_rubrique = '', |
|
| 50 | + $menu = true, |
|
| 51 | + $minipres = false, |
|
| 52 | + $alertes = true |
|
| 53 | 53 | ) { |
| 54 | 54 | |
| 55 | - include_spip('inc/headers'); |
|
| 55 | + include_spip('inc/headers'); |
|
| 56 | 56 | |
| 57 | - http_no_cache(); |
|
| 57 | + http_no_cache(); |
|
| 58 | 58 | |
| 59 | - return init_entete($titre, $id_rubrique, $minipres) |
|
| 60 | - . init_body($rubrique, $sous_rubrique, $id_rubrique, $menu) |
|
| 61 | - . "<div id='page'>" |
|
| 62 | - . auteurs_recemment_connectes($GLOBALS['connect_id_auteur']) |
|
| 63 | - . ($alertes ? alertes_auteur($GLOBALS['connect_id_auteur']) : '') |
|
| 64 | - . '<div class="largeur">'; |
|
| 59 | + return init_entete($titre, $id_rubrique, $minipres) |
|
| 60 | + . init_body($rubrique, $sous_rubrique, $id_rubrique, $menu) |
|
| 61 | + . "<div id='page'>" |
|
| 62 | + . auteurs_recemment_connectes($GLOBALS['connect_id_auteur']) |
|
| 63 | + . ($alertes ? alertes_auteur($GLOBALS['connect_id_auteur']) : '') |
|
| 64 | + . '<div class="largeur">'; |
|
| 65 | 65 | } |
| 66 | 66 | |
| 67 | 67 | /** |
@@ -82,21 +82,21 @@ discard block |
||
| 82 | 82 | * Entête du fichier HTML avec le DOCTYPE |
| 83 | 83 | */ |
| 84 | 84 | function init_entete($titre = '', $dummy = 0, $minipres = false) { |
| 85 | - include_spip('inc/texte'); |
|
| 86 | - if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']['nom_site']))) { |
|
| 87 | - $nom_site_spip = _T('info_mon_site_spip'); |
|
| 88 | - } |
|
| 89 | - |
|
| 90 | - $titre = '[' |
|
| 91 | - . $nom_site_spip |
|
| 92 | - . ']' |
|
| 93 | - . ($titre ? ' ' . textebrut(typo($titre)) : ''); |
|
| 94 | - |
|
| 95 | - return _DOCTYPE_ECRIRE |
|
| 96 | - . html_lang_attributes() |
|
| 97 | - . "<head>\n" |
|
| 98 | - . init_head($titre, $dummy, $minipres) |
|
| 99 | - . "</head>\n"; |
|
| 85 | + include_spip('inc/texte'); |
|
| 86 | + if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']['nom_site']))) { |
|
| 87 | + $nom_site_spip = _T('info_mon_site_spip'); |
|
| 88 | + } |
|
| 89 | + |
|
| 90 | + $titre = '[' |
|
| 91 | + . $nom_site_spip |
|
| 92 | + . ']' |
|
| 93 | + . ($titre ? ' ' . textebrut(typo($titre)) : ''); |
|
| 94 | + |
|
| 95 | + return _DOCTYPE_ECRIRE |
|
| 96 | + . html_lang_attributes() |
|
| 97 | + . "<head>\n" |
|
| 98 | + . init_head($titre, $dummy, $minipres) |
|
| 99 | + . "</head>\n"; |
|
| 100 | 100 | } |
| 101 | 101 | |
| 102 | 102 | /** |
@@ -110,7 +110,7 @@ discard block |
||
| 110 | 110 | * @return string |
| 111 | 111 | */ |
| 112 | 112 | function init_head($titre = '', $dummy = 0, $minipres = false) { |
| 113 | - return recuperer_fond('prive/squelettes/head/dist', ['titre' => $titre, 'minipres' => $minipres ? ' ' : '']); |
|
| 113 | + return recuperer_fond('prive/squelettes/head/dist', ['titre' => $titre, 'minipres' => $minipres ? ' ' : '']); |
|
| 114 | 114 | } |
| 115 | 115 | |
| 116 | 116 | /** |
@@ -132,20 +132,20 @@ discard block |
||
| 132 | 132 | */ |
| 133 | 133 | function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubrique = '', $menu = true) { |
| 134 | 134 | |
| 135 | - $res = pipeline('body_prive', "<body class='" |
|
| 136 | - . init_body_class() . ' ' . _request('exec') . "'" |
|
| 137 | - . ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '') |
|
| 138 | - . '>'); |
|
| 135 | + $res = pipeline('body_prive', "<body class='" |
|
| 136 | + . init_body_class() . ' ' . _request('exec') . "'" |
|
| 137 | + . ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '') |
|
| 138 | + . '>'); |
|
| 139 | 139 | |
| 140 | - if (!$menu) { |
|
| 141 | - return $res; |
|
| 142 | - } |
|
| 140 | + if (!$menu) { |
|
| 141 | + return $res; |
|
| 142 | + } |
|
| 143 | 143 | |
| 144 | 144 | |
| 145 | - $bandeau = charger_fonction('bandeau', 'inc'); |
|
| 145 | + $bandeau = charger_fonction('bandeau', 'inc'); |
|
| 146 | 146 | |
| 147 | - return $res |
|
| 148 | - . $bandeau(); |
|
| 147 | + return $res |
|
| 148 | + . $bandeau(); |
|
| 149 | 149 | } |
| 150 | 150 | |
| 151 | 151 | /** |
@@ -157,23 +157,23 @@ discard block |
||
| 157 | 157 | * @return string Classes CSS (séparées par des espaces) |
| 158 | 158 | */ |
| 159 | 159 | function init_body_class() { |
| 160 | - $display_modes = [ |
|
| 161 | - 0 => 'icones_img_texte' // défaut. |
|
| 162 | - /*init*/, |
|
| 163 | - 1 => 'icones_texte', |
|
| 164 | - 2 => 'icones_img_texte', |
|
| 165 | - 3 => 'icones_img' |
|
| 166 | - ]; |
|
| 160 | + $display_modes = [ |
|
| 161 | + 0 => 'icones_img_texte' // défaut. |
|
| 162 | + /*init*/, |
|
| 163 | + 1 => 'icones_texte', |
|
| 164 | + 2 => 'icones_img_texte', |
|
| 165 | + 3 => 'icones_img' |
|
| 166 | + ]; |
|
| 167 | 167 | |
| 168 | - $prefs = $GLOBALS['visiteur_session']['prefs'] ?? []; |
|
| 168 | + $prefs = $GLOBALS['visiteur_session']['prefs'] ?? []; |
|
| 169 | 169 | |
| 170 | - $display_mode = $display_modes[intval($prefs['display'] ?? 0)] ?? $display_modes[0]; |
|
| 171 | - $spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones'; |
|
| 170 | + $display_mode = $display_modes[intval($prefs['display'] ?? 0)] ?? $display_modes[0]; |
|
| 171 | + $spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones'; |
|
| 172 | 172 | |
| 173 | - $couleur = intval($prefs['couleur'] ?? 2); |
|
| 173 | + $couleur = intval($prefs['couleur'] ?? 2); |
|
| 174 | 174 | |
| 175 | - $classes = "spip-theme-colors-$couleur $spip_display_navigation $display_mode"; |
|
| 176 | - return spip_sanitize_classname($classes); |
|
| 175 | + $classes = "spip-theme-colors-$couleur $spip_display_navigation $display_mode"; |
|
| 176 | + return spip_sanitize_classname($classes); |
|
| 177 | 177 | } |
| 178 | 178 | |
| 179 | 179 | |
@@ -184,5 +184,5 @@ discard block |
||
| 184 | 184 | * @return string |
| 185 | 185 | */ |
| 186 | 186 | function auteurs_recemment_connectes($id_auteur) { |
| 187 | - return recuperer_fond('prive/objets/liste/auteurs_enligne'); |
|
| 187 | + return recuperer_fond('prive/objets/liste/auteurs_enligne'); |
|
| 188 | 188 | } |
@@ -90,7 +90,7 @@ discard block |
||
| 90 | 90 | $titre = '[' |
| 91 | 91 | . $nom_site_spip |
| 92 | 92 | . ']' |
| 93 | - . ($titre ? ' ' . textebrut(typo($titre)) : ''); |
|
| 93 | + . ($titre ? ' '.textebrut(typo($titre)) : ''); |
|
| 94 | 94 | |
| 95 | 95 | return _DOCTYPE_ECRIRE |
| 96 | 96 | . html_lang_attributes() |
@@ -133,7 +133,7 @@ discard block |
||
| 133 | 133 | function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubrique = '', $menu = true) { |
| 134 | 134 | |
| 135 | 135 | $res = pipeline('body_prive', "<body class='" |
| 136 | - . init_body_class() . ' ' . _request('exec') . "'" |
|
| 136 | + . init_body_class().' '._request('exec')."'" |
|
| 137 | 137 | . ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '') |
| 138 | 138 | . '>'); |
| 139 | 139 | |
@@ -4,248 +4,248 @@ discard block |
||
| 4 | 4 | // ** ne pas modifier le fichier ** |
| 5 | 5 | |
| 6 | 6 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 7 | - return; |
|
| 7 | + return; |
|
| 8 | 8 | } |
| 9 | 9 | |
| 10 | 10 | $GLOBALS[$GLOBALS['idx_lang']] = array( |
| 11 | 11 | |
| 12 | - // A |
|
| 13 | - 'access_interface_graphique' => 'Retour à l’interface graphique complète', |
|
| 14 | - 'access_mode_texte' => 'Afficher l’interface textuelle simplifiée', |
|
| 15 | - 'admin_debug' => 'debug', |
|
| 16 | - 'admin_modifier_article' => 'Modifier cet article', |
|
| 17 | - 'admin_modifier_auteur' => 'Modifier cet auteur', |
|
| 18 | - 'admin_modifier_breve' => 'Modifier cette brève', |
|
| 19 | - 'admin_modifier_mot' => 'Modifier ce mot-clé', |
|
| 20 | - 'admin_modifier_rubrique' => 'Modifier cette rubrique', |
|
| 21 | - 'admin_recalculer' => 'Recalculer cette page', |
|
| 22 | - 'afficher_calendrier' => 'Afficher le calendrier', |
|
| 23 | - 'afficher_trad' => 'afficher les traductions', |
|
| 24 | - 'alerte_maj_impossible' => '<b>Alerte !</b> La mise à jour de la base SQL vers la version @version@ est impossible, peut-être à cause d’un problème de droit de modification sur la base de données. Contacte ton hébergeur.', |
|
| 25 | - 'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :', |
|
| 26 | - 'analyse_xml' => 'Analyse XML', |
|
| 27 | - 'annuler' => 'Annuler', |
|
| 28 | - 'antispam_champ_vide' => 'Laisse ce champ vide :', |
|
| 29 | - 'articles_recents' => 'Articles les plus récents', |
|
| 30 | - 'attention_champ_mini_nb_caractères' => 'Attention ! @nb@ caractères au minimum', |
|
| 31 | - 'avis_1_erreur_saisie' => 'Il y a 1 erreur dans dans ta saisie, vérifie les informations.', |
|
| 32 | - 'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP', |
|
| 33 | - 'avis_archive_invalide' => 'le fichier archive n’est pas valide', |
|
| 34 | - 'avis_attention' => 'ATTENTION !', |
|
| 35 | - 'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@', |
|
| 36 | - 'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas', |
|
| 37 | - 'avis_erreur' => 'Erreur : voir ci-dessous', |
|
| 38 | - 'avis_erreur_connexion' => 'Erreur de connexion', |
|
| 39 | - 'avis_erreur_cookie' => 'problème de cookie', |
|
| 40 | - 'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.', |
|
| 41 | - 'avis_erreur_mysql' => 'Erreur SQL', |
|
| 42 | - 'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !', |
|
| 43 | - 'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé', |
|
| 44 | - 'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans ta saisie, vérifie les informations.', |
|
| 12 | + // A |
|
| 13 | + 'access_interface_graphique' => 'Retour à l’interface graphique complète', |
|
| 14 | + 'access_mode_texte' => 'Afficher l’interface textuelle simplifiée', |
|
| 15 | + 'admin_debug' => 'debug', |
|
| 16 | + 'admin_modifier_article' => 'Modifier cet article', |
|
| 17 | + 'admin_modifier_auteur' => 'Modifier cet auteur', |
|
| 18 | + 'admin_modifier_breve' => 'Modifier cette brève', |
|
| 19 | + 'admin_modifier_mot' => 'Modifier ce mot-clé', |
|
| 20 | + 'admin_modifier_rubrique' => 'Modifier cette rubrique', |
|
| 21 | + 'admin_recalculer' => 'Recalculer cette page', |
|
| 22 | + 'afficher_calendrier' => 'Afficher le calendrier', |
|
| 23 | + 'afficher_trad' => 'afficher les traductions', |
|
| 24 | + 'alerte_maj_impossible' => '<b>Alerte !</b> La mise à jour de la base SQL vers la version @version@ est impossible, peut-être à cause d’un problème de droit de modification sur la base de données. Contacte ton hébergeur.', |
|
| 25 | + 'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :', |
|
| 26 | + 'analyse_xml' => 'Analyse XML', |
|
| 27 | + 'annuler' => 'Annuler', |
|
| 28 | + 'antispam_champ_vide' => 'Laisse ce champ vide :', |
|
| 29 | + 'articles_recents' => 'Articles les plus récents', |
|
| 30 | + 'attention_champ_mini_nb_caractères' => 'Attention ! @nb@ caractères au minimum', |
|
| 31 | + 'avis_1_erreur_saisie' => 'Il y a 1 erreur dans dans ta saisie, vérifie les informations.', |
|
| 32 | + 'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP', |
|
| 33 | + 'avis_archive_invalide' => 'le fichier archive n’est pas valide', |
|
| 34 | + 'avis_attention' => 'ATTENTION !', |
|
| 35 | + 'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@', |
|
| 36 | + 'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas', |
|
| 37 | + 'avis_erreur' => 'Erreur : voir ci-dessous', |
|
| 38 | + 'avis_erreur_connexion' => 'Erreur de connexion', |
|
| 39 | + 'avis_erreur_cookie' => 'problème de cookie', |
|
| 40 | + 'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.', |
|
| 41 | + 'avis_erreur_mysql' => 'Erreur SQL', |
|
| 42 | + 'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !', |
|
| 43 | + 'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé', |
|
| 44 | + 'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans ta saisie, vérifie les informations.', |
|
| 45 | 45 | |
| 46 | - // B |
|
| 47 | - 'barre_a_accent_grave' => 'Insérer un A accent grave majuscule', |
|
| 48 | - 'barre_aide' => 'Utilise les raccourcis typographiques pour enrichir ta mise en page', |
|
| 49 | - 'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule', |
|
| 50 | - 'barre_eo' => 'Insérer un E dans l’O', |
|
| 51 | - 'barre_eo_maj' => 'Insérer un E dans l’O majuscule', |
|
| 52 | - 'barre_euro' => 'Insérer le symbole ?', |
|
| 53 | - 'barre_gras' => 'Mettre en {{gras}}', |
|
| 54 | - 'barre_guillemets' => 'Entourer de « guillemets français »', |
|
| 55 | - 'barre_guillemets_simples' => 'Entourer de ?guillemets de second niveau ?', |
|
| 56 | - 'barre_intertitre' => 'Transformer en {{{intertitre}}}', |
|
| 57 | - 'barre_italic' => 'Mettre en {italique}', |
|
| 58 | - 'barre_lien' => 'Transformer en [lien hypertexte->http://...]', |
|
| 59 | - 'barre_lien_input' => 'Indiquer l’adresse de ton lien (tu peux indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.', |
|
| 60 | - 'barre_note' => 'Transformer en [[Note de bas de page]]', |
|
| 61 | - 'barre_paragraphe' => 'Crée un paragraphe', |
|
| 62 | - 'barre_quote' => '<quote>Citer un message</quote>', |
|
| 63 | - 'bouton_changer' => 'Changer', |
|
| 64 | - 'bouton_chercher' => 'Chercher', |
|
| 65 | - 'bouton_choisir' => 'Choisir', |
|
| 66 | - 'bouton_deplacer' => 'Déplacer', |
|
| 67 | - 'bouton_download' => 'Télécharger', |
|
| 68 | - 'bouton_enregistrer' => 'Enregistrer', |
|
| 69 | - 'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne', |
|
| 70 | - 'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales', |
|
| 71 | - 'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces', |
|
| 72 | - 'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés', |
|
| 73 | - 'bouton_recharger_page' => 'recharger cette page', |
|
| 74 | - 'bouton_telecharger' => 'Télécharger', |
|
| 75 | - 'bouton_upload' => 'Téléverser', |
|
| 76 | - 'bouton_valider' => 'Valider', |
|
| 46 | + // B |
|
| 47 | + 'barre_a_accent_grave' => 'Insérer un A accent grave majuscule', |
|
| 48 | + 'barre_aide' => 'Utilise les raccourcis typographiques pour enrichir ta mise en page', |
|
| 49 | + 'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule', |
|
| 50 | + 'barre_eo' => 'Insérer un E dans l’O', |
|
| 51 | + 'barre_eo_maj' => 'Insérer un E dans l’O majuscule', |
|
| 52 | + 'barre_euro' => 'Insérer le symbole ?', |
|
| 53 | + 'barre_gras' => 'Mettre en {{gras}}', |
|
| 54 | + 'barre_guillemets' => 'Entourer de « guillemets français »', |
|
| 55 | + 'barre_guillemets_simples' => 'Entourer de ?guillemets de second niveau ?', |
|
| 56 | + 'barre_intertitre' => 'Transformer en {{{intertitre}}}', |
|
| 57 | + 'barre_italic' => 'Mettre en {italique}', |
|
| 58 | + 'barre_lien' => 'Transformer en [lien hypertexte->http://...]', |
|
| 59 | + 'barre_lien_input' => 'Indiquer l’adresse de ton lien (tu peux indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.', |
|
| 60 | + 'barre_note' => 'Transformer en [[Note de bas de page]]', |
|
| 61 | + 'barre_paragraphe' => 'Crée un paragraphe', |
|
| 62 | + 'barre_quote' => '<quote>Citer un message</quote>', |
|
| 63 | + 'bouton_changer' => 'Changer', |
|
| 64 | + 'bouton_chercher' => 'Chercher', |
|
| 65 | + 'bouton_choisir' => 'Choisir', |
|
| 66 | + 'bouton_deplacer' => 'Déplacer', |
|
| 67 | + 'bouton_download' => 'Télécharger', |
|
| 68 | + 'bouton_enregistrer' => 'Enregistrer', |
|
| 69 | + 'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne', |
|
| 70 | + 'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales', |
|
| 71 | + 'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces', |
|
| 72 | + 'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés', |
|
| 73 | + 'bouton_recharger_page' => 'recharger cette page', |
|
| 74 | + 'bouton_telecharger' => 'Télécharger', |
|
| 75 | + 'bouton_upload' => 'Téléverser', |
|
| 76 | + 'bouton_valider' => 'Valider', |
|
| 77 | 77 | |
| 78 | - // C |
|
| 79 | - 'cal_apresmidi' => 'après-midi', |
|
| 80 | - 'cal_jour_entier' => 'jour entier', |
|
| 81 | - 'cal_matin' => 'matin', |
|
| 82 | - 'cal_par_jour' => 'calendrier par jour', |
|
| 83 | - 'cal_par_mois' => 'calendrier par mois', |
|
| 84 | - 'cal_par_semaine' => 'calendrier par semaine', |
|
| 85 | - 'choix_couleur_interface' => 'couleur ', |
|
| 86 | - 'choix_interface' => 'choix de l’interface', |
|
| 87 | - 'colonne' => 'Colonne', |
|
| 88 | - 'confirm_changer_statut' => 'Attention, tu as demandé à changer le statut de cet élément. Souhaites-tu continuer ?', |
|
| 89 | - 'correcte' => 'correcte', |
|
| 78 | + // C |
|
| 79 | + 'cal_apresmidi' => 'après-midi', |
|
| 80 | + 'cal_jour_entier' => 'jour entier', |
|
| 81 | + 'cal_matin' => 'matin', |
|
| 82 | + 'cal_par_jour' => 'calendrier par jour', |
|
| 83 | + 'cal_par_mois' => 'calendrier par mois', |
|
| 84 | + 'cal_par_semaine' => 'calendrier par semaine', |
|
| 85 | + 'choix_couleur_interface' => 'couleur ', |
|
| 86 | + 'choix_interface' => 'choix de l’interface', |
|
| 87 | + 'colonne' => 'Colonne', |
|
| 88 | + 'confirm_changer_statut' => 'Attention, tu as demandé à changer le statut de cet élément. Souhaites-tu continuer ?', |
|
| 89 | + 'correcte' => 'correcte', |
|
| 90 | 90 | |
| 91 | - // D |
|
| 92 | - 'date_aujourdhui' => 'aujourd’hui', |
|
| 93 | - 'date_avant_jc' => 'av. J.C.', |
|
| 94 | - 'date_dans' => 'dans @delai@', |
|
| 95 | - 'date_de_mois_1' => '@j@ @nommois@', |
|
| 96 | - 'date_de_mois_10' => '@j@ @nommois@', |
|
| 97 | - 'date_de_mois_11' => '@j@ @nommois@', |
|
| 98 | - 'date_de_mois_12' => '@j@ @nommois@', |
|
| 99 | - 'date_de_mois_2' => '@j@ @nommois@', |
|
| 100 | - 'date_de_mois_3' => '@j@ @nommois@', |
|
| 101 | - 'date_de_mois_4' => '@j@ @nommois@', |
|
| 102 | - 'date_de_mois_5' => '@j@ @nommois@', |
|
| 103 | - 'date_de_mois_6' => '@j@ @nommois@', |
|
| 104 | - 'date_de_mois_7' => '@j@ @nommois@', |
|
| 105 | - 'date_de_mois_8' => '@j@ @nommois@', |
|
| 106 | - 'date_de_mois_9' => '@j@ @nommois@', |
|
| 107 | - 'date_demain' => 'demain', |
|
| 108 | - 'date_fmt_heures_minutes' => '@h@h@m@min', |
|
| 109 | - 'date_fmt_heures_minutes_court' => '@h@h@m@', |
|
| 110 | - 'date_fmt_jour' => '@nomjour@ @jour@', |
|
| 111 | - 'date_fmt_jour_heure' => '@jour@ à @heure@', |
|
| 112 | - 'date_fmt_jour_heure_debut_fin' => 'le @jour@ de @heure_debut@ à @heure_fin@', |
|
| 113 | - 'date_fmt_jour_heure_debut_fin_abbr' => 'le @dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtstart@@heure_fin@@dtend@', |
|
| 114 | - 'date_fmt_jour_mois' => '@jour@ @nommois@', |
|
| 115 | - 'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@', |
|
| 116 | - 'date_fmt_mois_annee' => '@nommois@ @annee@', |
|
| 117 | - 'date_fmt_nomjour' => '@nomjour@ @date@', |
|
| 118 | - 'date_fmt_nomjour_date' => 'le @nomjour@ @date@', |
|
| 119 | - 'date_fmt_periode' => 'Du @date_debut@ au @date_fin@', |
|
| 120 | - 'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@', |
|
| 121 | - 'date_fmt_periode_from' => 'Du', |
|
| 122 | - 'date_fmt_periode_to' => 'au', |
|
| 123 | - 'date_fmt_saison_annee' => '@saison@ @annee@', |
|
| 124 | - 'date_heures' => 'heures', |
|
| 125 | - 'date_hier' => 'hier', |
|
| 126 | - 'date_il_y_a' => 'il y a @delai@', |
|
| 127 | - 'date_jnum1' => '1er', |
|
| 128 | - 'date_jnum10' => '10', |
|
| 129 | - 'date_jnum11' => '11', |
|
| 130 | - 'date_jnum12' => '12', |
|
| 131 | - 'date_jnum13' => '13', |
|
| 132 | - 'date_jnum14' => '14', |
|
| 133 | - 'date_jnum15' => '15', |
|
| 134 | - 'date_jnum16' => '16', |
|
| 135 | - 'date_jnum17' => '17', |
|
| 136 | - 'date_jnum18' => '18', |
|
| 137 | - 'date_jnum19' => '19', |
|
| 138 | - 'date_jnum2' => '2', |
|
| 139 | - 'date_jnum20' => '20', |
|
| 140 | - 'date_jnum21' => '21', |
|
| 141 | - 'date_jnum22' => '22', |
|
| 142 | - 'date_jnum23' => '23', |
|
| 143 | - 'date_jnum24' => '24', |
|
| 144 | - 'date_jnum25' => '25', |
|
| 145 | - 'date_jnum26' => '26', |
|
| 146 | - 'date_jnum27' => '27', |
|
| 147 | - 'date_jnum28' => '28', |
|
| 148 | - 'date_jnum29' => '29', |
|
| 149 | - 'date_jnum3' => '3', |
|
| 150 | - 'date_jnum30' => '30', |
|
| 151 | - 'date_jnum31' => '31', |
|
| 152 | - 'date_jnum4' => '4', |
|
| 153 | - 'date_jnum5' => '5', |
|
| 154 | - 'date_jnum6' => '6', |
|
| 155 | - 'date_jnum7' => '7', |
|
| 156 | - 'date_jnum8' => '8', |
|
| 157 | - 'date_jnum9' => '9', |
|
| 158 | - 'date_jour_1' => 'dimanche', |
|
| 159 | - 'date_jour_1_abbr' => 'dim.', |
|
| 160 | - 'date_jour_1_initiale' => 'd.', |
|
| 161 | - 'date_jour_2' => 'lundi', |
|
| 162 | - 'date_jour_2_abbr' => 'lun.', |
|
| 163 | - 'date_jour_2_initiale' => 'l.', |
|
| 164 | - 'date_jour_3' => 'mardi', |
|
| 165 | - 'date_jour_3_abbr' => 'mar.', |
|
| 166 | - 'date_jour_3_initiale' => 'm.', |
|
| 167 | - 'date_jour_4' => 'mercredi', |
|
| 168 | - 'date_jour_4_abbr' => 'mer.', |
|
| 169 | - 'date_jour_4_initiale' => 'm.', |
|
| 170 | - 'date_jour_5' => 'jeudi', |
|
| 171 | - 'date_jour_5_abbr' => 'jeu.', |
|
| 172 | - 'date_jour_5_initiale' => 'j.', |
|
| 173 | - 'date_jour_6' => 'vendredi', |
|
| 174 | - 'date_jour_6_abbr' => 'ven.', |
|
| 175 | - 'date_jour_6_initiale' => 'v.', |
|
| 176 | - 'date_jour_7' => 'samedi', |
|
| 177 | - 'date_jour_7_abbr' => 'sam.', |
|
| 178 | - 'date_jour_7_initiale' => 's.', |
|
| 179 | - 'date_jours' => 'jours', |
|
| 180 | - 'date_minutes' => 'minutes', |
|
| 181 | - 'date_mois' => 'mois', |
|
| 182 | - 'date_mois_1' => 'janvier', |
|
| 183 | - 'date_mois_10' => 'octobre', |
|
| 184 | - 'date_mois_10_abbr' => 'oct.', |
|
| 185 | - 'date_mois_11' => 'novembre', |
|
| 186 | - 'date_mois_11_abbr' => 'nov.', |
|
| 187 | - 'date_mois_12' => 'décembre', |
|
| 188 | - 'date_mois_12_abbr' => 'déc.', |
|
| 189 | - 'date_mois_1_abbr' => 'janv.', |
|
| 190 | - 'date_mois_2' => 'février', |
|
| 191 | - 'date_mois_2_abbr' => 'févr.', |
|
| 192 | - 'date_mois_3' => 'mars', |
|
| 193 | - 'date_mois_3_abbr' => 'mars', |
|
| 194 | - 'date_mois_4' => 'avril', |
|
| 195 | - 'date_mois_4_abbr' => 'avr.', |
|
| 196 | - 'date_mois_5' => 'mai', |
|
| 197 | - 'date_mois_5_abbr' => 'mai', |
|
| 198 | - 'date_mois_6' => 'juin', |
|
| 199 | - 'date_mois_6_abbr' => 'juin', |
|
| 200 | - 'date_mois_7' => 'juillet', |
|
| 201 | - 'date_mois_7_abbr' => 'juil.', |
|
| 202 | - 'date_mois_8' => 'août', |
|
| 203 | - 'date_mois_8_abbr' => 'août', |
|
| 204 | - 'date_mois_9' => 'septembre', |
|
| 205 | - 'date_mois_9_abbr' => 'sept.', |
|
| 206 | - 'date_saison_1' => 'hiver', |
|
| 207 | - 'date_saison_2' => 'printemps', |
|
| 208 | - 'date_saison_3' => 'été', |
|
| 209 | - 'date_saison_4' => 'automne', |
|
| 210 | - 'date_secondes' => 'secondes', |
|
| 211 | - 'date_semaines' => 'semaines', |
|
| 212 | - 'date_un_mois' => 'mois', |
|
| 213 | - 'date_une_heure' => 'heure', |
|
| 214 | - 'date_une_minute' => 'minute', |
|
| 215 | - 'date_une_seconde' => 'seconde', |
|
| 216 | - 'date_une_semaine' => 'semaine', |
|
| 217 | - 'dirs_commencer' => ' afin de commencer réellement l’installation', |
|
| 218 | - 'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>', |
|
| 219 | - 'dirs_probleme_droits' => 'Problème de droits d’accès', |
|
| 220 | - 'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@.</ul> |
|
| 91 | + // D |
|
| 92 | + 'date_aujourdhui' => 'aujourd’hui', |
|
| 93 | + 'date_avant_jc' => 'av. J.C.', |
|
| 94 | + 'date_dans' => 'dans @delai@', |
|
| 95 | + 'date_de_mois_1' => '@j@ @nommois@', |
|
| 96 | + 'date_de_mois_10' => '@j@ @nommois@', |
|
| 97 | + 'date_de_mois_11' => '@j@ @nommois@', |
|
| 98 | + 'date_de_mois_12' => '@j@ @nommois@', |
|
| 99 | + 'date_de_mois_2' => '@j@ @nommois@', |
|
| 100 | + 'date_de_mois_3' => '@j@ @nommois@', |
|
| 101 | + 'date_de_mois_4' => '@j@ @nommois@', |
|
| 102 | + 'date_de_mois_5' => '@j@ @nommois@', |
|
| 103 | + 'date_de_mois_6' => '@j@ @nommois@', |
|
| 104 | + 'date_de_mois_7' => '@j@ @nommois@', |
|
| 105 | + 'date_de_mois_8' => '@j@ @nommois@', |
|
| 106 | + 'date_de_mois_9' => '@j@ @nommois@', |
|
| 107 | + 'date_demain' => 'demain', |
|
| 108 | + 'date_fmt_heures_minutes' => '@h@h@m@min', |
|
| 109 | + 'date_fmt_heures_minutes_court' => '@h@h@m@', |
|
| 110 | + 'date_fmt_jour' => '@nomjour@ @jour@', |
|
| 111 | + 'date_fmt_jour_heure' => '@jour@ à @heure@', |
|
| 112 | + 'date_fmt_jour_heure_debut_fin' => 'le @jour@ de @heure_debut@ à @heure_fin@', |
|
| 113 | + 'date_fmt_jour_heure_debut_fin_abbr' => 'le @dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtstart@@heure_fin@@dtend@', |
|
| 114 | + 'date_fmt_jour_mois' => '@jour@ @nommois@', |
|
| 115 | + 'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@', |
|
| 116 | + 'date_fmt_mois_annee' => '@nommois@ @annee@', |
|
| 117 | + 'date_fmt_nomjour' => '@nomjour@ @date@', |
|
| 118 | + 'date_fmt_nomjour_date' => 'le @nomjour@ @date@', |
|
| 119 | + 'date_fmt_periode' => 'Du @date_debut@ au @date_fin@', |
|
| 120 | + 'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@', |
|
| 121 | + 'date_fmt_periode_from' => 'Du', |
|
| 122 | + 'date_fmt_periode_to' => 'au', |
|
| 123 | + 'date_fmt_saison_annee' => '@saison@ @annee@', |
|
| 124 | + 'date_heures' => 'heures', |
|
| 125 | + 'date_hier' => 'hier', |
|
| 126 | + 'date_il_y_a' => 'il y a @delai@', |
|
| 127 | + 'date_jnum1' => '1er', |
|
| 128 | + 'date_jnum10' => '10', |
|
| 129 | + 'date_jnum11' => '11', |
|
| 130 | + 'date_jnum12' => '12', |
|
| 131 | + 'date_jnum13' => '13', |
|
| 132 | + 'date_jnum14' => '14', |
|
| 133 | + 'date_jnum15' => '15', |
|
| 134 | + 'date_jnum16' => '16', |
|
| 135 | + 'date_jnum17' => '17', |
|
| 136 | + 'date_jnum18' => '18', |
|
| 137 | + 'date_jnum19' => '19', |
|
| 138 | + 'date_jnum2' => '2', |
|
| 139 | + 'date_jnum20' => '20', |
|
| 140 | + 'date_jnum21' => '21', |
|
| 141 | + 'date_jnum22' => '22', |
|
| 142 | + 'date_jnum23' => '23', |
|
| 143 | + 'date_jnum24' => '24', |
|
| 144 | + 'date_jnum25' => '25', |
|
| 145 | + 'date_jnum26' => '26', |
|
| 146 | + 'date_jnum27' => '27', |
|
| 147 | + 'date_jnum28' => '28', |
|
| 148 | + 'date_jnum29' => '29', |
|
| 149 | + 'date_jnum3' => '3', |
|
| 150 | + 'date_jnum30' => '30', |
|
| 151 | + 'date_jnum31' => '31', |
|
| 152 | + 'date_jnum4' => '4', |
|
| 153 | + 'date_jnum5' => '5', |
|
| 154 | + 'date_jnum6' => '6', |
|
| 155 | + 'date_jnum7' => '7', |
|
| 156 | + 'date_jnum8' => '8', |
|
| 157 | + 'date_jnum9' => '9', |
|
| 158 | + 'date_jour_1' => 'dimanche', |
|
| 159 | + 'date_jour_1_abbr' => 'dim.', |
|
| 160 | + 'date_jour_1_initiale' => 'd.', |
|
| 161 | + 'date_jour_2' => 'lundi', |
|
| 162 | + 'date_jour_2_abbr' => 'lun.', |
|
| 163 | + 'date_jour_2_initiale' => 'l.', |
|
| 164 | + 'date_jour_3' => 'mardi', |
|
| 165 | + 'date_jour_3_abbr' => 'mar.', |
|
| 166 | + 'date_jour_3_initiale' => 'm.', |
|
| 167 | + 'date_jour_4' => 'mercredi', |
|
| 168 | + 'date_jour_4_abbr' => 'mer.', |
|
| 169 | + 'date_jour_4_initiale' => 'm.', |
|
| 170 | + 'date_jour_5' => 'jeudi', |
|
| 171 | + 'date_jour_5_abbr' => 'jeu.', |
|
| 172 | + 'date_jour_5_initiale' => 'j.', |
|
| 173 | + 'date_jour_6' => 'vendredi', |
|
| 174 | + 'date_jour_6_abbr' => 'ven.', |
|
| 175 | + 'date_jour_6_initiale' => 'v.', |
|
| 176 | + 'date_jour_7' => 'samedi', |
|
| 177 | + 'date_jour_7_abbr' => 'sam.', |
|
| 178 | + 'date_jour_7_initiale' => 's.', |
|
| 179 | + 'date_jours' => 'jours', |
|
| 180 | + 'date_minutes' => 'minutes', |
|
| 181 | + 'date_mois' => 'mois', |
|
| 182 | + 'date_mois_1' => 'janvier', |
|
| 183 | + 'date_mois_10' => 'octobre', |
|
| 184 | + 'date_mois_10_abbr' => 'oct.', |
|
| 185 | + 'date_mois_11' => 'novembre', |
|
| 186 | + 'date_mois_11_abbr' => 'nov.', |
|
| 187 | + 'date_mois_12' => 'décembre', |
|
| 188 | + 'date_mois_12_abbr' => 'déc.', |
|
| 189 | + 'date_mois_1_abbr' => 'janv.', |
|
| 190 | + 'date_mois_2' => 'février', |
|
| 191 | + 'date_mois_2_abbr' => 'févr.', |
|
| 192 | + 'date_mois_3' => 'mars', |
|
| 193 | + 'date_mois_3_abbr' => 'mars', |
|
| 194 | + 'date_mois_4' => 'avril', |
|
| 195 | + 'date_mois_4_abbr' => 'avr.', |
|
| 196 | + 'date_mois_5' => 'mai', |
|
| 197 | + 'date_mois_5_abbr' => 'mai', |
|
| 198 | + 'date_mois_6' => 'juin', |
|
| 199 | + 'date_mois_6_abbr' => 'juin', |
|
| 200 | + 'date_mois_7' => 'juillet', |
|
| 201 | + 'date_mois_7_abbr' => 'juil.', |
|
| 202 | + 'date_mois_8' => 'août', |
|
| 203 | + 'date_mois_8_abbr' => 'août', |
|
| 204 | + 'date_mois_9' => 'septembre', |
|
| 205 | + 'date_mois_9_abbr' => 'sept.', |
|
| 206 | + 'date_saison_1' => 'hiver', |
|
| 207 | + 'date_saison_2' => 'printemps', |
|
| 208 | + 'date_saison_3' => 'été', |
|
| 209 | + 'date_saison_4' => 'automne', |
|
| 210 | + 'date_secondes' => 'secondes', |
|
| 211 | + 'date_semaines' => 'semaines', |
|
| 212 | + 'date_un_mois' => 'mois', |
|
| 213 | + 'date_une_heure' => 'heure', |
|
| 214 | + 'date_une_minute' => 'minute', |
|
| 215 | + 'date_une_seconde' => 'seconde', |
|
| 216 | + 'date_une_semaine' => 'semaine', |
|
| 217 | + 'dirs_commencer' => ' afin de commencer réellement l’installation', |
|
| 218 | + 'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>', |
|
| 219 | + 'dirs_probleme_droits' => 'Problème de droits d’accès', |
|
| 220 | + 'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@.</ul> |
|
| 221 | 221 | <p>Il est probable que cela soit dû à un problème de mauvaise mise en majuscules ou minuscules. |
| 222 | 222 | Vérifie que les minuscules et majuscules de ces répertoires concordent bien avec ce qui est affiché |
| 223 | 223 | ci-dessus ; si ce n’est pas le cas, renomme les répertoires avec ton logiciel FTP de façon à corriger l’erreur.</p> |
| 224 | 224 | <p>Une fois cette manipulation effectuée, tu pourras ', |
| 225 | - 'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul> |
|
| 225 | + 'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul> |
|
| 226 | 226 | <p>Pour y remédier, utilise ton client FTP afin de régler les droits d’accès de chacun |
| 227 | 227 | de ces répertoires. La procédure est expliquée en détail dans le guide d’installation.</p> |
| 228 | 228 | <p>Une fois cette manipulation effectuée, tu pourras ', |
| 229 | - 'double_occurrence' => 'Double occurrence de @balise@', |
|
| 229 | + 'double_occurrence' => 'Double occurrence de @balise@', |
|
| 230 | 230 | |
| 231 | - // E |
|
| 232 | - 'en_cours' => 'en cours', |
|
| 233 | - 'envoi_via_le_site' => 'Envoi via le site', |
|
| 234 | - 'erreur' => 'Erreur', |
|
| 235 | - 'erreur_balise_non_fermee' => 'dernière balise non refermée :', |
|
| 236 | - 'erreur_technique_ajaxform' => 'Ooops. Une erreur innatendue a empêché de soumettre le formulaire. Tu peux essayer à nouveau.', |
|
| 237 | - 'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.', |
|
| 238 | - 'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.', |
|
| 239 | - 'erreur_texte' => 'erreur(s)', |
|
| 240 | - 'etape' => 'Étape', |
|
| 231 | + // E |
|
| 232 | + 'en_cours' => 'en cours', |
|
| 233 | + 'envoi_via_le_site' => 'Envoi via le site', |
|
| 234 | + 'erreur' => 'Erreur', |
|
| 235 | + 'erreur_balise_non_fermee' => 'dernière balise non refermée :', |
|
| 236 | + 'erreur_technique_ajaxform' => 'Ooops. Une erreur innatendue a empêché de soumettre le formulaire. Tu peux essayer à nouveau.', |
|
| 237 | + 'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.', |
|
| 238 | + 'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.', |
|
| 239 | + 'erreur_texte' => 'erreur(s)', |
|
| 240 | + 'etape' => 'Étape', |
|
| 241 | 241 | |
| 242 | - // F |
|
| 243 | - 'fichier_introuvable' => 'Fichier @fichier@ introuvable.', |
|
| 244 | - 'fonction_introuvable' => 'Fonction @fonction@() introuvable.', |
|
| 245 | - 'form_auteur_confirmation' => 'Confirme ton adresse email', |
|
| 246 | - 'form_auteur_email_modifie' => 'Ton adresse email a été modifiée.', |
|
| 247 | - 'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Visite l’adresse Web mentionnée dans ce courrier pour valider ton adresse mail.', |
|
| 248 | - 'form_auteur_mail_confirmation' => 'Salut, |
|
| 242 | + // F |
|
| 243 | + 'fichier_introuvable' => 'Fichier @fichier@ introuvable.', |
|
| 244 | + 'fonction_introuvable' => 'Fonction @fonction@() introuvable.', |
|
| 245 | + 'form_auteur_confirmation' => 'Confirme ton adresse email', |
|
| 246 | + 'form_auteur_email_modifie' => 'Ton adresse email a été modifiée.', |
|
| 247 | + 'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Visite l’adresse Web mentionnée dans ce courrier pour valider ton adresse mail.', |
|
| 248 | + 'form_auteur_mail_confirmation' => 'Salut, |
|
| 249 | 249 | |
| 250 | 250 | Tu as demandé à changer ton adresse email. |
| 251 | 251 | Pour confirmer ta nouvelle adresse, il suffit de te connecter à |
@@ -254,346 +254,346 @@ discard block |
||
| 254 | 254 | |
| 255 | 255 | @url@ |
| 256 | 256 | ', |
| 257 | - 'form_deja_inscrit' => 'Tu es déjà inscrit.', |
|
| 258 | - 'form_email_non_valide' => 'Ton adresse email n’est pas valide.', |
|
| 259 | - 'form_forum_access_refuse' => 'Tu n’as plus accès à ce site.', |
|
| 260 | - 'form_forum_bonjour' => 'Salut @nom@,', |
|
| 261 | - 'form_forum_confirmer_email' => 'Pour confirmer ton adresse email, va à cette adresse : @url_confirm@', |
|
| 262 | - 'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, tu peux donc utiliser ton mot de passe habituel.', |
|
| 263 | - 'form_forum_identifiant_mail' => 'Ton nouvel identifiant vient de t’être envoyé par email.', |
|
| 264 | - 'form_forum_identifiants' => 'Identifiants personnels', |
|
| 265 | - 'form_forum_indiquer_nom_email' => 'Indique ici ton nom et ton adresse email. Ton identifiant personnel te parviendra rapidement, par courrier électronique.', |
|
| 266 | - 'form_forum_login' => 'login :', |
|
| 267 | - 'form_forum_message_auto' => '(ceci est un message automatique)', |
|
| 268 | - 'form_forum_pass' => 'mot de passe :', |
|
| 269 | - 'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.', |
|
| 270 | - 'form_forum_voici1' => 'Voici tes identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :', |
|
| 271 | - 'form_forum_voici2' => 'Voici tes identifiants pour proposer des articles sur |
|
| 257 | + 'form_deja_inscrit' => 'Tu es déjà inscrit.', |
|
| 258 | + 'form_email_non_valide' => 'Ton adresse email n’est pas valide.', |
|
| 259 | + 'form_forum_access_refuse' => 'Tu n’as plus accès à ce site.', |
|
| 260 | + 'form_forum_bonjour' => 'Salut @nom@,', |
|
| 261 | + 'form_forum_confirmer_email' => 'Pour confirmer ton adresse email, va à cette adresse : @url_confirm@', |
|
| 262 | + 'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, tu peux donc utiliser ton mot de passe habituel.', |
|
| 263 | + 'form_forum_identifiant_mail' => 'Ton nouvel identifiant vient de t’être envoyé par email.', |
|
| 264 | + 'form_forum_identifiants' => 'Identifiants personnels', |
|
| 265 | + 'form_forum_indiquer_nom_email' => 'Indique ici ton nom et ton adresse email. Ton identifiant personnel te parviendra rapidement, par courrier électronique.', |
|
| 266 | + 'form_forum_login' => 'login :', |
|
| 267 | + 'form_forum_message_auto' => '(ceci est un message automatique)', |
|
| 268 | + 'form_forum_pass' => 'mot de passe :', |
|
| 269 | + 'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.', |
|
| 270 | + 'form_forum_voici1' => 'Voici tes identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :', |
|
| 271 | + 'form_forum_voici2' => 'Voici tes identifiants pour proposer des articles sur |
|
| 272 | 272 | le site "@nom_site_spip@" (@adresse_login@) :', |
| 273 | - 'form_indiquer_email' => 'Indique ton adresse email.', |
|
| 274 | - 'form_indiquer_nom' => 'Indique ton nom.', |
|
| 275 | - 'form_indiquer_nom_site' => 'Indique le nom de ton site.', |
|
| 276 | - 'form_pet_deja_enregistre' => 'Ce site est déjà enregistré', |
|
| 277 | - 'form_pet_signature_pasprise' => 'Ta signature n’est pas prise en compte.', |
|
| 278 | - 'form_prop_confirmer_envoi' => 'Confirmer l’envoi', |
|
| 279 | - 'form_prop_description' => 'Description/commentaire', |
|
| 280 | - 'form_prop_enregistre' => 'Ta proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.', |
|
| 281 | - 'form_prop_envoyer' => 'Envoyer un message', |
|
| 282 | - 'form_prop_indiquer_email' => 'Indiquer une adresse email valide', |
|
| 283 | - 'form_prop_indiquer_nom_site' => 'Indiquer le nom du site.', |
|
| 284 | - 'form_prop_indiquer_sujet' => 'Indiquer un sujet', |
|
| 285 | - 'form_prop_message_envoye' => 'Message envoyé', |
|
| 286 | - 'form_prop_non_enregistre' => 'Ta proposition n’a pas été enregistrée.', |
|
| 287 | - 'form_prop_sujet' => 'Sujet', |
|
| 288 | - 'form_prop_url_site' => 'Adresse URL du site', |
|
| 289 | - 'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.', |
|
| 290 | - 'format_date_incorrecte' => 'La date ou son format est incorrect', |
|
| 291 | - 'format_heure_attendu' => 'Saisir une heure au format hh:mm.', |
|
| 292 | - 'format_heure_incorrecte' => 'L’heure ou son format est incorrect', |
|
| 293 | - 'forum_non_inscrit' => 'Tu n’es pas inscrit, ou l’adresse ou le mot de passe sont erronés.', |
|
| 294 | - 'forum_par_auteur' => 'par @auteur@', |
|
| 295 | - 'forum_titre_erreur' => 'Erreur...', |
|
| 273 | + 'form_indiquer_email' => 'Indique ton adresse email.', |
|
| 274 | + 'form_indiquer_nom' => 'Indique ton nom.', |
|
| 275 | + 'form_indiquer_nom_site' => 'Indique le nom de ton site.', |
|
| 276 | + 'form_pet_deja_enregistre' => 'Ce site est déjà enregistré', |
|
| 277 | + 'form_pet_signature_pasprise' => 'Ta signature n’est pas prise en compte.', |
|
| 278 | + 'form_prop_confirmer_envoi' => 'Confirmer l’envoi', |
|
| 279 | + 'form_prop_description' => 'Description/commentaire', |
|
| 280 | + 'form_prop_enregistre' => 'Ta proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.', |
|
| 281 | + 'form_prop_envoyer' => 'Envoyer un message', |
|
| 282 | + 'form_prop_indiquer_email' => 'Indiquer une adresse email valide', |
|
| 283 | + 'form_prop_indiquer_nom_site' => 'Indiquer le nom du site.', |
|
| 284 | + 'form_prop_indiquer_sujet' => 'Indiquer un sujet', |
|
| 285 | + 'form_prop_message_envoye' => 'Message envoyé', |
|
| 286 | + 'form_prop_non_enregistre' => 'Ta proposition n’a pas été enregistrée.', |
|
| 287 | + 'form_prop_sujet' => 'Sujet', |
|
| 288 | + 'form_prop_url_site' => 'Adresse URL du site', |
|
| 289 | + 'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.', |
|
| 290 | + 'format_date_incorrecte' => 'La date ou son format est incorrect', |
|
| 291 | + 'format_heure_attendu' => 'Saisir une heure au format hh:mm.', |
|
| 292 | + 'format_heure_incorrecte' => 'L’heure ou son format est incorrect', |
|
| 293 | + 'forum_non_inscrit' => 'Tu n’es pas inscrit, ou l’adresse ou le mot de passe sont erronés.', |
|
| 294 | + 'forum_par_auteur' => 'par @auteur@', |
|
| 295 | + 'forum_titre_erreur' => 'Erreur...', |
|
| 296 | 296 | |
| 297 | - // I |
|
| 298 | - 'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :', |
|
| 299 | - 'ical_texte_rss_articles2' => 'Tu peux également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :', |
|
| 300 | - 'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, tu obtiendras uniquement les brèves de cette rubrique.', |
|
| 301 | - 'icone_a_suivre' => 'À suivre', |
|
| 302 | - 'icone_admin_site' => 'Administration du site', |
|
| 303 | - 'icone_agenda' => 'Agenda', |
|
| 304 | - 'icone_aide_ligne' => 'Aide', |
|
| 305 | - 'icone_articles' => 'Articles', |
|
| 306 | - 'icone_auteurs' => 'Auteurs', |
|
| 307 | - 'icone_brouteur' => 'Navigation rapide', |
|
| 308 | - 'icone_configuration_site' => 'Configuration', |
|
| 309 | - 'icone_configurer_site' => 'Configurer ton site', |
|
| 310 | - 'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur', |
|
| 311 | - 'icone_creer_rubrique' => 'Créer une rubrique', |
|
| 312 | - 'icone_creer_sous_rubrique' => 'Créer une sous-rubrique', |
|
| 313 | - 'icone_deconnecter' => 'Se déconnecter', |
|
| 314 | - 'icone_discussions' => 'Discussions', |
|
| 315 | - 'icone_doc_rubrique' => 'Documents des rubriques', |
|
| 316 | - 'icone_ecrire_article' => 'Écrire un nouvel article', |
|
| 317 | - 'icone_edition_site' => 'Édition', |
|
| 318 | - 'icone_gestion_langues' => 'Gestion des langues', |
|
| 319 | - 'icone_informations_personnelles' => 'Informations personnelles', |
|
| 320 | - 'icone_interface_complet' => 'interface complète', |
|
| 321 | - 'icone_interface_simple' => 'Interface simplifiée', |
|
| 322 | - 'icone_maintenance_site' => 'Maintenance du site', |
|
| 323 | - 'icone_messagerie_personnelle' => 'Messagerie personnelle', |
|
| 324 | - 'icone_repartition_debut' => 'Afficher la répartition depuis le début', |
|
| 325 | - 'icone_rubriques' => 'Rubriques', |
|
| 326 | - 'icone_sauver_site' => 'Sauvegarde du site', |
|
| 327 | - 'icone_site_entier' => 'Tout le site', |
|
| 328 | - 'icone_sites_references' => 'Sites référencés', |
|
| 329 | - 'icone_statistiques' => 'Statistiques du site', |
|
| 330 | - 'icone_suivi_activite' => 'Suivre la vie du site', |
|
| 331 | - 'icone_suivi_actualite' => 'Évolution du site', |
|
| 332 | - 'icone_suivi_pettions' => 'Suivre/gérer les pétitions', |
|
| 333 | - 'icone_suivi_revisions' => 'Modifications des articles', |
|
| 334 | - 'icone_supprimer_document' => 'Supprimer ce document', |
|
| 335 | - 'icone_supprimer_image' => 'Supprimer cette image', |
|
| 336 | - 'icone_tous_articles' => 'Tous tes articles', |
|
| 337 | - 'icone_tous_auteur' => 'Tous les auteurs', |
|
| 338 | - 'icone_tous_visiteur' => 'Tous les visiteurs', |
|
| 339 | - 'icone_visiter_site' => 'Voir le site public', |
|
| 340 | - 'icone_voir_en_ligne' => 'Voir en ligne', |
|
| 341 | - 'img_indisponible' => 'image indisponible', |
|
| 342 | - 'impossible' => 'impossible', |
|
| 343 | - 'info_a_suivre' => 'À SUIVRE »', |
|
| 344 | - 'info_acces_interdit' => 'Accès interdit', |
|
| 345 | - 'info_acces_refuse' => 'Accès refusé', |
|
| 346 | - 'info_action' => 'Action : @action@', |
|
| 347 | - 'info_administrer_rubriques' => 'Tu peux administrer cette rubrique et ses sous-rubriques', |
|
| 348 | - 'info_adresse_non_indiquee' => 'Tu n’as pas indiqué d’adresse à tester !', |
|
| 349 | - 'info_aide' => 'AIDE :', |
|
| 350 | - 'info_ajouter_mot' => 'Ajouter ce mot', |
|
| 351 | - 'info_annonce' => 'ANNONCE', |
|
| 352 | - 'info_annonces_generales' => 'Annonces générales :', |
|
| 353 | - 'info_article_propose' => 'Article proposé', |
|
| 354 | - 'info_article_publie' => 'Article publié', |
|
| 355 | - 'info_article_redaction' => 'Article en cours de rédaction', |
|
| 356 | - 'info_article_refuse' => 'Article refusé', |
|
| 357 | - 'info_article_supprime' => 'Article supprimé', |
|
| 358 | - 'info_articles' => 'Articles', |
|
| 359 | - 'info_articles_a_valider' => 'Les articles à valider', |
|
| 360 | - 'info_articles_nb' => '@nb@ articles', |
|
| 361 | - 'info_articles_proposes' => 'Articles proposés', |
|
| 362 | - 'info_articles_un' => '1 article', |
|
| 363 | - 'info_auteurs_nombre' => 'auteur(s) :', |
|
| 364 | - 'info_authentification_ftp' => 'Authentification (par FTP).', |
|
| 365 | - 'info_breves_2' => 'brèves', |
|
| 366 | - 'info_breves_nb' => '@nb@ brèves', |
|
| 367 | - 'info_breves_un' => '1 brève', |
|
| 368 | - 'info_connexion_refusee' => 'Connexion refusée', |
|
| 369 | - 'info_contact_developpeur' => 'Contacte un développeur.', |
|
| 370 | - 'info_contenance' => 'Ce site contient :', |
|
| 371 | - 'info_contribution' => 'contributions', |
|
| 372 | - 'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.', |
|
| 373 | - 'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.', |
|
| 374 | - 'info_copyright_gpl' => 'sous licence GPL', |
|
| 375 | - 'info_cours_edition' => 'En cours de modification', |
|
| 376 | - 'info_creer_repertoire' => 'Crée un fichier ou un répertoire nommé :', |
|
| 377 | - 'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :', |
|
| 378 | - 'info_creer_vignette' => 'création automatique de la vignette', |
|
| 379 | - 'info_creerdansrubrique_non_autorise' => 'Tu n’as pas de droits suffisants pour créer un contenu dans cette rubrique', |
|
| 380 | - 'info_deplier' => 'Déplier', |
|
| 381 | - 'info_descriptif_nombre' => 'descriptif(s) :', |
|
| 382 | - 'info_description' => 'Description :', |
|
| 383 | - 'info_description_2' => 'Description :', |
|
| 384 | - 'info_dimension' => 'Dimensions :', |
|
| 385 | - 'info_documents_nb' => '@nb@ documents', |
|
| 386 | - 'info_documents_un' => '1 document', |
|
| 387 | - 'info_ecire_message_prive' => 'Écrire un message privé', |
|
| 388 | - 'info_email_invalide' => 'Adresse email invalide.', |
|
| 389 | - 'info_en_cours_validation' => 'Tes articles en cours de rédaction', |
|
| 390 | - 'info_en_ligne' => 'Actuellement en ligne :', |
|
| 391 | - 'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur', |
|
| 392 | - 'info_erreur_requete' => 'Erreur dans la requête :', |
|
| 393 | - 'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...', |
|
| 394 | - 'info_erreur_systeme' => 'Erreur système (errno @errsys@)', |
|
| 395 | - 'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br /> |
|
| 297 | + // I |
|
| 298 | + 'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :', |
|
| 299 | + 'ical_texte_rss_articles2' => 'Tu peux également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :', |
|
| 300 | + 'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, tu obtiendras uniquement les brèves de cette rubrique.', |
|
| 301 | + 'icone_a_suivre' => 'À suivre', |
|
| 302 | + 'icone_admin_site' => 'Administration du site', |
|
| 303 | + 'icone_agenda' => 'Agenda', |
|
| 304 | + 'icone_aide_ligne' => 'Aide', |
|
| 305 | + 'icone_articles' => 'Articles', |
|
| 306 | + 'icone_auteurs' => 'Auteurs', |
|
| 307 | + 'icone_brouteur' => 'Navigation rapide', |
|
| 308 | + 'icone_configuration_site' => 'Configuration', |
|
| 309 | + 'icone_configurer_site' => 'Configurer ton site', |
|
| 310 | + 'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur', |
|
| 311 | + 'icone_creer_rubrique' => 'Créer une rubrique', |
|
| 312 | + 'icone_creer_sous_rubrique' => 'Créer une sous-rubrique', |
|
| 313 | + 'icone_deconnecter' => 'Se déconnecter', |
|
| 314 | + 'icone_discussions' => 'Discussions', |
|
| 315 | + 'icone_doc_rubrique' => 'Documents des rubriques', |
|
| 316 | + 'icone_ecrire_article' => 'Écrire un nouvel article', |
|
| 317 | + 'icone_edition_site' => 'Édition', |
|
| 318 | + 'icone_gestion_langues' => 'Gestion des langues', |
|
| 319 | + 'icone_informations_personnelles' => 'Informations personnelles', |
|
| 320 | + 'icone_interface_complet' => 'interface complète', |
|
| 321 | + 'icone_interface_simple' => 'Interface simplifiée', |
|
| 322 | + 'icone_maintenance_site' => 'Maintenance du site', |
|
| 323 | + 'icone_messagerie_personnelle' => 'Messagerie personnelle', |
|
| 324 | + 'icone_repartition_debut' => 'Afficher la répartition depuis le début', |
|
| 325 | + 'icone_rubriques' => 'Rubriques', |
|
| 326 | + 'icone_sauver_site' => 'Sauvegarde du site', |
|
| 327 | + 'icone_site_entier' => 'Tout le site', |
|
| 328 | + 'icone_sites_references' => 'Sites référencés', |
|
| 329 | + 'icone_statistiques' => 'Statistiques du site', |
|
| 330 | + 'icone_suivi_activite' => 'Suivre la vie du site', |
|
| 331 | + 'icone_suivi_actualite' => 'Évolution du site', |
|
| 332 | + 'icone_suivi_pettions' => 'Suivre/gérer les pétitions', |
|
| 333 | + 'icone_suivi_revisions' => 'Modifications des articles', |
|
| 334 | + 'icone_supprimer_document' => 'Supprimer ce document', |
|
| 335 | + 'icone_supprimer_image' => 'Supprimer cette image', |
|
| 336 | + 'icone_tous_articles' => 'Tous tes articles', |
|
| 337 | + 'icone_tous_auteur' => 'Tous les auteurs', |
|
| 338 | + 'icone_tous_visiteur' => 'Tous les visiteurs', |
|
| 339 | + 'icone_visiter_site' => 'Voir le site public', |
|
| 340 | + 'icone_voir_en_ligne' => 'Voir en ligne', |
|
| 341 | + 'img_indisponible' => 'image indisponible', |
|
| 342 | + 'impossible' => 'impossible', |
|
| 343 | + 'info_a_suivre' => 'À SUIVRE »', |
|
| 344 | + 'info_acces_interdit' => 'Accès interdit', |
|
| 345 | + 'info_acces_refuse' => 'Accès refusé', |
|
| 346 | + 'info_action' => 'Action : @action@', |
|
| 347 | + 'info_administrer_rubriques' => 'Tu peux administrer cette rubrique et ses sous-rubriques', |
|
| 348 | + 'info_adresse_non_indiquee' => 'Tu n’as pas indiqué d’adresse à tester !', |
|
| 349 | + 'info_aide' => 'AIDE :', |
|
| 350 | + 'info_ajouter_mot' => 'Ajouter ce mot', |
|
| 351 | + 'info_annonce' => 'ANNONCE', |
|
| 352 | + 'info_annonces_generales' => 'Annonces générales :', |
|
| 353 | + 'info_article_propose' => 'Article proposé', |
|
| 354 | + 'info_article_publie' => 'Article publié', |
|
| 355 | + 'info_article_redaction' => 'Article en cours de rédaction', |
|
| 356 | + 'info_article_refuse' => 'Article refusé', |
|
| 357 | + 'info_article_supprime' => 'Article supprimé', |
|
| 358 | + 'info_articles' => 'Articles', |
|
| 359 | + 'info_articles_a_valider' => 'Les articles à valider', |
|
| 360 | + 'info_articles_nb' => '@nb@ articles', |
|
| 361 | + 'info_articles_proposes' => 'Articles proposés', |
|
| 362 | + 'info_articles_un' => '1 article', |
|
| 363 | + 'info_auteurs_nombre' => 'auteur(s) :', |
|
| 364 | + 'info_authentification_ftp' => 'Authentification (par FTP).', |
|
| 365 | + 'info_breves_2' => 'brèves', |
|
| 366 | + 'info_breves_nb' => '@nb@ brèves', |
|
| 367 | + 'info_breves_un' => '1 brève', |
|
| 368 | + 'info_connexion_refusee' => 'Connexion refusée', |
|
| 369 | + 'info_contact_developpeur' => 'Contacte un développeur.', |
|
| 370 | + 'info_contenance' => 'Ce site contient :', |
|
| 371 | + 'info_contribution' => 'contributions', |
|
| 372 | + 'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.', |
|
| 373 | + 'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.', |
|
| 374 | + 'info_copyright_gpl' => 'sous licence GPL', |
|
| 375 | + 'info_cours_edition' => 'En cours de modification', |
|
| 376 | + 'info_creer_repertoire' => 'Crée un fichier ou un répertoire nommé :', |
|
| 377 | + 'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :', |
|
| 378 | + 'info_creer_vignette' => 'création automatique de la vignette', |
|
| 379 | + 'info_creerdansrubrique_non_autorise' => 'Tu n’as pas de droits suffisants pour créer un contenu dans cette rubrique', |
|
| 380 | + 'info_deplier' => 'Déplier', |
|
| 381 | + 'info_descriptif_nombre' => 'descriptif(s) :', |
|
| 382 | + 'info_description' => 'Description :', |
|
| 383 | + 'info_description_2' => 'Description :', |
|
| 384 | + 'info_dimension' => 'Dimensions :', |
|
| 385 | + 'info_documents_nb' => '@nb@ documents', |
|
| 386 | + 'info_documents_un' => '1 document', |
|
| 387 | + 'info_ecire_message_prive' => 'Écrire un message privé', |
|
| 388 | + 'info_email_invalide' => 'Adresse email invalide.', |
|
| 389 | + 'info_en_cours_validation' => 'Tes articles en cours de rédaction', |
|
| 390 | + 'info_en_ligne' => 'Actuellement en ligne :', |
|
| 391 | + 'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur', |
|
| 392 | + 'info_erreur_requete' => 'Erreur dans la requête :', |
|
| 393 | + 'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...', |
|
| 394 | + 'info_erreur_systeme' => 'Erreur système (errno @errsys@)', |
|
| 395 | + 'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br /> |
|
| 396 | 396 | <span style="color:red;">Essaie de <a href=\'@script@\'>réparer la base</a>, ou contacte ton hébergeur.</span>', |
| 397 | - 'info_fini' => 'C’est fini !', |
|
| 398 | - 'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.', |
|
| 399 | - 'info_format_non_defini' => 'format non défini', |
|
| 400 | - 'info_grand_ecran' => 'Grand écran', |
|
| 401 | - 'info_image_aide' => 'AIDE', |
|
| 402 | - 'info_image_process_titre' => 'Comment faire de nouveaux signets', |
|
| 403 | - 'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ', |
|
| 404 | - 'info_installation_systeme_publication' => 'Installation du système de publication...', |
|
| 405 | - 'info_installer_documents' => 'Tu peux installer automatiquement tous les documents contenus dans le dossier @upload@.', |
|
| 406 | - 'info_installer_ftp' => 'En tant qu’administrateur, tu peux installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.', |
|
| 407 | - 'info_installer_images' => 'Tu peux installer des images aux formats JPEG, GIF et PNG.', |
|
| 408 | - 'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.', |
|
| 409 | - 'info_interface_complete' => 'interface complète', |
|
| 410 | - 'info_interface_simple' => 'Interface simplifiée', |
|
| 411 | - 'info_joindre_document_article' => 'Tu peux joindre à cet article des documents de type', |
|
| 412 | - 'info_joindre_document_rubrique' => 'Tu peux ajouter dans cette rubrique des documents de type', |
|
| 413 | - 'info_joindre_documents_article' => 'Tu peux joindre à ton article des documents de type :', |
|
| 414 | - 'info_l_article' => 'l’article', |
|
| 415 | - 'info_la_breve' => 'la brève', |
|
| 416 | - 'info_la_rubrique' => 'la rubrique', |
|
| 417 | - 'info_langue_principale' => 'Langue principale du site', |
|
| 418 | - 'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels', |
|
| 419 | - 'info_les_auteurs_1' => 'par @les_auteurs@', |
|
| 420 | - 'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.', |
|
| 421 | - 'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).', |
|
| 422 | - 'info_mail_fournisseur' => '[email protected]', |
|
| 423 | - 'info_message_2' => 'MESSAGE', |
|
| 424 | - 'info_message_supprime' => 'MESSAGE SUPPRIMÉ', |
|
| 425 | - 'info_messages_nb' => '@nb@ messages', |
|
| 426 | - 'info_messages_un' => '1 message', |
|
| 427 | - 'info_mise_en_ligne' => 'Date de mise en ligne :', |
|
| 428 | - 'info_modification_parametres_securite' => 'modifications des paramètres de sécurité', |
|
| 429 | - 'info_mois_courant' => 'Dans le courant du mois :', |
|
| 430 | - 'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à', |
|
| 431 | - 'info_multi_herit' => 'Langue par défaut', |
|
| 432 | - 'info_multi_langues_soulignees' => 'Les <u>langues soulignées</u> bénéficient d’une traduction totale ou partielle des textes de l’interface. Si tu sélectionnes ces langues, de nombreux éléments du site public (dates, formulaires) seront automatiquement traduits. Pour les langues non soulignées, ces éléments apparaîtront dans la langue principale du site.', |
|
| 433 | - 'info_multilinguisme' => 'Multilinguisme', |
|
| 434 | - 'info_nom_non_utilisateurs_connectes' => 'Ton nom n’apparaît pas dans la liste des utilisateurs connectés.', |
|
| 435 | - 'info_nom_utilisateurs_connectes' => 'Ton nom apparaît dans la liste des utilisateurs connectés.', |
|
| 436 | - 'info_nombre_en_ligne' => 'Actuellement en ligne :', |
|
| 437 | - 'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"', |
|
| 438 | - 'info_non_utilisation_messagerie' => 'Tu n’utilise pas la messagerie interne de ce site.', |
|
| 439 | - 'info_nouveau_message' => 'TU AS UN NOUVEAU MESSAGE', |
|
| 440 | - 'info_nouveaux_messages' => 'TU AS @total_messages@ NOUVEAUX MESSAGES', |
|
| 441 | - 'info_numero_abbreviation' => 'N° ', |
|
| 442 | - 'info_obligatoire' => 'Cette information est obligatoire', |
|
| 443 | - 'info_page_actuelle' => 'Page actuelle', |
|
| 444 | - 'info_pense_bete' => 'PENSE-BÊTE', |
|
| 445 | - 'info_petit_ecran' => 'Petit écran', |
|
| 446 | - 'info_petition_close' => 'Pétition close', |
|
| 447 | - 'info_pixels' => 'pixels', |
|
| 448 | - 'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :', |
|
| 449 | - 'info_portfolio_automatique' => 'Portfolio automatique :', |
|
| 450 | - 'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]', |
|
| 451 | - 'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]', |
|
| 452 | - 'info_propose_1' => '[@nom_site_spip@] Propose : @titre@', |
|
| 453 | - 'info_propose_2' => 'Article proposé |
|
| 397 | + 'info_fini' => 'C’est fini !', |
|
| 398 | + 'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.', |
|
| 399 | + 'info_format_non_defini' => 'format non défini', |
|
| 400 | + 'info_grand_ecran' => 'Grand écran', |
|
| 401 | + 'info_image_aide' => 'AIDE', |
|
| 402 | + 'info_image_process_titre' => 'Comment faire de nouveaux signets', |
|
| 403 | + 'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ', |
|
| 404 | + 'info_installation_systeme_publication' => 'Installation du système de publication...', |
|
| 405 | + 'info_installer_documents' => 'Tu peux installer automatiquement tous les documents contenus dans le dossier @upload@.', |
|
| 406 | + 'info_installer_ftp' => 'En tant qu’administrateur, tu peux installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.', |
|
| 407 | + 'info_installer_images' => 'Tu peux installer des images aux formats JPEG, GIF et PNG.', |
|
| 408 | + 'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.', |
|
| 409 | + 'info_interface_complete' => 'interface complète', |
|
| 410 | + 'info_interface_simple' => 'Interface simplifiée', |
|
| 411 | + 'info_joindre_document_article' => 'Tu peux joindre à cet article des documents de type', |
|
| 412 | + 'info_joindre_document_rubrique' => 'Tu peux ajouter dans cette rubrique des documents de type', |
|
| 413 | + 'info_joindre_documents_article' => 'Tu peux joindre à ton article des documents de type :', |
|
| 414 | + 'info_l_article' => 'l’article', |
|
| 415 | + 'info_la_breve' => 'la brève', |
|
| 416 | + 'info_la_rubrique' => 'la rubrique', |
|
| 417 | + 'info_langue_principale' => 'Langue principale du site', |
|
| 418 | + 'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels', |
|
| 419 | + 'info_les_auteurs_1' => 'par @les_auteurs@', |
|
| 420 | + 'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.', |
|
| 421 | + 'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).', |
|
| 422 | + 'info_mail_fournisseur' => '[email protected]', |
|
| 423 | + 'info_message_2' => 'MESSAGE', |
|
| 424 | + 'info_message_supprime' => 'MESSAGE SUPPRIMÉ', |
|
| 425 | + 'info_messages_nb' => '@nb@ messages', |
|
| 426 | + 'info_messages_un' => '1 message', |
|
| 427 | + 'info_mise_en_ligne' => 'Date de mise en ligne :', |
|
| 428 | + 'info_modification_parametres_securite' => 'modifications des paramètres de sécurité', |
|
| 429 | + 'info_mois_courant' => 'Dans le courant du mois :', |
|
| 430 | + 'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à', |
|
| 431 | + 'info_multi_herit' => 'Langue par défaut', |
|
| 432 | + 'info_multi_langues_soulignees' => 'Les <u>langues soulignées</u> bénéficient d’une traduction totale ou partielle des textes de l’interface. Si tu sélectionnes ces langues, de nombreux éléments du site public (dates, formulaires) seront automatiquement traduits. Pour les langues non soulignées, ces éléments apparaîtront dans la langue principale du site.', |
|
| 433 | + 'info_multilinguisme' => 'Multilinguisme', |
|
| 434 | + 'info_nom_non_utilisateurs_connectes' => 'Ton nom n’apparaît pas dans la liste des utilisateurs connectés.', |
|
| 435 | + 'info_nom_utilisateurs_connectes' => 'Ton nom apparaît dans la liste des utilisateurs connectés.', |
|
| 436 | + 'info_nombre_en_ligne' => 'Actuellement en ligne :', |
|
| 437 | + 'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"', |
|
| 438 | + 'info_non_utilisation_messagerie' => 'Tu n’utilise pas la messagerie interne de ce site.', |
|
| 439 | + 'info_nouveau_message' => 'TU AS UN NOUVEAU MESSAGE', |
|
| 440 | + 'info_nouveaux_messages' => 'TU AS @total_messages@ NOUVEAUX MESSAGES', |
|
| 441 | + 'info_numero_abbreviation' => 'N° ', |
|
| 442 | + 'info_obligatoire' => 'Cette information est obligatoire', |
|
| 443 | + 'info_page_actuelle' => 'Page actuelle', |
|
| 444 | + 'info_pense_bete' => 'PENSE-BÊTE', |
|
| 445 | + 'info_petit_ecran' => 'Petit écran', |
|
| 446 | + 'info_petition_close' => 'Pétition close', |
|
| 447 | + 'info_pixels' => 'pixels', |
|
| 448 | + 'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :', |
|
| 449 | + 'info_portfolio_automatique' => 'Portfolio automatique :', |
|
| 450 | + 'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]', |
|
| 451 | + 'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]', |
|
| 452 | + 'info_propose_1' => '[@nom_site_spip@] Propose : @titre@', |
|
| 453 | + 'info_propose_2' => 'Article proposé |
|
| 454 | 454 | ---------------', |
| 455 | - 'info_propose_3' => 'L’article "@titre@" est proposé à la publication.', |
|
| 456 | - 'info_propose_4' => 'Tu es invité à venir le consulter et à donner ton opinion', |
|
| 457 | - 'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :', |
|
| 458 | - 'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.', |
|
| 459 | - 'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@', |
|
| 460 | - 'info_publie_2' => 'Article publié |
|
| 455 | + 'info_propose_3' => 'L’article "@titre@" est proposé à la publication.', |
|
| 456 | + 'info_propose_4' => 'Tu es invité à venir le consulter et à donner ton opinion', |
|
| 457 | + 'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :', |
|
| 458 | + 'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.', |
|
| 459 | + 'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@', |
|
| 460 | + 'info_publie_2' => 'Article publié |
|
| 461 | 461 | --------------', |
| 462 | - 'info_rechercher' => 'Rechercher', |
|
| 463 | - 'info_rechercher_02' => 'Rechercher :', |
|
| 464 | - 'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :', |
|
| 465 | - 'info_rubriques_nb' => '@nb@ rubriques', |
|
| 466 | - 'info_rubriques_un' => '1 rubrique', |
|
| 467 | - 'info_sans_titre_2' => 'sans titre', |
|
| 468 | - 'info_selectionner_fichier' => 'Tu peux sélectionner un fichier du dossier @upload@', |
|
| 469 | - 'info_selectionner_fichier_2' => 'Sélectionner un fichier :', |
|
| 470 | - 'info_sites_nb' => '@nb@ sites', |
|
| 471 | - 'info_sites_un' => '1 site', |
|
| 472 | - 'info_supprimer_vignette' => 'supprimer la vignette', |
|
| 473 | - 'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à ton usage personnel.', |
|
| 474 | - 'info_symbole_jaune' => 'Le symbole <b>jaune</b> indique une <b>annonce à tous les rédacteurs</b> : modifiable par tous les administrateurs, et visible par tous les rédacteurs.', |
|
| 475 | - 'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.', |
|
| 476 | - 'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :', |
|
| 477 | - 'info_telecharger_ordinateur' => 'Télécharger depuis ton ordinateur :', |
|
| 478 | - 'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]', |
|
| 479 | - 'info_tout_afficher' => 'Tout afficher', |
|
| 480 | - 'info_travaux_texte' => 'Ce site n’est pas encore configuré. Reviens plus tard...', |
|
| 481 | - 'info_travaux_titre' => 'Site en travaux', |
|
| 482 | - 'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; affine la recherche.', |
|
| 483 | - 'info_utilisation_messagerie_interne' => 'Tu utilises la messagerie interne de ce site.', |
|
| 484 | - 'info_valider_lien' => 'valider ce lien', |
|
| 485 | - 'info_verifier_image' => ', vérifie que tes images ont été transférées correctement.', |
|
| 486 | - 'info_vignette_defaut' => 'Vignette par défaut', |
|
| 487 | - 'info_vignette_personnalisee' => 'Vignette personnalisée', |
|
| 488 | - 'info_visite' => 'visite :', |
|
| 489 | - 'info_vos_rendez_vous' => 'Tes rendez-vous à venir', |
|
| 490 | - 'infos_vos_pense_bete' => 'Tes pense-bêtes', |
|
| 462 | + 'info_rechercher' => 'Rechercher', |
|
| 463 | + 'info_rechercher_02' => 'Rechercher :', |
|
| 464 | + 'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :', |
|
| 465 | + 'info_rubriques_nb' => '@nb@ rubriques', |
|
| 466 | + 'info_rubriques_un' => '1 rubrique', |
|
| 467 | + 'info_sans_titre_2' => 'sans titre', |
|
| 468 | + 'info_selectionner_fichier' => 'Tu peux sélectionner un fichier du dossier @upload@', |
|
| 469 | + 'info_selectionner_fichier_2' => 'Sélectionner un fichier :', |
|
| 470 | + 'info_sites_nb' => '@nb@ sites', |
|
| 471 | + 'info_sites_un' => '1 site', |
|
| 472 | + 'info_supprimer_vignette' => 'supprimer la vignette', |
|
| 473 | + 'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à ton usage personnel.', |
|
| 474 | + 'info_symbole_jaune' => 'Le symbole <b>jaune</b> indique une <b>annonce à tous les rédacteurs</b> : modifiable par tous les administrateurs, et visible par tous les rédacteurs.', |
|
| 475 | + 'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.', |
|
| 476 | + 'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :', |
|
| 477 | + 'info_telecharger_ordinateur' => 'Télécharger depuis ton ordinateur :', |
|
| 478 | + 'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]', |
|
| 479 | + 'info_tout_afficher' => 'Tout afficher', |
|
| 480 | + 'info_travaux_texte' => 'Ce site n’est pas encore configuré. Reviens plus tard...', |
|
| 481 | + 'info_travaux_titre' => 'Site en travaux', |
|
| 482 | + 'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; affine la recherche.', |
|
| 483 | + 'info_utilisation_messagerie_interne' => 'Tu utilises la messagerie interne de ce site.', |
|
| 484 | + 'info_valider_lien' => 'valider ce lien', |
|
| 485 | + 'info_verifier_image' => ', vérifie que tes images ont été transférées correctement.', |
|
| 486 | + 'info_vignette_defaut' => 'Vignette par défaut', |
|
| 487 | + 'info_vignette_personnalisee' => 'Vignette personnalisée', |
|
| 488 | + 'info_visite' => 'visite :', |
|
| 489 | + 'info_vos_rendez_vous' => 'Tes rendez-vous à venir', |
|
| 490 | + 'infos_vos_pense_bete' => 'Tes pense-bêtes', |
|
| 491 | 491 | |
| 492 | - // L |
|
| 493 | - 'label_ajout_id_rapide' => 'Ajout rapide', |
|
| 494 | - 'label_poids_fichier' => 'Taille', |
|
| 495 | - 'label_ponctuer' => '@label@ :', |
|
| 496 | - 'lien_afficher_icones_seuls' => 'Afficher uniquement les icones', |
|
| 497 | - 'lien_afficher_texte_icones' => 'Afficher les icones et le texte', |
|
| 498 | - 'lien_afficher_texte_seul' => 'Afficher uniquement le texte', |
|
| 499 | - 'lien_aller_a_la_derniere_page' => 'Aller à la dernière page', |
|
| 500 | - 'lien_aller_a_la_page_nb' => 'Aller à la page @nb@', |
|
| 501 | - 'lien_aller_a_la_page_precedente' => 'Aller à la page précédente', |
|
| 502 | - 'lien_aller_a_la_page_suivante' => 'Aller à la page suivante', |
|
| 503 | - 'lien_aller_a_la_premiere_page' => 'Aller à la première page', |
|
| 504 | - 'lien_liberer' => 'libérer', |
|
| 505 | - 'lien_liberer_tous' => 'Tout libérer', |
|
| 506 | - 'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE', |
|
| 507 | - 'lien_nouveau_message' => 'NOUVEAU MESSAGE', |
|
| 508 | - 'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE', |
|
| 509 | - 'lien_petitions' => 'PÉTITION', |
|
| 510 | - 'lien_popularite' => 'popularité : @popularite@%', |
|
| 511 | - 'lien_racine_site' => 'RACINE DU SITE', |
|
| 512 | - 'lien_reessayer' => 'réessayer', |
|
| 513 | - 'lien_repondre_message' => 'Répondre à ce message', |
|
| 514 | - 'lien_supprimer' => 'supprimer', |
|
| 515 | - 'lien_tout_afficher' => 'Tout afficher', |
|
| 516 | - 'lien_visite_site' => 'visiter ce site', |
|
| 517 | - 'lien_visites' => '@visites@ visites', |
|
| 518 | - 'lien_voir_auteur' => 'Voir cet auteur', |
|
| 519 | - 'ligne' => 'Ligne', |
|
| 520 | - 'login' => 'Connexion', |
|
| 521 | - 'login_acces_prive' => 'accès à l’espace privé', |
|
| 522 | - 'login_autre_identifiant' => 'se connecter sous un autre identifiant', |
|
| 523 | - 'login_cookie_accepte' => 'Régle ton navigateur pour qu’il les accepte (au moins pour ce site).', |
|
| 524 | - 'login_cookie_oblige' => 'Pour t’identifier de façon sûre sur ce site, tu dois accepter les cookies.', |
|
| 525 | - 'login_deconnexion_ok' => 'Déconnexion effectuée.', |
|
| 526 | - 'login_erreur_pass' => 'Erreur de mot de passe.', |
|
| 527 | - 'login_espace_prive' => 'espace privé', |
|
| 528 | - 'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.', |
|
| 529 | - 'login_login' => 'Login :', |
|
| 530 | - 'login_login2' => 'Login ou adresse email@circ@ :', |
|
| 531 | - 'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)', |
|
| 532 | - 'login_motpasseoublie' => 'mot de passe oublié ?', |
|
| 533 | - 'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé. |
|
| 492 | + // L |
|
| 493 | + 'label_ajout_id_rapide' => 'Ajout rapide', |
|
| 494 | + 'label_poids_fichier' => 'Taille', |
|
| 495 | + 'label_ponctuer' => '@label@ :', |
|
| 496 | + 'lien_afficher_icones_seuls' => 'Afficher uniquement les icones', |
|
| 497 | + 'lien_afficher_texte_icones' => 'Afficher les icones et le texte', |
|
| 498 | + 'lien_afficher_texte_seul' => 'Afficher uniquement le texte', |
|
| 499 | + 'lien_aller_a_la_derniere_page' => 'Aller à la dernière page', |
|
| 500 | + 'lien_aller_a_la_page_nb' => 'Aller à la page @nb@', |
|
| 501 | + 'lien_aller_a_la_page_precedente' => 'Aller à la page précédente', |
|
| 502 | + 'lien_aller_a_la_page_suivante' => 'Aller à la page suivante', |
|
| 503 | + 'lien_aller_a_la_premiere_page' => 'Aller à la première page', |
|
| 504 | + 'lien_liberer' => 'libérer', |
|
| 505 | + 'lien_liberer_tous' => 'Tout libérer', |
|
| 506 | + 'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE', |
|
| 507 | + 'lien_nouveau_message' => 'NOUVEAU MESSAGE', |
|
| 508 | + 'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE', |
|
| 509 | + 'lien_petitions' => 'PÉTITION', |
|
| 510 | + 'lien_popularite' => 'popularité : @popularite@%', |
|
| 511 | + 'lien_racine_site' => 'RACINE DU SITE', |
|
| 512 | + 'lien_reessayer' => 'réessayer', |
|
| 513 | + 'lien_repondre_message' => 'Répondre à ce message', |
|
| 514 | + 'lien_supprimer' => 'supprimer', |
|
| 515 | + 'lien_tout_afficher' => 'Tout afficher', |
|
| 516 | + 'lien_visite_site' => 'visiter ce site', |
|
| 517 | + 'lien_visites' => '@visites@ visites', |
|
| 518 | + 'lien_voir_auteur' => 'Voir cet auteur', |
|
| 519 | + 'ligne' => 'Ligne', |
|
| 520 | + 'login' => 'Connexion', |
|
| 521 | + 'login_acces_prive' => 'accès à l’espace privé', |
|
| 522 | + 'login_autre_identifiant' => 'se connecter sous un autre identifiant', |
|
| 523 | + 'login_cookie_accepte' => 'Régle ton navigateur pour qu’il les accepte (au moins pour ce site).', |
|
| 524 | + 'login_cookie_oblige' => 'Pour t’identifier de façon sûre sur ce site, tu dois accepter les cookies.', |
|
| 525 | + 'login_deconnexion_ok' => 'Déconnexion effectuée.', |
|
| 526 | + 'login_erreur_pass' => 'Erreur de mot de passe.', |
|
| 527 | + 'login_espace_prive' => 'espace privé', |
|
| 528 | + 'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.', |
|
| 529 | + 'login_login' => 'Login :', |
|
| 530 | + 'login_login2' => 'Login ou adresse email@circ@ :', |
|
| 531 | + 'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)', |
|
| 532 | + 'login_motpasseoublie' => 'mot de passe oublié ?', |
|
| 533 | + 'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé. |
|
| 534 | 534 | Si tu ne veux pas que ton mot de passe puisse être |
| 535 | 535 | intercepté sur le réseau, active Javascript |
| 536 | 536 | dans ton navigateur et', |
| 537 | - 'login_nouvelle_tentative' => 'Nouvelle tentative', |
|
| 538 | - 'login_par_ici' => 'Tu es enregistré... par ici...', |
|
| 539 | - 'login_pass2' => 'Mot de passe :', |
|
| 540 | - 'login_preferez_refuser' => '<b>Si tu préfére refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à ta disposition :', |
|
| 541 | - 'login_recharger' => 'recharger cette page', |
|
| 542 | - 'login_rester_identifie' => 'Se souvenir de moi', |
|
| 543 | - 'login_retour_public' => 'Retour au site public', |
|
| 544 | - 'login_retour_site' => 'Retour au site public', |
|
| 545 | - 'login_retoursitepublic' => 'retour au site public', |
|
| 546 | - 'login_sans_cookie' => 'Identification sans cookie', |
|
| 547 | - 'login_securise' => 'Login sécurisé', |
|
| 548 | - 'login_sinscrire' => 's’inscrire', |
|
| 549 | - 'login_test_navigateur' => 'test navigateur/reconnexion', |
|
| 550 | - 'login_verifiez_navigateur' => '(Vérifie toutefois que ton navigateur n’a pas mémorisé ton mot de passe...)', |
|
| 537 | + 'login_nouvelle_tentative' => 'Nouvelle tentative', |
|
| 538 | + 'login_par_ici' => 'Tu es enregistré... par ici...', |
|
| 539 | + 'login_pass2' => 'Mot de passe :', |
|
| 540 | + 'login_preferez_refuser' => '<b>Si tu préfére refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à ta disposition :', |
|
| 541 | + 'login_recharger' => 'recharger cette page', |
|
| 542 | + 'login_rester_identifie' => 'Se souvenir de moi', |
|
| 543 | + 'login_retour_public' => 'Retour au site public', |
|
| 544 | + 'login_retour_site' => 'Retour au site public', |
|
| 545 | + 'login_retoursitepublic' => 'retour au site public', |
|
| 546 | + 'login_sans_cookie' => 'Identification sans cookie', |
|
| 547 | + 'login_securise' => 'Login sécurisé', |
|
| 548 | + 'login_sinscrire' => 's’inscrire', |
|
| 549 | + 'login_test_navigateur' => 'test navigateur/reconnexion', |
|
| 550 | + 'login_verifiez_navigateur' => '(Vérifie toutefois que ton navigateur n’a pas mémorisé ton mot de passe...)', |
|
| 551 | 551 | |
| 552 | - // M |
|
| 553 | - 'masquer_colonne' => 'Masquer cette colonne', |
|
| 554 | - 'masquer_trad' => 'masquer les traductions', |
|
| 555 | - 'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.', |
|
| 556 | - 'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.', |
|
| 557 | - 'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.', |
|
| 558 | - 'module_fichiers_langues' => 'Fichiers de langue', |
|
| 552 | + // M |
|
| 553 | + 'masquer_colonne' => 'Masquer cette colonne', |
|
| 554 | + 'masquer_trad' => 'masquer les traductions', |
|
| 555 | + 'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.', |
|
| 556 | + 'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.', |
|
| 557 | + 'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.', |
|
| 558 | + 'module_fichiers_langues' => 'Fichiers de langue', |
|
| 559 | 559 | |
| 560 | - // N |
|
| 561 | - 'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.', |
|
| 562 | - 'numero' => 'Numéro', |
|
| 560 | + // N |
|
| 561 | + 'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.', |
|
| 562 | + 'numero' => 'Numéro', |
|
| 563 | 563 | |
| 564 | - // O |
|
| 565 | - 'occurence' => 'Occurence', |
|
| 566 | - 'onglet_affacer_base' => 'Effacer la base', |
|
| 567 | - 'onglet_auteur' => 'L’auteur', |
|
| 568 | - 'onglet_contenu_site' => 'Contenu du site', |
|
| 569 | - 'onglet_evolution_visite_mod' => 'Évolution', |
|
| 570 | - 'onglet_fonctions_avances' => 'Fonctions avancées', |
|
| 571 | - 'onglet_informations_personnelles' => 'Informations personnelles', |
|
| 572 | - 'onglet_interactivite' => 'Interactivité', |
|
| 573 | - 'onglet_messagerie' => 'Messagerie', |
|
| 574 | - 'onglet_repartition_rubrique' => 'Répartition par rubriques', |
|
| 575 | - 'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base', |
|
| 576 | - 'onglet_vider_cache' => 'Vider le cache', |
|
| 564 | + // O |
|
| 565 | + 'occurence' => 'Occurence', |
|
| 566 | + 'onglet_affacer_base' => 'Effacer la base', |
|
| 567 | + 'onglet_auteur' => 'L’auteur', |
|
| 568 | + 'onglet_contenu_site' => 'Contenu du site', |
|
| 569 | + 'onglet_evolution_visite_mod' => 'Évolution', |
|
| 570 | + 'onglet_fonctions_avances' => 'Fonctions avancées', |
|
| 571 | + 'onglet_informations_personnelles' => 'Informations personnelles', |
|
| 572 | + 'onglet_interactivite' => 'Interactivité', |
|
| 573 | + 'onglet_messagerie' => 'Messagerie', |
|
| 574 | + 'onglet_repartition_rubrique' => 'Répartition par rubriques', |
|
| 575 | + 'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base', |
|
| 576 | + 'onglet_vider_cache' => 'Vider le cache', |
|
| 577 | 577 | |
| 578 | - // P |
|
| 579 | - 'pass_choix_pass' => 'Choisis ton nouveau mot de passe :', |
|
| 580 | - 'pass_erreur' => 'Erreur', |
|
| 581 | - 'pass_erreur_acces_refuse' => '<b>Erreur :</b> tu n’as plus accès à ce site.', |
|
| 582 | - 'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.', |
|
| 583 | - 'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.', |
|
| 584 | - 'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !', |
|
| 585 | - 'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.', |
|
| 586 | - 'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux |
|
| 578 | + // P |
|
| 579 | + 'pass_choix_pass' => 'Choisis ton nouveau mot de passe :', |
|
| 580 | + 'pass_erreur' => 'Erreur', |
|
| 581 | + 'pass_erreur_acces_refuse' => '<b>Erreur :</b> tu n’as plus accès à ce site.', |
|
| 582 | + 'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.', |
|
| 583 | + 'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.', |
|
| 584 | + 'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !', |
|
| 585 | + 'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.', |
|
| 586 | + 'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux |
|
| 587 | 587 | visiteurs, après inscription. Une fois enregistré, |
| 588 | 588 | tu pourras consulter les articles en cours de rédaction, |
| 589 | 589 | proposer des articles et participer à tous les forums.', |
| 590 | - 'pass_forum_bla' => 'Tu as demandé à intervenir sur un forum |
|
| 590 | + 'pass_forum_bla' => 'Tu as demandé à intervenir sur un forum |
|
| 591 | 591 | réservé aux visiteurs enregistrés.', |
| 592 | - 'pass_indiquez_cidessous' => 'Indique ci-dessous l’adresse email sous laquelle tu |
|
| 592 | + 'pass_indiquez_cidessous' => 'Indique ci-dessous l’adresse email sous laquelle tu |
|
| 593 | 593 | t’es précédemment enregistré. Tu |
| 594 | 594 | recevras un email t’indiquant la marche à suivre pour |
| 595 | 595 | récupérer ton accès.', |
| 596 | - 'pass_mail_passcookie' => '(ceci est un message automatique) |
|
| 596 | + 'pass_mail_passcookie' => '(ceci est un message automatique) |
|
| 597 | 597 | Pour retrouver ton accès au site |
| 598 | 598 | @nom_site_spip@ (@adresse_site@) |
| 599 | 599 | Rends toi à l’adresse suivante : |
@@ -604,146 +604,146 @@ discard block |
||
| 604 | 604 | et te reconnecter au site. |
| 605 | 605 | |
| 606 | 606 | ', |
| 607 | - 'pass_mot_oublie' => 'Mot de passe oublié', |
|
| 608 | - 'pass_nouveau_enregistre' => 'Ton nouveau mot de passe a été enregistré.', |
|
| 609 | - 'pass_nouveau_pass' => 'Nouveau mot de passe', |
|
| 610 | - 'pass_ok' => 'OK', |
|
| 611 | - 'pass_oubli_mot' => 'Oubli du mot de passe', |
|
| 612 | - 'pass_procedure_changer' => 'Pour changer ton mot de passe, merci d’indiquer l’adresse email associée à ton compte.', |
|
| 613 | - 'pass_quitter_fenetre' => 'Quitter cette fenêtre', |
|
| 614 | - 'pass_rappel_login' => 'Rappel : ton identifiant (login) est « @login@ ».', |
|
| 615 | - 'pass_recevoir_mail' => 'Un lien de réinitialisation de ton mot de passe t’a été envoyé sur ton adresse email (si celle-ci est valide).', |
|
| 616 | - 'pass_retour_public' => 'Retour sur le site public', |
|
| 617 | - 'pass_rien_a_faire_ici' => 'Rien à faire ici.', |
|
| 618 | - 'pass_vousinscrire' => 'T’inscrire sur ce site', |
|
| 619 | - 'precedent' => 'précédent', |
|
| 620 | - 'previsualisation' => 'Prévisualisation', |
|
| 621 | - 'previsualiser' => 'Prévisualiser', |
|
| 607 | + 'pass_mot_oublie' => 'Mot de passe oublié', |
|
| 608 | + 'pass_nouveau_enregistre' => 'Ton nouveau mot de passe a été enregistré.', |
|
| 609 | + 'pass_nouveau_pass' => 'Nouveau mot de passe', |
|
| 610 | + 'pass_ok' => 'OK', |
|
| 611 | + 'pass_oubli_mot' => 'Oubli du mot de passe', |
|
| 612 | + 'pass_procedure_changer' => 'Pour changer ton mot de passe, merci d’indiquer l’adresse email associée à ton compte.', |
|
| 613 | + 'pass_quitter_fenetre' => 'Quitter cette fenêtre', |
|
| 614 | + 'pass_rappel_login' => 'Rappel : ton identifiant (login) est « @login@ ».', |
|
| 615 | + 'pass_recevoir_mail' => 'Un lien de réinitialisation de ton mot de passe t’a été envoyé sur ton adresse email (si celle-ci est valide).', |
|
| 616 | + 'pass_retour_public' => 'Retour sur le site public', |
|
| 617 | + 'pass_rien_a_faire_ici' => 'Rien à faire ici.', |
|
| 618 | + 'pass_vousinscrire' => 'T’inscrire sur ce site', |
|
| 619 | + 'precedent' => 'précédent', |
|
| 620 | + 'previsualisation' => 'Prévisualisation', |
|
| 621 | + 'previsualiser' => 'Prévisualiser', |
|
| 622 | 622 | |
| 623 | - // R |
|
| 624 | - 'retour' => 'Retour', |
|
| 623 | + // R |
|
| 624 | + 'retour' => 'Retour', |
|
| 625 | 625 | |
| 626 | - // S |
|
| 627 | - 'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :', |
|
| 628 | - 'squelette' => 'squelette', |
|
| 629 | - 'squelette_inclus_ligne' => 'squelette inclus, ligne', |
|
| 630 | - 'squelette_ligne' => 'squelette, ligne', |
|
| 631 | - 'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@', |
|
| 632 | - 'suivant' => 'suivant', |
|
| 626 | + // S |
|
| 627 | + 'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :', |
|
| 628 | + 'squelette' => 'squelette', |
|
| 629 | + 'squelette_inclus_ligne' => 'squelette inclus, ligne', |
|
| 630 | + 'squelette_ligne' => 'squelette, ligne', |
|
| 631 | + 'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@', |
|
| 632 | + 'suivant' => 'suivant', |
|
| 633 | 633 | |
| 634 | - // T |
|
| 635 | - 'taille_go' => '@taille@ Go', |
|
| 636 | - 'taille_ko' => '@taille@ ko', |
|
| 637 | - 'taille_mo' => '@taille@ Mo', |
|
| 638 | - 'taille_octets' => '@taille@ octets', |
|
| 639 | - 'texte_actualite_site_1' => 'Quand tu seras familiarisé(e) avec l’interface, tu pourras cliquer sur « ', |
|
| 640 | - 'texte_actualite_site_2' => 'interface complète', |
|
| 641 | - 'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.', |
|
| 642 | - 'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si tu installe à partir de ce formulaire des images au(x) format(s) @gd_formats@, elles seront accompagnées d’une vignette d’une taille maximale de @taille_preview@ pixels.', |
|
| 643 | - 'texte_documents_associes' => 'Les documents suivants sont associés à l’article, |
|
| 634 | + // T |
|
| 635 | + 'taille_go' => '@taille@ Go', |
|
| 636 | + 'taille_ko' => '@taille@ ko', |
|
| 637 | + 'taille_mo' => '@taille@ Mo', |
|
| 638 | + 'taille_octets' => '@taille@ octets', |
|
| 639 | + 'texte_actualite_site_1' => 'Quand tu seras familiarisé(e) avec l’interface, tu pourras cliquer sur « ', |
|
| 640 | + 'texte_actualite_site_2' => 'interface complète', |
|
| 641 | + 'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.', |
|
| 642 | + 'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si tu installe à partir de ce formulaire des images au(x) format(s) @gd_formats@, elles seront accompagnées d’une vignette d’une taille maximale de @taille_preview@ pixels.', |
|
| 643 | + 'texte_documents_associes' => 'Les documents suivants sont associés à l’article, |
|
| 644 | 644 | mais ils n’y ont pas été directement |
| 645 | 645 | insérés. Selon la mise en page du site public, |
| 646 | 646 | ils pourront apparaître sous forme de documents joints.', |
| 647 | - 'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau. |
|
| 647 | + 'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau. |
|
| 648 | 648 | L’image <b>@fichier@</b> n’est pas passée (article @id_article@). |
| 649 | 649 | Note bien cette référence, réessaye la mise à |
| 650 | 650 | niveau, et enfin vérifie que les images apparaissent |
| 651 | 651 | toujours dans les articles.', |
| 652 | - 'texte_erreur_visiteur' => 'Tu as tenté d’accéder à l’espace privé avec un login qui ne le permet pas.', |
|
| 653 | - 'texte_inc_auth_1' => 'Tu es identifié sous le |
|
| 652 | + 'texte_erreur_visiteur' => 'Tu as tenté d’accéder à l’espace privé avec un login qui ne le permet pas.', |
|
| 653 | + 'texte_inc_auth_1' => 'Tu es identifié sous le |
|
| 654 | 654 | login <b>@auth_login@</b>, mais celui-ci n’existe pas/plus dans la base. |
| 655 | 655 | Essaye de te', |
| 656 | - 'texte_inc_auth_2' => 'reconnecter', |
|
| 657 | - 'texte_inc_auth_3' => ', après avoir éventuellement quitté puis |
|
| 656 | + 'texte_inc_auth_2' => 'reconnecter', |
|
| 657 | + 'texte_inc_auth_3' => ', après avoir éventuellement quitté puis |
|
| 658 | 658 | redémarré ton navigateur.', |
| 659 | - 'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le |
|
| 659 | + 'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le |
|
| 660 | 660 | fonctionnement de ton site. Nous te recommandons de ne pas y intervenir tant que tu n’es pas |
| 661 | 661 | familier du fonctionnement du système SPIP. <br /><br /><b>Plus |
| 662 | 662 | généralement, il est fortement conseillé |
| 663 | 663 | de laisser la charge de ces pages au webmestre principal de ton site.</b>', |
| 664 | - 'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. En tant qu’administrateur du site,', |
|
| 665 | - 'texte_inc_meta_2' => 'vérifie les droits d’ecriture', |
|
| 666 | - 'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.', |
|
| 667 | - 'texte_statut_en_cours_redaction' => 'en cours de rédaction', |
|
| 668 | - 'texte_statut_poubelle' => 'à la poubelle', |
|
| 669 | - 'texte_statut_propose_evaluation' => 'proposé à l’évaluation', |
|
| 670 | - 'texte_statut_publie' => 'publié en ligne', |
|
| 671 | - 'texte_statut_refuse' => 'refusé', |
|
| 672 | - 'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :', |
|
| 673 | - 'titre_cadre_raccourcis' => 'RACCOURCIS :', |
|
| 674 | - 'titre_changer_couleur_interface' => 'Changer la couleur de l’interface', |
|
| 675 | - 'titre_image_admin_article' => 'Tu peux administrer cet article', |
|
| 676 | - 'titre_image_administrateur' => 'Administrateur', |
|
| 677 | - 'titre_image_aide' => 'De l’aide sur cet élément', |
|
| 678 | - 'titre_image_auteur_supprime' => 'Auteur supprimé', |
|
| 679 | - 'titre_image_redacteur' => 'Rédacteur sans accès', |
|
| 680 | - 'titre_image_redacteur_02' => 'Rédacteur', |
|
| 681 | - 'titre_image_selecteur' => 'Afficher la liste', |
|
| 682 | - 'titre_image_visiteur' => 'Visiteur', |
|
| 683 | - 'titre_joindre_document' => 'JOINDRE UN DOCUMENT', |
|
| 684 | - 'titre_mots_cles' => 'MOTS-CLÉS', |
|
| 685 | - 'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de ta compréhension.', |
|
| 686 | - 'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE', |
|
| 687 | - 'titre_signatures_attente' => 'Signatures en attente de validation', |
|
| 688 | - 'titre_signatures_confirmees' => 'Signatures confirmées', |
|
| 689 | - 'titre_statistiques' => 'Statistiques du site', |
|
| 690 | - 'titre_titre_document' => 'Titre du document :', |
|
| 691 | - 'todo' => 'à venir', |
|
| 692 | - 'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions', |
|
| 693 | - 'trad_reference' => '(référence des traductions)', |
|
| 664 | + 'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. En tant qu’administrateur du site,', |
|
| 665 | + 'texte_inc_meta_2' => 'vérifie les droits d’ecriture', |
|
| 666 | + 'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.', |
|
| 667 | + 'texte_statut_en_cours_redaction' => 'en cours de rédaction', |
|
| 668 | + 'texte_statut_poubelle' => 'à la poubelle', |
|
| 669 | + 'texte_statut_propose_evaluation' => 'proposé à l’évaluation', |
|
| 670 | + 'texte_statut_publie' => 'publié en ligne', |
|
| 671 | + 'texte_statut_refuse' => 'refusé', |
|
| 672 | + 'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :', |
|
| 673 | + 'titre_cadre_raccourcis' => 'RACCOURCIS :', |
|
| 674 | + 'titre_changer_couleur_interface' => 'Changer la couleur de l’interface', |
|
| 675 | + 'titre_image_admin_article' => 'Tu peux administrer cet article', |
|
| 676 | + 'titre_image_administrateur' => 'Administrateur', |
|
| 677 | + 'titre_image_aide' => 'De l’aide sur cet élément', |
|
| 678 | + 'titre_image_auteur_supprime' => 'Auteur supprimé', |
|
| 679 | + 'titre_image_redacteur' => 'Rédacteur sans accès', |
|
| 680 | + 'titre_image_redacteur_02' => 'Rédacteur', |
|
| 681 | + 'titre_image_selecteur' => 'Afficher la liste', |
|
| 682 | + 'titre_image_visiteur' => 'Visiteur', |
|
| 683 | + 'titre_joindre_document' => 'JOINDRE UN DOCUMENT', |
|
| 684 | + 'titre_mots_cles' => 'MOTS-CLÉS', |
|
| 685 | + 'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de ta compréhension.', |
|
| 686 | + 'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE', |
|
| 687 | + 'titre_signatures_attente' => 'Signatures en attente de validation', |
|
| 688 | + 'titre_signatures_confirmees' => 'Signatures confirmées', |
|
| 689 | + 'titre_statistiques' => 'Statistiques du site', |
|
| 690 | + 'titre_titre_document' => 'Titre du document :', |
|
| 691 | + 'todo' => 'à venir', |
|
| 692 | + 'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions', |
|
| 693 | + 'trad_reference' => '(référence des traductions)', |
|
| 694 | 694 | |
| 695 | - // U |
|
| 696 | - 'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.', |
|
| 695 | + // U |
|
| 696 | + 'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.', |
|
| 697 | 697 | |
| 698 | - // Z |
|
| 699 | - 'zbug_balise_b_aval' => ' : balise B en aval', |
|
| 700 | - 'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@', |
|
| 701 | - 'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@', |
|
| 702 | - 'zbug_boucle' => 'boucle', |
|
| 703 | - 'zbug_boucle_recursive_undef' => 'boucle récursive non définie', |
|
| 704 | - 'zbug_calcul' => 'calcul', |
|
| 705 | - 'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle', |
|
| 706 | - 'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@', |
|
| 707 | - 'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@', |
|
| 708 | - 'zbug_code' => 'code', |
|
| 709 | - 'zbug_critere_inconnu' => 'critère inconnu @critere@', |
|
| 710 | - 'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique', |
|
| 711 | - 'zbug_distant_interdit' => 'externe interdit', |
|
| 712 | - 'zbug_doublon_table_sans_cle_primaire' => 'doublons sur une table sans clef primaire atomique', |
|
| 713 | - 'zbug_doublon_table_sans_index' => 'doublons sur une table sans index', |
|
| 714 | - 'zbug_erreur_boucle_double' => 'BOUCLE@id@ : double définition', |
|
| 715 | - 'zbug_erreur_boucle_fermant' => 'BOUCLE@id@ : tag fermant manquant', |
|
| 716 | - 'zbug_erreur_boucle_syntaxe' => 'Syntaxe boucle incorrecte', |
|
| 717 | - 'zbug_erreur_compilation' => 'Erreur de compilation', |
|
| 718 | - 'zbug_erreur_execution_page' => 'erreur d’exécution de la page', |
|
| 719 | - 'zbug_erreur_filtre' => 'Erreur : filtre <b>« @filtre@ »</b> non défini', |
|
| 720 | - 'zbug_erreur_filtre_nbarg_min' => 'Filtre @filtre@ : il manque @nb@ argument(s)', |
|
| 721 | - 'zbug_erreur_meme_parent' => '{meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)', |
|
| 722 | - 'zbug_erreur_squelette' => 'Erreur(s) dans le squelette', |
|
| 723 | - 'zbug_hors_compilation' => 'Hors Compilation', |
|
| 724 | - 'zbug_info_erreur_squelette' => 'Erreur sur le site', |
|
| 725 | - 'zbug_inversion_ordre_inexistant' => 'inversion d’un ordre inexistant', |
|
| 726 | - 'zbug_pagination_sans_critere' => '#PAGINATION sans critère {pagination} ou employé dans une boucle récursive', |
|
| 727 | - 'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@', |
|
| 728 | - 'zbug_profile' => 'Temps de calcul : @time@', |
|
| 729 | - 'zbug_resultat' => 'résultat', |
|
| 730 | - 'zbug_serveur_indefini' => 'serveur SQL indéfini', |
|
| 731 | - 'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée', |
|
| 732 | - 'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue', |
|
| 733 | - 'zxml_connus_attributs' => 'attributs connus', |
|
| 734 | - 'zxml_de' => 'de', |
|
| 735 | - 'zxml_inconnu_attribut' => 'attribut inconnu', |
|
| 736 | - 'zxml_inconnu_balise' => 'balise inconnue', |
|
| 737 | - 'zxml_inconnu_entite' => 'entité inconnue', |
|
| 738 | - 'zxml_inconnu_id' => 'ID inconnu', |
|
| 739 | - 'zxml_mais_de' => 'mais de', |
|
| 740 | - 'zxml_non_conforme' => 'n’est pas conforme au motif', |
|
| 741 | - 'zxml_non_fils' => 'n’est pas un fils de', |
|
| 742 | - 'zxml_nonvide_balise' => 'balise non vide', |
|
| 743 | - 'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans', |
|
| 744 | - 'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte', |
|
| 745 | - 'zxml_survoler' => 'survoler pour voir les corrects', |
|
| 746 | - 'zxml_valeur_attribut' => 'valeur de l’attribut', |
|
| 747 | - 'zxml_vide_balise' => 'balise vide', |
|
| 748 | - 'zxml_vu' => 'vu auparavant' |
|
| 698 | + // Z |
|
| 699 | + 'zbug_balise_b_aval' => ' : balise B en aval', |
|
| 700 | + 'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@', |
|
| 701 | + 'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@', |
|
| 702 | + 'zbug_boucle' => 'boucle', |
|
| 703 | + 'zbug_boucle_recursive_undef' => 'boucle récursive non définie', |
|
| 704 | + 'zbug_calcul' => 'calcul', |
|
| 705 | + 'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle', |
|
| 706 | + 'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@', |
|
| 707 | + 'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@', |
|
| 708 | + 'zbug_code' => 'code', |
|
| 709 | + 'zbug_critere_inconnu' => 'critère inconnu @critere@', |
|
| 710 | + 'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique', |
|
| 711 | + 'zbug_distant_interdit' => 'externe interdit', |
|
| 712 | + 'zbug_doublon_table_sans_cle_primaire' => 'doublons sur une table sans clef primaire atomique', |
|
| 713 | + 'zbug_doublon_table_sans_index' => 'doublons sur une table sans index', |
|
| 714 | + 'zbug_erreur_boucle_double' => 'BOUCLE@id@ : double définition', |
|
| 715 | + 'zbug_erreur_boucle_fermant' => 'BOUCLE@id@ : tag fermant manquant', |
|
| 716 | + 'zbug_erreur_boucle_syntaxe' => 'Syntaxe boucle incorrecte', |
|
| 717 | + 'zbug_erreur_compilation' => 'Erreur de compilation', |
|
| 718 | + 'zbug_erreur_execution_page' => 'erreur d’exécution de la page', |
|
| 719 | + 'zbug_erreur_filtre' => 'Erreur : filtre <b>« @filtre@ »</b> non défini', |
|
| 720 | + 'zbug_erreur_filtre_nbarg_min' => 'Filtre @filtre@ : il manque @nb@ argument(s)', |
|
| 721 | + 'zbug_erreur_meme_parent' => '{meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)', |
|
| 722 | + 'zbug_erreur_squelette' => 'Erreur(s) dans le squelette', |
|
| 723 | + 'zbug_hors_compilation' => 'Hors Compilation', |
|
| 724 | + 'zbug_info_erreur_squelette' => 'Erreur sur le site', |
|
| 725 | + 'zbug_inversion_ordre_inexistant' => 'inversion d’un ordre inexistant', |
|
| 726 | + 'zbug_pagination_sans_critere' => '#PAGINATION sans critère {pagination} ou employé dans une boucle récursive', |
|
| 727 | + 'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@', |
|
| 728 | + 'zbug_profile' => 'Temps de calcul : @time@', |
|
| 729 | + 'zbug_resultat' => 'résultat', |
|
| 730 | + 'zbug_serveur_indefini' => 'serveur SQL indéfini', |
|
| 731 | + 'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée', |
|
| 732 | + 'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue', |
|
| 733 | + 'zxml_connus_attributs' => 'attributs connus', |
|
| 734 | + 'zxml_de' => 'de', |
|
| 735 | + 'zxml_inconnu_attribut' => 'attribut inconnu', |
|
| 736 | + 'zxml_inconnu_balise' => 'balise inconnue', |
|
| 737 | + 'zxml_inconnu_entite' => 'entité inconnue', |
|
| 738 | + 'zxml_inconnu_id' => 'ID inconnu', |
|
| 739 | + 'zxml_mais_de' => 'mais de', |
|
| 740 | + 'zxml_non_conforme' => 'n’est pas conforme au motif', |
|
| 741 | + 'zxml_non_fils' => 'n’est pas un fils de', |
|
| 742 | + 'zxml_nonvide_balise' => 'balise non vide', |
|
| 743 | + 'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans', |
|
| 744 | + 'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte', |
|
| 745 | + 'zxml_survoler' => 'survoler pour voir les corrects', |
|
| 746 | + 'zxml_valeur_attribut' => 'valeur de l’attribut', |
|
| 747 | + 'zxml_vide_balise' => 'balise vide', |
|
| 748 | + 'zxml_vu' => 'vu auparavant' |
|
| 749 | 749 | ); |