Completed
Push — master ( 3caaa9...7e8601 )
by cam
01:42
created
ecrire/action/converser.php 1 patch
Indentation   +43 added lines, -43 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Langue
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('inc/cookie');
@@ -30,21 +30,21 @@  discard block
 block discarded – undo
30 30
  * @return void
31 31
  */
32 32
 function action_converser_dist() {
33
-	$update_session = false;
34
-	if (_request('arg') and spip_connect()) {
35
-		$securiser_action = charger_fonction('securiser_action', 'inc');
36
-		$securiser_action();
37
-		$update_session = true;
38
-	}
33
+    $update_session = false;
34
+    if (_request('arg') and spip_connect()) {
35
+        $securiser_action = charger_fonction('securiser_action', 'inc');
36
+        $securiser_action();
37
+        $update_session = true;
38
+    }
39 39
 
40
-	$lang = action_converser_changer_langue($update_session);
41
-	$redirect = rawurldecode(_request('redirect'));
40
+    $lang = action_converser_changer_langue($update_session);
41
+    $redirect = rawurldecode(_request('redirect'));
42 42
 
43
-	if (!$redirect) {
44
-		$redirect = _DIR_RESTREINT_ABS;
45
-	}
46
-	$redirect = parametre_url($redirect, 'lang', $lang, '&');
47
-	redirige_par_entete($redirect, true);
43
+    if (!$redirect) {
44
+        $redirect = _DIR_RESTREINT_ABS;
45
+    }
46
+    $redirect = parametre_url($redirect, 'lang', $lang, '&');
47
+    redirige_par_entete($redirect, true);
48 48
 }
49 49
 
50 50
 /**
@@ -56,23 +56,23 @@  discard block
 block discarded – undo
56 56
  * @return string
57 57
  */
58 58
 function action_converser_changer_langue($update_session) {
59
-	if ($lang = _request('var_lang')) {
60
-		action_converser_post($lang);
61
-	} elseif ($lang = _request('var_lang_ecrire')) {
62
-		if ($update_session) {
63
-			sql_updateq('spip_auteurs', ['lang' => $lang], 'id_auteur = ' . $GLOBALS['visiteur_session']['id_auteur']);
64
-			$GLOBALS['visiteur_session']['lang'] = $lang;
65
-			$session = charger_fonction('session', 'inc');
66
-			if ($spip_session = $session($GLOBALS['visiteur_session'])) {
67
-				spip_setcookie('spip_session', $spip_session, [
68
-					'expires' => time() + 3600 * 24 * 14
69
-				]);
70
-			}
71
-		}
72
-		action_converser_post($lang, true);
73
-	}
59
+    if ($lang = _request('var_lang')) {
60
+        action_converser_post($lang);
61
+    } elseif ($lang = _request('var_lang_ecrire')) {
62
+        if ($update_session) {
63
+            sql_updateq('spip_auteurs', ['lang' => $lang], 'id_auteur = ' . $GLOBALS['visiteur_session']['id_auteur']);
64
+            $GLOBALS['visiteur_session']['lang'] = $lang;
65
+            $session = charger_fonction('session', 'inc');
66
+            if ($spip_session = $session($GLOBALS['visiteur_session'])) {
67
+                spip_setcookie('spip_session', $spip_session, [
68
+                    'expires' => time() + 3600 * 24 * 14
69
+                ]);
70
+            }
71
+        }
72
+        action_converser_post($lang, true);
73
+    }
74 74
 
75
-	return $lang;
75
+    return $lang;
76 76
 }
77 77
 
78 78
 /**
@@ -83,17 +83,17 @@  discard block
 block discarded – undo
83 83
  * @return void
84 84
  */
85 85
 function action_converser_post($lang, $ecrire = false) {
86
-	if ($lang) {
87
-		include_spip('inc/lang');
88
-		if (changer_langue($lang)) {
89
-			spip_setcookie('spip_lang', $_COOKIE['spip_lang'] = $lang, [
90
-				'expires' => time() + 365 * 24 * 3600
91
-			]);
92
-			if ($ecrire) {
93
-				spip_setcookie('spip_lang_ecrire', $_COOKIE['spip_lang_ecrire'] = $lang, [
94
-					'expires' => time() + 365 * 24 * 3600
95
-				]);
96
-			}
97
-		}
98
-	}
86
+    if ($lang) {
87
+        include_spip('inc/lang');
88
+        if (changer_langue($lang)) {
89
+            spip_setcookie('spip_lang', $_COOKIE['spip_lang'] = $lang, [
90
+                'expires' => time() + 365 * 24 * 3600
91
+            ]);
92
+            if ($ecrire) {
93
+                spip_setcookie('spip_lang_ecrire', $_COOKIE['spip_lang_ecrire'] = $lang, [
94
+                    'expires' => time() + 365 * 24 * 3600
95
+                ]);
96
+            }
97
+        }
98
+    }
99 99
 }
Please login to merge, or discard this patch.
ecrire/action/logout.php 1 patch
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 include_spip('inc/cookie');
@@ -34,73 +34,73 @@  discard block
 block discarded – undo
34 34
  *
35 35
  */
36 36
 function action_logout_dist() {
37
-	$logout = _request('logout');
38
-	$url = securiser_redirect_action(_request('url'));
39
-	// cas particulier, logout dans l'espace public
40
-	if ($logout == 'public' and !$url) {
41
-		$url = url_de_base();
42
-	}
37
+    $logout = _request('logout');
38
+    $url = securiser_redirect_action(_request('url'));
39
+    // cas particulier, logout dans l'espace public
40
+    if ($logout == 'public' and !$url) {
41
+        $url = url_de_base();
42
+    }
43 43
 
44
-	// seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
45
-	if (
46
-		isset($GLOBALS['visiteur_session']['id_auteur'])
47
-		and is_numeric($GLOBALS['visiteur_session']['id_auteur'])
48
-		// des sessions anonymes avec id_auteur=0 existent, mais elle n'ont pas de statut : double check
49
-		and isset($GLOBALS['visiteur_session']['statut'])
50
-	) {
51
-		// il faut un jeton pour fermer la session (eviter les CSRF)
52
-		if (
53
-			!$jeton = _request('jeton')
54
-			or !verifier_jeton_logout($jeton, $GLOBALS['visiteur_session'])
55
-		) {
56
-			$jeton = generer_jeton_logout($GLOBALS['visiteur_session']);
57
-			$action = generer_url_action('logout', "jeton=$jeton");
58
-			$action = parametre_url($action, 'logout', _request('logout'));
59
-			$action = parametre_url($action, 'url', _request('url'));
60
-			include_spip('inc/minipres');
61
-			include_spip('inc/filtres');
62
-			$texte = bouton_action(_T('spip:icone_deconnecter'), $action);
63
-			$texte = "<div class='boutons'>$texte</div>";
64
-			$texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>';
65
-			$res = minipres(_T('spip:icone_deconnecter'), $texte, ['all_inline' => true]);
66
-			echo $res;
44
+    // seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
45
+    if (
46
+        isset($GLOBALS['visiteur_session']['id_auteur'])
47
+        and is_numeric($GLOBALS['visiteur_session']['id_auteur'])
48
+        // des sessions anonymes avec id_auteur=0 existent, mais elle n'ont pas de statut : double check
49
+        and isset($GLOBALS['visiteur_session']['statut'])
50
+    ) {
51
+        // il faut un jeton pour fermer la session (eviter les CSRF)
52
+        if (
53
+            !$jeton = _request('jeton')
54
+            or !verifier_jeton_logout($jeton, $GLOBALS['visiteur_session'])
55
+        ) {
56
+            $jeton = generer_jeton_logout($GLOBALS['visiteur_session']);
57
+            $action = generer_url_action('logout', "jeton=$jeton");
58
+            $action = parametre_url($action, 'logout', _request('logout'));
59
+            $action = parametre_url($action, 'url', _request('url'));
60
+            include_spip('inc/minipres');
61
+            include_spip('inc/filtres');
62
+            $texte = bouton_action(_T('spip:icone_deconnecter'), $action);
63
+            $texte = "<div class='boutons'>$texte</div>";
64
+            $texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>';
65
+            $res = minipres(_T('spip:icone_deconnecter'), $texte, ['all_inline' => true]);
66
+            echo $res;
67 67
 
68
-			return;
69
-		}
68
+            return;
69
+        }
70 70
 
71
-		include_spip('inc/auth');
72
-		auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00');
73
-		// le logout explicite vaut destruction de toutes les sessions
74
-		if (isset($_COOKIE['spip_session'])) {
75
-			$session = charger_fonction('session', 'inc');
76
-			$session($GLOBALS['visiteur_session']['id_auteur']);
77
-			spip_setcookie('spip_session', $_COOKIE['spip_session'], [
78
-				'expires' => time() - 3600
79
-			]);
80
-		}
81
-		// si authentification http, et que la personne est loge,
82
-		// pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
83
-		if (
84
-			isset($_SERVER['PHP_AUTH_USER'])
85
-			and !$GLOBALS['ignore_auth_http']
86
-			and $GLOBALS['auth_can_disconnect']
87
-		) {
88
-			ask_php_auth(
89
-				_T('login_deconnexion_ok'),
90
-				_T('login_verifiez_navigateur'),
91
-				_T('login_retour_public'),
92
-				'redirect=' . _DIR_RESTREINT_ABS,
93
-				_T('login_test_navigateur'),
94
-				true
95
-			);
96
-		}
97
-	}
71
+        include_spip('inc/auth');
72
+        auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00');
73
+        // le logout explicite vaut destruction de toutes les sessions
74
+        if (isset($_COOKIE['spip_session'])) {
75
+            $session = charger_fonction('session', 'inc');
76
+            $session($GLOBALS['visiteur_session']['id_auteur']);
77
+            spip_setcookie('spip_session', $_COOKIE['spip_session'], [
78
+                'expires' => time() - 3600
79
+            ]);
80
+        }
81
+        // si authentification http, et que la personne est loge,
82
+        // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
83
+        if (
84
+            isset($_SERVER['PHP_AUTH_USER'])
85
+            and !$GLOBALS['ignore_auth_http']
86
+            and $GLOBALS['auth_can_disconnect']
87
+        ) {
88
+            ask_php_auth(
89
+                _T('login_deconnexion_ok'),
90
+                _T('login_verifiez_navigateur'),
91
+                _T('login_retour_public'),
92
+                'redirect=' . _DIR_RESTREINT_ABS,
93
+                _T('login_test_navigateur'),
94
+                true
95
+            );
96
+        }
97
+    }
98 98
 
99
-	// Rediriger en contrant le cache navigateur (Safari3)
100
-	include_spip('inc/headers');
101
-	redirige_par_entete($url
102
-		? parametre_url($url, 'var_hasard', uniqid(random_int(0, mt_getrandmax())), '&')
103
-		: generer_url_public('login'));
99
+    // Rediriger en contrant le cache navigateur (Safari3)
100
+    include_spip('inc/headers');
101
+    redirige_par_entete($url
102
+        ? parametre_url($url, 'var_hasard', uniqid(random_int(0, mt_getrandmax())), '&')
103
+        : generer_url_public('login'));
104 104
 }
105 105
 
106 106
 /**
@@ -111,17 +111,17 @@  discard block
 block discarded – undo
111 111
  * @return string
112 112
  */
113 113
 function generer_jeton_logout($session, $alea = null) {
114
-	if (is_null($alea)) {
115
-		include_spip('inc/acces');
116
-		$alea = charger_aleas();
117
-	}
114
+    if (is_null($alea)) {
115
+        include_spip('inc/acces');
116
+        $alea = charger_aleas();
117
+    }
118 118
 
119
-	$jeton = md5($session['date_session']
120
-		. $session['id_auteur']
121
-		. $session['statut']
122
-		. $alea);
119
+    $jeton = md5($session['date_session']
120
+        . $session['id_auteur']
121
+        . $session['statut']
122
+        . $alea);
123 123
 
124
-	return $jeton;
124
+    return $jeton;
125 125
 }
126 126
 
127 127
 /**
@@ -135,13 +135,13 @@  discard block
 block discarded – undo
135 135
  * @return bool
136 136
  */
137 137
 function verifier_jeton_logout($jeton, $session) {
138
-	if (generer_jeton_logout($session) === $jeton) {
139
-		return true;
140
-	}
138
+    if (generer_jeton_logout($session) === $jeton) {
139
+        return true;
140
+    }
141 141
 
142
-	if (generer_jeton_logout($session, $GLOBALS['meta']['alea_ephemere_ancien']) === $jeton) {
143
-		return true;
144
-	}
142
+    if (generer_jeton_logout($session, $GLOBALS['meta']['alea_ephemere_ancien']) === $jeton) {
143
+        return true;
144
+    }
145 145
 
146
-	return false;
146
+    return false;
147 147
 }
Please login to merge, or discard this patch.
ecrire/action/instituer_langue_objet.php 1 patch
Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -31,43 +31,43 @@  discard block
 block discarded – undo
31 31
  * @return string
32 32
  */
33 33
 function action_instituer_langue_objet_dist($objet, $id, $id_rubrique, $changer_lang, $serveur = '') {
34
-	if ($changer_lang) {
35
-		$table_objet_sql = table_objet_sql($objet);
36
-		$id_table_objet = id_table_objet($objet);
37
-		$trouver_table = charger_fonction('trouver_table', 'base');
38
-		$desc = $trouver_table($table_objet_sql, $serveur);
34
+    if ($changer_lang) {
35
+        $table_objet_sql = table_objet_sql($objet);
36
+        $id_table_objet = id_table_objet($objet);
37
+        $trouver_table = charger_fonction('trouver_table', 'base');
38
+        $desc = $trouver_table($table_objet_sql, $serveur);
39 39
 
40
-		$set = [];
41
-		if (isset($desc['field']['langue_choisie'])) {
42
-			$set['langue_choisie'] = 'oui';
43
-		}
40
+        $set = [];
41
+        if (isset($desc['field']['langue_choisie'])) {
42
+            $set['langue_choisie'] = 'oui';
43
+        }
44 44
 
45
-		if ($changer_lang != 'herit') {
46
-			$set['lang'] = $changer_lang;
47
-			sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id), [], $serveur);
48
-			include_spip('inc/rubriques'); // pour calculer_langues_rubriques et calculer_langues_utilisees
49
-			if ($table_objet_sql == 'spip_rubriques') {
50
-				calculer_langues_rubriques();
51
-			}
52
-			$langues = calculer_langues_utilisees($serveur);
53
-			ecrire_meta('langues_utilisees', $langues);
54
-		} else {
55
-			$langue_parent = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
56
-			if (!$langue_parent) {
57
-				$langue_parent = $GLOBALS['meta']['langue_site'];
58
-			}
59
-			$changer_lang = $langue_parent;
60
-			$set['lang'] = $changer_lang;
61
-			if (isset($set['langue_choisie'])) {
62
-				$set['langue_choisie'] = 'non';
63
-			}
64
-			sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id), [], $serveur);
65
-			if ($table_objet_sql == 'spip_rubriques') {
66
-				include_spip('inc/rubriques');
67
-				calculer_langues_rubriques();
68
-			}
69
-		}
70
-	}
45
+        if ($changer_lang != 'herit') {
46
+            $set['lang'] = $changer_lang;
47
+            sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id), [], $serveur);
48
+            include_spip('inc/rubriques'); // pour calculer_langues_rubriques et calculer_langues_utilisees
49
+            if ($table_objet_sql == 'spip_rubriques') {
50
+                calculer_langues_rubriques();
51
+            }
52
+            $langues = calculer_langues_utilisees($serveur);
53
+            ecrire_meta('langues_utilisees', $langues);
54
+        } else {
55
+            $langue_parent = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
56
+            if (!$langue_parent) {
57
+                $langue_parent = $GLOBALS['meta']['langue_site'];
58
+            }
59
+            $changer_lang = $langue_parent;
60
+            $set['lang'] = $changer_lang;
61
+            if (isset($set['langue_choisie'])) {
62
+                $set['langue_choisie'] = 'non';
63
+            }
64
+            sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id), [], $serveur);
65
+            if ($table_objet_sql == 'spip_rubriques') {
66
+                include_spip('inc/rubriques');
67
+                calculer_langues_rubriques();
68
+            }
69
+        }
70
+    }
71 71
 
72
-	return $changer_lang;
72
+    return $changer_lang;
73 73
 }
Please login to merge, or discard this patch.
ecrire/base/abstract_sql.php 1 patch
Indentation   +693 added lines, -693 removed lines patch added patch discarded remove patch
@@ -25,7 +25,7 @@  discard block
 block discarded – undo
25 25
  */
26 26
 
27 27
 if (!defined('_ECRIRE_INC_VERSION')) {
28
-	return;
28
+    return;
29 29
 }
30 30
 
31 31
 /** Version de l'API SQL */
@@ -45,39 +45,39 @@  discard block
 block discarded – undo
45 45
  *     contexte de l'erreur
46 46
  **/
47 47
 function sql_error_backtrace($compil_info = false) {
48
-	$trace = debug_backtrace();
49
-	$caller = array_shift($trace);
50
-	while (count($trace) and (empty($trace[0]['file']) or $trace[0]['file'] === $caller['file'] or $trace[0]['file'] === __FILE__)) {
51
-		array_shift($trace);
52
-	}
53
-
54
-	if ($compil_info) {
55
-		$contexte_compil = [
56
-			$trace[0]['file'],// sourcefile
57
-			'', //nom
58
-			(isset($trace[1]) ? $trace[1]['function'] . "(){\n" : '')
59
-			. $trace[0]['function'] . '();'
60
-			. (isset($trace[1]) ? "\n}" : ''), //id_boucle
61
-			$trace[0]['line'], // ligne
62
-			$GLOBALS['spip_lang'], // lang
63
-		];
64
-
65
-		return $contexte_compil;
66
-	}
67
-
68
-	$message = count($trace) ? $trace[0]['file'] . ' L' . $trace[0]['line'] : '';
69
-	$f = [];
70
-	while (count($trace) and $t = array_shift($trace)) {
71
-		if (in_array($t['function'], ['include_once', 'include_spip', 'find_in_path'])) {
72
-			break;
73
-		}
74
-		$f[] = $t['function'];
75
-	}
76
-	if (count($f)) {
77
-		$message .= ' [' . implode('(),', $f) . '()]';
78
-	}
79
-
80
-	return $message;
48
+    $trace = debug_backtrace();
49
+    $caller = array_shift($trace);
50
+    while (count($trace) and (empty($trace[0]['file']) or $trace[0]['file'] === $caller['file'] or $trace[0]['file'] === __FILE__)) {
51
+        array_shift($trace);
52
+    }
53
+
54
+    if ($compil_info) {
55
+        $contexte_compil = [
56
+            $trace[0]['file'],// sourcefile
57
+            '', //nom
58
+            (isset($trace[1]) ? $trace[1]['function'] . "(){\n" : '')
59
+            . $trace[0]['function'] . '();'
60
+            . (isset($trace[1]) ? "\n}" : ''), //id_boucle
61
+            $trace[0]['line'], // ligne
62
+            $GLOBALS['spip_lang'], // lang
63
+        ];
64
+
65
+        return $contexte_compil;
66
+    }
67
+
68
+    $message = count($trace) ? $trace[0]['file'] . ' L' . $trace[0]['line'] : '';
69
+    $f = [];
70
+    while (count($trace) and $t = array_shift($trace)) {
71
+        if (in_array($t['function'], ['include_once', 'include_spip', 'find_in_path'])) {
72
+            break;
73
+        }
74
+        $f[] = $t['function'];
75
+    }
76
+    if (count($f)) {
77
+        $message .= ' [' . implode('(),', $f) . '()]';
78
+    }
79
+
80
+    return $message;
81 81
 }
82 82
 
83 83
 
@@ -102,16 +102,16 @@  discard block
 block discarded – undo
102 102
  *
103 103
  **/
104 104
 function sql_serveur($ins_sql = '', $serveur = '', $continue = false) {
105
-	static $sql_serveur = [];
106
-	if (!isset($sql_serveur[$serveur][$ins_sql])) {
107
-		$f = spip_connect_sql(\SQL_ABSTRACT_VERSION, $ins_sql, $serveur, $continue);
108
-		if (!is_string($f) or !$f) {
109
-			return $f;
110
-		}
111
-		$sql_serveur[$serveur][$ins_sql] = $f;
112
-	}
113
-
114
-	return $sql_serveur[$serveur][$ins_sql];
105
+    static $sql_serveur = [];
106
+    if (!isset($sql_serveur[$serveur][$ins_sql])) {
107
+        $f = spip_connect_sql(\SQL_ABSTRACT_VERSION, $ins_sql, $serveur, $continue);
108
+        if (!is_string($f) or !$f) {
109
+            return $f;
110
+        }
111
+        $sql_serveur[$serveur][$ins_sql] = $f;
112
+    }
113
+
114
+    return $sql_serveur[$serveur][$ins_sql];
115 115
 }
116 116
 
117 117
 /**
@@ -133,23 +133,23 @@  discard block
 block discarded – undo
133 133
  *     Retourne le nom du charset si effectivement trouvé, sinon false.
134 134
  **/
135 135
 function sql_get_charset($charset, $serveur = '', $option = true) {
136
-	// le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc.
137
-	$desc = sql_serveur('', $serveur, true);
138
-	$desc = $desc[\SQL_ABSTRACT_VERSION];
139
-	$c = $desc['charsets'][$charset];
140
-	if ($c) {
141
-		if (function_exists($f = @$desc['get_charset'])) {
142
-			if ($f($c, $serveur, $option !== false)) {
143
-				return $c;
144
-			}
145
-		}
146
-	}
147
-	spip_log(
148
-		"SPIP ne connait pas les Charsets disponibles sur le serveur $serveur. Le serveur choisira seul.",
149
-		_LOG_AVERTISSEMENT
150
-	);
151
-
152
-	return false;
136
+    // le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc.
137
+    $desc = sql_serveur('', $serveur, true);
138
+    $desc = $desc[\SQL_ABSTRACT_VERSION];
139
+    $c = $desc['charsets'][$charset];
140
+    if ($c) {
141
+        if (function_exists($f = @$desc['get_charset'])) {
142
+            if ($f($c, $serveur, $option !== false)) {
143
+                return $c;
144
+            }
145
+        }
146
+    }
147
+    spip_log(
148
+        "SPIP ne connait pas les Charsets disponibles sur le serveur $serveur. Le serveur choisira seul.",
149
+        _LOG_AVERTISSEMENT
150
+    );
151
+
152
+    return false;
153 153
 }
154 154
 
155 155
 
@@ -175,12 +175,12 @@  discard block
 block discarded – undo
175 175
  *    Retourne true si elle reussie.
176 176
  **/
177 177
 function sql_set_charset($charset, $serveur = '', $option = true) {
178
-	$f = sql_serveur('set_charset', $serveur, $option === 'continue' or $option === false);
179
-	if (!is_string($f) or !$f) {
180
-		return false;
181
-	}
178
+    $f = sql_serveur('set_charset', $serveur, $option === 'continue' or $option === false);
179
+    if (!is_string($f) or !$f) {
180
+        return false;
181
+    }
182 182
 
183
-	return $f($charset, $serveur, $option !== false);
183
+    return $f($charset, $serveur, $option !== false);
184 184
 }
185 185
 
186 186
 
@@ -231,59 +231,59 @@  discard block
 block discarded – undo
231 231
  *
232 232
  **/
233 233
 function sql_select(
234
-	$select = [],
235
-	$from = [],
236
-	$where = [],
237
-	$groupby = [],
238
-	$orderby = [],
239
-	$limit = '',
240
-	$having = [],
241
-	$serveur = '',
242
-	$option = true
234
+    $select = [],
235
+    $from = [],
236
+    $where = [],
237
+    $groupby = [],
238
+    $orderby = [],
239
+    $limit = '',
240
+    $having = [],
241
+    $serveur = '',
242
+    $option = true
243 243
 ) {
244
-	$f = sql_serveur('select', $serveur, $option === 'continue' or $option === false);
245
-	if (!is_string($f) or !$f) {
246
-		return false;
247
-	}
248
-
249
-	$debug = (defined('_VAR_MODE') and _VAR_MODE == 'debug');
250
-	if (($option !== false) and !$debug) {
251
-		$res = $f(
252
-			$select,
253
-			$from,
254
-			$where,
255
-			$groupby,
256
-			$orderby,
257
-			$limit,
258
-			$having,
259
-			$serveur,
260
-			is_array($option) ? true : $option
261
-		);
262
-	} else {
263
-		$query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
264
-		if (!$option) {
265
-			return $query;
266
-		}
267
-		// le debug, c'est pour ce qui a ete produit par le compilateur
268
-		if (isset($GLOBALS['debug']['aucasou'])) {
269
-			[$table, $id, ] = $GLOBALS['debug']['aucasou'];
270
-			$nom = $GLOBALS['debug_objets']['courant'] . $id;
271
-			$GLOBALS['debug_objets']['requete'][$nom] = $query;
272
-		}
273
-		$res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true);
274
-	}
275
-
276
-	// en cas d'erreur
277
-	if (!is_string($res)) {
278
-		return $res;
279
-	}
280
-	// denoncer l'erreur SQL dans sa version brute
281
-	spip_sql_erreur($serveur);
282
-	// idem dans sa version squelette (prefixe des tables non substitue)
283
-	$contexte_compil = sql_error_backtrace(true);
284
-	erreur_squelette([sql_errno($serveur), sql_error($serveur), $res], $contexte_compil);
285
-
286
-	return false;
244
+    $f = sql_serveur('select', $serveur, $option === 'continue' or $option === false);
245
+    if (!is_string($f) or !$f) {
246
+        return false;
247
+    }
248
+
249
+    $debug = (defined('_VAR_MODE') and _VAR_MODE == 'debug');
250
+    if (($option !== false) and !$debug) {
251
+        $res = $f(
252
+            $select,
253
+            $from,
254
+            $where,
255
+            $groupby,
256
+            $orderby,
257
+            $limit,
258
+            $having,
259
+            $serveur,
260
+            is_array($option) ? true : $option
261
+        );
262
+    } else {
263
+        $query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
264
+        if (!$option) {
265
+            return $query;
266
+        }
267
+        // le debug, c'est pour ce qui a ete produit par le compilateur
268
+        if (isset($GLOBALS['debug']['aucasou'])) {
269
+            [$table, $id, ] = $GLOBALS['debug']['aucasou'];
270
+            $nom = $GLOBALS['debug_objets']['courant'] . $id;
271
+            $GLOBALS['debug_objets']['requete'][$nom] = $query;
272
+        }
273
+        $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true);
274
+    }
275
+
276
+    // en cas d'erreur
277
+    if (!is_string($res)) {
278
+        return $res;
279
+    }
280
+    // denoncer l'erreur SQL dans sa version brute
281
+    spip_sql_erreur($serveur);
282
+    // idem dans sa version squelette (prefixe des tables non substitue)
283
+    $contexte_compil = sql_error_backtrace(true);
284
+    erreur_squelette([sql_errno($serveur), sql_error($serveur), $res], $contexte_compil);
285
+
286
+    return false;
287 287
 }
288 288
 
289 289
 
@@ -320,16 +320,16 @@  discard block
 block discarded – undo
320 320
  *
321 321
  **/
322 322
 function sql_get_select(
323
-	$select = [],
324
-	$from = [],
325
-	$where = [],
326
-	$groupby = [],
327
-	$orderby = [],
328
-	$limit = '',
329
-	$having = [],
330
-	$serveur = ''
323
+    $select = [],
324
+    $from = [],
325
+    $where = [],
326
+    $groupby = [],
327
+    $orderby = [],
328
+    $limit = '',
329
+    $having = [],
330
+    $serveur = ''
331 331
 ) {
332
-	return sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
332
+    return sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
333 333
 }
334 334
 
335 335
 
@@ -373,23 +373,23 @@  discard block
 block discarded – undo
373 373
  *
374 374
  **/
375 375
 function sql_countsel(
376
-	$from = [],
377
-	$where = [],
378
-	$groupby = [],
379
-	$having = [],
380
-	$serveur = '',
381
-	$option = true
376
+    $from = [],
377
+    $where = [],
378
+    $groupby = [],
379
+    $having = [],
380
+    $serveur = '',
381
+    $option = true
382 382
 ) {
383
-	$f = sql_serveur('countsel', $serveur, $option === 'continue' or $option === false);
384
-	if (!is_string($f) or !$f) {
385
-		return false;
386
-	}
387
-	$r = $f($from, $where, $groupby, $having, $serveur, $option !== false);
388
-	if ($r === false) {
389
-		spip_sql_erreur($serveur);
390
-	}
391
-
392
-	return $r;
383
+    $f = sql_serveur('countsel', $serveur, $option === 'continue' or $option === false);
384
+    if (!is_string($f) or !$f) {
385
+        return false;
386
+    }
387
+    $r = $f($from, $where, $groupby, $having, $serveur, $option !== false);
388
+    if ($r === false) {
389
+        spip_sql_erreur($serveur);
390
+    }
391
+
392
+    return $r;
393 393
 }
394 394
 
395 395
 /**
@@ -421,16 +421,16 @@  discard block
 block discarded – undo
421 421
  *     Ce retour n'est pas pertinent pour savoir si l'opération est correctement réalisée.
422 422
  **/
423 423
 function sql_alter($q, $serveur = '', $option = true) {
424
-	$f = sql_serveur('alter', $serveur, $option === 'continue' or $option === false);
425
-	if (!is_string($f) or !$f) {
426
-		return false;
427
-	}
428
-	$r = $f($q, $serveur, $option !== false);
429
-	if ($r === false) {
430
-		spip_sql_erreur($serveur);
431
-	}
432
-
433
-	return $r;
424
+    $f = sql_serveur('alter', $serveur, $option === 'continue' or $option === false);
425
+    if (!is_string($f) or !$f) {
426
+        return false;
427
+    }
428
+    $r = $f($q, $serveur, $option !== false);
429
+    if ($r === false) {
430
+        spip_sql_erreur($serveur);
431
+    }
432
+
433
+    return $r;
434 434
 }
435 435
 
436 436
 /**
@@ -453,12 +453,12 @@  discard block
 block discarded – undo
453 453
  *    presentant une ligne de resultat d'une selection
454 454
  */
455 455
 function sql_fetch($res, $serveur = '', $option = true) {
456
-	$f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false);
457
-	if (!is_string($f) or !$f) {
458
-		return false;
459
-	}
456
+    $f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false);
457
+    if (!is_string($f) or !$f) {
458
+        return false;
459
+    }
460 460
 
461
-	return $f($res, null, $serveur, $option !== false);
461
+    return $f($res, null, $serveur, $option !== false);
462 462
 }
463 463
 
464 464
 
@@ -485,20 +485,20 @@  discard block
 block discarded – undo
485 485
  *    presentant une ligne de resultat d'une selection
486 486
  */
487 487
 function sql_fetch_all($res, $serveur = '', $option = true) {
488
-	$rows = [];
489
-	if (!$res) {
490
-		return $rows;
491
-	}
492
-	$f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false);
493
-	if (!is_string($f) or !$f) {
494
-		return [];
495
-	}
496
-	while ($r = $f($res, null, $serveur, $option !== false)) {
497
-		$rows[] = $r;
498
-	}
499
-	sql_free($res, $serveur);
500
-
501
-	return $rows;
488
+    $rows = [];
489
+    if (!$res) {
490
+        return $rows;
491
+    }
492
+    $f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false);
493
+    if (!is_string($f) or !$f) {
494
+        return [];
495
+    }
496
+    while ($r = $f($res, null, $serveur, $option !== false)) {
497
+        $rows[] = $r;
498
+    }
499
+    sql_free($res, $serveur);
500
+
501
+    return $rows;
502 502
 }
503 503
 
504 504
 /**
@@ -526,16 +526,16 @@  discard block
 block discarded – undo
526 526
  *    Operation effectuée (true), sinon false.
527 527
  **/
528 528
 function sql_seek($res, $row_number, $serveur = '', $option = true) {
529
-	$f = sql_serveur('seek', $serveur, $option === 'continue' or $option === false);
530
-	if (!is_string($f) or !$f) {
531
-		return false;
532
-	}
533
-	$r = $f($res, $row_number, $serveur, $option !== false);
534
-	if ($r === false) {
535
-		spip_sql_erreur($serveur);
536
-	}
537
-
538
-	return $r;
529
+    $f = sql_serveur('seek', $serveur, $option === 'continue' or $option === false);
530
+    if (!is_string($f) or !$f) {
531
+        return false;
532
+    }
533
+    $r = $f($res, $row_number, $serveur, $option !== false);
534
+    if ($r === false) {
535
+        spip_sql_erreur($serveur);
536
+    }
537
+
538
+    return $r;
539 539
 }
540 540
 
541 541
 
@@ -560,16 +560,16 @@  discard block
 block discarded – undo
560 560
  *    False en cas d'erreur.
561 561
  **/
562 562
 function sql_listdbs($serveur = '', $option = true) {
563
-	$f = sql_serveur('listdbs', $serveur, $option === 'continue' or $option === false);
564
-	if (!is_string($f) or !$f) {
565
-		return false;
566
-	}
567
-	$r = $f($serveur);
568
-	if ($r === false) {
569
-		spip_sql_erreur($serveur);
570
-	}
571
-
572
-	return $r;
563
+    $f = sql_serveur('listdbs', $serveur, $option === 'continue' or $option === false);
564
+    if (!is_string($f) or !$f) {
565
+        return false;
566
+    }
567
+    $r = $f($serveur);
568
+    if ($r === false) {
569
+        spip_sql_erreur($serveur);
570
+    }
571
+
572
+    return $r;
573 573
 }
574 574
 
575 575
 
@@ -592,16 +592,16 @@  discard block
 block discarded – undo
592 592
  *     - False en cas d'erreur.
593 593
  **/
594 594
 function sql_selectdb($nom, $serveur = '', $option = true) {
595
-	$f = sql_serveur('selectdb', $serveur, $option === 'continue' or $option === false);
596
-	if (!is_string($f) or !$f) {
597
-		return false;
598
-	}
599
-	$r = $f($nom, $serveur, $option !== false);
600
-	if ($r === false) {
601
-		spip_sql_erreur($serveur);
602
-	}
603
-
604
-	return $r;
595
+    $f = sql_serveur('selectdb', $serveur, $option === 'continue' or $option === false);
596
+    if (!is_string($f) or !$f) {
597
+        return false;
598
+    }
599
+    $r = $f($nom, $serveur, $option !== false);
600
+    if ($r === false) {
601
+        spip_sql_erreur($serveur);
602
+    }
603
+
604
+    return $r;
605 605
 }
606 606
 
607 607
 /**
@@ -626,16 +626,16 @@  discard block
 block discarded – undo
626 626
  *     - false en cas d'erreur.
627 627
  **/
628 628
 function sql_count($res, $serveur = '', $option = true) {
629
-	$f = sql_serveur('count', $serveur, $option === 'continue' or $option === false);
630
-	if (!is_string($f) or !$f) {
631
-		return false;
632
-	}
633
-	$r = $f($res, $serveur, $option !== false);
634
-	if ($r === false) {
635
-		spip_sql_erreur($serveur);
636
-	}
637
-
638
-	return $r;
629
+    $f = sql_serveur('count', $serveur, $option === 'continue' or $option === false);
630
+    if (!is_string($f) or !$f) {
631
+        return false;
632
+    }
633
+    $r = $f($res, $serveur, $option !== false);
634
+    if ($r === false) {
635
+        spip_sql_erreur($serveur);
636
+    }
637
+
638
+    return $r;
639 639
 }
640 640
 
641 641
 /**
@@ -657,12 +657,12 @@  discard block
 block discarded – undo
657 657
  *     True si réussi
658 658
  */
659 659
 function sql_free($res, $serveur = '', $option = true) {
660
-	$f = sql_serveur('free', $serveur, $option === 'continue' or $option === false);
661
-	if (!is_string($f) or !$f) {
662
-		return false;
663
-	}
660
+    $f = sql_serveur('free', $serveur, $option === 'continue' or $option === false);
661
+    if (!is_string($f) or !$f) {
662
+        return false;
663
+    }
664 664
 
665
-	return $f($res);
665
+    return $f($res);
666 666
 }
667 667
 
668 668
 
@@ -700,17 +700,17 @@  discard block
 block discarded – undo
700 700
  *     - False en cas d'erreur.
701 701
  **/
702 702
 function sql_insert($table, $noms, $valeurs, $desc = [], $serveur = '', $option = true) {
703
-	$f = sql_serveur('insert', $serveur, $option === 'continue' or $option === false);
704
-	if (!is_string($f) or !$f) {
705
-		return false;
706
-	}
707
-	$r = $f($table, $noms, $valeurs, $desc, $serveur, $option !== false);
708
-	if ($r === false or $r === null) {
709
-		spip_sql_erreur($serveur);
710
-		$r = false;
711
-	}
712
-
713
-	return $r;
703
+    $f = sql_serveur('insert', $serveur, $option === 'continue' or $option === false);
704
+    if (!is_string($f) or !$f) {
705
+        return false;
706
+    }
707
+    $r = $f($table, $noms, $valeurs, $desc, $serveur, $option !== false);
708
+    if ($r === false or $r === null) {
709
+        spip_sql_erreur($serveur);
710
+        $r = false;
711
+    }
712
+
713
+    return $r;
714 714
 }
715 715
 
716 716
 /**
@@ -751,17 +751,17 @@  discard block
 block discarded – undo
751 751
  *     - False en cas d'erreur.
752 752
  **/
753 753
 function sql_insertq($table, $couples = [], $desc = [], $serveur = '', $option = true) {
754
-	$f = sql_serveur('insertq', $serveur, $option === 'continue' or $option === false);
755
-	if (!is_string($f) or !$f) {
756
-		return false;
757
-	}
758
-	$r = $f($table, $couples, $desc, $serveur, $option !== false);
759
-	if ($r === false or $r === null) {
760
-		spip_sql_erreur($serveur);
761
-		$r = false;
762
-	}
763
-
764
-	return $r;
754
+    $f = sql_serveur('insertq', $serveur, $option === 'continue' or $option === false);
755
+    if (!is_string($f) or !$f) {
756
+        return false;
757
+    }
758
+    $r = $f($table, $couples, $desc, $serveur, $option !== false);
759
+    if ($r === false or $r === null) {
760
+        spip_sql_erreur($serveur);
761
+        $r = false;
762
+    }
763
+
764
+    return $r;
765 765
 }
766 766
 
767 767
 /**
@@ -796,17 +796,17 @@  discard block
 block discarded – undo
796 796
  *     - False en cas d'erreur.
797 797
  **/
798 798
 function sql_insertq_multi($table, $couples = [], $desc = [], $serveur = '', $option = true) {
799
-	$f = sql_serveur('insertq_multi', $serveur, $option === 'continue' or $option === false);
800
-	if (!is_string($f) or !$f) {
801
-		return false;
802
-	}
803
-	$r = $f($table, $couples, $desc, $serveur, $option !== false);
804
-	if ($r === false or $r === null) {
805
-		spip_sql_erreur($serveur);
806
-		$r = false;
807
-	}
808
-
809
-	return $r;
799
+    $f = sql_serveur('insertq_multi', $serveur, $option === 'continue' or $option === false);
800
+    if (!is_string($f) or !$f) {
801
+        return false;
802
+    }
803
+    $r = $f($table, $couples, $desc, $serveur, $option !== false);
804
+    if ($r === false or $r === null) {
805
+        spip_sql_erreur($serveur);
806
+        $r = false;
807
+    }
808
+
809
+    return $r;
810 810
 }
811 811
 
812 812
 /**
@@ -846,16 +846,16 @@  discard block
 block discarded – undo
846 846
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
847 847
  */
848 848
 function sql_update($table, $exp, $where = '', $desc = [], $serveur = '', $option = true) {
849
-	$f = sql_serveur('update', $serveur, $option === 'continue' or $option === false);
850
-	if (!is_string($f) or !$f) {
851
-		return false;
852
-	}
853
-	$r = $f($table, $exp, $where, $desc, $serveur, $option !== false);
854
-	if ($r === false) {
855
-		spip_sql_erreur($serveur);
856
-	}
857
-
858
-	return $r;
849
+    $f = sql_serveur('update', $serveur, $option === 'continue' or $option === false);
850
+    if (!is_string($f) or !$f) {
851
+        return false;
852
+    }
853
+    $r = $f($table, $exp, $where, $desc, $serveur, $option !== false);
854
+    if ($r === false) {
855
+        spip_sql_erreur($serveur);
856
+    }
857
+
858
+    return $r;
859 859
 }
860 860
 
861 861
 
@@ -901,16 +901,16 @@  discard block
 block discarded – undo
901 901
  *     - False en cas d'erreur.
902 902
  **/
903 903
 function sql_updateq($table, $exp, $where = '', $desc = [], $serveur = '', $option = true) {
904
-	$f = sql_serveur('updateq', $serveur, $option === 'continue' or $option === false);
905
-	if (!is_string($f) or !$f) {
906
-		return false;
907
-	}
908
-	$r = $f($table, $exp, $where, $desc, $serveur, $option !== false);
909
-	if ($r === false) {
910
-		spip_sql_erreur($serveur);
911
-	}
912
-
913
-	return $r;
904
+    $f = sql_serveur('updateq', $serveur, $option === 'continue' or $option === false);
905
+    if (!is_string($f) or !$f) {
906
+        return false;
907
+    }
908
+    $r = $f($table, $exp, $where, $desc, $serveur, $option !== false);
909
+    if ($r === false) {
910
+        spip_sql_erreur($serveur);
911
+    }
912
+
913
+    return $r;
914 914
 }
915 915
 
916 916
 /**
@@ -941,16 +941,16 @@  discard block
 block discarded – undo
941 941
  *     - False en cas d'erreur.
942 942
  **/
943 943
 function sql_delete($table, $where = '', $serveur = '', $option = true) {
944
-	$f = sql_serveur('delete', $serveur, $option === 'continue' or $option === false);
945
-	if (!is_string($f) or !$f) {
946
-		return false;
947
-	}
948
-	$r = $f($table, $where, $serveur, $option !== false);
949
-	if ($r === false) {
950
-		spip_sql_erreur($serveur);
951
-	}
952
-
953
-	return $r;
944
+    $f = sql_serveur('delete', $serveur, $option === 'continue' or $option === false);
945
+    if (!is_string($f) or !$f) {
946
+        return false;
947
+    }
948
+    $r = $f($table, $where, $serveur, $option !== false);
949
+    if ($r === false) {
950
+        spip_sql_erreur($serveur);
951
+    }
952
+
953
+    return $r;
954 954
 }
955 955
 
956 956
 /**
@@ -986,16 +986,16 @@  discard block
 block discarded – undo
986 986
  *     - False en cas d'erreur.
987 987
  **/
988 988
 function sql_replace($table, $couples, $desc = [], $serveur = '', $option = true) {
989
-	$f = sql_serveur('replace', $serveur, $option === 'continue' or $option === false);
990
-	if (!is_string($f) or !$f) {
991
-		return false;
992
-	}
993
-	$r = $f($table, $couples, $desc, $serveur, $option !== false);
994
-	if ($r === false) {
995
-		spip_sql_erreur($serveur);
996
-	}
997
-
998
-	return $r;
989
+    $f = sql_serveur('replace', $serveur, $option === 'continue' or $option === false);
990
+    if (!is_string($f) or !$f) {
991
+        return false;
992
+    }
993
+    $r = $f($table, $couples, $desc, $serveur, $option !== false);
994
+    if ($r === false) {
995
+        spip_sql_erreur($serveur);
996
+    }
997
+
998
+    return $r;
999 999
 }
1000 1000
 
1001 1001
 
@@ -1033,16 +1033,16 @@  discard block
 block discarded – undo
1033 1033
  *     - False en cas d'erreur.
1034 1034
  **/
1035 1035
 function sql_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $option = true) {
1036
-	$f = sql_serveur('replace_multi', $serveur, $option === 'continue' or $option === false);
1037
-	if (!is_string($f) or !$f) {
1038
-		return false;
1039
-	}
1040
-	$r = $f($table, $tab_couples, $desc, $serveur, $option !== false);
1041
-	if ($r === false) {
1042
-		spip_sql_erreur($serveur);
1043
-	}
1044
-
1045
-	return $r;
1036
+    $f = sql_serveur('replace_multi', $serveur, $option === 'continue' or $option === false);
1037
+    if (!is_string($f) or !$f) {
1038
+        return false;
1039
+    }
1040
+    $r = $f($table, $tab_couples, $desc, $serveur, $option !== false);
1041
+    if ($r === false) {
1042
+        spip_sql_erreur($serveur);
1043
+    }
1044
+
1045
+    return $r;
1046 1046
 }
1047 1047
 
1048 1048
 /**
@@ -1070,16 +1070,16 @@  discard block
 block discarded – undo
1070 1070
  *     - False en cas d'erreur.
1071 1071
  **/
1072 1072
 function sql_drop_table($table, $exist = '', $serveur = '', $option = true) {
1073
-	$f = sql_serveur('drop_table', $serveur, $option === 'continue' or $option === false);
1074
-	if (!is_string($f) or !$f) {
1075
-		return false;
1076
-	}
1077
-	$r = $f($table, $exist, $serveur, $option !== false);
1078
-	if ($r === false) {
1079
-		spip_sql_erreur($serveur);
1080
-	}
1081
-
1082
-	return $r;
1073
+    $f = sql_serveur('drop_table', $serveur, $option === 'continue' or $option === false);
1074
+    if (!is_string($f) or !$f) {
1075
+        return false;
1076
+    }
1077
+    $r = $f($table, $exist, $serveur, $option !== false);
1078
+    if ($r === false) {
1079
+        spip_sql_erreur($serveur);
1080
+    }
1081
+
1082
+    return $r;
1083 1083
 }
1084 1084
 
1085 1085
 /**
@@ -1103,16 +1103,16 @@  discard block
 block discarded – undo
1103 1103
  *     - true si la requête a réussie, false sinon
1104 1104
  */
1105 1105
 function sql_drop_view($table, $exist = '', $serveur = '', $option = true) {
1106
-	$f = sql_serveur('drop_view', $serveur, $option === 'continue' or $option === false);
1107
-	if (!is_string($f) or !$f) {
1108
-		return false;
1109
-	}
1110
-	$r = $f($table, $exist, $serveur, $option !== false);
1111
-	if ($r === false) {
1112
-		spip_sql_erreur($serveur);
1113
-	}
1114
-
1115
-	return $r;
1106
+    $f = sql_serveur('drop_view', $serveur, $option === 'continue' or $option === false);
1107
+    if (!is_string($f) or !$f) {
1108
+        return false;
1109
+    }
1110
+    $r = $f($table, $exist, $serveur, $option !== false);
1111
+    if ($r === false) {
1112
+        spip_sql_erreur($serveur);
1113
+    }
1114
+
1115
+    return $r;
1116 1116
 }
1117 1117
 
1118 1118
 /**
@@ -1136,18 +1136,18 @@  discard block
 block discarded – undo
1136 1136
  *     Ressource à utiliser avec sql_fetch()
1137 1137
  **/
1138 1138
 function sql_showbase($spip = null, $serveur = '', $option = true) {
1139
-	$f = sql_serveur('showbase', $serveur, $option === 'continue' or $option === false);
1140
-	if (!is_string($f) or !$f) {
1141
-		return false;
1142
-	}
1143
-
1144
-	// la globale n'est remplie qu'apres l'appel de sql_serveur.
1145
-	if ($spip == null) {
1146
-		$connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1147
-		$spip = $connexion['prefixe'] . '\_%';
1148
-	}
1149
-
1150
-	return $f($spip, $serveur, $option !== false);
1139
+    $f = sql_serveur('showbase', $serveur, $option === 'continue' or $option === false);
1140
+    if (!is_string($f) or !$f) {
1141
+        return false;
1142
+    }
1143
+
1144
+    // la globale n'est remplie qu'apres l'appel de sql_serveur.
1145
+    if ($spip == null) {
1146
+        $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1147
+        $spip = $connexion['prefixe'] . '\_%';
1148
+    }
1149
+
1150
+    return $f($spip, $serveur, $option !== false);
1151 1151
 }
1152 1152
 
1153 1153
 /**
@@ -1170,15 +1170,15 @@  discard block
 block discarded – undo
1170 1170
  *     Liste des tables SQL
1171 1171
  **/
1172 1172
 function sql_alltable($spip = null, $serveur = '', $option = true) {
1173
-	$q = sql_showbase($spip, $serveur, $option);
1174
-	$r = [];
1175
-	if ($q) {
1176
-		while ($t = sql_fetch($q, $serveur)) {
1177
-			$r[] = array_shift($t);
1178
-		}
1179
-	}
1180
-
1181
-	return $r;
1173
+    $q = sql_showbase($spip, $serveur, $option);
1174
+    $r = [];
1175
+    if ($q) {
1176
+        while ($t = sql_fetch($q, $serveur)) {
1177
+            $r[] = array_shift($t);
1178
+        }
1179
+    }
1180
+
1181
+    return $r;
1182 1182
 }
1183 1183
 
1184 1184
 /**
@@ -1211,31 +1211,31 @@  discard block
 block discarded – undo
1211 1211
  *       - 'join' => array() // jointures, si déclarées.
1212 1212
  **/
1213 1213
 function sql_showtable($table, $table_spip = false, $serveur = '', $option = true) {
1214
-	$f = sql_serveur('showtable', $serveur, $option === 'continue' or $option === false);
1215
-	if (!is_string($f) or !$f) {
1216
-		return false;
1217
-	}
1218
-
1219
-	// la globale n'est remplie qu'apres l'appel de sql_serveur.
1220
-	if ($table_spip) {
1221
-		$connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1222
-		$prefixe = $connexion['prefixe'];
1223
-		$vraie_table = prefixer_table_spip($table, $prefixe);
1224
-	} else {
1225
-		$vraie_table = $table;
1226
-	}
1227
-
1228
-	$f = $f($vraie_table, $serveur, $option !== false);
1229
-	if (!$f) {
1230
-		return [];
1231
-	}
1232
-	if (isset($GLOBALS['tables_principales'][$table]['join'])) {
1233
-		$f['join'] = $GLOBALS['tables_principales'][$table]['join'];
1234
-	} elseif (isset($GLOBALS['tables_auxiliaires'][$table]['join'])) {
1235
-		$f['join'] = $GLOBALS['tables_auxiliaires'][$table]['join'];
1236
-	}
1237
-
1238
-	return $f;
1214
+    $f = sql_serveur('showtable', $serveur, $option === 'continue' or $option === false);
1215
+    if (!is_string($f) or !$f) {
1216
+        return false;
1217
+    }
1218
+
1219
+    // la globale n'est remplie qu'apres l'appel de sql_serveur.
1220
+    if ($table_spip) {
1221
+        $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1222
+        $prefixe = $connexion['prefixe'];
1223
+        $vraie_table = prefixer_table_spip($table, $prefixe);
1224
+    } else {
1225
+        $vraie_table = $table;
1226
+    }
1227
+
1228
+    $f = $f($vraie_table, $serveur, $option !== false);
1229
+    if (!$f) {
1230
+        return [];
1231
+    }
1232
+    if (isset($GLOBALS['tables_principales'][$table]['join'])) {
1233
+        $f['join'] = $GLOBALS['tables_principales'][$table]['join'];
1234
+    } elseif (isset($GLOBALS['tables_auxiliaires'][$table]['join'])) {
1235
+        $f['join'] = $GLOBALS['tables_auxiliaires'][$table]['join'];
1236
+    }
1237
+
1238
+    return $f;
1239 1239
 }
1240 1240
 
1241 1241
 
@@ -1263,21 +1263,21 @@  discard block
 block discarded – undo
1263 1263
  *     - False en cas d'erreur.
1264 1264
  **/
1265 1265
 function sql_table_exists(string $table, bool $table_spip = true, $serveur = '', $option = true) {
1266
-	$f = sql_serveur('table_exists', $serveur, $option === 'continue' or $option === false);
1267
-	if (!is_string($f) or !$f) {
1268
-		return false;
1269
-	}
1270
-
1271
-	// la globale n'est remplie qu'apres l'appel de sql_serveur.
1272
-	if ($table_spip) {
1273
-		$connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1274
-		$prefixe = $connexion['prefixe'];
1275
-		$vraie_table = prefixer_table_spip($table, $prefixe);
1276
-	} else {
1277
-		$vraie_table = $table;
1278
-	}
1279
-
1280
-	return $f($vraie_table, $serveur, $option !== false);
1266
+    $f = sql_serveur('table_exists', $serveur, $option === 'continue' or $option === false);
1267
+    if (!is_string($f) or !$f) {
1268
+        return false;
1269
+    }
1270
+
1271
+    // la globale n'est remplie qu'apres l'appel de sql_serveur.
1272
+    if ($table_spip) {
1273
+        $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1274
+        $prefixe = $connexion['prefixe'];
1275
+        $vraie_table = prefixer_table_spip($table, $prefixe);
1276
+    } else {
1277
+        $vraie_table = $table;
1278
+    }
1279
+
1280
+    return $f($vraie_table, $serveur, $option !== false);
1281 1281
 }
1282 1282
 
1283 1283
 
@@ -1323,24 +1323,24 @@  discard block
 block discarded – undo
1323 1323
  *     true si succès, false en cas d'echec
1324 1324
  **/
1325 1325
 function sql_create(
1326
-	$nom,
1327
-	$champs,
1328
-	$cles = [],
1329
-	$autoinc = false,
1330
-	$temporary = false,
1331
-	$serveur = '',
1332
-	$option = true
1326
+    $nom,
1327
+    $champs,
1328
+    $cles = [],
1329
+    $autoinc = false,
1330
+    $temporary = false,
1331
+    $serveur = '',
1332
+    $option = true
1333 1333
 ) {
1334
-	$f = sql_serveur('create', $serveur, $option === 'continue' or $option === false);
1335
-	if (!is_string($f) or !$f) {
1336
-		return false;
1337
-	}
1338
-	$r = $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option !== false);
1339
-	if ($r === false) {
1340
-		spip_sql_erreur($serveur);
1341
-	}
1342
-
1343
-	return $r;
1334
+    $f = sql_serveur('create', $serveur, $option === 'continue' or $option === false);
1335
+    if (!is_string($f) or !$f) {
1336
+        return false;
1337
+    }
1338
+    $r = $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option !== false);
1339
+    if ($r === false) {
1340
+        spip_sql_erreur($serveur);
1341
+    }
1342
+
1343
+    return $r;
1344 1344
 }
1345 1345
 
1346 1346
 /**
@@ -1358,16 +1358,16 @@  discard block
 block discarded – undo
1358 1358
  * @return bool true si la base est créee.
1359 1359
  **/
1360 1360
 function sql_create_base($nom, $serveur = '', $option = true) {
1361
-	$f = sql_serveur('create_base', $serveur, $option === 'continue' or $option === false);
1362
-	if (!is_string($f) or !$f) {
1363
-		return false;
1364
-	}
1365
-	$r = $f($nom, $serveur, $option !== false);
1366
-	if ($r === false) {
1367
-		spip_sql_erreur($serveur);
1368
-	}
1369
-
1370
-	return $r;
1361
+    $f = sql_serveur('create_base', $serveur, $option === 'continue' or $option === false);
1362
+    if (!is_string($f) or !$f) {
1363
+        return false;
1364
+    }
1365
+    $r = $f($nom, $serveur, $option !== false);
1366
+    if ($r === false) {
1367
+        spip_sql_erreur($serveur);
1368
+    }
1369
+
1370
+    return $r;
1371 1371
 }
1372 1372
 
1373 1373
 
@@ -1397,16 +1397,16 @@  discard block
 block discarded – undo
1397 1397
  *     - false en cas d'échec.
1398 1398
  **/
1399 1399
 function sql_create_view($nom, $select_query, $serveur = '', $option = true) {
1400
-	$f = sql_serveur('create_view', $serveur, $option === 'continue' or $option === false);
1401
-	if (!is_string($f) or !$f) {
1402
-		return false;
1403
-	}
1404
-	$r = $f($nom, $select_query, $serveur, $option !== false);
1405
-	if ($r === false) {
1406
-		spip_sql_erreur($serveur);
1407
-	}
1408
-
1409
-	return $r;
1400
+    $f = sql_serveur('create_view', $serveur, $option === 'continue' or $option === false);
1401
+    if (!is_string($f) or !$f) {
1402
+        return false;
1403
+    }
1404
+    $r = $f($nom, $select_query, $serveur, $option !== false);
1405
+    if ($r === false) {
1406
+        spip_sql_erreur($serveur);
1407
+    }
1408
+
1409
+    return $r;
1410 1410
 }
1411 1411
 
1412 1412
 /**
@@ -1435,12 +1435,12 @@  discard block
 block discarded – undo
1435 1435
  *     Texte de sélection pour la requête
1436 1436
  */
1437 1437
 function sql_multi($sel, $lang, $serveur = '', $option = true) {
1438
-	$f = sql_serveur('multi', $serveur, $option === 'continue' or $option === false);
1439
-	if (!is_string($f) or !$f) {
1440
-		return false;
1441
-	}
1438
+    $f = sql_serveur('multi', $serveur, $option === 'continue' or $option === false);
1439
+    if (!is_string($f) or !$f) {
1440
+        return false;
1441
+    }
1442 1442
 
1443
-	return $f($sel, $lang);
1443
+    return $f($sel, $lang);
1444 1444
 }
1445 1445
 
1446 1446
 
@@ -1455,12 +1455,12 @@  discard block
 block discarded – undo
1455 1455
  *      False si le serveur est indisponible
1456 1456
  */
1457 1457
 function sql_error($serveur = '') {
1458
-	$f = sql_serveur('error', $serveur, true);
1459
-	if (!is_string($f) or !$f) {
1460
-		return false;
1461
-	}
1458
+    $f = sql_serveur('error', $serveur, true);
1459
+    if (!is_string($f) or !$f) {
1460
+        return false;
1461
+    }
1462 1462
 
1463
-	return $f('query inconnue', $serveur);
1463
+    return $f('query inconnue', $serveur);
1464 1464
 }
1465 1465
 
1466 1466
 /**
@@ -1474,12 +1474,12 @@  discard block
 block discarded – undo
1474 1474
  *      False si le serveur est indisponible
1475 1475
  */
1476 1476
 function sql_errno($serveur = '') {
1477
-	$f = sql_serveur('errno', $serveur, true);
1478
-	if (!is_string($f) or !$f) {
1479
-		return false;
1480
-	}
1477
+    $f = sql_serveur('errno', $serveur, true);
1478
+    if (!is_string($f) or !$f) {
1479
+        return false;
1480
+    }
1481 1481
 
1482
-	return $f($serveur);
1482
+    return $f($serveur);
1483 1483
 }
1484 1484
 
1485 1485
 /**
@@ -1497,16 +1497,16 @@  discard block
 block discarded – undo
1497 1497
  * @return array|false   Tableau de l'explication
1498 1498
  */
1499 1499
 function sql_explain($q, $serveur = '', $option = true) {
1500
-	$f = sql_serveur('explain', $serveur, true);
1501
-	if (!is_string($f) or !$f) {
1502
-		return false;
1503
-	}
1504
-	$r = $f($q, $serveur, $option !== false);
1505
-	if ($r === false) {
1506
-		spip_sql_erreur($serveur);
1507
-	}
1508
-
1509
-	return $r;
1500
+    $f = sql_serveur('explain', $serveur, true);
1501
+    if (!is_string($f) or !$f) {
1502
+        return false;
1503
+    }
1504
+    $r = $f($q, $serveur, $option !== false);
1505
+    if ($r === false) {
1506
+        spip_sql_erreur($serveur);
1507
+    }
1508
+
1509
+    return $r;
1510 1510
 }
1511 1511
 
1512 1512
 /**
@@ -1524,16 +1524,16 @@  discard block
 block discarded – undo
1524 1524
  * @return bool            Toujours true
1525 1525
  */
1526 1526
 function sql_optimize($table, $serveur = '', $option = true) {
1527
-	$f = sql_serveur('optimize', $serveur, $option === 'continue' or $option === false);
1528
-	if (!is_string($f) or !$f) {
1529
-		return false;
1530
-	}
1531
-	$r = $f($table, $serveur, $option !== false);
1532
-	if ($r === false) {
1533
-		spip_sql_erreur($serveur);
1534
-	}
1535
-
1536
-	return $r;
1527
+    $f = sql_serveur('optimize', $serveur, $option === 'continue' or $option === false);
1528
+    if (!is_string($f) or !$f) {
1529
+        return false;
1530
+    }
1531
+    $r = $f($table, $serveur, $option !== false);
1532
+    if ($r === false) {
1533
+        spip_sql_erreur($serveur);
1534
+    }
1535
+
1536
+    return $r;
1537 1537
 }
1538 1538
 
1539 1539
 /**
@@ -1553,16 +1553,16 @@  discard block
 block discarded – undo
1553 1553
  *     - true si la requête a réussie, false sinon
1554 1554
  */
1555 1555
 function sql_repair($table, $serveur = '', $option = true) {
1556
-	$f = sql_serveur('repair', $serveur, $option === 'continue' or $option === false);
1557
-	if (!is_string($f) or !$f) {
1558
-		return false;
1559
-	}
1560
-	$r = $f($table, $serveur, $option !== false);
1561
-	if ($r === false) {
1562
-		spip_sql_erreur($serveur);
1563
-	}
1564
-
1565
-	return $r;
1556
+    $f = sql_serveur('repair', $serveur, $option === 'continue' or $option === false);
1557
+    if (!is_string($f) or !$f) {
1558
+        return false;
1559
+    }
1560
+    $r = $f($table, $serveur, $option !== false);
1561
+    if ($r === false) {
1562
+        spip_sql_erreur($serveur);
1563
+    }
1564
+
1565
+    return $r;
1566 1566
 }
1567 1567
 
1568 1568
 
@@ -1587,16 +1587,16 @@  discard block
 block discarded – undo
1587 1587
  *     - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1588 1588
  */
1589 1589
 function sql_query($ins, $serveur = '', $option = true) {
1590
-	$f = sql_serveur('query', $serveur, $option === 'continue' or $option === false);
1591
-	if (!is_string($f) or !$f) {
1592
-		return false;
1593
-	}
1594
-	$r = $f($ins, $serveur, $option !== false);
1595
-	if ($r === false) {
1596
-		spip_sql_erreur($serveur);
1597
-	}
1598
-
1599
-	return $r;
1590
+    $f = sql_serveur('query', $serveur, $option === 'continue' or $option === false);
1591
+    if (!is_string($f) or !$f) {
1592
+        return false;
1593
+    }
1594
+    $r = $f($ins, $serveur, $option !== false);
1595
+    if ($r === false) {
1596
+        spip_sql_erreur($serveur);
1597
+    }
1598
+
1599
+    return $r;
1600 1600
 }
1601 1601
 
1602 1602
 /**
@@ -1644,27 +1644,27 @@  discard block
 block discarded – undo
1644 1644
  *
1645 1645
  **/
1646 1646
 function sql_fetsel(
1647
-	$select = [],
1648
-	$from = [],
1649
-	$where = [],
1650
-	$groupby = [],
1651
-	$orderby = [],
1652
-	$limit = '',
1653
-	$having = [],
1654
-	$serveur = '',
1655
-	$option = true
1647
+    $select = [],
1648
+    $from = [],
1649
+    $where = [],
1650
+    $groupby = [],
1651
+    $orderby = [],
1652
+    $limit = '',
1653
+    $having = [],
1654
+    $serveur = '',
1655
+    $option = true
1656 1656
 ) {
1657
-	$q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1658
-	if ($option === false) {
1659
-		return $q;
1660
-	}
1661
-	if (!$q) {
1662
-		return [];
1663
-	}
1664
-	$r = sql_fetch($q, $serveur, $option);
1665
-	sql_free($q, $serveur, $option);
1666
-
1667
-	return $r;
1657
+    $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1658
+    if ($option === false) {
1659
+        return $q;
1660
+    }
1661
+    if (!$q) {
1662
+        return [];
1663
+    }
1664
+    $r = sql_fetch($q, $serveur, $option);
1665
+    sql_free($q, $serveur, $option);
1666
+
1667
+    return $r;
1668 1668
 }
1669 1669
 
1670 1670
 
@@ -1721,22 +1721,22 @@  discard block
 block discarded – undo
1721 1721
  *
1722 1722
  **/
1723 1723
 function sql_allfetsel(
1724
-	$select = [],
1725
-	$from = [],
1726
-	$where = [],
1727
-	$groupby = [],
1728
-	$orderby = [],
1729
-	$limit = '',
1730
-	$having = [],
1731
-	$serveur = '',
1732
-	$option = true
1724
+    $select = [],
1725
+    $from = [],
1726
+    $where = [],
1727
+    $groupby = [],
1728
+    $orderby = [],
1729
+    $limit = '',
1730
+    $having = [],
1731
+    $serveur = '',
1732
+    $option = true
1733 1733
 ) {
1734
-	$q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1735
-	if ($option === false) {
1736
-		return $q;
1737
-	}
1734
+    $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1735
+    if ($option === false) {
1736
+        return $q;
1737
+    }
1738 1738
 
1739
-	return sql_fetch_all($q, $serveur, $option);
1739
+    return sql_fetch_all($q, $serveur, $option);
1740 1740
 }
1741 1741
 
1742 1742
 
@@ -1783,33 +1783,33 @@  discard block
 block discarded – undo
1783 1783
  *
1784 1784
  **/
1785 1785
 function sql_getfetsel(
1786
-	$select,
1787
-	$from = [],
1788
-	$where = [],
1789
-	$groupby = [],
1790
-	$orderby = [],
1791
-	$limit = '',
1792
-	$having = [],
1793
-	$serveur = '',
1794
-	$option = true
1786
+    $select,
1787
+    $from = [],
1788
+    $where = [],
1789
+    $groupby = [],
1790
+    $orderby = [],
1791
+    $limit = '',
1792
+    $having = [],
1793
+    $serveur = '',
1794
+    $option = true
1795 1795
 ) {
1796
-	if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) {
1797
-		$id = $c[1];
1798
-	} elseif (!preg_match('/\W/', $select)) {
1799
-		$id = $select;
1800
-	} else {
1801
-		$id = 'n';
1802
-		$select .= ' AS n';
1803
-	}
1804
-	$r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1805
-	if ($option === false) {
1806
-		return $r;
1807
-	}
1808
-	if (!$r) {
1809
-		return null;
1810
-	}
1811
-
1812
-	return $r[$id];
1796
+    if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) {
1797
+        $id = $c[1];
1798
+    } elseif (!preg_match('/\W/', $select)) {
1799
+        $id = $select;
1800
+    } else {
1801
+        $id = 'n';
1802
+        $select .= ' AS n';
1803
+    }
1804
+    $r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1805
+    if ($option === false) {
1806
+        return $r;
1807
+    }
1808
+    if (!$r) {
1809
+        return null;
1810
+    }
1811
+
1812
+    return $r[$id];
1813 1813
 }
1814 1814
 
1815 1815
 /**
@@ -1827,9 +1827,9 @@  discard block
 block discarded – undo
1827 1827
  *    Numero de version du serveur SQL
1828 1828
  **/
1829 1829
 function sql_version($serveur = '', $option = true) {
1830
-	$row = sql_fetsel('version() AS n', '', '', '', '', '', '', $serveur);
1830
+    $row = sql_fetsel('version() AS n', '', '', '', '', '', '', $serveur);
1831 1831
 
1832
-	return ($row['n']);
1832
+    return ($row['n']);
1833 1833
 }
1834 1834
 
1835 1835
 /**
@@ -1865,16 +1865,16 @@  discard block
 block discarded – undo
1865 1865
  *    Le serveur SQL prefere t'il des transactions pour les insertions multiples ?
1866 1866
  **/
1867 1867
 function sql_preferer_transaction($serveur = '', $option = true) {
1868
-	$f = sql_serveur('preferer_transaction', $serveur, true);
1869
-	if (!is_string($f) or !$f) {
1870
-		return false;
1871
-	}
1872
-	$r = $f($serveur, $option !== false);
1873
-	if ($r === false) {
1874
-		spip_sql_erreur($serveur);
1875
-	}
1876
-
1877
-	return $r;
1868
+    $f = sql_serveur('preferer_transaction', $serveur, true);
1869
+    if (!is_string($f) or !$f) {
1870
+        return false;
1871
+    }
1872
+    $r = $f($serveur, $option !== false);
1873
+    if ($r === false) {
1874
+        spip_sql_erreur($serveur);
1875
+    }
1876
+
1877
+    return $r;
1878 1878
 }
1879 1879
 
1880 1880
 ;
@@ -1899,16 +1899,16 @@  discard block
 block discarded – undo
1899 1899
  *      false en cas d'erreur
1900 1900
  **/
1901 1901
 function sql_demarrer_transaction($serveur = '', $option = true) {
1902
-	$f = sql_serveur('demarrer_transaction', $serveur, true);
1903
-	if (!is_string($f) or !$f) {
1904
-		return false;
1905
-	}
1906
-	$r = $f($serveur, $option !== false);
1907
-	if ($r === false) {
1908
-		spip_sql_erreur($serveur);
1909
-	}
1910
-
1911
-	return $r;
1902
+    $f = sql_serveur('demarrer_transaction', $serveur, true);
1903
+    if (!is_string($f) or !$f) {
1904
+        return false;
1905
+    }
1906
+    $r = $f($serveur, $option !== false);
1907
+    if ($r === false) {
1908
+        spip_sql_erreur($serveur);
1909
+    }
1910
+
1911
+    return $r;
1912 1912
 }
1913 1913
 
1914 1914
 ;
@@ -1933,16 +1933,16 @@  discard block
 block discarded – undo
1933 1933
  *      false en cas d'erreur
1934 1934
  **/
1935 1935
 function sql_terminer_transaction($serveur = '', $option = true) {
1936
-	$f = sql_serveur('terminer_transaction', $serveur, true);
1937
-	if (!is_string($f) or !$f) {
1938
-		return false;
1939
-	}
1940
-	$r = $f($serveur, $option !== false);
1941
-	if ($r === false) {
1942
-		spip_sql_erreur($serveur);
1943
-	}
1944
-
1945
-	return $r;
1936
+    $f = sql_serveur('terminer_transaction', $serveur, true);
1937
+    if (!is_string($f) or !$f) {
1938
+        return false;
1939
+    }
1940
+    $r = $f($serveur, $option !== false);
1941
+    if ($r === false) {
1942
+        spip_sql_erreur($serveur);
1943
+    }
1944
+
1945
+    return $r;
1946 1946
 }
1947 1947
 
1948 1948
 ;
@@ -1969,12 +1969,12 @@  discard block
 block discarded – undo
1969 1969
  *     Valeur hexadécimale attendue par le serveur SQL
1970 1970
  **/
1971 1971
 function sql_hex($val, $serveur = '', $option = true) {
1972
-	$f = sql_serveur('hex', $serveur, $option === 'continue' or $option === false);
1973
-	if (!is_string($f) or !$f) {
1974
-		return false;
1975
-	}
1972
+    $f = sql_serveur('hex', $serveur, $option === 'continue' or $option === false);
1973
+    if (!is_string($f) or !$f) {
1974
+        return false;
1975
+    }
1976 1976
 
1977
-	return $f($val);
1977
+    return $f($val);
1978 1978
 }
1979 1979
 
1980 1980
 /**
@@ -2000,12 +2000,12 @@  discard block
 block discarded – undo
2000 2000
  *     La chaine echappee
2001 2001
  **/
2002 2002
 function sql_quote($val, $serveur = '', $type = '') {
2003
-	$f = sql_serveur('quote', $serveur, true);
2004
-	if (!is_string($f) or !$f) {
2005
-		$f = '_q';
2006
-	}
2003
+    $f = sql_serveur('quote', $serveur, true);
2004
+    if (!is_string($f) or !$f) {
2005
+        $f = '_q';
2006
+    }
2007 2007
 
2008
-	return $f($val, $type);
2008
+    return $f($val, $type);
2009 2009
 }
2010 2010
 
2011 2011
 /**
@@ -2030,12 +2030,12 @@  discard block
 block discarded – undo
2030 2030
  *     - false si le serveur SQL est indisponible
2031 2031
  **/
2032 2032
 function sql_date_proche($champ, $interval, $unite, $serveur = '', $option = true) {
2033
-	$f = sql_serveur('date_proche', $serveur, true);
2034
-	if (!is_string($f) or !$f) {
2035
-		return false;
2036
-	}
2033
+    $f = sql_serveur('date_proche', $serveur, true);
2034
+    if (!is_string($f) or !$f) {
2035
+        return false;
2036
+    }
2037 2037
 
2038
-	return $f($champ, $interval, $unite);
2038
+    return $f($champ, $interval, $unite);
2039 2039
 }
2040 2040
 
2041 2041
 /**
@@ -2071,26 +2071,26 @@  discard block
 block discarded – undo
2071 2071
  *     Expression de requête SQL
2072 2072
  **/
2073 2073
 function sql_in_quote($champ, $valeurs, $not = '', $serveur = '', $type = '', $option = true) {
2074
-	$quote = sql_serveur('quote', $serveur, true);
2075
-	if (!is_string($quote) or !$quote) {
2076
-		return false;
2077
-	}
2078
-
2079
-	// sql_quote produit une chaine dans tous les cas
2080
-	$valeurs = array_filter($valeurs, fn($v) => !is_array($v));
2081
-	$valeurs = array_unique($valeurs);
2082
-	$valeurs = $quote($valeurs, $type);
2083
-
2084
-	if (!strlen(trim($valeurs))) {
2085
-		return ($not ? '0=0' : '0=1');
2086
-	}
2087
-
2088
-	$f = sql_serveur('in', $serveur, $option === 'continue' or $option === false);
2089
-	if (!is_string($f) or !$f) {
2090
-		return false;
2091
-	}
2092
-
2093
-	return $f($champ, $valeurs, $not ? 'NOT' : '', $serveur, $option !== false);
2074
+    $quote = sql_serveur('quote', $serveur, true);
2075
+    if (!is_string($quote) or !$quote) {
2076
+        return false;
2077
+    }
2078
+
2079
+    // sql_quote produit une chaine dans tous les cas
2080
+    $valeurs = array_filter($valeurs, fn($v) => !is_array($v));
2081
+    $valeurs = array_unique($valeurs);
2082
+    $valeurs = $quote($valeurs, $type);
2083
+
2084
+    if (!strlen(trim($valeurs))) {
2085
+        return ($not ? '0=0' : '0=1');
2086
+    }
2087
+
2088
+    $f = sql_serveur('in', $serveur, $option === 'continue' or $option === false);
2089
+    if (!is_string($f) or !$f) {
2090
+        return false;
2091
+    }
2092
+
2093
+    return $f($champ, $valeurs, $not ? 'NOT' : '', $serveur, $option !== false);
2094 2094
 }
2095 2095
 
2096 2096
 /**
@@ -2107,19 +2107,19 @@  discard block
 block discarded – undo
2107 2107
  * @param bool $option
2108 2108
  */
2109 2109
 function sql_in($champ, $valeurs, $not = '', $serveur = '', $option = true) {
2110
-	$type = '';
2111
-	if (!is_array($valeurs)) {
2112
-		$valeurs = strval($valeurs);
2113
-		if (isset($valeurs[0]) and $valeurs[0] === ',') {
2114
-			$valeurs = substr($valeurs, 1);
2115
-		}
2116
-		// on explode en tableau pour pouvoir securiser le contenu
2117
-		$valeurs = explode(',', $valeurs);
2118
-		// et on force un cast de type int donc
2119
-		$type = 'int';
2120
-	}
2121
-
2122
-	return sql_in_quote($champ, $valeurs, $not, $serveur, $type, $option);
2110
+    $type = '';
2111
+    if (!is_array($valeurs)) {
2112
+        $valeurs = strval($valeurs);
2113
+        if (isset($valeurs[0]) and $valeurs[0] === ',') {
2114
+            $valeurs = substr($valeurs, 1);
2115
+        }
2116
+        // on explode en tableau pour pouvoir securiser le contenu
2117
+        $valeurs = explode(',', $valeurs);
2118
+        // et on force un cast de type int donc
2119
+        $type = 'int';
2120
+    }
2121
+
2122
+    return sql_in_quote($champ, $valeurs, $not, $serveur, $type, $option);
2123 2123
 }
2124 2124
 
2125 2125
 
@@ -2160,24 +2160,24 @@  discard block
 block discarded – undo
2160 2160
  *     Expression de requête SQL
2161 2161
  **/
2162 2162
 function sql_in_select(
2163
-	$in,
2164
-	$select,
2165
-	$from = [],
2166
-	$where = [],
2167
-	$groupby = [],
2168
-	$orderby = [],
2169
-	$limit = '',
2170
-	$having = [],
2171
-	$serveur = ''
2163
+    $in,
2164
+    $select,
2165
+    $from = [],
2166
+    $where = [],
2167
+    $groupby = [],
2168
+    $orderby = [],
2169
+    $limit = '',
2170
+    $having = [],
2171
+    $serveur = ''
2172 2172
 ) {
2173
-	$liste = [];
2174
-	$res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur);
2175
-	while ($r = sql_fetch($res)) {
2176
-		$liste[] = array_shift($r);
2177
-	}
2178
-	sql_free($res);
2179
-
2180
-	return sql_in($in, $liste);
2173
+    $liste = [];
2174
+    $res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur);
2175
+    while ($r = sql_fetch($res)) {
2176
+        $liste[] = array_shift($r);
2177
+    }
2178
+    sql_free($res);
2179
+
2180
+    return sql_in($in, $liste);
2181 2181
 }
2182 2182
 
2183 2183
 /**
@@ -2209,29 +2209,29 @@  discard block
 block discarded – undo
2209 2209
  *    Position apres le saut.
2210 2210
  */
2211 2211
 function sql_skip($res, $pos, $saut, $count, $serveur = '', $option = true) {
2212
-	// pas de saut en arriere qu'on ne sait pas faire sans sql_seek
2213
-	if (($saut = intval($saut)) <= 0) {
2214
-		return $pos;
2215
-	}
2216
-
2217
-	$seek = $pos + $saut;
2218
-	// si le saut fait depasser le maxi, on libere la resource
2219
-	// et on sort
2220
-	if ($seek >= $count) {
2221
-		sql_free($res, $serveur, $option);
2222
-
2223
-		return $count;
2224
-	}
2225
-
2226
-	if (sql_seek($res, $seek)) {
2227
-		$pos = $seek;
2228
-	} else {
2229
-		while ($pos < $seek and sql_fetch($res, $serveur, $option)) {
2230
-			$pos++;
2231
-		}
2232
-	}
2233
-
2234
-	return $pos;
2212
+    // pas de saut en arriere qu'on ne sait pas faire sans sql_seek
2213
+    if (($saut = intval($saut)) <= 0) {
2214
+        return $pos;
2215
+    }
2216
+
2217
+    $seek = $pos + $saut;
2218
+    // si le saut fait depasser le maxi, on libere la resource
2219
+    // et on sort
2220
+    if ($seek >= $count) {
2221
+        sql_free($res, $serveur, $option);
2222
+
2223
+        return $count;
2224
+    }
2225
+
2226
+    if (sql_seek($res, $seek)) {
2227
+        $pos = $seek;
2228
+    } else {
2229
+        while ($pos < $seek and sql_fetch($res, $serveur, $option)) {
2230
+            $pos++;
2231
+        }
2232
+    }
2233
+
2234
+    return $pos;
2235 2235
 }
2236 2236
 
2237 2237
 
@@ -2251,7 +2251,7 @@  discard block
 block discarded – undo
2251 2251
  *     True si le champ est de type entier
2252 2252
  */
2253 2253
 function sql_test_int($type, $serveur = '', $option = true) {
2254
-	return preg_match('/^(TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT)/i', trim($type));
2254
+    return preg_match('/^(TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT)/i', trim($type));
2255 2255
 }
2256 2256
 
2257 2257
 /**
@@ -2270,7 +2270,7 @@  discard block
 block discarded – undo
2270 2270
  *     True si le champ est de type entier
2271 2271
  */
2272 2272
 function sql_test_date($type, $serveur = '', $option = true) {
2273
-	return preg_match('/^(DATE|DATETIME|TIMESTAMP|TIME)/i', trim($type));
2273
+    return preg_match('/^(DATE|DATETIME|TIMESTAMP|TIME)/i', trim($type));
2274 2274
 }
2275 2275
 
2276 2276
 /**
@@ -2292,19 +2292,19 @@  discard block
 block discarded – undo
2292 2292
  *     La date formatee
2293 2293
  */
2294 2294
 function sql_format_date($annee = 0, $mois = 0, $jour = 0, $h = 0, $m = 0, $s = 0, $serveur = '') {
2295
-	$annee = sprintf('%04s', $annee);
2296
-	$mois = sprintf('%02s', $mois);
2297
-
2298
-	if ($annee == '0000') {
2299
-		$mois = 0;
2300
-	}
2301
-	if ($mois == '00') {
2302
-		$jour = 0;
2303
-	}
2304
-
2305
-	return sprintf('%04u', $annee) . '-' . sprintf('%02u', $mois) . '-'
2306
-	. sprintf('%02u', $jour) . ' ' . sprintf('%02u', $h) . ':'
2307
-	. sprintf('%02u', $m) . ':' . sprintf('%02u', $s);
2295
+    $annee = sprintf('%04s', $annee);
2296
+    $mois = sprintf('%02s', $mois);
2297
+
2298
+    if ($annee == '0000') {
2299
+        $mois = 0;
2300
+    }
2301
+    if ($mois == '00') {
2302
+        $jour = 0;
2303
+    }
2304
+
2305
+    return sprintf('%04u', $annee) . '-' . sprintf('%02u', $mois) . '-'
2306
+    . sprintf('%02u', $jour) . ' ' . sprintf('%02u', $h) . ':'
2307
+    . sprintf('%02u', $m) . ':' . sprintf('%02u', $s);
2308 2308
 }
2309 2309
 
2310 2310
 
@@ -2327,32 +2327,32 @@  discard block
 block discarded – undo
2327 2327
  **/
2328 2328
 function description_table($nom, $serveur = '') {
2329 2329
 
2330
-	static $trouver_table;
2330
+    static $trouver_table;
2331 2331
 
2332
-	/* toujours utiliser trouver_table
2332
+    /* toujours utiliser trouver_table
2333 2333
 	 qui renverra la description theorique
2334 2334
 	 car sinon on va se comporter differement selon que la table est declaree
2335 2335
 	 ou non
2336 2336
 	 */
2337
-	if (!$trouver_table) {
2338
-		$trouver_table = charger_fonction('trouver_table', 'base');
2339
-	}
2340
-	if ($desc = $trouver_table($nom, $serveur)) {
2341
-		return $desc;
2342
-	}
2343
-
2344
-	// sauf a l'installation :
2345
-	include_spip('base/serial');
2346
-	if (isset($GLOBALS['tables_principales'][$nom])) {
2347
-		return $GLOBALS['tables_principales'][$nom];
2348
-	}
2349
-
2350
-	include_spip('base/auxiliaires');
2351
-	if (isset($GLOBALS['tables_auxiliaires'][$nom])) {
2352
-		return $GLOBALS['tables_auxiliaires'][$nom];
2353
-	}
2354
-
2355
-	return false;
2337
+    if (!$trouver_table) {
2338
+        $trouver_table = charger_fonction('trouver_table', 'base');
2339
+    }
2340
+    if ($desc = $trouver_table($nom, $serveur)) {
2341
+        return $desc;
2342
+    }
2343
+
2344
+    // sauf a l'installation :
2345
+    include_spip('base/serial');
2346
+    if (isset($GLOBALS['tables_principales'][$nom])) {
2347
+        return $GLOBALS['tables_principales'][$nom];
2348
+    }
2349
+
2350
+    include_spip('base/auxiliaires');
2351
+    if (isset($GLOBALS['tables_auxiliaires'][$nom])) {
2352
+        return $GLOBALS['tables_auxiliaires'][$nom];
2353
+    }
2354
+
2355
+    return false;
2356 2356
 }
2357 2357
 
2358 2358
 /**
@@ -2365,8 +2365,8 @@  discard block
 block discarded – undo
2365 2365
  * @return string Table sql éventuellement renommée
2366 2366
  */
2367 2367
 function prefixer_table_spip($table, $prefixe) {
2368
-	if ($prefixe) {
2369
-		$table = preg_replace('/^spip_/', $prefixe . '_', $table);
2370
-	}
2371
-	return $table;
2368
+    if ($prefixe) {
2369
+        $table = preg_replace('/^spip_/', $prefixe . '_', $table);
2370
+    }
2371
+    return $table;
2372 2372
 }
Please login to merge, or discard this patch.
ecrire/req/sqlite_fonctions.php 1 patch
Indentation   +229 added lines, -229 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
  */
23 23
 
24 24
 if (!defined('_ECRIRE_INC_VERSION')) {
25
-	return;
25
+    return;
26 26
 }
27 27
 
28 28
 /**
@@ -43,90 +43,90 @@  discard block
 block discarded – undo
43 43
  */
44 44
 function _sqlite_init_functions(&$sqlite) {
45 45
 
46
-	if (!$sqlite) {
47
-		return false;
48
-	}
46
+    if (!$sqlite) {
47
+        return false;
48
+    }
49 49
 
50 50
 
51
-	$fonctions = [
52
-		// A
53
-		'ACOS'  => ['acos', 1],
54
-		'ASIN'  => ['asin', 1],
55
-		'ATAN'  => ['atan', 1], // mysql accepte 2 params comme atan2… hum ?
56
-		'ATAN2' => ['atan2', 2],
51
+    $fonctions = [
52
+        // A
53
+        'ACOS'  => ['acos', 1],
54
+        'ASIN'  => ['asin', 1],
55
+        'ATAN'  => ['atan', 1], // mysql accepte 2 params comme atan2… hum ?
56
+        'ATAN2' => ['atan2', 2],
57 57
 
58
-		// C
59
-		'CEIL'   => ['_sqlite_func_ceil', 1],
60
-		'CONCAT' => ['_sqlite_func_concat', -1],
61
-		'COS'    => ['cos', 1],
58
+        // C
59
+        'CEIL'   => ['_sqlite_func_ceil', 1],
60
+        'CONCAT' => ['_sqlite_func_concat', -1],
61
+        'COS'    => ['cos', 1],
62 62
 
63
-		// D
64
-		'DATE_FORMAT' => ['_sqlite_func_date_format', 2], // équivalent a strftime avec args inversés
65
-		'DAYOFMONTH'  => ['_sqlite_func_dayofmonth', 1],
66
-		'DEGREES'     => ['rad2deg', 1],
63
+        // D
64
+        'DATE_FORMAT' => ['_sqlite_func_date_format', 2], // équivalent a strftime avec args inversés
65
+        'DAYOFMONTH'  => ['_sqlite_func_dayofmonth', 1],
66
+        'DEGREES'     => ['rad2deg', 1],
67 67
 
68
-		// E
69
-		'EXTRAIRE_MULTI' => ['_sqlite_func_extraire_multi', 2], // specifique a SPIP/sql_multi()
70
-		'EXP'            => ['exp', 1],
68
+        // E
69
+        'EXTRAIRE_MULTI' => ['_sqlite_func_extraire_multi', 2], // specifique a SPIP/sql_multi()
70
+        'EXP'            => ['exp', 1],
71 71
 
72
-		// F
73
-		'FIND_IN_SET' => ['_sqlite_func_find_in_set', 2],
74
-		'FLOOR'       => ['_sqlite_func_floor', 1],
72
+        // F
73
+        'FIND_IN_SET' => ['_sqlite_func_find_in_set', 2],
74
+        'FLOOR'       => ['_sqlite_func_floor', 1],
75 75
 
76
-		// G
77
-		'GREATEST' => ['_sqlite_func_greatest', -1],
76
+        // G
77
+        'GREATEST' => ['_sqlite_func_greatest', -1],
78 78
 
79
-		// I
80
-		'IF'     => ['_sqlite_func_if', 3],
81
-		'INSERT' => ['_sqlite_func_insert', 4],
82
-		'INSTR'  => ['_sqlite_func_instr', 2],
79
+        // I
80
+        'IF'     => ['_sqlite_func_if', 3],
81
+        'INSERT' => ['_sqlite_func_insert', 4],
82
+        'INSTR'  => ['_sqlite_func_instr', 2],
83 83
 
84
-		// L
85
-		'LEAST'  => ['_sqlite_func_least', -1],
86
-		'_LEFT'  => ['_sqlite_func_left', 2],
84
+        // L
85
+        'LEAST'  => ['_sqlite_func_least', -1],
86
+        '_LEFT'  => ['_sqlite_func_left', 2],
87 87
 
88
-		// N
89
-		'NOW' => ['_sqlite_func_now', 0],
88
+        // N
89
+        'NOW' => ['_sqlite_func_now', 0],
90 90
 
91
-		// M
92
-		'MD5'   => ['md5', 1],
93
-		'MONTH' => ['_sqlite_func_month', 1],
91
+        // M
92
+        'MD5'   => ['md5', 1],
93
+        'MONTH' => ['_sqlite_func_month', 1],
94 94
 
95
-		// P
96
-		'PREG_REPLACE' => ['_sqlite_func_preg_replace', 3],
95
+        // P
96
+        'PREG_REPLACE' => ['_sqlite_func_preg_replace', 3],
97 97
 
98
-		// R
99
-		'RADIANS' => ['deg2rad', 1],
100
-		'RAND'    => ['_sqlite_func_rand', 0], // sinon random() v2.4
101
-		'REGEXP'  => ['_sqlite_func_regexp_match', 2], // critere REGEXP supporte a partir de v3.3.2
102
-		'RIGHT'   => ['_sqlite_func_right', 2],
98
+        // R
99
+        'RADIANS' => ['deg2rad', 1],
100
+        'RAND'    => ['_sqlite_func_rand', 0], // sinon random() v2.4
101
+        'REGEXP'  => ['_sqlite_func_regexp_match', 2], // critere REGEXP supporte a partir de v3.3.2
102
+        'RIGHT'   => ['_sqlite_func_right', 2],
103 103
 
104
-		// S
105
-		'SETTYPE'   => ['settype', 2], // CAST present en v3.2.3
106
-		'SIN'       => ['sin', 1],
107
-		'SQRT'      => ['sqrt', 1],
108
-		'SUBSTRING' => ['_sqlite_func_substring' /*, 3*/], // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0
104
+        // S
105
+        'SETTYPE'   => ['settype', 2], // CAST present en v3.2.3
106
+        'SIN'       => ['sin', 1],
107
+        'SQRT'      => ['sqrt', 1],
108
+        'SUBSTRING' => ['_sqlite_func_substring' /*, 3*/], // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0
109 109
 
110
-		// T
111
-		'TAN'           => ['tan', 1],
112
-		'TIMESTAMPDIFF' => ['_sqlite_timestampdiff'    /*, 3*/],
113
-		'TO_DAYS'       => ['_sqlite_func_to_days', 1],
110
+        // T
111
+        'TAN'           => ['tan', 1],
112
+        'TIMESTAMPDIFF' => ['_sqlite_timestampdiff'    /*, 3*/],
113
+        'TO_DAYS'       => ['_sqlite_func_to_days', 1],
114 114
 
115
-		// U
116
-		'UNIX_TIMESTAMP' => ['_sqlite_func_unix_timestamp', 1],
115
+        // U
116
+        'UNIX_TIMESTAMP' => ['_sqlite_func_unix_timestamp', 1],
117 117
 
118
-		// V
119
-		'VIDE' => ['_sqlite_func_vide', 0], // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide()
118
+        // V
119
+        'VIDE' => ['_sqlite_func_vide', 0], // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide()
120 120
 
121
-		// Y
122
-		'YEAR' => ['_sqlite_func_year', 1]
123
-	];
121
+        // Y
122
+        'YEAR' => ['_sqlite_func_year', 1]
123
+    ];
124 124
 
125
-	foreach ($fonctions as $f => $r) {
126
-		_sqlite_add_function($sqlite, $f, $r);
127
-	}
125
+    foreach ($fonctions as $f => $r) {
126
+        _sqlite_add_function($sqlite, $f, $r);
127
+    }
128 128
 
129
-	#spip_log('functions sqlite chargees ','sqlite.'._LOG_DEBUG);
129
+    #spip_log('functions sqlite chargees ','sqlite.'._LOG_DEBUG);
130 130
 }
131 131
 
132 132
 
@@ -147,9 +147,9 @@  discard block
 block discarded – undo
147 147
  *
148 148
 **/
149 149
 function _sqlite_add_function(&$sqlite, &$f, &$r) {
150
-	isset($r[1])
151
-		? $sqlite->sqliteCreateFunction($f, $r[0], $r[1])
152
-		: $sqlite->sqliteCreateFunction($f, $r[0]);
150
+    isset($r[1])
151
+        ? $sqlite->sqliteCreateFunction($f, $r[0], $r[1])
152
+        : $sqlite->sqliteCreateFunction($f, $r[0]);
153 153
 }
154 154
 
155 155
 /**
@@ -159,7 +159,7 @@  discard block
 block discarded – undo
159 159
  * @return int
160 160
  */
161 161
 function _sqlite_func_ceil($a) {
162
-	return ceil($a);
162
+    return ceil($a);
163 163
 }
164 164
 
165 165
 /**
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
  * @return string
170 170
  */
171 171
 function _sqlite_func_concat(...$args) {
172
-	return join('', $args);
172
+    return join('', $args);
173 173
 }
174 174
 
175 175
 
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
  * @return string
183 183
  */
184 184
 function _sqlite_func_dayofmonth($d) {
185
-	return _sqlite_func_date('d', $d);
185
+    return _sqlite_func_date('d', $d);
186 186
 }
187 187
 
188 188
 
@@ -194,15 +194,15 @@  discard block
 block discarded – undo
194 194
  * @return int
195 195
  */
196 196
 function _sqlite_func_find_in_set($num, $set) {
197
-	$rank = 0;
198
-	foreach (explode(',', $set) as $v) {
199
-		if ($v == $num) {
200
-			return (++$rank);
201
-		}
202
-		$rank++;
203
-	}
204
-
205
-	return 0;
197
+    $rank = 0;
198
+    foreach (explode(',', $set) as $v) {
199
+        if ($v == $num) {
200
+            return (++$rank);
201
+        }
202
+        $rank++;
203
+    }
204
+
205
+    return 0;
206 206
 }
207 207
 
208 208
 /**
@@ -212,7 +212,7 @@  discard block
 block discarded – undo
212 212
  * @return int
213 213
  */
214 214
 function _sqlite_func_floor($a) {
215
-	return floor($a);
215
+    return floor($a);
216 216
 }
217 217
 
218 218
 
@@ -225,7 +225,7 @@  discard block
 block discarded – undo
225 225
  * @return mixed
226 226
  */
227 227
 function _sqlite_func_if($bool, $oui, $non) {
228
-	return ($bool) ? $oui : $non;
228
+    return ($bool) ? $oui : $non;
229 229
 }
230 230
 
231 231
 
@@ -242,10 +242,10 @@  discard block
 block discarded – undo
242 242
  * @return string
243 243
  */
244 244
 function _sqlite_func_insert($s, $index, $longueur, $chaine) {
245
-	return
246
-		substr($s, 0, $index)
247
-		. $chaine
248
-		. substr(substr($s, $index), $longueur);
245
+    return
246
+        substr($s, 0, $index)
247
+        . $chaine
248
+        . substr(substr($s, $index), $longueur);
249 249
 }
250 250
 
251 251
 
@@ -257,7 +257,7 @@  discard block
 block discarded – undo
257 257
  * @return int
258 258
  */
259 259
 function _sqlite_func_instr($s, $search) {
260
-	return strpos($s, $search);
260
+    return strpos($s, $search);
261 261
 }
262 262
 
263 263
 
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
  * @return int
269 269
  */
270 270
 function _sqlite_func_least(...$args) {
271
-	return min($args);
271
+    return min($args);
272 272
 }
273 273
 
274 274
 
@@ -279,7 +279,7 @@  discard block
 block discarded – undo
279 279
  * @return int
280 280
  */
281 281
 function _sqlite_func_greatest(...$args) {
282
-	return max($args);
282
+    return max($args);
283 283
 }
284 284
 
285 285
 
@@ -291,7 +291,7 @@  discard block
 block discarded – undo
291 291
  * @return string
292 292
  */
293 293
 function _sqlite_func_left($s, $lenght) {
294
-	return substr($s, $lenght);
294
+    return substr($s, $lenght);
295 295
 }
296 296
 
297 297
 /**
@@ -301,13 +301,13 @@  discard block
 block discarded – undo
301 301
  * @return string
302 302
  */
303 303
 function _sqlite_func_now($force_refresh = false) {
304
-	static $now = null;
305
-	if (is_null($now) or $force_refresh) {
306
-		$now = date('Y-m-d H:i:s');
307
-	}
304
+    static $now = null;
305
+    if (is_null($now) or $force_refresh) {
306
+        $now = date('Y-m-d H:i:s');
307
+    }
308 308
 
309
-	#spip_log("Passage avec NOW : $now | ".time(),'sqlite.'._LOG_DEBUG);
310
-	return $now;
309
+    #spip_log("Passage avec NOW : $now | ".time(),'sqlite.'._LOG_DEBUG);
310
+    return $now;
311 311
 }
312 312
 
313 313
 
@@ -320,7 +320,7 @@  discard block
 block discarded – undo
320 320
  * @return string
321 321
  */
322 322
 function _sqlite_func_month($d) {
323
-	return _sqlite_func_date('m', $d);
323
+    return _sqlite_func_date('m', $d);
324 324
 }
325 325
 
326 326
 
@@ -333,10 +333,10 @@  discard block
 block discarded – undo
333 333
  * @return string
334 334
  */
335 335
 function _sqlite_func_preg_replace($quoi, $cherche, $remplace) {
336
-	$return = preg_replace('%' . $cherche . '%', $remplace, $quoi);
336
+    $return = preg_replace('%' . $cherche . '%', $remplace, $quoi);
337 337
 
338
-	#spip_log("preg_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG);
339
-	return $return;
338
+    #spip_log("preg_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG);
339
+    return $return;
340 340
 }
341 341
 
342 342
 /**
@@ -349,26 +349,26 @@  discard block
 block discarded – undo
349 349
  * @return string, l'extrait trouve.
350 350
  **/
351 351
 function _sqlite_func_extraire_multi($quoi, $lang) {
352
-	if (!defined('_EXTRAIRE_MULTI')) {
353
-		include_spip('inc/filtres');
354
-	}
355
-	if (!function_exists('approcher_langue')) {
356
-		include_spip('inc/lang');
357
-	}
358
-	if (preg_match_all(_EXTRAIRE_MULTI, $quoi, $regs, PREG_SET_ORDER)) {
359
-		foreach ($regs as $reg) {
360
-			// chercher la version de la langue courante
361
-			$trads = extraire_trads($reg[1]);
362
-			if ($l = approcher_langue($trads, $lang)) {
363
-				$trad = $trads[$l];
364
-			} else {
365
-				$trad = reset($trads);
366
-			}
367
-			$quoi = str_replace($reg[0], $trad, $quoi);
368
-		}
369
-	}
370
-
371
-	return $quoi;
352
+    if (!defined('_EXTRAIRE_MULTI')) {
353
+        include_spip('inc/filtres');
354
+    }
355
+    if (!function_exists('approcher_langue')) {
356
+        include_spip('inc/lang');
357
+    }
358
+    if (preg_match_all(_EXTRAIRE_MULTI, $quoi, $regs, PREG_SET_ORDER)) {
359
+        foreach ($regs as $reg) {
360
+            // chercher la version de la langue courante
361
+            $trads = extraire_trads($reg[1]);
362
+            if ($l = approcher_langue($trads, $lang)) {
363
+                $trad = $trads[$l];
364
+            } else {
365
+                $trad = reset($trads);
366
+            }
367
+            $quoi = str_replace($reg[0], $trad, $quoi);
368
+        }
369
+    }
370
+
371
+    return $quoi;
372 372
 }
373 373
 
374 374
 
@@ -378,7 +378,7 @@  discard block
 block discarded – undo
378 378
  * @return float
379 379
  */
380 380
 function _sqlite_func_rand() {
381
-	return random_int(0, mt_getrandmax());
381
+    return random_int(0, mt_getrandmax());
382 382
 }
383 383
 
384 384
 
@@ -390,7 +390,7 @@  discard block
 block discarded – undo
390 390
  * @return string
391 391
  */
392 392
 function _sqlite_func_right($s, $length) {
393
-	return substr($s, 0 - $length);
393
+    return substr($s, 0 - $length);
394 394
 }
395 395
 
396 396
 
@@ -402,17 +402,17 @@  discard block
 block discarded – undo
402 402
  * @return bool
403 403
  */
404 404
 function _sqlite_func_regexp_match($cherche, $quoi) {
405
-	// optimiser un cas tres courant avec les requetes en base
406
-	if (!$quoi and !strlen($quoi)) {
407
-		return false;
408
-	}
409
-	// il faut enlever un niveau d'echappement pour être homogène à mysql
410
-	$cherche = str_replace('\\\\', '\\', $cherche);
411
-	$u = $GLOBALS['meta']['pcre_u'] ?? 'u';
412
-	$return = preg_match('%' . $cherche . '%imsS' . $u, $quoi);
413
-
414
-	#spip_log("regexp_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG);
415
-	return $return;
405
+    // optimiser un cas tres courant avec les requetes en base
406
+    if (!$quoi and !strlen($quoi)) {
407
+        return false;
408
+    }
409
+    // il faut enlever un niveau d'echappement pour être homogène à mysql
410
+    $cherche = str_replace('\\\\', '\\', $cherche);
411
+    $u = $GLOBALS['meta']['pcre_u'] ?? 'u';
412
+    $return = preg_match('%' . $cherche . '%imsS' . $u, $quoi);
413
+
414
+    #spip_log("regexp_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG);
415
+    return $return;
416 416
 }
417 417
 
418 418
 
@@ -427,8 +427,8 @@  discard block
 block discarded – undo
427 427
  * @return string
428 428
  */
429 429
 function _sqlite_func_date_format($date, $conv) {
430
-	$conv = _sqlite_func_strftime_format_converter($conv);
431
-	return strftime($conv, is_int($date) ? $date : strtotime($date));
430
+    $conv = _sqlite_func_strftime_format_converter($conv);
431
+    return strftime($conv, is_int($date) ? $date : strtotime($date));
432 432
 }
433 433
 
434 434
 /**
@@ -444,28 +444,28 @@  discard block
 block discarded – undo
444 444
  * @return void
445 445
  */
446 446
 function _sqlite_func_strftime_format_converter(string $conv): string {
447
-	// ok : %a %b %d %e %H %I %l %j %k %m %p %r %S %T %w %y %Y
448
-	// on ne sait pas en gérer certains...
449
-	static $mysql_to_strftime_not_ok = ['%c', '%D', '%f', '%U', '%V', '%W', '%X'];
450
-	static $mysql_to_strftime = [
451
-		'%h' => '%I',
452
-		'%i' => '%M',
453
-		'%M' => '%B',
454
-		'%s' => '%S',
455
-		'%u' => '%U',
456
-		'%v' => '%V',
457
-		'%x' => '%G',
458
-	];
459
-	static $to_strftime = [];
460
-	if (!isset($to_strftime[$conv])) {
461
-		$count = 0;
462
-		str_replace($mysql_to_strftime_not_ok, '', $conv, $count);
463
-		if ($count > 0) {
464
-			spip_log("DATE_FORMAT : At least one parameter can't be parsed by strftime with format '$conv'", 'sqlite.' . _LOG_ERREUR);
465
-		}
466
-		$to_strftime[$conv] = str_replace(array_keys($mysql_to_strftime), $mysql_to_strftime, $conv);
467
-	}
468
-	return $to_strftime[$conv];
447
+    // ok : %a %b %d %e %H %I %l %j %k %m %p %r %S %T %w %y %Y
448
+    // on ne sait pas en gérer certains...
449
+    static $mysql_to_strftime_not_ok = ['%c', '%D', '%f', '%U', '%V', '%W', '%X'];
450
+    static $mysql_to_strftime = [
451
+        '%h' => '%I',
452
+        '%i' => '%M',
453
+        '%M' => '%B',
454
+        '%s' => '%S',
455
+        '%u' => '%U',
456
+        '%v' => '%V',
457
+        '%x' => '%G',
458
+    ];
459
+    static $to_strftime = [];
460
+    if (!isset($to_strftime[$conv])) {
461
+        $count = 0;
462
+        str_replace($mysql_to_strftime_not_ok, '', $conv, $count);
463
+        if ($count > 0) {
464
+            spip_log("DATE_FORMAT : At least one parameter can't be parsed by strftime with format '$conv'", 'sqlite.' . _LOG_ERREUR);
465
+        }
466
+        $to_strftime[$conv] = str_replace(array_keys($mysql_to_strftime), $mysql_to_strftime, $conv);
467
+    }
468
+    return $to_strftime[$conv];
469 469
 }
470 470
 
471 471
 /**
@@ -479,11 +479,11 @@  discard block
 block discarded – undo
479 479
  * @return int
480 480
  */
481 481
 function _sqlite_func_to_days($d) {
482
-	static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01
483
-	$result = $offset + (int)ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600));
482
+    static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01
483
+    $result = $offset + (int)ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600));
484 484
 
485
-	#spip_log("Passage avec TO_DAYS : $d, $result",'sqlite.'._LOG_DEBUG);
486
-	return $result;
485
+    #spip_log("Passage avec TO_DAYS : $d, $result",'sqlite.'._LOG_DEBUG);
486
+    return $result;
487 487
 }
488 488
 
489 489
 /**
@@ -495,13 +495,13 @@  discard block
 block discarded – undo
495 495
  * @return string
496 496
  */
497 497
 function _sqlite_func_substring($string, $start, $len = null) {
498
-	// SQL compte a partir de 1, php a partir de 0
499
-	$start = ($start > 0) ? $start - 1 : $start;
500
-	if (is_null($len)) {
501
-		return substr($string, $start);
502
-	} else {
503
-		return substr($string, $start, $len);
504
-	}
498
+    // SQL compte a partir de 1, php a partir de 0
499
+    $start = ($start > 0) ? $start - 1 : $start;
500
+    if (is_null($len)) {
501
+        return substr($string, $start);
502
+    } else {
503
+        return substr($string, $start, $len);
504
+    }
505 505
 }
506 506
 
507 507
 /**
@@ -517,33 +517,33 @@  discard block
 block discarded – undo
517 517
  * @return int
518 518
  */
519 519
 function _sqlite_timestampdiff($unit, $date1, $date2) {
520
-	$d1 = date_create($date1);
521
-	$d2 = date_create($date2);
522
-	$diff = date_diff($d1, $d2);
523
-	$inv = $diff->invert ? -1 : 1;
524
-	switch ($unit) {
525
-		case 'YEAR':
526
-			return $inv * $diff->y;
527
-		case 'QUARTER':
528
-			return $inv * (4 * $diff->y + intval(floor($diff->m / 3)));
529
-		case 'MONTH':
530
-			return $inv * (12 * $diff->y + $diff->m);
531
-		case 'WEEK':
532
-			return $inv * intval(floor($diff->days / 7));
533
-		case 'DAY':
534
-			#var_dump($inv*$diff->days);
535
-			return $inv * $diff->days;
536
-		case 'HOUR':
537
-			return $inv * (24 * $diff->days + $diff->h);
538
-		case 'MINUTE':
539
-			return $inv * ((24 * $diff->days + $diff->h) * 60 + $diff->i);
540
-		case 'SECOND':
541
-			return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s);
542
-		case 'MICROSECOND':
543
-			return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s) * 1_000_000;
544
-	}
545
-
546
-	return 0;
520
+    $d1 = date_create($date1);
521
+    $d2 = date_create($date2);
522
+    $diff = date_diff($d1, $d2);
523
+    $inv = $diff->invert ? -1 : 1;
524
+    switch ($unit) {
525
+        case 'YEAR':
526
+            return $inv * $diff->y;
527
+        case 'QUARTER':
528
+            return $inv * (4 * $diff->y + intval(floor($diff->m / 3)));
529
+        case 'MONTH':
530
+            return $inv * (12 * $diff->y + $diff->m);
531
+        case 'WEEK':
532
+            return $inv * intval(floor($diff->days / 7));
533
+        case 'DAY':
534
+            #var_dump($inv*$diff->days);
535
+            return $inv * $diff->days;
536
+        case 'HOUR':
537
+            return $inv * (24 * $diff->days + $diff->h);
538
+        case 'MINUTE':
539
+            return $inv * ((24 * $diff->days + $diff->h) * 60 + $diff->i);
540
+        case 'SECOND':
541
+            return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s);
542
+        case 'MICROSECOND':
543
+            return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s) * 1_000_000;
544
+    }
545
+
546
+    return 0;
547 547
 }
548 548
 
549 549
 /**
@@ -553,24 +553,24 @@  discard block
 block discarded – undo
553 553
  * @return int
554 554
  */
555 555
 function _sqlite_func_unix_timestamp($d) {
556
-	static $mem = [];
557
-	static $n = 0;
558
-	if (isset($mem[$d])) {
559
-		return $mem[$d];
560
-	}
561
-	if ($n++ > 100) {
562
-		$mem = [];
563
-		$n = 0;
564
-	}
565
-
566
-	//2005-12-02 20:53:53
567
-	#spip_log("Passage avec UNIX_TIMESTAMP : $d",'sqlite.'._LOG_DEBUG);
568
-	if (!$d) {
569
-		return $mem[$d] = time();
570
-	}
571
-
572
-	// une pile plus grosse n'accelere pas le calcul
573
-	return $mem[$d] = strtotime($d);
556
+    static $mem = [];
557
+    static $n = 0;
558
+    if (isset($mem[$d])) {
559
+        return $mem[$d];
560
+    }
561
+    if ($n++ > 100) {
562
+        $mem = [];
563
+        $n = 0;
564
+    }
565
+
566
+    //2005-12-02 20:53:53
567
+    #spip_log("Passage avec UNIX_TIMESTAMP : $d",'sqlite.'._LOG_DEBUG);
568
+    if (!$d) {
569
+        return $mem[$d] = time();
570
+    }
571
+
572
+    // une pile plus grosse n'accelere pas le calcul
573
+    return $mem[$d] = strtotime($d);
574 574
 }
575 575
 
576 576
 
@@ -583,7 +583,7 @@  discard block
 block discarded – undo
583 583
  * @return string
584 584
  */
585 585
 function _sqlite_func_year($d) {
586
-	return _sqlite_func_date('Y', $d);
586
+    return _sqlite_func_date('Y', $d);
587 587
 }
588 588
 
589 589
 /**
@@ -596,20 +596,20 @@  discard block
 block discarded – undo
596 596
  * @return string
597 597
  */
598 598
 function _sqlite_func_date($quoi, $d) {
599
-	static $mem = [];
600
-	static $n = 0;
601
-	if (isset($mem[$d])) {
602
-		return $mem[$d][$quoi];
603
-	}
604
-	if ($n++ > 100) {
605
-		$mem = [];
606
-		$n = 0;
607
-	}
608
-
609
-	$dec = date('Y-m-d', _sqlite_func_unix_timestamp($d));
610
-	$mem[$d] = ['Y' => substr($dec, 0, 4), 'm' => substr($dec, 5, 2), 'd' => substr($dec, 8, 2)];
611
-
612
-	return $mem[$d][$quoi];
599
+    static $mem = [];
600
+    static $n = 0;
601
+    if (isset($mem[$d])) {
602
+        return $mem[$d][$quoi];
603
+    }
604
+    if ($n++ > 100) {
605
+        $mem = [];
606
+        $n = 0;
607
+    }
608
+
609
+    $dec = date('Y-m-d', _sqlite_func_unix_timestamp($d));
610
+    $mem[$d] = ['Y' => substr($dec, 0, 4), 'm' => substr($dec, 5, 2), 'd' => substr($dec, 8, 2)];
611
+
612
+    return $mem[$d][$quoi];
613 613
 }
614 614
 
615 615
 /**
@@ -618,5 +618,5 @@  discard block
 block discarded – undo
618 618
  * @return void
619 619
  */
620 620
 function _sqlite_func_vide() {
621
-	return;
621
+    return;
622 622
 }
Please login to merge, or discard this patch.
ecrire/req/sqlite_generique.php 1 patch
Indentation   +1999 added lines, -1999 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  */
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 // TODO: get/set_caracteres ?
@@ -42,91 +42,91 @@  discard block
 block discarded – undo
42 42
  * @return array|bool
43 43
  */
44 44
 function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $sqlite_version = '') {
45
-	static $last_connect = [];
46
-
47
-	// si provient de selectdb
48
-	// un code pour etre sur que l'on vient de select_db()
49
-	if (strpos($db, $code = '@selectdb@') !== false) {
50
-		foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
51
-			$$a = $last_connect[$a];
52
-		}
53
-		$db = str_replace($code, '', $db);
54
-	}
55
-
56
-	/*
45
+    static $last_connect = [];
46
+
47
+    // si provient de selectdb
48
+    // un code pour etre sur que l'on vient de select_db()
49
+    if (strpos($db, $code = '@selectdb@') !== false) {
50
+        foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
51
+            $$a = $last_connect[$a];
52
+        }
53
+        $db = str_replace($code, '', $db);
54
+    }
55
+
56
+    /*
57 57
 	 * En sqlite, seule l'adresse du fichier est importante.
58 58
 	 * Ce sera $db le nom,
59 59
 	 * le path est $addr
60 60
 	 * (_DIR_DB si $addr est vide)
61 61
 	 */
62
-	_sqlite_init();
63
-
64
-	// determiner le dossier de la base : $addr ou _DIR_DB
65
-	$f = _DIR_DB;
66
-	if ($addr and strpos($addr, '/') !== false) {
67
-		$f = rtrim($addr, '/') . '/';
68
-	}
69
-
70
-	// un nom de base demande et impossible d'obtenir la base, on s'en va :
71
-	// il faut que la base existe ou que le repertoire parent soit writable
72
-	if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
73
-		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
74
-
75
-		return false;
76
-	}
77
-
78
-	// charger les modules sqlite au besoin
79
-	if (!_sqlite_charger_version($sqlite_version)) {
80
-		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
81
-
82
-		return false;
83
-	}
84
-
85
-	// chargement des constantes
86
-	// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
87
-	$define = 'spip_sqlite' . $sqlite_version . '_constantes';
88
-	$define();
89
-
90
-	$ok = false;
91
-	if (!$db) {
92
-		// si pas de db ->
93
-		// base temporaire tant qu'on ne connait pas son vrai nom
94
-		// pour tester la connexion
95
-		$db = '_sqlite' . $sqlite_version . '_install';
96
-		$tmp = _DIR_DB . $db . '.sqlite';
97
-		$ok = $link = new \PDO("sqlite:$tmp");
98
-	} else {
99
-		// Ouvrir (eventuellement creer la base)
100
-		$ok = $link = new \PDO("sqlite:$f");
101
-	}
102
-
103
-	if (!$ok) {
104
-		$e = _sqlite_last_error_from_link($link);
105
-		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
106
-
107
-		return false;
108
-	}
109
-
110
-	if ($link) {
111
-		$last_connect = [
112
-			'addr' => $addr,
113
-			'port' => $port,
114
-			'login' => $login,
115
-			'pass' => $pass,
116
-			'db' => $db,
117
-			'prefixe' => $prefixe,
118
-		];
119
-		// etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
120
-		include_spip('req/sqlite_fonctions');
121
-		_sqlite_init_functions($link);
122
-	}
123
-
124
-	return [
125
-		'db' => $db,
126
-		'prefixe' => $prefixe ? $prefixe : $db,
127
-		'link' => $link,
128
-		'total_requetes' => 0,
129
-	];
62
+    _sqlite_init();
63
+
64
+    // determiner le dossier de la base : $addr ou _DIR_DB
65
+    $f = _DIR_DB;
66
+    if ($addr and strpos($addr, '/') !== false) {
67
+        $f = rtrim($addr, '/') . '/';
68
+    }
69
+
70
+    // un nom de base demande et impossible d'obtenir la base, on s'en va :
71
+    // il faut que la base existe ou que le repertoire parent soit writable
72
+    if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
73
+        spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
74
+
75
+        return false;
76
+    }
77
+
78
+    // charger les modules sqlite au besoin
79
+    if (!_sqlite_charger_version($sqlite_version)) {
80
+        spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
81
+
82
+        return false;
83
+    }
84
+
85
+    // chargement des constantes
86
+    // il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
87
+    $define = 'spip_sqlite' . $sqlite_version . '_constantes';
88
+    $define();
89
+
90
+    $ok = false;
91
+    if (!$db) {
92
+        // si pas de db ->
93
+        // base temporaire tant qu'on ne connait pas son vrai nom
94
+        // pour tester la connexion
95
+        $db = '_sqlite' . $sqlite_version . '_install';
96
+        $tmp = _DIR_DB . $db . '.sqlite';
97
+        $ok = $link = new \PDO("sqlite:$tmp");
98
+    } else {
99
+        // Ouvrir (eventuellement creer la base)
100
+        $ok = $link = new \PDO("sqlite:$f");
101
+    }
102
+
103
+    if (!$ok) {
104
+        $e = _sqlite_last_error_from_link($link);
105
+        spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
106
+
107
+        return false;
108
+    }
109
+
110
+    if ($link) {
111
+        $last_connect = [
112
+            'addr' => $addr,
113
+            'port' => $port,
114
+            'login' => $login,
115
+            'pass' => $pass,
116
+            'db' => $db,
117
+            'prefixe' => $prefixe,
118
+        ];
119
+        // etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
120
+        include_spip('req/sqlite_fonctions');
121
+        _sqlite_init_functions($link);
122
+    }
123
+
124
+    return [
125
+        'db' => $db,
126
+        'prefixe' => $prefixe ? $prefixe : $db,
127
+        'link' => $link,
128
+        'total_requetes' => 0,
129
+    ];
130 130
 }
131 131
 
132 132
 
@@ -145,14 +145,14 @@  discard block
 block discarded – undo
145 145
  *    Resultat de la requete
146 146
  */
147 147
 function spip_sqlite_query($query, $serveur = '', $requeter = true) {
148
-	#spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
149
-	#_sqlite_init(); // fait la premiere fois dans spip_sqlite
150
-	$query = spip_sqlite::traduire_requete($query, $serveur);
151
-	if (!$requeter) {
152
-		return $query;
153
-	}
148
+    #spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
149
+    #_sqlite_init(); // fait la premiere fois dans spip_sqlite
150
+    $query = spip_sqlite::traduire_requete($query, $serveur);
151
+    if (!$requeter) {
152
+        return $query;
153
+    }
154 154
 
155
-	return spip_sqlite::executer_requete($query, $serveur);
155
+    return spip_sqlite::executer_requete($query, $serveur);
156 156
 }
157 157
 
158 158
 
@@ -169,11 +169,11 @@  discard block
 block discarded – undo
169 169
  */
170 170
 function spip_sqlite_alter($query, $serveur = '', $requeter = true) {
171 171
 
172
-	$query = spip_sqlite_query("ALTER $query", $serveur, false);
173
-	// traduire la requete pour recuperer les bons noms de table
174
-	$query = spip_sqlite::traduire_requete($query, $serveur);
172
+    $query = spip_sqlite_query("ALTER $query", $serveur, false);
173
+    // traduire la requete pour recuperer les bons noms de table
174
+    $query = spip_sqlite::traduire_requete($query, $serveur);
175 175
 
176
-	/*
176
+    /*
177 177
 		 * la il faut faire les transformations
178 178
 		 * si ALTER TABLE x (DROP|CHANGE) y
179 179
 		 *
@@ -182,251 +182,251 @@  discard block
 block discarded – undo
182 182
 		 * 3) faire chaque requete independemment
183 183
 		 */
184 184
 
185
-	// 1
186
-	if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
187
-		$debut = $regs[1];
188
-		$table = $regs[3];
189
-		$suite = $regs[4];
190
-	} else {
191
-		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
192
-
193
-		return false;
194
-	}
195
-
196
-	// 2
197
-	// il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
198
-	// tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
199
-	// ou revoir l'api de sql_alter en creant un
200
-	// sql_alter_table($table,array($actions));
201
-	$todo = explode(',', $suite);
202
-
203
-	// on remet les morceaux dechires ensembles... que c'est laid !
204
-	$todo2 = [];
205
-	$i = 0;
206
-	$ouverte = false;
207
-	while ($do = array_shift($todo)) {
208
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
209
-		$o = (false !== strpos($do, '('));
210
-		$f = (false !== strpos($do, ')'));
211
-		if ($o and !$f) {
212
-			$ouverte = true;
213
-		} elseif ($f) {
214
-			$ouverte = false;
215
-		}
216
-		if (!$ouverte) {
217
-			$i++;
218
-		}
219
-	}
220
-
221
-	// 3
222
-	$resultats = [];
223
-	foreach ($todo2 as $do) {
224
-		$do = trim($do);
225
-		if (
226
-			!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
227
-			. '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
228
-			. '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
229
-			. '|ADD COLUMN|ADD'
230
-			. ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
231
-		) {
232
-			spip_log(
233
-				"SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
234
-				'sqlite.' . _LOG_ERREUR
235
-			);
236
-
237
-			return false;
238
-		}
239
-
240
-		$cle = strtoupper($matches[1]);
241
-		$colonne_origine = $matches[2];
242
-		$colonne_destination = '';
243
-
244
-		$def = $matches[3];
245
-
246
-		// eluder une eventuelle clause before|after|first inutilisable
247
-		$defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
248
-		$defo = $defr; // garder la def d'origine pour certains cas
249
-		// remplacer les definitions venant de mysql
250
-		$defr = _sqlite_remplacements_definitions_table($defr);
251
-
252
-		// reinjecter dans le do
253
-		$do = str_replace($def, $defr, $do);
254
-		$def = $defr;
255
-
256
-		switch ($cle) {
257
-			// suppression d'un index
258
-			case 'DROP KEY':
259
-			case 'DROP INDEX':
260
-				$nom_index = $colonne_origine;
261
-				spip_sqlite_drop_index($nom_index, $table, $serveur);
262
-				break;
263
-
264
-			// suppression d'une pk
265
-			case 'DROP PRIMARY KEY':
266
-				if (
267
-					!_sqlite_modifier_table(
268
-						$table,
269
-						$colonne_origine,
270
-						['key' => ['PRIMARY KEY' => '']],
271
-						$serveur
272
-					)
273
-				) {
274
-					return false;
275
-				}
276
-				break;
277
-			// suppression d'une colonne
278
-			case 'DROP COLUMN':
279
-			case 'DROP':
280
-				if (
281
-					!_sqlite_modifier_table(
282
-						$table,
283
-						[$colonne_origine => ''],
284
-						[],
285
-						$serveur
286
-					)
287
-				) {
288
-					return false;
289
-				}
290
-				break;
291
-
292
-			case 'CHANGE COLUMN':
293
-			case 'CHANGE':
294
-				// recuperer le nom de la future colonne
295
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
296
-				// en tenant compte de la cle primaire (ce qui est mieux)
297
-				$def = trim($defo);
298
-				$colonne_destination = substr($def, 0, strpos($def, ' '));
299
-				$def = substr($def, strlen($colonne_destination) + 1);
300
-
301
-				if (
302
-					!_sqlite_modifier_table(
303
-						$table,
304
-						[$colonne_origine => $colonne_destination],
305
-						['field' => [$colonne_destination => $def]],
306
-						$serveur
307
-					)
308
-				) {
309
-					return false;
310
-				}
311
-				break;
312
-
313
-			case 'MODIFY':
314
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
315
-				// en tenant compte de la cle primaire (ce qui est mieux)
316
-				if (
317
-					!_sqlite_modifier_table(
318
-						$table,
319
-						$colonne_origine,
320
-						['field' => [$colonne_origine => $defo]],
321
-						$serveur
322
-					)
323
-				) {
324
-					return false;
325
-				}
326
-				break;
327
-
328
-			// pas geres en sqlite2
329
-			case 'RENAME':
330
-				$do = 'RENAME TO' . substr($do, 6);
331
-			case 'RENAME TO':
332
-				if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
333
-					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
334
-
335
-					return false;
336
-				}
337
-				break;
338
-
339
-			// ajout d'une pk
340
-			case 'ADD PRIMARY KEY':
341
-				$pk = trim(substr($do, 16));
342
-				$pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
343
-				if (
344
-					!_sqlite_modifier_table(
345
-						$table,
346
-						$colonne_origine,
347
-						['key' => ['PRIMARY KEY' => $pk]],
348
-						$serveur
349
-					)
350
-				) {
351
-					return false;
352
-				}
353
-				break;
354
-			// ajout d'un index
355
-			case 'ADD UNIQUE KEY':
356
-			case 'ADD UNIQUE':
357
-				$unique = true;
358
-			case 'ADD INDEX':
359
-			case 'ADD KEY':
360
-				if (!isset($unique)) {
361
-					$unique = false;
362
-				}
363
-				// peut etre "(colonne)" ou "nom_index (colonnes)"
364
-				// bug potentiel si qqn met "(colonne, colonne)"
365
-				//
366
-				// nom_index (colonnes)
367
-				if ($def) {
368
-					$colonnes = substr($def, 1, -1);
369
-					$nom_index = $colonne_origine;
370
-				} else {
371
-					// (colonne)
372
-					if ($colonne_origine[0] == '(') {
373
-						$colonnes = substr($colonne_origine, 1, -1);
374
-						if (false !== strpos(',', $colonnes)) {
375
-							spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
376
-								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
377
-							break;
378
-						} else {
379
-							$nom_index = $colonnes;
380
-						}
381
-					} // nom_index
382
-					else {
383
-						$nom_index = $colonnes = $colonne_origine;
384
-					}
385
-				}
386
-				spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
387
-				break;
388
-
389
-			// pas geres en sqlite2
390
-			case 'ADD COLUMN':
391
-				$do = 'ADD' . substr($do, 10);
392
-			case 'ADD':
393
-			default:
394
-				if (!preg_match(',primary\s+key,i', $do)) {
395
-					if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
396
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
397
-
398
-						return false;
399
-					}
400
-					break;
401
-				}
402
-				// ou si la colonne est aussi primary key
403
-				// cas du add id_truc int primary key
404
-				// ajout d'une colonne qui passe en primary key directe
405
-				else {
406
-					$def = trim(substr($do, 3));
407
-					$colonne_ajoutee = substr($def, 0, strpos($def, ' '));
408
-					$def = substr($def, strlen($colonne_ajoutee) + 1);
409
-					$opts = [];
410
-					if (preg_match(',primary\s+key,i', $def)) {
411
-						$opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
412
-						$def = preg_replace(',primary\s+key,i', '', $def);
413
-					}
414
-					$opts['field'] = [$colonne_ajoutee => $def];
415
-					if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
416
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
417
-
418
-						return false;
419
-					}
420
-				}
421
-				break;
422
-		}
423
-		// tout est bon, ouf !
424
-		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
425
-	}
426
-
427
-	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
428
-
429
-	return true;
185
+    // 1
186
+    if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
187
+        $debut = $regs[1];
188
+        $table = $regs[3];
189
+        $suite = $regs[4];
190
+    } else {
191
+        spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
192
+
193
+        return false;
194
+    }
195
+
196
+    // 2
197
+    // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
198
+    // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
199
+    // ou revoir l'api de sql_alter en creant un
200
+    // sql_alter_table($table,array($actions));
201
+    $todo = explode(',', $suite);
202
+
203
+    // on remet les morceaux dechires ensembles... que c'est laid !
204
+    $todo2 = [];
205
+    $i = 0;
206
+    $ouverte = false;
207
+    while ($do = array_shift($todo)) {
208
+        $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
209
+        $o = (false !== strpos($do, '('));
210
+        $f = (false !== strpos($do, ')'));
211
+        if ($o and !$f) {
212
+            $ouverte = true;
213
+        } elseif ($f) {
214
+            $ouverte = false;
215
+        }
216
+        if (!$ouverte) {
217
+            $i++;
218
+        }
219
+    }
220
+
221
+    // 3
222
+    $resultats = [];
223
+    foreach ($todo2 as $do) {
224
+        $do = trim($do);
225
+        if (
226
+            !preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
227
+            . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
228
+            . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
229
+            . '|ADD COLUMN|ADD'
230
+            . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
231
+        ) {
232
+            spip_log(
233
+                "SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
234
+                'sqlite.' . _LOG_ERREUR
235
+            );
236
+
237
+            return false;
238
+        }
239
+
240
+        $cle = strtoupper($matches[1]);
241
+        $colonne_origine = $matches[2];
242
+        $colonne_destination = '';
243
+
244
+        $def = $matches[3];
245
+
246
+        // eluder une eventuelle clause before|after|first inutilisable
247
+        $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
248
+        $defo = $defr; // garder la def d'origine pour certains cas
249
+        // remplacer les definitions venant de mysql
250
+        $defr = _sqlite_remplacements_definitions_table($defr);
251
+
252
+        // reinjecter dans le do
253
+        $do = str_replace($def, $defr, $do);
254
+        $def = $defr;
255
+
256
+        switch ($cle) {
257
+            // suppression d'un index
258
+            case 'DROP KEY':
259
+            case 'DROP INDEX':
260
+                $nom_index = $colonne_origine;
261
+                spip_sqlite_drop_index($nom_index, $table, $serveur);
262
+                break;
263
+
264
+            // suppression d'une pk
265
+            case 'DROP PRIMARY KEY':
266
+                if (
267
+                    !_sqlite_modifier_table(
268
+                        $table,
269
+                        $colonne_origine,
270
+                        ['key' => ['PRIMARY KEY' => '']],
271
+                        $serveur
272
+                    )
273
+                ) {
274
+                    return false;
275
+                }
276
+                break;
277
+            // suppression d'une colonne
278
+            case 'DROP COLUMN':
279
+            case 'DROP':
280
+                if (
281
+                    !_sqlite_modifier_table(
282
+                        $table,
283
+                        [$colonne_origine => ''],
284
+                        [],
285
+                        $serveur
286
+                    )
287
+                ) {
288
+                    return false;
289
+                }
290
+                break;
291
+
292
+            case 'CHANGE COLUMN':
293
+            case 'CHANGE':
294
+                // recuperer le nom de la future colonne
295
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
296
+                // en tenant compte de la cle primaire (ce qui est mieux)
297
+                $def = trim($defo);
298
+                $colonne_destination = substr($def, 0, strpos($def, ' '));
299
+                $def = substr($def, strlen($colonne_destination) + 1);
300
+
301
+                if (
302
+                    !_sqlite_modifier_table(
303
+                        $table,
304
+                        [$colonne_origine => $colonne_destination],
305
+                        ['field' => [$colonne_destination => $def]],
306
+                        $serveur
307
+                    )
308
+                ) {
309
+                    return false;
310
+                }
311
+                break;
312
+
313
+            case 'MODIFY':
314
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
315
+                // en tenant compte de la cle primaire (ce qui est mieux)
316
+                if (
317
+                    !_sqlite_modifier_table(
318
+                        $table,
319
+                        $colonne_origine,
320
+                        ['field' => [$colonne_origine => $defo]],
321
+                        $serveur
322
+                    )
323
+                ) {
324
+                    return false;
325
+                }
326
+                break;
327
+
328
+            // pas geres en sqlite2
329
+            case 'RENAME':
330
+                $do = 'RENAME TO' . substr($do, 6);
331
+            case 'RENAME TO':
332
+                if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
333
+                    spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
334
+
335
+                    return false;
336
+                }
337
+                break;
338
+
339
+            // ajout d'une pk
340
+            case 'ADD PRIMARY KEY':
341
+                $pk = trim(substr($do, 16));
342
+                $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
343
+                if (
344
+                    !_sqlite_modifier_table(
345
+                        $table,
346
+                        $colonne_origine,
347
+                        ['key' => ['PRIMARY KEY' => $pk]],
348
+                        $serveur
349
+                    )
350
+                ) {
351
+                    return false;
352
+                }
353
+                break;
354
+            // ajout d'un index
355
+            case 'ADD UNIQUE KEY':
356
+            case 'ADD UNIQUE':
357
+                $unique = true;
358
+            case 'ADD INDEX':
359
+            case 'ADD KEY':
360
+                if (!isset($unique)) {
361
+                    $unique = false;
362
+                }
363
+                // peut etre "(colonne)" ou "nom_index (colonnes)"
364
+                // bug potentiel si qqn met "(colonne, colonne)"
365
+                //
366
+                // nom_index (colonnes)
367
+                if ($def) {
368
+                    $colonnes = substr($def, 1, -1);
369
+                    $nom_index = $colonne_origine;
370
+                } else {
371
+                    // (colonne)
372
+                    if ($colonne_origine[0] == '(') {
373
+                        $colonnes = substr($colonne_origine, 1, -1);
374
+                        if (false !== strpos(',', $colonnes)) {
375
+                            spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
376
+                                . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
377
+                            break;
378
+                        } else {
379
+                            $nom_index = $colonnes;
380
+                        }
381
+                    } // nom_index
382
+                    else {
383
+                        $nom_index = $colonnes = $colonne_origine;
384
+                    }
385
+                }
386
+                spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
387
+                break;
388
+
389
+            // pas geres en sqlite2
390
+            case 'ADD COLUMN':
391
+                $do = 'ADD' . substr($do, 10);
392
+            case 'ADD':
393
+            default:
394
+                if (!preg_match(',primary\s+key,i', $do)) {
395
+                    if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
396
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
397
+
398
+                        return false;
399
+                    }
400
+                    break;
401
+                }
402
+                // ou si la colonne est aussi primary key
403
+                // cas du add id_truc int primary key
404
+                // ajout d'une colonne qui passe en primary key directe
405
+                else {
406
+                    $def = trim(substr($do, 3));
407
+                    $colonne_ajoutee = substr($def, 0, strpos($def, ' '));
408
+                    $def = substr($def, strlen($colonne_ajoutee) + 1);
409
+                    $opts = [];
410
+                    if (preg_match(',primary\s+key,i', $def)) {
411
+                        $opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
412
+                        $def = preg_replace(',primary\s+key,i', '', $def);
413
+                    }
414
+                    $opts['field'] = [$colonne_ajoutee => $def];
415
+                    if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
416
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
417
+
418
+                        return false;
419
+                    }
420
+                }
421
+                break;
422
+        }
423
+        // tout est bon, ouf !
424
+        spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
425
+    }
426
+
427
+    spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
428
+
429
+    return true;
430 430
 }
431 431
 
432 432
 
@@ -449,38 +449,38 @@  discard block
 block discarded – undo
449 449
  *     - true si la requête réussie, false sinon.
450 450
  */
451 451
 function spip_sqlite_create(
452
-	$nom,
453
-	$champs,
454
-	$cles,
455
-	$autoinc = false,
456
-	$temporary = false,
457
-	$serveur = '',
458
-	$requeter = true
452
+    $nom,
453
+    $champs,
454
+    $cles,
455
+    $autoinc = false,
456
+    $temporary = false,
457
+    $serveur = '',
458
+    $requeter = true
459 459
 ) {
460
-	$query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
461
-	if (!$query) {
462
-		return false;
463
-	}
464
-	$res = spip_sqlite_query($query, $serveur, $requeter);
465
-
466
-	// SQLite ne cree pas les KEY sur les requetes CREATE TABLE
467
-	// il faut donc les faire creer ensuite
468
-	if (!$requeter) {
469
-		return $res;
470
-	}
471
-
472
-	$ok = $res ? true : false;
473
-	if ($ok) {
474
-		foreach ($cles as $k => $v) {
475
-			if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
476
-				$index = trim(substr($k, strlen($m[1])));
477
-				$unique = (strlen($m[1]) > 3);
478
-				$ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
479
-			}
480
-		}
481
-	}
482
-
483
-	return $ok ? true : false;
460
+    $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
461
+    if (!$query) {
462
+        return false;
463
+    }
464
+    $res = spip_sqlite_query($query, $serveur, $requeter);
465
+
466
+    // SQLite ne cree pas les KEY sur les requetes CREATE TABLE
467
+    // il faut donc les faire creer ensuite
468
+    if (!$requeter) {
469
+        return $res;
470
+    }
471
+
472
+    $ok = $res ? true : false;
473
+    if ($ok) {
474
+        foreach ($cles as $k => $v) {
475
+            if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
476
+                $index = trim(substr($k, strlen($m[1])));
477
+                $unique = (strlen($m[1]) > 3);
478
+                $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
479
+            }
480
+        }
481
+    }
482
+
483
+    return $ok ? true : false;
484 484
 }
485 485
 
486 486
 /**
@@ -493,21 +493,21 @@  discard block
 block discarded – undo
493 493
  * @return bool true si la base est créee.
494 494
  **/
495 495
 function spip_sqlite_create_base($nom, $serveur = '', $option = true) {
496
-	$f = $nom . '.sqlite';
497
-	if (strpos($nom, '/') === false) {
498
-		$f = _DIR_DB . $f;
499
-	}
496
+    $f = $nom . '.sqlite';
497
+    if (strpos($nom, '/') === false) {
498
+        $f = _DIR_DB . $f;
499
+    }
500 500
 
501
-	$ok = new \PDO("sqlite:$f");
501
+    $ok = new \PDO("sqlite:$f");
502 502
 
503
-	if ($ok) {
504
-		unset($ok);
503
+    if ($ok) {
504
+        unset($ok);
505 505
 
506
-		return true;
507
-	}
508
-	unset($ok);
506
+        return true;
507
+    }
508
+    unset($ok);
509 509
 
510
-	return false;
510
+    return false;
511 511
 }
512 512
 
513 513
 
@@ -528,22 +528,22 @@  discard block
 block discarded – undo
528 528
  *     - string texte de la requête si $requeter vaut false
529 529
  */
530 530
 function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true) {
531
-	if (!$query_select) {
532
-		return false;
533
-	}
534
-	// vue deja presente
535
-	if (sql_showtable($nom, false, $serveur)) {
536
-		spip_log(
537
-			"Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
538
-			'sqlite.' . _LOG_ERREUR
539
-		);
531
+    if (!$query_select) {
532
+        return false;
533
+    }
534
+    // vue deja presente
535
+    if (sql_showtable($nom, false, $serveur)) {
536
+        spip_log(
537
+            "Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
538
+            'sqlite.' . _LOG_ERREUR
539
+        );
540 540
 
541
-		return false;
542
-	}
541
+        return false;
542
+    }
543 543
 
544
-	$query = "CREATE VIEW $nom AS " . $query_select;
544
+    $query = "CREATE VIEW $nom AS " . $query_select;
545 545
 
546
-	return spip_sqlite_query($query, $serveur, $requeter);
546
+    return spip_sqlite_query($query, $serveur, $requeter);
547 547
 }
548 548
 
549 549
 /**
@@ -565,54 +565,54 @@  discard block
 block discarded – undo
565 565
  *    string : requête, false si erreur, true sinon.
566 566
  */
567 567
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) {
568
-	if (!($nom or $table or $champs)) {
569
-		spip_log(
570
-			"Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
571
-			'sqlite.' . _LOG_ERREUR
572
-		);
573
-
574
-		return false;
575
-	}
576
-
577
-	// SQLite ne differentie pas noms des index en fonction des tables
578
-	// il faut donc creer des noms uniques d'index pour une base sqlite
579
-	$nom = $table . '_' . $nom;
580
-	// enlever d'eventuelles parentheses deja presentes sur champs
581
-	if (!is_array($champs)) {
582
-		if ($champs[0] == '(') {
583
-			$champs = substr($champs, 1, -1);
584
-		}
585
-		$champs = [$champs];
586
-		// supprimer l'info de longueur d'index mysql en fin de champ
587
-		$champs = preg_replace(',\(\d+\)$,', '', $champs);
588
-	}
589
-
590
-	$ifnotexists = '';
591
-	$version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
592
-	if (!function_exists('spip_version_compare')) {
593
-		include_spip('plugins/installer');
594
-	}
595
-
596
-	if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
597
-		$ifnotexists = ' IF NOT EXISTS';
598
-	} else {
599
-		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
600
-		$a = spip_sqlite_showtable($table, $serveur);
601
-		if (isset($a['key']['KEY ' . $nom])) {
602
-			return true;
603
-		}
604
-	}
605
-
606
-	$query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
607
-	$res = spip_sqlite_query($query, $serveur, $requeter);
608
-	if (!$requeter) {
609
-		return $res;
610
-	}
611
-	if ($res) {
612
-		return true;
613
-	} else {
614
-		return false;
615
-	}
568
+    if (!($nom or $table or $champs)) {
569
+        spip_log(
570
+            "Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
571
+            'sqlite.' . _LOG_ERREUR
572
+        );
573
+
574
+        return false;
575
+    }
576
+
577
+    // SQLite ne differentie pas noms des index en fonction des tables
578
+    // il faut donc creer des noms uniques d'index pour une base sqlite
579
+    $nom = $table . '_' . $nom;
580
+    // enlever d'eventuelles parentheses deja presentes sur champs
581
+    if (!is_array($champs)) {
582
+        if ($champs[0] == '(') {
583
+            $champs = substr($champs, 1, -1);
584
+        }
585
+        $champs = [$champs];
586
+        // supprimer l'info de longueur d'index mysql en fin de champ
587
+        $champs = preg_replace(',\(\d+\)$,', '', $champs);
588
+    }
589
+
590
+    $ifnotexists = '';
591
+    $version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
592
+    if (!function_exists('spip_version_compare')) {
593
+        include_spip('plugins/installer');
594
+    }
595
+
596
+    if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
597
+        $ifnotexists = ' IF NOT EXISTS';
598
+    } else {
599
+        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
600
+        $a = spip_sqlite_showtable($table, $serveur);
601
+        if (isset($a['key']['KEY ' . $nom])) {
602
+            return true;
603
+        }
604
+    }
605
+
606
+    $query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
607
+    $res = spip_sqlite_query($query, $serveur, $requeter);
608
+    if (!$requeter) {
609
+        return $res;
610
+    }
611
+    if ($res) {
612
+        return true;
613
+    } else {
614
+        return false;
615
+    }
616 616
 }
617 617
 
618 618
 /**
@@ -629,31 +629,31 @@  discard block
 block discarded – undo
629 629
  * @return int                 Nombre de lignes
630 630
  */
631 631
 function spip_sqlite_count($r, $serveur = '', $requeter = true) {
632
-	if (!$r) {
633
-		return 0;
634
-	}
635
-
636
-	// select ou autre (insert, update,...) ?
637
-	// (link,requete) a compter
638
-	if (is_array($r->spipSqliteRowCount)) {
639
-		list($link, $query) = $r->spipSqliteRowCount;
640
-		// amelioration possible a tester intensivement : pas de order by pour compter !
641
-		// $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
642
-		$query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
643
-		$l = $link->query($query);
644
-		$i = 0;
645
-		if ($l and $z = $l->fetch()) {
646
-			$i = $z['zzzzsqlitecount'];
647
-		}
648
-		$r->spipSqliteRowCount = $i;
649
-	}
650
-	if (isset($r->spipSqliteRowCount)) {
651
-		// Ce compte est faux s'il y a des limit dans la requete :(
652
-		// il retourne le nombre d'enregistrements sans le limit
653
-		return $r->spipSqliteRowCount;
654
-	} else {
655
-		return $r->rowCount();
656
-	}
632
+    if (!$r) {
633
+        return 0;
634
+    }
635
+
636
+    // select ou autre (insert, update,...) ?
637
+    // (link,requete) a compter
638
+    if (is_array($r->spipSqliteRowCount)) {
639
+        list($link, $query) = $r->spipSqliteRowCount;
640
+        // amelioration possible a tester intensivement : pas de order by pour compter !
641
+        // $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
642
+        $query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
643
+        $l = $link->query($query);
644
+        $i = 0;
645
+        if ($l and $z = $l->fetch()) {
646
+            $i = $z['zzzzsqlitecount'];
647
+        }
648
+        $r->spipSqliteRowCount = $i;
649
+    }
650
+    if (isset($r->spipSqliteRowCount)) {
651
+        // Ce compte est faux s'il y a des limit dans la requete :(
652
+        // il retourne le nombre d'enregistrements sans le limit
653
+        return $r->spipSqliteRowCount;
654
+    } else {
655
+        return $r->rowCount();
656
+    }
657 657
 }
658 658
 
659 659
 
@@ -672,30 +672,30 @@  discard block
 block discarded – undo
672 672
  *     - false si la requête a échouée
673 673
  **/
674 674
 function spip_sqlite_countsel(
675
-	$from = [],
676
-	$where = [],
677
-	$groupby = '',
678
-	$having = [],
679
-	$serveur = '',
680
-	$requeter = true
675
+    $from = [],
676
+    $where = [],
677
+    $groupby = '',
678
+    $having = [],
679
+    $serveur = '',
680
+    $requeter = true
681 681
 ) {
682
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
683
-	$r = spip_sqlite_select(
684
-		"COUNT($c)",
685
-		$from,
686
-		$where,
687
-		'',
688
-		'',
689
-		'',
690
-		$having,
691
-		$serveur,
692
-		$requeter
693
-	);
694
-	if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
-		list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
-	}
697
-
698
-	return $r;
682
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
683
+    $r = spip_sqlite_select(
684
+        "COUNT($c)",
685
+        $from,
686
+        $where,
687
+        '',
688
+        '',
689
+        '',
690
+        $having,
691
+        $serveur,
692
+        $requeter
693
+    );
694
+    if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
+        list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
+    }
697
+
698
+    return $r;
699 699
 }
700 700
 
701 701
 
@@ -712,24 +712,24 @@  discard block
 block discarded – undo
712 712
  *     - False en cas d'erreur.
713 713
  **/
714 714
 function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true) {
715
-	$res = spip_sqlite_query(
716
-		_sqlite_calculer_expression('DELETE FROM', $table, ',')
717
-		. _sqlite_calculer_expression('WHERE', $where),
718
-		$serveur,
719
-		$requeter
720
-	);
715
+    $res = spip_sqlite_query(
716
+        _sqlite_calculer_expression('DELETE FROM', $table, ',')
717
+        . _sqlite_calculer_expression('WHERE', $where),
718
+        $serveur,
719
+        $requeter
720
+    );
721 721
 
722
-	// renvoyer la requete inerte si demandee
723
-	if (!$requeter) {
724
-		return $res;
725
-	}
722
+    // renvoyer la requete inerte si demandee
723
+    if (!$requeter) {
724
+        return $res;
725
+    }
726 726
 
727
-	if ($res) {
728
-		$link = _sqlite_link($serveur);
729
-		return $res->rowCount();
730
-	} else {
731
-		return false;
732
-	}
727
+    if ($res) {
728
+        $link = _sqlite_link($serveur);
729
+        return $res->rowCount();
730
+    } else {
731
+        return false;
732
+    }
733 733
 }
734 734
 
735 735
 
@@ -745,15 +745,15 @@  discard block
 block discarded – undo
745 745
  *     - true si la requête a réussie, false sinon
746 746
  */
747 747
 function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true) {
748
-	if ($exist) {
749
-		$exist = ' IF EXISTS';
750
-	}
748
+    if ($exist) {
749
+        $exist = ' IF EXISTS';
750
+    }
751 751
 
752
-	if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
753
-		return true;
754
-	} else {
755
-		return false;
756
-	}
752
+    if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
753
+        return true;
754
+    } else {
755
+        return false;
756
+    }
757 757
 }
758 758
 
759 759
 
@@ -769,11 +769,11 @@  discard block
 block discarded – undo
769 769
  *     - true si la requête a réussie, false sinon
770 770
  */
771 771
 function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true) {
772
-	if ($exist) {
773
-		$exist = ' IF EXISTS';
774
-	}
772
+    if ($exist) {
773
+        $exist = ' IF EXISTS';
774
+    }
775 775
 
776
-	return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
776
+    return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
777 777
 }
778 778
 
779 779
 /**
@@ -787,20 +787,20 @@  discard block
 block discarded – undo
787 787
  * @return bool ou requete
788 788
  */
789 789
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true) {
790
-	if (!($nom or $table)) {
791
-		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
790
+    if (!($nom or $table)) {
791
+        spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
792 792
 
793
-		return false;
794
-	}
793
+        return false;
794
+    }
795 795
 
796
-	// SQLite ne differentie pas noms des index en fonction des tables
797
-	// il faut donc creer des noms uniques d'index pour une base sqlite
798
-	$index = $table . '_' . $nom;
799
-	$exist = ' IF EXISTS';
796
+    // SQLite ne differentie pas noms des index en fonction des tables
797
+    // il faut donc creer des noms uniques d'index pour une base sqlite
798
+    $index = $table . '_' . $nom;
799
+    $exist = ' IF EXISTS';
800 800
 
801
-	$query = "DROP INDEX$exist $index";
801
+    $query = "DROP INDEX$exist $index";
802 802
 
803
-	return spip_sqlite_query($query, $serveur, $requeter);
803
+    return spip_sqlite_query($query, $serveur, $requeter);
804 804
 }
805 805
 
806 806
 /**
@@ -816,28 +816,28 @@  discard block
 block discarded – undo
816 816
  *     Erreur eventuelle
817 817
  **/
818 818
 function spip_sqlite_error($query = '', $serveur = '') {
819
-	$link = _sqlite_link($serveur);
819
+    $link = _sqlite_link($serveur);
820 820
 
821
-	if ($link) {
822
-		$errs = $link->errorInfo();
823
-		$s = _sqlite_last_error_from_link($link);
824
-	} else {
825
-		$s = ': aucune ressource sqlite (link)';
826
-	}
827
-	if ($s) {
828
-		$trace = debug_backtrace();
829
-		if ($trace[0]['function'] != 'spip_sqlite_error') {
830
-			spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
831
-		}
832
-	}
821
+    if ($link) {
822
+        $errs = $link->errorInfo();
823
+        $s = _sqlite_last_error_from_link($link);
824
+    } else {
825
+        $s = ': aucune ressource sqlite (link)';
826
+    }
827
+    if ($s) {
828
+        $trace = debug_backtrace();
829
+        if ($trace[0]['function'] != 'spip_sqlite_error') {
830
+            spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
831
+        }
832
+    }
833 833
 
834
-	return $s;
834
+    return $s;
835 835
 }
836 836
 
837 837
 function _sqlite_last_error_from_link($link) {
838
-	if ($link) {
839
-		$errs = $link->errorInfo();
840
-		/*
838
+    if ($link) {
839
+        $errs = $link->errorInfo();
840
+        /*
841 841
 			$errs[0]
842 842
 				numero SQLState ('HY000' souvent lors d'une erreur)
843 843
 				http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html
@@ -847,11 +847,11 @@  discard block
 block discarded – undo
847 847
 			$errs[2]
848 848
 				Le texte du message d'erreur
849 849
 		*/
850
-		if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
851
-			return "$errs[2]";
852
-		}
853
-	}
854
-	return '';
850
+        if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
851
+            return "$errs[2]";
852
+        }
853
+    }
854
+    return '';
855 855
 }
856 856
 
857 857
 /**
@@ -868,23 +868,23 @@  discard block
 block discarded – undo
868 868
  *    'HY000/1' : numéro de l'erreur SQLState / numéro d'erreur interne SQLite (en sqlite 3)
869 869
  **/
870 870
 function spip_sqlite_errno($serveur = '') {
871
-	$link = _sqlite_link($serveur);
871
+    $link = _sqlite_link($serveur);
872 872
 
873
-	if ($link) {
874
-		$t = $link->errorInfo();
875
-		$s = ltrim($t[0], '0'); // 00000 si pas d'erreur
876
-		if ($s) {
877
-			$s .= ' / ' . $t[1];
878
-		} // ajoute l'erreur du moteur SQLite
879
-	} else {
880
-		$s = ': aucune ressource sqlite (link)';
881
-	}
873
+    if ($link) {
874
+        $t = $link->errorInfo();
875
+        $s = ltrim($t[0], '0'); // 00000 si pas d'erreur
876
+        if ($s) {
877
+            $s .= ' / ' . $t[1];
878
+        } // ajoute l'erreur du moteur SQLite
879
+    } else {
880
+        $s = ': aucune ressource sqlite (link)';
881
+    }
882 882
 
883
-	if ($s) {
884
-		spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
885
-	}
883
+    if ($s) {
884
+        spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
885
+    }
886 886
 
887
-	return $s ? $s : 0;
887
+    return $s ? $s : 0;
888 888
 }
889 889
 
890 890
 
@@ -900,19 +900,19 @@  discard block
 block discarded – undo
900 900
  *     - false si on a pas pu avoir d'explication
901 901
  */
902 902
 function spip_sqlite_explain($query, $serveur = '', $requeter = true) {
903
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
904
-		return [];
905
-	}
903
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
904
+        return [];
905
+    }
906 906
 
907
-	$query = spip_sqlite::traduire_requete($query, $serveur);
908
-	$query = 'EXPLAIN ' . $query;
909
-	if (!$requeter) {
910
-		return $query;
911
-	}
912
-	// on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
913
-	$r = spip_sqlite::executer_requete($query, $serveur, false);
907
+    $query = spip_sqlite::traduire_requete($query, $serveur);
908
+    $query = 'EXPLAIN ' . $query;
909
+    if (!$requeter) {
910
+        return $query;
911
+    }
912
+    // on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
913
+    $r = spip_sqlite::executer_requete($query, $serveur, false);
914 914
 
915
-	return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
915
+    return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
916 916
 }
917 917
 
918 918
 
@@ -929,30 +929,30 @@  discard block
 block discarded – undo
929 929
  */
930 930
 function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true) {
931 931
 
932
-	$link = _sqlite_link($serveur);
933
-	$t = $t ? $t : SPIP_SQLITE3_ASSOC;
932
+    $link = _sqlite_link($serveur);
933
+    $t = $t ? $t : SPIP_SQLITE3_ASSOC;
934 934
 
935
-	$retour = false;
936
-	if ($r) {
937
-		$retour = $r->fetch($t);
938
-	}
935
+    $retour = false;
936
+    if ($r) {
937
+        $retour = $r->fetch($t);
938
+    }
939 939
 
940
-	// Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
941
-	// suppression de 'table.' pour toutes les cles (c'est un peu violent !)
942
-	// c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
943
-	if (
944
-		$retour
945
-		and strpos(implode('', array_keys($retour)), '.') !== false
946
-	) {
947
-		foreach ($retour as $cle => $val) {
948
-			if (($pos = strpos($cle, '.')) !== false) {
949
-				$retour[substr($cle, $pos + 1)] = &$retour[$cle];
950
-				unset($retour[$cle]);
951
-			}
952
-		}
953
-	}
940
+    // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
941
+    // suppression de 'table.' pour toutes les cles (c'est un peu violent !)
942
+    // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
943
+    if (
944
+        $retour
945
+        and strpos(implode('', array_keys($retour)), '.') !== false
946
+    ) {
947
+        foreach ($retour as $cle => $val) {
948
+            if (($pos = strpos($cle, '.')) !== false) {
949
+                $retour[substr($cle, $pos + 1)] = &$retour[$cle];
950
+                unset($retour[$cle]);
951
+            }
952
+        }
953
+    }
954 954
 
955
-	return $retour;
955
+    return $retour;
956 956
 }
957 957
 
958 958
 /**
@@ -965,8 +965,8 @@  discard block
 block discarded – undo
965 965
  * @return bool True si déplacement réussi, false sinon.
966 966
  **/
967 967
 function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true) {
968
-	// encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
969
-	return false;
968
+    // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
969
+    return false;
970 970
 }
971 971
 
972 972
 
@@ -982,10 +982,10 @@  discard block
 block discarded – undo
982 982
  * @return bool                True si réussi
983 983
  */
984 984
 function spip_sqlite_free(&$r, $serveur = '', $requeter = true) {
985
-	unset($r);
985
+    unset($r);
986 986
 
987
-	return true;
988
-	//return sqlite_free_result($r);
987
+    return true;
988
+    //return sqlite_free_result($r);
989 989
 }
990 990
 
991 991
 
@@ -1000,8 +1000,8 @@  discard block
 block discarded – undo
1000 1000
  * @return void
1001 1001
  */
1002 1002
 function spip_sqlite_get_charset($charset = [], $serveur = '', $requeter = true) {
1003
-	//$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1004
-	//return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1003
+    //$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1004
+    //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1005 1005
 }
1006 1006
 
1007 1007
 
@@ -1016,7 +1016,7 @@  discard block
 block discarded – undo
1016 1016
  *     Valeur hexadécimale pour SQLite
1017 1017
  **/
1018 1018
 function spip_sqlite_hex($v) {
1019
-	return hexdec($v);
1019
+    return hexdec($v);
1020 1020
 }
1021 1021
 
1022 1022
 
@@ -1038,7 +1038,7 @@  discard block
 block discarded – undo
1038 1038
  *     Expression de requête SQL
1039 1039
  **/
1040 1040
 function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1041
-	return "($val $not IN ($valeurs))";
1041
+    return "($val $not IN ($valeurs))";
1042 1042
 }
1043 1043
 
1044 1044
 
@@ -1066,20 +1066,20 @@  discard block
 block discarded – undo
1066 1066
  **/
1067 1067
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1068 1068
 
1069
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1070
-	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1071
-		if (!$requeter) {
1072
-			return $r;
1073
-		}
1074
-		$nb = spip_sqlite::last_insert_id($serveur);
1075
-	} else {
1076
-		$nb = false;
1077
-	}
1069
+    $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1070
+    if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1071
+        if (!$requeter) {
1072
+            return $r;
1073
+        }
1074
+        $nb = spip_sqlite::last_insert_id($serveur);
1075
+    } else {
1076
+        $nb = false;
1077
+    }
1078 1078
 
1079
-	$err = spip_sqlite_error($query, $serveur);
1079
+    $err = spip_sqlite_error($query, $serveur);
1080 1080
 
1081
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1082
-	return isset($_GET['var_profile']) ? $r : $nb;
1081
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1082
+    return isset($_GET['var_profile']) ? $r : $nb;
1083 1083
 }
1084 1084
 
1085 1085
 
@@ -1104,28 +1104,28 @@  discard block
 block discarded – undo
1104 1104
  *     - Tableau de description de la requête et du temps d'exécution, si var_profile activé
1105 1105
  **/
1106 1106
 function spip_sqlite_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
1107
-	if (!$desc) {
1108
-		$desc = description_table($table, $serveur);
1109
-	}
1110
-	if (!$desc) {
1111
-		die("$table insertion sans description");
1112
-	}
1113
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1107
+    if (!$desc) {
1108
+        $desc = description_table($table, $serveur);
1109
+    }
1110
+    if (!$desc) {
1111
+        die("$table insertion sans description");
1112
+    }
1113
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1114 1114
 
1115
-	foreach ($couples as $champ => $val) {
1116
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1117
-	}
1115
+    foreach ($couples as $champ => $val) {
1116
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1117
+    }
1118 1118
 
1119
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1120
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1119
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1120
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1121 1121
 
1122
-	$cles = $valeurs = '';
1123
-	if (count($couples)) {
1124
-		$cles = '(' . join(',', array_keys($couples)) . ')';
1125
-		$valeurs = '(' . join(',', $couples) . ')';
1126
-	}
1122
+    $cles = $valeurs = '';
1123
+    if (count($couples)) {
1124
+        $cles = '(' . join(',', array_keys($couples)) . ')';
1125
+        $valeurs = '(' . join(',', $couples) . ')';
1126
+    }
1127 1127
 
1128
-	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1128
+    return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1129 1129
 }
1130 1130
 
1131 1131
 
@@ -1149,70 +1149,70 @@  discard block
 block discarded – undo
1149 1149
  *     - False en cas d'erreur.
1150 1150
  **/
1151 1151
 function spip_sqlite_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
1152
-	if (!$desc) {
1153
-		$desc = description_table($table, $serveur);
1154
-	}
1155
-	if (!$desc) {
1156
-		die("$table insertion sans description");
1157
-	}
1158
-	if (!isset($desc['field'])) {
1159
-		$desc['field'] = [];
1160
-	}
1161
-
1162
-	// recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1163
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1164
-
1165
-	// seul le nom de la table est a traduire ici :
1166
-	// le faire une seule fois au debut
1167
-	$query_start = "INSERT INTO $table ";
1168
-	$query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1169
-
1170
-	// ouvrir une transaction
1171
-	if ($requeter) {
1172
-		spip_sqlite::demarrer_transaction($serveur);
1173
-	}
1174
-
1175
-	while ($couples = array_shift($tab_couples)) {
1176
-		foreach ($couples as $champ => $val) {
1177
-			$couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1178
-		}
1179
-
1180
-		// inserer les champs timestamp par defaut
1181
-		$couples = array_merge($maj, $couples);
1182
-
1183
-		$champs = $valeurs = '';
1184
-		if (count($couples)) {
1185
-			$champs = '(' . join(',', array_keys($couples)) . ')';
1186
-			$valeurs = '(' . join(',', $couples) . ')';
1187
-			$query = $query_start . "$champs VALUES $valeurs";
1188
-		} else {
1189
-			$query = $query_start . 'DEFAULT VALUES';
1190
-		}
1191
-
1192
-		if ($requeter) {
1193
-			$retour = spip_sqlite::executer_requete($query, $serveur);
1194
-		}
1195
-
1196
-		// sur le dernier couple uniquement
1197
-		if (!count($tab_couples)) {
1198
-			$nb = 0;
1199
-			if ($requeter) {
1200
-				$nb = spip_sqlite::last_insert_id($serveur);
1201
-			} else {
1202
-				return $query;
1203
-			}
1204
-		}
1205
-
1206
-		$err = spip_sqlite_error($query, $serveur);
1207
-	}
1208
-
1209
-	if ($requeter) {
1210
-		spip_sqlite::finir_transaction($serveur);
1211
-	}
1212
-
1213
-	// renvoie le dernier id d'autoincrement ajoute
1214
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1215
-	return isset($_GET['var_profile']) ? $retour : $nb;
1152
+    if (!$desc) {
1153
+        $desc = description_table($table, $serveur);
1154
+    }
1155
+    if (!$desc) {
1156
+        die("$table insertion sans description");
1157
+    }
1158
+    if (!isset($desc['field'])) {
1159
+        $desc['field'] = [];
1160
+    }
1161
+
1162
+    // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1163
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1164
+
1165
+    // seul le nom de la table est a traduire ici :
1166
+    // le faire une seule fois au debut
1167
+    $query_start = "INSERT INTO $table ";
1168
+    $query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1169
+
1170
+    // ouvrir une transaction
1171
+    if ($requeter) {
1172
+        spip_sqlite::demarrer_transaction($serveur);
1173
+    }
1174
+
1175
+    while ($couples = array_shift($tab_couples)) {
1176
+        foreach ($couples as $champ => $val) {
1177
+            $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1178
+        }
1179
+
1180
+        // inserer les champs timestamp par defaut
1181
+        $couples = array_merge($maj, $couples);
1182
+
1183
+        $champs = $valeurs = '';
1184
+        if (count($couples)) {
1185
+            $champs = '(' . join(',', array_keys($couples)) . ')';
1186
+            $valeurs = '(' . join(',', $couples) . ')';
1187
+            $query = $query_start . "$champs VALUES $valeurs";
1188
+        } else {
1189
+            $query = $query_start . 'DEFAULT VALUES';
1190
+        }
1191
+
1192
+        if ($requeter) {
1193
+            $retour = spip_sqlite::executer_requete($query, $serveur);
1194
+        }
1195
+
1196
+        // sur le dernier couple uniquement
1197
+        if (!count($tab_couples)) {
1198
+            $nb = 0;
1199
+            if ($requeter) {
1200
+                $nb = spip_sqlite::last_insert_id($serveur);
1201
+            } else {
1202
+                return $query;
1203
+            }
1204
+        }
1205
+
1206
+        $err = spip_sqlite_error($query, $serveur);
1207
+    }
1208
+
1209
+    if ($requeter) {
1210
+        spip_sqlite::finir_transaction($serveur);
1211
+    }
1212
+
1213
+    // renvoie le dernier id d'autoincrement ajoute
1214
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1215
+    return isset($_GET['var_profile']) ? $retour : $nb;
1216 1216
 }
1217 1217
 
1218 1218
 
@@ -1227,7 +1227,7 @@  discard block
 block discarded – undo
1227 1227
  *     Toujours true.
1228 1228
  **/
1229 1229
 function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) {
1230
-	return true;
1230
+    return true;
1231 1231
 }
1232 1232
 
1233 1233
 /**
@@ -1244,12 +1244,12 @@  discard block
 block discarded – undo
1244 1244
  *     string si texte de la requête demandé, true sinon
1245 1245
  **/
1246 1246
 function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true) {
1247
-	if (!$requeter) {
1248
-		return 'BEGIN TRANSACTION';
1249
-	}
1250
-	spip_sqlite::demarrer_transaction($serveur);
1247
+    if (!$requeter) {
1248
+        return 'BEGIN TRANSACTION';
1249
+    }
1250
+    spip_sqlite::demarrer_transaction($serveur);
1251 1251
 
1252
-	return true;
1252
+    return true;
1253 1253
 }
1254 1254
 
1255 1255
 /**
@@ -1263,12 +1263,12 @@  discard block
 block discarded – undo
1263 1263
  *     string si texte de la requête demandé, true sinon
1264 1264
  **/
1265 1265
 function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) {
1266
-	if (!$requeter) {
1267
-		return 'COMMIT';
1268
-	}
1269
-	spip_sqlite::finir_transaction($serveur);
1266
+    if (!$requeter) {
1267
+        return 'COMMIT';
1268
+    }
1269
+    spip_sqlite::finir_transaction($serveur);
1270 1270
 
1271
-	return true;
1271
+    return true;
1272 1272
 }
1273 1273
 
1274 1274
 
@@ -1283,27 +1283,27 @@  discard block
 block discarded – undo
1283 1283
  *     Liste des noms de bases
1284 1284
  **/
1285 1285
 function spip_sqlite_listdbs($serveur = '', $requeter = true) {
1286
-	_sqlite_init();
1286
+    _sqlite_init();
1287 1287
 
1288
-	if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1289
-		return [];
1290
-	}
1288
+    if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1289
+        return [];
1290
+    }
1291 1291
 
1292
-	include_spip('inc/flock');
1293
-	$bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1294
-	$bds = [];
1292
+    include_spip('inc/flock');
1293
+    $bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1294
+    $bds = [];
1295 1295
 
1296
-	foreach ($bases as $b) {
1297
-		// pas de bases commencant pas sqlite
1298
-		// (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1299
-		// les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1300
-		if (strpos($b, '_sqlite')) {
1301
-			continue;
1302
-		}
1303
-		$bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1304
-	}
1296
+    foreach ($bases as $b) {
1297
+        // pas de bases commencant pas sqlite
1298
+        // (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1299
+        // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1300
+        if (strpos($b, '_sqlite')) {
1301
+            continue;
1302
+        }
1303
+        $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1304
+    }
1305 1305
 
1306
-	return $bds;
1306
+    return $bds;
1307 1307
 }
1308 1308
 
1309 1309
 
@@ -1318,9 +1318,9 @@  discard block
 block discarded – undo
1318 1318
  * @return string       Texte de sélection pour la requête
1319 1319
  */
1320 1320
 function spip_sqlite_multi($objet, $lang) {
1321
-	$r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1321
+    $r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1322 1322
 
1323
-	return $r;
1323
+    return $r;
1324 1324
 }
1325 1325
 
1326 1326
 
@@ -1337,15 +1337,15 @@  discard block
 block discarded – undo
1337 1337
  * @return bool|string true / false / requete
1338 1338
  **/
1339 1339
 function spip_sqlite_optimize($table, $serveur = '', $requeter = true) {
1340
-	static $do = false;
1341
-	if ($requeter and $do) {
1342
-		return true;
1343
-	}
1344
-	if ($requeter) {
1345
-		$do = true;
1346
-	}
1340
+    static $do = false;
1341
+    if ($requeter and $do) {
1342
+        return true;
1343
+    }
1344
+    if ($requeter) {
1345
+        $do = true;
1346
+    }
1347 1347
 
1348
-	return spip_sqlite_query('VACUUM', $serveur, $requeter);
1348
+    return spip_sqlite_query('VACUUM', $serveur, $requeter);
1349 1349
 }
1350 1350
 
1351 1351
 
@@ -1362,15 +1362,15 @@  discard block
 block discarded – undo
1362 1362
  *    Donnée prête à être utilisée par le gestionnaire SQL
1363 1363
  */
1364 1364
 function spip_sqlite_quote($v, $type = '') {
1365
-	if (!is_array($v)) {
1366
-		return _sqlite_calculer_cite($v, $type);
1367
-	}
1368
-	// si c'est un tableau, le parcourir en propageant le type
1369
-	foreach ($v as $k => $r) {
1370
-		$v[$k] = spip_sqlite_quote($r, $type);
1371
-	}
1365
+    if (!is_array($v)) {
1366
+        return _sqlite_calculer_cite($v, $type);
1367
+    }
1368
+    // si c'est un tableau, le parcourir en propageant le type
1369
+    foreach ($v as $k => $r) {
1370
+        $v[$k] = spip_sqlite_quote($r, $type);
1371
+    }
1372 1372
 
1373
-	return join(',', $v);
1373
+    return join(',', $v);
1374 1374
 }
1375 1375
 
1376 1376
 
@@ -1387,9 +1387,9 @@  discard block
 block discarded – undo
1387 1387
  *     Expression SQL
1388 1388
  **/
1389 1389
 function spip_sqlite_date_proche($champ, $interval, $unite) {
1390
-	$op = (($interval <= 0) ? '>' : '<');
1390
+    $op = (($interval <= 0) ? '>' : '<');
1391 1391
 
1392
-	return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1392
+    return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1393 1393
 }
1394 1394
 
1395 1395
 
@@ -1407,48 +1407,48 @@  discard block
 block discarded – undo
1407 1407
  *     l'état de la table après la réparation
1408 1408
  */
1409 1409
 function spip_sqlite_repair($table, $serveur = '', $requeter = true) {
1410
-	if (
1411
-		$desc = spip_sqlite_showtable($table, $serveur)
1412
-		and isset($desc['field'])
1413
-		and is_array($desc['field'])
1414
-	) {
1415
-		foreach ($desc['field'] as $c => $d) {
1416
-			if (
1417
-				preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1418
-				and stripos($d, 'NOT NULL') !== false
1419
-				and stripos($d, 'DEFAULT') === false
1420
-				/* pas touche aux cles primaires */
1421
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1422
-			) {
1423
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1424
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1425
-			}
1426
-			if (
1427
-				preg_match(',^(INTEGER),i', $d)
1428
-				and stripos($d, 'NOT NULL') !== false
1429
-				and stripos($d, 'DEFAULT') === false
1430
-				/* pas touche aux cles primaires */
1431
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1432
-			) {
1433
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1434
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1435
-			}
1436
-			if (
1437
-				preg_match(',^(datetime),i', $d)
1438
-				and stripos($d, 'NOT NULL') !== false
1439
-				and stripos($d, 'DEFAULT') === false
1440
-				/* pas touche aux cles primaires */
1441
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1442
-			) {
1443
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1444
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1445
-			}
1446
-		}
1447
-
1448
-		return [' OK '];
1449
-	}
1450
-
1451
-	return [' ERROR '];
1410
+    if (
1411
+        $desc = spip_sqlite_showtable($table, $serveur)
1412
+        and isset($desc['field'])
1413
+        and is_array($desc['field'])
1414
+    ) {
1415
+        foreach ($desc['field'] as $c => $d) {
1416
+            if (
1417
+                preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1418
+                and stripos($d, 'NOT NULL') !== false
1419
+                and stripos($d, 'DEFAULT') === false
1420
+                /* pas touche aux cles primaires */
1421
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1422
+            ) {
1423
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1424
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1425
+            }
1426
+            if (
1427
+                preg_match(',^(INTEGER),i', $d)
1428
+                and stripos($d, 'NOT NULL') !== false
1429
+                and stripos($d, 'DEFAULT') === false
1430
+                /* pas touche aux cles primaires */
1431
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1432
+            ) {
1433
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1434
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1435
+            }
1436
+            if (
1437
+                preg_match(',^(datetime),i', $d)
1438
+                and stripos($d, 'NOT NULL') !== false
1439
+                and stripos($d, 'DEFAULT') === false
1440
+                /* pas touche aux cles primaires */
1441
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1442
+            ) {
1443
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1444
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1445
+            }
1446
+        }
1447
+
1448
+        return [' OK '];
1449
+    }
1450
+
1451
+    return [' ERROR '];
1452 1452
 }
1453 1453
 
1454 1454
 
@@ -1477,25 +1477,25 @@  discard block
 block discarded – undo
1477 1477
  *     - False en cas d'erreur.
1478 1478
  **/
1479 1479
 function spip_sqlite_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1480
-	if (!$desc) {
1481
-		$desc = description_table($table, $serveur);
1482
-	}
1483
-	if (!$desc) {
1484
-		die("$table insertion sans description");
1485
-	}
1486
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1480
+    if (!$desc) {
1481
+        $desc = description_table($table, $serveur);
1482
+    }
1483
+    if (!$desc) {
1484
+        die("$table insertion sans description");
1485
+    }
1486
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1487 1487
 
1488
-	foreach ($couples as $champ => $val) {
1489
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1490
-	}
1488
+    foreach ($couples as $champ => $val) {
1489
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1490
+    }
1491 1491
 
1492
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1493
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1492
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1493
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1494 1494
 
1495
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1496
-		',',
1497
-		$couples
1498
-	) . ')', $serveur);
1495
+    return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1496
+        ',',
1497
+        $couples
1498
+    ) . ')', $serveur);
1499 1499
 }
1500 1500
 
1501 1501
 
@@ -1525,13 +1525,13 @@  discard block
 block discarded – undo
1525 1525
  **/
1526 1526
 function spip_sqlite_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1527 1527
 
1528
-	// boucler pour trainter chaque requete independemment
1529
-	foreach ($tab_couples as $couples) {
1530
-		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1531
-	}
1528
+    // boucler pour trainter chaque requete independemment
1529
+    foreach ($tab_couples as $couples) {
1530
+        $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1531
+    }
1532 1532
 
1533
-	// renvoie le dernier id
1534
-	return $retour;
1533
+    // renvoie le dernier id
1534
+    return $retour;
1535 1535
 }
1536 1536
 
1537 1537
 
@@ -1558,44 +1558,44 @@  discard block
 block discarded – undo
1558 1558
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1559 1559
  */
1560 1560
 function spip_sqlite_select(
1561
-	$select,
1562
-	$from,
1563
-	$where = '',
1564
-	$groupby = '',
1565
-	$orderby = '',
1566
-	$limit = '',
1567
-	$having = '',
1568
-	$serveur = '',
1569
-	$requeter = true
1561
+    $select,
1562
+    $from,
1563
+    $where = '',
1564
+    $groupby = '',
1565
+    $orderby = '',
1566
+    $limit = '',
1567
+    $having = '',
1568
+    $serveur = '',
1569
+    $requeter = true
1570 1570
 ) {
1571 1571
 
1572
-	// version() n'est pas connu de sqlite
1573
-	$select = str_replace('version()', 'sqlite_version()', $select);
1572
+    // version() n'est pas connu de sqlite
1573
+    $select = str_replace('version()', 'sqlite_version()', $select);
1574 1574
 
1575
-	// recomposer from
1576
-	$from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1575
+    // recomposer from
1576
+    $from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1577 1577
 
1578
-	$query =
1579
-		_sqlite_calculer_expression('SELECT', $select, ', ')
1580
-		. _sqlite_calculer_expression('FROM', $from, ', ')
1581
-		. _sqlite_calculer_expression('WHERE', $where)
1582
-		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1583
-		. _sqlite_calculer_expression('HAVING', $having)
1584
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1585
-		. ($limit ? "\nLIMIT $limit" : '');
1578
+    $query =
1579
+        _sqlite_calculer_expression('SELECT', $select, ', ')
1580
+        . _sqlite_calculer_expression('FROM', $from, ', ')
1581
+        . _sqlite_calculer_expression('WHERE', $where)
1582
+        . _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1583
+        . _sqlite_calculer_expression('HAVING', $having)
1584
+        . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1585
+        . ($limit ? "\nLIMIT $limit" : '');
1586 1586
 
1587
-	// dans un select, on doit renvoyer la requête en cas d'erreur
1588
-	$res = spip_sqlite_query($query, $serveur, $requeter);
1589
-	// texte de la requete demande ?
1590
-	if (!$requeter) {
1591
-		return $res;
1592
-	}
1593
-	// erreur survenue ?
1594
-	if ($res === false) {
1595
-		return spip_sqlite::traduire_requete($query, $serveur);
1596
-	}
1587
+    // dans un select, on doit renvoyer la requête en cas d'erreur
1588
+    $res = spip_sqlite_query($query, $serveur, $requeter);
1589
+    // texte de la requete demande ?
1590
+    if (!$requeter) {
1591
+        return $res;
1592
+    }
1593
+    // erreur survenue ?
1594
+    if ($res === false) {
1595
+        return spip_sqlite::traduire_requete($query, $serveur);
1596
+    }
1597 1597
 
1598
-	return $res;
1598
+    return $res;
1599 1599
 }
1600 1600
 
1601 1601
 
@@ -1614,32 +1614,32 @@  discard block
 block discarded – undo
1614 1614
  *     - False en cas d'erreur.
1615 1615
  **/
1616 1616
 function spip_sqlite_selectdb($db, $serveur = '', $requeter = true) {
1617
-	_sqlite_init();
1617
+    _sqlite_init();
1618 1618
 
1619
-	// interdire la creation d'une nouvelle base,
1620
-	// sauf si on est dans l'installation
1621
-	if (
1622
-		!is_file($f = _DIR_DB . $db . '.sqlite')
1623
-		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1624
-	) {
1625
-		spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1619
+    // interdire la creation d'une nouvelle base,
1620
+    // sauf si on est dans l'installation
1621
+    if (
1622
+        !is_file($f = _DIR_DB . $db . '.sqlite')
1623
+        && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1624
+    ) {
1625
+        spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1626 1626
 
1627
-		return false;
1628
-	}
1627
+        return false;
1628
+    }
1629 1629
 
1630
-	// se connecter a la base indiquee
1631
-	// avec les identifiants connus
1632
-	$index = $serveur ? $serveur : 0;
1630
+    // se connecter a la base indiquee
1631
+    // avec les identifiants connus
1632
+    $index = $serveur ? $serveur : 0;
1633 1633
 
1634
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1635
-		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1636
-			return $db;
1637
-		}
1638
-	} else {
1639
-		spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1634
+    if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1635
+        if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1636
+            return $db;
1637
+        }
1638
+    } else {
1639
+        spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1640 1640
 
1641
-		return false;
1642
-	}
1641
+        return false;
1642
+    }
1643 1643
 }
1644 1644
 
1645 1645
 
@@ -1654,8 +1654,8 @@  discard block
 block discarded – undo
1654 1654
  * @return void
1655 1655
  */
1656 1656
 function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true) {
1657
-	# spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1658
-	# return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1657
+    # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1658
+    # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1659 1659
 }
1660 1660
 
1661 1661
 
@@ -1673,24 +1673,24 @@  discard block
 block discarded – undo
1673 1673
  *     Ressource à utiliser avec sql_fetch()
1674 1674
  **/
1675 1675
 function spip_sqlite_showbase($match, $serveur = '', $requeter = true) {
1676
-	// type est le type d'entrée : table / index / view
1677
-	// on ne retourne que les tables (?) et non les vues...
1678
-	# ESCAPE non supporte par les versions sqlite <3
1679
-	#	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1680
-	$match = preg_quote($match);
1681
-	$match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1682
-	$match = str_replace('\\\%', '[[POURCENT]]', $match);
1683
-	$match = str_replace('_', '.', $match);
1684
-	$match = str_replace('%', '.*', $match);
1685
-	$match = str_replace('[[TIRETBAS]]', '_', $match);
1686
-	$match = str_replace('[[POURCENT]]', '%', $match);
1687
-	$match = "^$match$";
1688
-
1689
-	return spip_sqlite_query(
1690
-		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1691
-		$serveur,
1692
-		$requeter
1693
-	);
1676
+    // type est le type d'entrée : table / index / view
1677
+    // on ne retourne que les tables (?) et non les vues...
1678
+    # ESCAPE non supporte par les versions sqlite <3
1679
+    #	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1680
+    $match = preg_quote($match);
1681
+    $match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1682
+    $match = str_replace('\\\%', '[[POURCENT]]', $match);
1683
+    $match = str_replace('_', '.', $match);
1684
+    $match = str_replace('%', '.*', $match);
1685
+    $match = str_replace('[[TIRETBAS]]', '_', $match);
1686
+    $match = str_replace('[[POURCENT]]', '%', $match);
1687
+    $match = "^$match$";
1688
+
1689
+    return spip_sqlite_query(
1690
+        "SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1691
+        $serveur,
1692
+        $requeter
1693
+    );
1694 1694
 }
1695 1695
 
1696 1696
 /**
@@ -1708,19 +1708,19 @@  discard block
 block discarded – undo
1708 1708
  *     - string : requete sql, si $requeter = true
1709 1709
  **/
1710 1710
 function spip_sqlite_table_exists(string $table, $serveur = '', $requeter = true) {
1711
-	$r = spip_sqlite_query(
1712
-		'SELECT name FROM sqlite_master WHERE'
1713
-		. ' type=\'table\''
1714
-		. ' AND name=' . spip_sqlite_quote($table, 'string')
1715
-		. ' AND name NOT LIKE \'sqlite_%\'',
1716
-		$serveur,
1717
-		$requeter
1718
-	);
1719
-	if (!$requeter) {
1720
-		return $r;
1721
-	}
1722
-	$res = spip_sqlite_fetch($r);
1723
-	return (bool) $res;
1711
+    $r = spip_sqlite_query(
1712
+        'SELECT name FROM sqlite_master WHERE'
1713
+        . ' type=\'table\''
1714
+        . ' AND name=' . spip_sqlite_quote($table, 'string')
1715
+        . ' AND name NOT LIKE \'sqlite_%\'',
1716
+        $serveur,
1717
+        $requeter
1718
+    );
1719
+    if (!$requeter) {
1720
+        return $r;
1721
+    }
1722
+    $res = spip_sqlite_fetch($r);
1723
+    return (bool) $res;
1724 1724
 }
1725 1725
 
1726 1726
 define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -1743,129 +1743,129 @@  discard block
 block discarded – undo
1743 1743
  *     - array description de la table sinon
1744 1744
  */
1745 1745
 function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true) {
1746
-	$query =
1747
-		'SELECT sql, type FROM'
1748
-		. ' (SELECT * FROM sqlite_master UNION ALL'
1749
-		. ' SELECT * FROM sqlite_temp_master)'
1750
-		. " WHERE tbl_name LIKE '$nom_table'"
1751
-		. " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1752
-		. ' ORDER BY substr(type,2,1), name';
1753
-
1754
-	$a = spip_sqlite_query($query, $serveur, $requeter);
1755
-	if (!$a) {
1756
-		return '';
1757
-	}
1758
-	if (!$requeter) {
1759
-		return $a;
1760
-	}
1761
-	if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1762
-		return '';
1763
-	}
1764
-	$vue = ($a['type'] == 'view'); // table | vue
1765
-
1766
-	// c'est une table
1767
-	// il faut parser le create
1768
-	if (!$vue) {
1769
-		if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1770
-			return '';
1771
-		} else {
1772
-			$desc = $r[1];
1773
-			// extraction d'une KEY éventuelle en prenant garde de ne pas
1774
-			// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1775
-			if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1776
-				$namedkeys = $r[2];
1777
-				$desc = $r[1];
1778
-			} else {
1779
-				$namedkeys = '';
1780
-			}
1781
-
1782
-			$fields = [];
1783
-			$keys = [];
1784
-
1785
-			// enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1786
-			// par exemple s'il contiennent une virgule.
1787
-			// /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1788
-			list($desc, $echaps) = query_echappe_textes($desc);
1789
-
1790
-			// separer toutes les descriptions de champs, separes par des virgules
1791
-			# /!\ explode peut exploser aussi DECIMAL(10,2) !
1792
-			$k_precedent = null;
1793
-			foreach (explode(',', $desc) as $v) {
1794
-				preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1795
-				// Les cles de champs peuvent etre entourees
1796
-				// de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1797
-				// http://www.sqlite.org/lang_keywords.html
1798
-				$k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1799
-				if ($char = strpbrk($k[0], '\'"[`')) {
1800
-					$k = trim($k, $char);
1801
-					if ($char == '[') {
1802
-						$k = rtrim($k, ']');
1803
-					}
1804
-				}
1805
-				$def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1806
-
1807
-				// rustine pour DECIMAL(10,2)
1808
-				// s'il y a une parenthèse fermante dans la clé
1809
-				// ou dans la définition sans qu'il n'y ait une ouverture avant
1810
-				if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1811
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1812
-					continue;
1813
-				}
1814
-
1815
-				// la primary key peut etre dans une des descriptions de champs
1816
-				// et non en fin de table, cas encore decouvert avec Sqlite Manager
1817
-				if (stripos($r[2], 'PRIMARY KEY') !== false) {
1818
-					$keys['PRIMARY KEY'] = $k;
1819
-				}
1820
-
1821
-				$fields[$k] = $def;
1822
-				$k_precedent = $k;
1823
-			}
1824
-			// key inclues dans la requete
1825
-			foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1826
-				if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1827
-					$k = str_replace('`', '', trim($r[1]));
1828
-					$t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1829
-					if ($k && !isset($keys[$k])) {
1830
-						$keys[$k] = $t;
1831
-					} else {
1832
-						$keys[] = $t;
1833
-					}
1834
-				}
1835
-			}
1836
-			// sinon ajouter les key index
1837
-			$query =
1838
-				'SELECT name,sql FROM'
1839
-				. ' (SELECT * FROM sqlite_master UNION ALL'
1840
-				. ' SELECT * FROM sqlite_temp_master)'
1841
-				. " WHERE tbl_name LIKE '$nom_table'"
1842
-				. " AND type='index' AND name NOT LIKE 'sqlite_%'"
1843
-				. 'ORDER BY substr(type,2,1), name';
1844
-			$a = spip_sqlite_query($query, $serveur, $requeter);
1845
-			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1846
-				$key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1847
-				$keytype = 'KEY';
1848
-				if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1849
-					$keytype = 'UNIQUE KEY';
1850
-				}
1851
-				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1852
-				$keys[$keytype . ' ' . $key] = $colonnes;
1853
-			}
1854
-		}
1855
-	} // c'est une vue, on liste les champs disponibles simplement
1856
-	else {
1857
-		if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1858
-			$fields = [];
1859
-			foreach ($res as $c => $v) {
1860
-				$fields[$c] = '';
1861
-			}
1862
-			$keys = [];
1863
-		} else {
1864
-			return '';
1865
-		}
1866
-	}
1867
-
1868
-	return ['field' => $fields, 'key' => $keys];
1746
+    $query =
1747
+        'SELECT sql, type FROM'
1748
+        . ' (SELECT * FROM sqlite_master UNION ALL'
1749
+        . ' SELECT * FROM sqlite_temp_master)'
1750
+        . " WHERE tbl_name LIKE '$nom_table'"
1751
+        . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1752
+        . ' ORDER BY substr(type,2,1), name';
1753
+
1754
+    $a = spip_sqlite_query($query, $serveur, $requeter);
1755
+    if (!$a) {
1756
+        return '';
1757
+    }
1758
+    if (!$requeter) {
1759
+        return $a;
1760
+    }
1761
+    if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1762
+        return '';
1763
+    }
1764
+    $vue = ($a['type'] == 'view'); // table | vue
1765
+
1766
+    // c'est une table
1767
+    // il faut parser le create
1768
+    if (!$vue) {
1769
+        if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1770
+            return '';
1771
+        } else {
1772
+            $desc = $r[1];
1773
+            // extraction d'une KEY éventuelle en prenant garde de ne pas
1774
+            // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1775
+            if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1776
+                $namedkeys = $r[2];
1777
+                $desc = $r[1];
1778
+            } else {
1779
+                $namedkeys = '';
1780
+            }
1781
+
1782
+            $fields = [];
1783
+            $keys = [];
1784
+
1785
+            // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1786
+            // par exemple s'il contiennent une virgule.
1787
+            // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1788
+            list($desc, $echaps) = query_echappe_textes($desc);
1789
+
1790
+            // separer toutes les descriptions de champs, separes par des virgules
1791
+            # /!\ explode peut exploser aussi DECIMAL(10,2) !
1792
+            $k_precedent = null;
1793
+            foreach (explode(',', $desc) as $v) {
1794
+                preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1795
+                // Les cles de champs peuvent etre entourees
1796
+                // de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1797
+                // http://www.sqlite.org/lang_keywords.html
1798
+                $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1799
+                if ($char = strpbrk($k[0], '\'"[`')) {
1800
+                    $k = trim($k, $char);
1801
+                    if ($char == '[') {
1802
+                        $k = rtrim($k, ']');
1803
+                    }
1804
+                }
1805
+                $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1806
+
1807
+                // rustine pour DECIMAL(10,2)
1808
+                // s'il y a une parenthèse fermante dans la clé
1809
+                // ou dans la définition sans qu'il n'y ait une ouverture avant
1810
+                if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1811
+                    $fields[$k_precedent] .= ',' . $k . ' ' . $def;
1812
+                    continue;
1813
+                }
1814
+
1815
+                // la primary key peut etre dans une des descriptions de champs
1816
+                // et non en fin de table, cas encore decouvert avec Sqlite Manager
1817
+                if (stripos($r[2], 'PRIMARY KEY') !== false) {
1818
+                    $keys['PRIMARY KEY'] = $k;
1819
+                }
1820
+
1821
+                $fields[$k] = $def;
1822
+                $k_precedent = $k;
1823
+            }
1824
+            // key inclues dans la requete
1825
+            foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1826
+                if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1827
+                    $k = str_replace('`', '', trim($r[1]));
1828
+                    $t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1829
+                    if ($k && !isset($keys[$k])) {
1830
+                        $keys[$k] = $t;
1831
+                    } else {
1832
+                        $keys[] = $t;
1833
+                    }
1834
+                }
1835
+            }
1836
+            // sinon ajouter les key index
1837
+            $query =
1838
+                'SELECT name,sql FROM'
1839
+                . ' (SELECT * FROM sqlite_master UNION ALL'
1840
+                . ' SELECT * FROM sqlite_temp_master)'
1841
+                . " WHERE tbl_name LIKE '$nom_table'"
1842
+                . " AND type='index' AND name NOT LIKE 'sqlite_%'"
1843
+                . 'ORDER BY substr(type,2,1), name';
1844
+            $a = spip_sqlite_query($query, $serveur, $requeter);
1845
+            while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1846
+                $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1847
+                $keytype = 'KEY';
1848
+                if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1849
+                    $keytype = 'UNIQUE KEY';
1850
+                }
1851
+                $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1852
+                $keys[$keytype . ' ' . $key] = $colonnes;
1853
+            }
1854
+        }
1855
+    } // c'est une vue, on liste les champs disponibles simplement
1856
+    else {
1857
+        if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1858
+            $fields = [];
1859
+            foreach ($res as $c => $v) {
1860
+                $fields[$c] = '';
1861
+            }
1862
+            $keys = [];
1863
+        } else {
1864
+            return '';
1865
+        }
1866
+    }
1867
+
1868
+    return ['field' => $fields, 'key' => $keys];
1869 1869
 }
1870 1870
 
1871 1871
 
@@ -1891,22 +1891,22 @@  discard block
 block discarded – undo
1891 1891
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1892 1892
  */
1893 1893
 function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true) {
1894
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1895
-	$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1894
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1895
+    $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1896 1896
 
1897
-	$set = [];
1898
-	foreach ($champs as $champ => $val) {
1899
-		$set[] = $champ . "=$val";
1900
-	}
1901
-	if (!empty($set)) {
1902
-		return spip_sqlite_query(
1903
-			_sqlite_calculer_expression('UPDATE', $table, ',')
1904
-			. _sqlite_calculer_expression('SET', $set, ',')
1905
-			. _sqlite_calculer_expression('WHERE', $where),
1906
-			$serveur,
1907
-			$requeter
1908
-		);
1909
-	}
1897
+    $set = [];
1898
+    foreach ($champs as $champ => $val) {
1899
+        $set[] = $champ . "=$val";
1900
+    }
1901
+    if (!empty($set)) {
1902
+        return spip_sqlite_query(
1903
+            _sqlite_calculer_expression('UPDATE', $table, ',')
1904
+            . _sqlite_calculer_expression('SET', $set, ',')
1905
+            . _sqlite_calculer_expression('WHERE', $where),
1906
+            $serveur,
1907
+            $requeter
1908
+        );
1909
+    }
1910 1910
 }
1911 1911
 
1912 1912
 
@@ -1936,38 +1936,38 @@  discard block
 block discarded – undo
1936 1936
  */
1937 1937
 function spip_sqlite_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1938 1938
 
1939
-	if (!$champs) {
1940
-		return;
1941
-	}
1942
-	if (!$desc) {
1943
-		$desc = description_table($table, $serveur);
1944
-	}
1945
-	if (!$desc) {
1946
-		die("$table insertion sans description");
1947
-	}
1948
-	$fields = $desc['field'];
1949
-
1950
-	$set = [];
1951
-	foreach ($champs as $champ => $val) {
1952
-		$set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1953
-	}
1954
-
1955
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1956
-	// attention ils sont deja quotes
1957
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1958
-	foreach ($maj as $champ => $val) {
1959
-		if (!isset($set[$champ])) {
1960
-			$set[$champ] = $champ . '=' . $val;
1961
-		}
1962
-	}
1963
-
1964
-	return spip_sqlite_query(
1965
-		_sqlite_calculer_expression('UPDATE', $table, ',')
1966
-		. _sqlite_calculer_expression('SET', $set, ',')
1967
-		. _sqlite_calculer_expression('WHERE', $where),
1968
-		$serveur,
1969
-		$requeter
1970
-	);
1939
+    if (!$champs) {
1940
+        return;
1941
+    }
1942
+    if (!$desc) {
1943
+        $desc = description_table($table, $serveur);
1944
+    }
1945
+    if (!$desc) {
1946
+        die("$table insertion sans description");
1947
+    }
1948
+    $fields = $desc['field'];
1949
+
1950
+    $set = [];
1951
+    foreach ($champs as $champ => $val) {
1952
+        $set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1953
+    }
1954
+
1955
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1956
+    // attention ils sont deja quotes
1957
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1958
+    foreach ($maj as $champ => $val) {
1959
+        if (!isset($set[$champ])) {
1960
+            $set[$champ] = $champ . '=' . $val;
1961
+        }
1962
+    }
1963
+
1964
+    return spip_sqlite_query(
1965
+        _sqlite_calculer_expression('UPDATE', $table, ',')
1966
+        . _sqlite_calculer_expression('SET', $set, ',')
1967
+        . _sqlite_calculer_expression('WHERE', $where),
1968
+        $serveur,
1969
+        $requeter
1970
+    );
1971 1971
 }
1972 1972
 
1973 1973
 
@@ -1985,17 +1985,17 @@  discard block
 block discarded – undo
1985 1985
  * @return void
1986 1986
  */
1987 1987
 function _sqlite_init() {
1988
-	if (!defined('_DIR_DB')) {
1989
-		define('_DIR_DB', _DIR_ETC . 'bases/');
1990
-	}
1991
-	if (!defined('_SQLITE_CHMOD')) {
1992
-		define('_SQLITE_CHMOD', _SPIP_CHMOD);
1993
-	}
1988
+    if (!defined('_DIR_DB')) {
1989
+        define('_DIR_DB', _DIR_ETC . 'bases/');
1990
+    }
1991
+    if (!defined('_SQLITE_CHMOD')) {
1992
+        define('_SQLITE_CHMOD', _SPIP_CHMOD);
1993
+    }
1994 1994
 
1995
-	if (!is_dir($d = _DIR_DB)) {
1996
-		include_spip('inc/flock');
1997
-		sous_repertoire($d);
1998
-	}
1995
+    if (!is_dir($d = _DIR_DB)) {
1996
+        include_spip('inc/flock');
1997
+        sous_repertoire($d);
1998
+    }
1999 1999
 }
2000 2000
 
2001 2001
 
@@ -2009,20 +2009,20 @@  discard block
 block discarded – undo
2009 2009
  * @return bool|int
2010 2010
  */
2011 2011
 function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true) {
2012
-	if ($link === '') {
2013
-		$link = _sqlite_link($serveur);
2014
-	}
2015
-	if (!$link) {
2016
-		return false;
2017
-	}
2012
+    if ($link === '') {
2013
+        $link = _sqlite_link($serveur);
2014
+    }
2015
+    if (!$link) {
2016
+        return false;
2017
+    }
2018 2018
 
2019
-	$v = 3;
2019
+    $v = 3;
2020 2020
 
2021
-	if (!$version) {
2022
-		return $v;
2023
-	}
2021
+    if (!$version) {
2022
+        return $v;
2023
+    }
2024 2024
 
2025
-	return ($version == $v);
2025
+    return ($version == $v);
2026 2026
 }
2027 2027
 
2028 2028
 
@@ -2033,9 +2033,9 @@  discard block
 block discarded – undo
2033 2033
  * @return PDO Information de connexion pour SQLite
2034 2034
  */
2035 2035
 function _sqlite_link($serveur = '') {
2036
-	$link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2036
+    $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2037 2037
 
2038
-	return $link;
2038
+    return $link;
2039 2039
 }
2040 2040
 
2041 2041
 
@@ -2050,52 +2050,52 @@  discard block
 block discarded – undo
2050 2050
  * @return string|number     Texte ou nombre échappé
2051 2051
  */
2052 2052
 function _sqlite_calculer_cite($v, $type) {
2053
-	if ($type) {
2054
-		if (
2055
-			is_null($v)
2056
-			and stripos($type, 'NOT NULL') === false
2057
-		) {
2058
-			return 'NULL';
2059
-		} // null php se traduit en NULL SQL
2060
-
2061
-		if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2062
-			return $v;
2063
-		}
2064
-		if (sql_test_int($type)) {
2065
-			if (is_numeric($v)) {
2066
-				return $v;
2067
-			} elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
2068
-				return hexdec(substr($v, 2));
2069
-			} else {
2070
-				return intval($v);
2071
-			}
2072
-		}
2073
-	} else {
2074
-		// si on ne connait pas le type on le deduit de $v autant que possible
2075
-		if (is_bool($v)) {
2076
-			return strval(intval($v));
2077
-		}
2078
-		elseif (is_numeric($v)) {
2079
-			return strval($v);
2080
-		}
2081
-	}
2082
-
2083
-	// trouver un link sqlite pour faire l'echappement
2084
-	foreach ($GLOBALS['connexions'] as $s) {
2085
-		if (
2086
-			$l = $s['link']
2087
-			and is_object($l)
2088
-			and $l instanceof \PDO
2089
-			and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2090
-		) {
2091
-			return $l->quote($v);
2092
-		}
2093
-	}
2094
-
2095
-	// echapper les ' en ''
2096
-	spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2097
-
2098
-	return ("'" . str_replace("'", "''", $v) . "'");
2053
+    if ($type) {
2054
+        if (
2055
+            is_null($v)
2056
+            and stripos($type, 'NOT NULL') === false
2057
+        ) {
2058
+            return 'NULL';
2059
+        } // null php se traduit en NULL SQL
2060
+
2061
+        if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2062
+            return $v;
2063
+        }
2064
+        if (sql_test_int($type)) {
2065
+            if (is_numeric($v)) {
2066
+                return $v;
2067
+            } elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
2068
+                return hexdec(substr($v, 2));
2069
+            } else {
2070
+                return intval($v);
2071
+            }
2072
+        }
2073
+    } else {
2074
+        // si on ne connait pas le type on le deduit de $v autant que possible
2075
+        if (is_bool($v)) {
2076
+            return strval(intval($v));
2077
+        }
2078
+        elseif (is_numeric($v)) {
2079
+            return strval($v);
2080
+        }
2081
+    }
2082
+
2083
+    // trouver un link sqlite pour faire l'echappement
2084
+    foreach ($GLOBALS['connexions'] as $s) {
2085
+        if (
2086
+            $l = $s['link']
2087
+            and is_object($l)
2088
+            and $l instanceof \PDO
2089
+            and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2090
+        ) {
2091
+            return $l->quote($v);
2092
+        }
2093
+    }
2094
+
2095
+    // echapper les ' en ''
2096
+    spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2097
+
2098
+    return ("'" . str_replace("'", "''", $v) . "'");
2099 2099
 }
2100 2100
 
2101 2101
 
@@ -2111,21 +2111,21 @@  discard block
 block discarded – undo
2111 2111
  * @return string            Texte de l'expression, une partie donc, du texte la requête.
2112 2112
  */
2113 2113
 function _sqlite_calculer_expression($expression, $v, $join = 'AND') {
2114
-	if (empty($v)) {
2115
-		return '';
2116
-	}
2114
+    if (empty($v)) {
2115
+        return '';
2116
+    }
2117 2117
 
2118
-	$exp = "\n$expression ";
2118
+    $exp = "\n$expression ";
2119 2119
 
2120
-	if (!is_array($v)) {
2121
-		return $exp . $v;
2122
-	} else {
2123
-		if (strtoupper($join) === 'AND') {
2124
-			return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2125
-		} else {
2126
-			return $exp . join($join, $v);
2127
-		}
2128
-	}
2120
+    if (!is_array($v)) {
2121
+        return $exp . $v;
2122
+    } else {
2123
+        if (strtoupper($join) === 'AND') {
2124
+            return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2125
+        } else {
2126
+            return $exp . join($join, $v);
2127
+        }
2128
+    }
2129 2129
 }
2130 2130
 
2131 2131
 
@@ -2141,7 +2141,7 @@  discard block
 block discarded – undo
2141 2141
  * @return string Texte du orderby préparé
2142 2142
  */
2143 2143
 function _sqlite_calculer_order($orderby) {
2144
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2144
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2145 2145
 }
2146 2146
 
2147 2147
 
@@ -2152,26 +2152,26 @@  discard block
 block discarded – undo
2152 2152
  * @return string Sélection de colonnes pour une clause SELECT
2153 2153
  */
2154 2154
 function _sqlite_calculer_select_as($args) {
2155
-	$res = '';
2156
-	foreach ($args as $k => $v) {
2157
-		if (substr($k, -1) == '@') {
2158
-			// c'est une jointure qui se refere au from precedent
2159
-			// pas de virgule
2160
-			$res .= '  ' . $v;
2161
-		} else {
2162
-			if (!is_numeric($k)) {
2163
-				$p = strpos($v, ' ');
2164
-				if ($p) {
2165
-					$v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2166
-				} else {
2167
-					$v .= " AS '$k'";
2168
-				}
2169
-			}
2170
-			$res .= ', ' . $v;
2171
-		}
2172
-	}
2173
-
2174
-	return substr($res, 2);
2155
+    $res = '';
2156
+    foreach ($args as $k => $v) {
2157
+        if (substr($k, -1) == '@') {
2158
+            // c'est une jointure qui se refere au from precedent
2159
+            // pas de virgule
2160
+            $res .= '  ' . $v;
2161
+        } else {
2162
+            if (!is_numeric($k)) {
2163
+                $p = strpos($v, ' ');
2164
+                if ($p) {
2165
+                    $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2166
+                } else {
2167
+                    $v .= " AS '$k'";
2168
+                }
2169
+            }
2170
+            $res .= ', ' . $v;
2171
+        }
2172
+    }
2173
+
2174
+    return substr($res, 2);
2175 2175
 }
2176 2176
 
2177 2177
 
@@ -2194,26 +2194,26 @@  discard block
 block discarded – undo
2194 2194
  *     Contrainte pour clause WHERE
2195 2195
  */
2196 2196
 function _sqlite_calculer_where($v) {
2197
-	if (!is_array($v)) {
2198
-		return $v;
2199
-	}
2200
-
2201
-	$op = array_shift($v);
2202
-	if (!($n = count($v))) {
2203
-		return $op;
2204
-	} else {
2205
-		$arg = _sqlite_calculer_where(array_shift($v));
2206
-		if ($n == 1) {
2207
-			return "$op($arg)";
2208
-		} else {
2209
-			$arg2 = _sqlite_calculer_where(array_shift($v));
2210
-			if ($n == 2) {
2211
-				return "($arg $op $arg2)";
2212
-			} else {
2213
-				return "($arg $op ($arg2) : $v[0])";
2214
-			}
2215
-		}
2216
-	}
2197
+    if (!is_array($v)) {
2198
+        return $v;
2199
+    }
2200
+
2201
+    $op = array_shift($v);
2202
+    if (!($n = count($v))) {
2203
+        return $op;
2204
+    } else {
2205
+        $arg = _sqlite_calculer_where(array_shift($v));
2206
+        if ($n == 1) {
2207
+            return "$op($arg)";
2208
+        } else {
2209
+            $arg2 = _sqlite_calculer_where(array_shift($v));
2210
+            if ($n == 2) {
2211
+                return "($arg $op $arg2)";
2212
+            } else {
2213
+                return "($arg $op ($arg2) : $v[0])";
2214
+            }
2215
+        }
2216
+    }
2217 2217
 }
2218 2218
 
2219 2219
 
@@ -2228,19 +2228,19 @@  discard block
 block discarded – undo
2228 2228
  * @return array|bool
2229 2229
  */
2230 2230
 function _sqlite_charger_version($version = '') {
2231
-	$versions = [];
2231
+    $versions = [];
2232 2232
 
2233
-	// version 3
2234
-	if (!$version || $version == 3) {
2235
-		if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2236
-			$versions[] = 3;
2237
-		}
2238
-	}
2239
-	if ($version) {
2240
-		return in_array($version, $versions);
2241
-	}
2233
+    // version 3
2234
+    if (!$version || $version == 3) {
2235
+        if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2236
+            $versions[] = 3;
2237
+        }
2238
+    }
2239
+    if ($version) {
2240
+        return in_array($version, $versions);
2241
+    }
2242 2242
 
2243
-	return $versions;
2243
+    return $versions;
2244 2244
 }
2245 2245
 
2246 2246
 
@@ -2278,147 +2278,147 @@  discard block
 block discarded – undo
2278 2278
  */
2279 2279
 function _sqlite_modifier_table($table, $colonne, $opt = [], $serveur = '') {
2280 2280
 
2281
-	if (is_array($table)) {
2282
-		$table_destination = reset($table);
2283
-		$table_origine = key($table);
2284
-	} else {
2285
-		$table_origine = $table_destination = $table;
2286
-	}
2287
-	// ne prend actuellement qu'un changement
2288
-	// mais pourra etre adapte pour changer plus qu'une colonne a la fois
2289
-	if (is_array($colonne)) {
2290
-		$colonne_destination = reset($colonne);
2291
-		$colonne_origine = key($colonne);
2292
-	} else {
2293
-		$colonne_origine = $colonne_destination = $colonne;
2294
-	}
2295
-	if (!isset($opt['field'])) {
2296
-		$opt['field'] = [];
2297
-	}
2298
-	if (!isset($opt['key'])) {
2299
-		$opt['key'] = [];
2300
-	}
2301
-
2302
-	// si les noms de tables sont differents, pas besoin de table temporaire
2303
-	// on prendra directement le nom de la future table
2304
-	$meme_table = ($table_origine == $table_destination);
2305
-
2306
-	$def_origine = sql_showtable($table_origine, false, $serveur);
2307
-	if (!$def_origine or !isset($def_origine['field'])) {
2308
-		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2309
-
2310
-		return false;
2311
-	}
2312
-
2313
-
2314
-	$table_tmp = $table_origine . '_tmp';
2315
-
2316
-	// 1) creer une table temporaire avec les modifications
2317
-	// - DROP : suppression de la colonne
2318
-	// - CHANGE : modification de la colonne
2319
-	// (foreach pour conserver l'ordre des champs)
2320
-
2321
-	// field
2322
-	$fields = [];
2323
-	// pour le INSERT INTO plus loin
2324
-	// stocker la correspondance nouvelles->anciennes colonnes
2325
-	$fields_correspondances = [];
2326
-	foreach ($def_origine['field'] as $c => $d) {
2327
-		if ($colonne_origine && ($c == $colonne_origine)) {
2328
-			// si pas DROP
2329
-			if ($colonne_destination) {
2330
-				$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2331
-				$fields_correspondances[$colonne_destination] = $c;
2332
-			}
2333
-		} else {
2334
-			$fields[$c] = $d;
2335
-			$fields_correspondances[$c] = $c;
2336
-		}
2337
-	}
2338
-	// cas de ADD sqlite2 (ajout du champ en fin de table):
2339
-	if (!$colonne_origine && $colonne_destination) {
2340
-		$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2341
-	}
2342
-
2343
-	// key...
2344
-	$keys = [];
2345
-	foreach ($def_origine['key'] as $c => $d) {
2346
-		$c = str_replace($colonne_origine, $colonne_destination, $c);
2347
-		$d = str_replace($colonne_origine, $colonne_destination, $d);
2348
-		// seulement si on ne supprime pas la colonne !
2349
-		if ($d) {
2350
-			$keys[$c] = $d;
2351
-		}
2352
-	}
2353
-
2354
-	// autres keys, on merge
2355
-	$keys = array_merge($keys, $opt['key']);
2356
-	$queries = [];
2357
-
2358
-	// copier dans destination (si differente de origine), sinon tmp
2359
-	$table_copie = ($meme_table) ? $table_tmp : $table_destination;
2360
-	$autoinc = (isset($keys['PRIMARY KEY'])
2361
-		and $keys['PRIMARY KEY']
2362
-		and stripos($keys['PRIMARY KEY'], ',') === false
2363
-		and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2364
-
2365
-	if (
2366
-		$q = _sqlite_requete_create(
2367
-			$table_copie,
2368
-			$fields,
2369
-			$keys,
2370
-			$autoinc,
2371
-			$temporary = false,
2372
-			$ifnotexists = true,
2373
-			$serveur
2374
-		)
2375
-	) {
2376
-		$queries[] = $q;
2377
-	}
2378
-
2379
-
2380
-	// 2) y copier les champs qui vont bien
2381
-	$champs_dest = join(', ', array_keys($fields_correspondances));
2382
-	$champs_ori = join(', ', $fields_correspondances);
2383
-	$queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2384
-
2385
-	// 3) supprimer la table d'origine
2386
-	$queries[] = "DROP TABLE $table_origine";
2387
-
2388
-	// 4) renommer la table temporaire
2389
-	// avec le nom de la table destination
2390
-	// si necessaire
2391
-	if ($meme_table) {
2392
-		$queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2393
-	}
2394
-
2395
-	// 5) remettre les index !
2396
-	foreach ($keys as $k => $v) {
2397
-		if ($k == 'PRIMARY KEY') {
2398
-		} else {
2399
-			// enlever KEY
2400
-			$k = substr($k, 4);
2401
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2402
-		}
2403
-	}
2404
-
2405
-
2406
-	if (count($queries)) {
2407
-		spip_sqlite::demarrer_transaction($serveur);
2408
-		// il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2409
-		foreach ($queries as $q) {
2410
-			if (!spip_sqlite::executer_requete($q, $serveur)) {
2411
-				spip_log('SQLite : ALTER TABLE table :'
2412
-					. " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2413
-				spip_sqlite::annuler_transaction($serveur);
2414
-
2415
-				return false;
2416
-			}
2417
-		}
2418
-		spip_sqlite::finir_transaction($serveur);
2419
-	}
2420
-
2421
-	return true;
2281
+    if (is_array($table)) {
2282
+        $table_destination = reset($table);
2283
+        $table_origine = key($table);
2284
+    } else {
2285
+        $table_origine = $table_destination = $table;
2286
+    }
2287
+    // ne prend actuellement qu'un changement
2288
+    // mais pourra etre adapte pour changer plus qu'une colonne a la fois
2289
+    if (is_array($colonne)) {
2290
+        $colonne_destination = reset($colonne);
2291
+        $colonne_origine = key($colonne);
2292
+    } else {
2293
+        $colonne_origine = $colonne_destination = $colonne;
2294
+    }
2295
+    if (!isset($opt['field'])) {
2296
+        $opt['field'] = [];
2297
+    }
2298
+    if (!isset($opt['key'])) {
2299
+        $opt['key'] = [];
2300
+    }
2301
+
2302
+    // si les noms de tables sont differents, pas besoin de table temporaire
2303
+    // on prendra directement le nom de la future table
2304
+    $meme_table = ($table_origine == $table_destination);
2305
+
2306
+    $def_origine = sql_showtable($table_origine, false, $serveur);
2307
+    if (!$def_origine or !isset($def_origine['field'])) {
2308
+        spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2309
+
2310
+        return false;
2311
+    }
2312
+
2313
+
2314
+    $table_tmp = $table_origine . '_tmp';
2315
+
2316
+    // 1) creer une table temporaire avec les modifications
2317
+    // - DROP : suppression de la colonne
2318
+    // - CHANGE : modification de la colonne
2319
+    // (foreach pour conserver l'ordre des champs)
2320
+
2321
+    // field
2322
+    $fields = [];
2323
+    // pour le INSERT INTO plus loin
2324
+    // stocker la correspondance nouvelles->anciennes colonnes
2325
+    $fields_correspondances = [];
2326
+    foreach ($def_origine['field'] as $c => $d) {
2327
+        if ($colonne_origine && ($c == $colonne_origine)) {
2328
+            // si pas DROP
2329
+            if ($colonne_destination) {
2330
+                $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2331
+                $fields_correspondances[$colonne_destination] = $c;
2332
+            }
2333
+        } else {
2334
+            $fields[$c] = $d;
2335
+            $fields_correspondances[$c] = $c;
2336
+        }
2337
+    }
2338
+    // cas de ADD sqlite2 (ajout du champ en fin de table):
2339
+    if (!$colonne_origine && $colonne_destination) {
2340
+        $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2341
+    }
2342
+
2343
+    // key...
2344
+    $keys = [];
2345
+    foreach ($def_origine['key'] as $c => $d) {
2346
+        $c = str_replace($colonne_origine, $colonne_destination, $c);
2347
+        $d = str_replace($colonne_origine, $colonne_destination, $d);
2348
+        // seulement si on ne supprime pas la colonne !
2349
+        if ($d) {
2350
+            $keys[$c] = $d;
2351
+        }
2352
+    }
2353
+
2354
+    // autres keys, on merge
2355
+    $keys = array_merge($keys, $opt['key']);
2356
+    $queries = [];
2357
+
2358
+    // copier dans destination (si differente de origine), sinon tmp
2359
+    $table_copie = ($meme_table) ? $table_tmp : $table_destination;
2360
+    $autoinc = (isset($keys['PRIMARY KEY'])
2361
+        and $keys['PRIMARY KEY']
2362
+        and stripos($keys['PRIMARY KEY'], ',') === false
2363
+        and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2364
+
2365
+    if (
2366
+        $q = _sqlite_requete_create(
2367
+            $table_copie,
2368
+            $fields,
2369
+            $keys,
2370
+            $autoinc,
2371
+            $temporary = false,
2372
+            $ifnotexists = true,
2373
+            $serveur
2374
+        )
2375
+    ) {
2376
+        $queries[] = $q;
2377
+    }
2378
+
2379
+
2380
+    // 2) y copier les champs qui vont bien
2381
+    $champs_dest = join(', ', array_keys($fields_correspondances));
2382
+    $champs_ori = join(', ', $fields_correspondances);
2383
+    $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2384
+
2385
+    // 3) supprimer la table d'origine
2386
+    $queries[] = "DROP TABLE $table_origine";
2387
+
2388
+    // 4) renommer la table temporaire
2389
+    // avec le nom de la table destination
2390
+    // si necessaire
2391
+    if ($meme_table) {
2392
+        $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2393
+    }
2394
+
2395
+    // 5) remettre les index !
2396
+    foreach ($keys as $k => $v) {
2397
+        if ($k == 'PRIMARY KEY') {
2398
+        } else {
2399
+            // enlever KEY
2400
+            $k = substr($k, 4);
2401
+            $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2402
+        }
2403
+    }
2404
+
2405
+
2406
+    if (count($queries)) {
2407
+        spip_sqlite::demarrer_transaction($serveur);
2408
+        // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2409
+        foreach ($queries as $q) {
2410
+            if (!spip_sqlite::executer_requete($q, $serveur)) {
2411
+                spip_log('SQLite : ALTER TABLE table :'
2412
+                    . " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2413
+                spip_sqlite::annuler_transaction($serveur);
2414
+
2415
+                return false;
2416
+            }
2417
+        }
2418
+        spip_sqlite::finir_transaction($serveur);
2419
+    }
2420
+
2421
+    return true;
2422 2422
 }
2423 2423
 
2424 2424
 
@@ -2428,61 +2428,61 @@  discard block
 block discarded – undo
2428 2428
  * @return array
2429 2429
  */
2430 2430
 function _sqlite_ref_fonctions() {
2431
-	$fonctions = [
2432
-		'alter' => 'spip_sqlite_alter',
2433
-		'count' => 'spip_sqlite_count',
2434
-		'countsel' => 'spip_sqlite_countsel',
2435
-		'create' => 'spip_sqlite_create',
2436
-		'create_base' => 'spip_sqlite_create_base',
2437
-		'create_view' => 'spip_sqlite_create_view',
2438
-		'date_proche' => 'spip_sqlite_date_proche',
2439
-		'delete' => 'spip_sqlite_delete',
2440
-		'drop_table' => 'spip_sqlite_drop_table',
2441
-		'drop_view' => 'spip_sqlite_drop_view',
2442
-		'errno' => 'spip_sqlite_errno',
2443
-		'error' => 'spip_sqlite_error',
2444
-		'explain' => 'spip_sqlite_explain',
2445
-		'fetch' => 'spip_sqlite_fetch',
2446
-		'seek' => 'spip_sqlite_seek',
2447
-		'free' => 'spip_sqlite_free',
2448
-		'hex' => 'spip_sqlite_hex',
2449
-		'in' => 'spip_sqlite_in',
2450
-		'insert' => 'spip_sqlite_insert',
2451
-		'insertq' => 'spip_sqlite_insertq',
2452
-		'insertq_multi' => 'spip_sqlite_insertq_multi',
2453
-		'listdbs' => 'spip_sqlite_listdbs',
2454
-		'multi' => 'spip_sqlite_multi',
2455
-		'optimize' => 'spip_sqlite_optimize',
2456
-		'query' => 'spip_sqlite_query',
2457
-		'quote' => 'spip_sqlite_quote',
2458
-		'repair' => 'spip_sqlite_repair',
2459
-		'replace' => 'spip_sqlite_replace',
2460
-		'replace_multi' => 'spip_sqlite_replace_multi',
2461
-		'select' => 'spip_sqlite_select',
2462
-		'selectdb' => 'spip_sqlite_selectdb',
2463
-		'set_charset' => 'spip_sqlite_set_charset',
2464
-		'get_charset' => 'spip_sqlite_get_charset',
2465
-		'showbase' => 'spip_sqlite_showbase',
2466
-		'showtable' => 'spip_sqlite_showtable',
2467
-		'table_exists' => 'spip_sqlite_table_exists',
2468
-		'update' => 'spip_sqlite_update',
2469
-		'updateq' => 'spip_sqlite_updateq',
2470
-		'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2471
-		'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2472
-		'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2473
-	];
2474
-
2475
-	// association de chaque nom http d'un charset aux couples sqlite
2476
-	// SQLite supporte utf-8 et utf-16 uniquement.
2477
-	$charsets = [
2478
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2479
-		//'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2480
-		//'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2481
-	];
2482
-
2483
-	$fonctions['charsets'] = $charsets;
2484
-
2485
-	return $fonctions;
2431
+    $fonctions = [
2432
+        'alter' => 'spip_sqlite_alter',
2433
+        'count' => 'spip_sqlite_count',
2434
+        'countsel' => 'spip_sqlite_countsel',
2435
+        'create' => 'spip_sqlite_create',
2436
+        'create_base' => 'spip_sqlite_create_base',
2437
+        'create_view' => 'spip_sqlite_create_view',
2438
+        'date_proche' => 'spip_sqlite_date_proche',
2439
+        'delete' => 'spip_sqlite_delete',
2440
+        'drop_table' => 'spip_sqlite_drop_table',
2441
+        'drop_view' => 'spip_sqlite_drop_view',
2442
+        'errno' => 'spip_sqlite_errno',
2443
+        'error' => 'spip_sqlite_error',
2444
+        'explain' => 'spip_sqlite_explain',
2445
+        'fetch' => 'spip_sqlite_fetch',
2446
+        'seek' => 'spip_sqlite_seek',
2447
+        'free' => 'spip_sqlite_free',
2448
+        'hex' => 'spip_sqlite_hex',
2449
+        'in' => 'spip_sqlite_in',
2450
+        'insert' => 'spip_sqlite_insert',
2451
+        'insertq' => 'spip_sqlite_insertq',
2452
+        'insertq_multi' => 'spip_sqlite_insertq_multi',
2453
+        'listdbs' => 'spip_sqlite_listdbs',
2454
+        'multi' => 'spip_sqlite_multi',
2455
+        'optimize' => 'spip_sqlite_optimize',
2456
+        'query' => 'spip_sqlite_query',
2457
+        'quote' => 'spip_sqlite_quote',
2458
+        'repair' => 'spip_sqlite_repair',
2459
+        'replace' => 'spip_sqlite_replace',
2460
+        'replace_multi' => 'spip_sqlite_replace_multi',
2461
+        'select' => 'spip_sqlite_select',
2462
+        'selectdb' => 'spip_sqlite_selectdb',
2463
+        'set_charset' => 'spip_sqlite_set_charset',
2464
+        'get_charset' => 'spip_sqlite_get_charset',
2465
+        'showbase' => 'spip_sqlite_showbase',
2466
+        'showtable' => 'spip_sqlite_showtable',
2467
+        'table_exists' => 'spip_sqlite_table_exists',
2468
+        'update' => 'spip_sqlite_update',
2469
+        'updateq' => 'spip_sqlite_updateq',
2470
+        'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2471
+        'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2472
+        'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2473
+    ];
2474
+
2475
+    // association de chaque nom http d'un charset aux couples sqlite
2476
+    // SQLite supporte utf-8 et utf-16 uniquement.
2477
+    $charsets = [
2478
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2479
+        //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2480
+        //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2481
+    ];
2482
+
2483
+    $fonctions['charsets'] = $charsets;
2484
+
2485
+    return $fonctions;
2486 2486
 }
2487 2487
 
2488 2488
 
@@ -2494,56 +2494,56 @@  discard block
 block discarded – undo
2494 2494
  * @return mixed
2495 2495
  */
2496 2496
 function _sqlite_remplacements_definitions_table($query, $autoinc = false) {
2497
-	// quelques remplacements
2498
-	$num = '(\s*\([0-9]*\))?';
2499
-	$enum = '(\s*\([^\)]*\))?';
2500
-
2501
-	$remplace = [
2502
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2503
-		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2504
-		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2505
-		'/auto_increment/is' => '',
2506
-		'/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2507
-		'/(timestamp .* )ON .*$/is' => '\\1',
2508
-		'/character set \w+/is' => '',
2509
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2510
-		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2511
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2512
-		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2513
-		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2514
-	];
2515
-
2516
-	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2517
-	$remplace_autocinc = [
2518
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2519
-	];
2520
-	// pour les int non autoincrement, il faut un DEFAULT
2521
-	$remplace_nonautocinc = [
2522
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2523
-	];
2524
-
2525
-	if (is_string($query)) {
2526
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
2527
-		if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2528
-			$query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2529
-		} else {
2530
-			$query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2531
-			$query = _sqlite_collate_ci($query);
2532
-		}
2533
-	} elseif (is_array($query)) {
2534
-		foreach ($query as $k => $q) {
2535
-			$ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2536
-			$query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2537
-			if ($ai) {
2538
-				$query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2539
-			} else {
2540
-				$query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2541
-				$query[$k] = _sqlite_collate_ci($query[$k]);
2542
-			}
2543
-		}
2544
-	}
2545
-
2546
-	return $query;
2497
+    // quelques remplacements
2498
+    $num = '(\s*\([0-9]*\))?';
2499
+    $enum = '(\s*\([^\)]*\))?';
2500
+
2501
+    $remplace = [
2502
+        '/enum' . $enum . '/is' => 'VARCHAR(255)',
2503
+        '/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2504
+        '/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2505
+        '/auto_increment/is' => '',
2506
+        '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2507
+        '/(timestamp .* )ON .*$/is' => '\\1',
2508
+        '/character set \w+/is' => '',
2509
+        '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2510
+        '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2511
+        '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2512
+        '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2513
+        '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2514
+    ];
2515
+
2516
+    // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2517
+    $remplace_autocinc = [
2518
+        '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2519
+    ];
2520
+    // pour les int non autoincrement, il faut un DEFAULT
2521
+    $remplace_nonautocinc = [
2522
+        '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2523
+    ];
2524
+
2525
+    if (is_string($query)) {
2526
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
2527
+        if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2528
+            $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2529
+        } else {
2530
+            $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2531
+            $query = _sqlite_collate_ci($query);
2532
+        }
2533
+    } elseif (is_array($query)) {
2534
+        foreach ($query as $k => $q) {
2535
+            $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2536
+            $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2537
+            if ($ai) {
2538
+                $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2539
+            } else {
2540
+                $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2541
+                $query[$k] = _sqlite_collate_ci($query[$k]);
2542
+            }
2543
+        }
2544
+    }
2545
+
2546
+    return $query;
2547 2547
 }
2548 2548
 
2549 2549
 /**
@@ -2554,17 +2554,17 @@  discard block
 block discarded – undo
2554 2554
  * @return string
2555 2555
  */
2556 2556
 function _sqlite_collate_ci($champ) {
2557
-	if (stripos($champ, 'COLLATE') !== false) {
2558
-		return $champ;
2559
-	}
2560
-	if (stripos($champ, 'BINARY') !== false) {
2561
-		return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2562
-	}
2563
-	if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2564
-		return $champ . ' COLLATE NOCASE';
2565
-	}
2557
+    if (stripos($champ, 'COLLATE') !== false) {
2558
+        return $champ;
2559
+    }
2560
+    if (stripos($champ, 'BINARY') !== false) {
2561
+        return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2562
+    }
2563
+    if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2564
+        return $champ . ' COLLATE NOCASE';
2565
+    }
2566 2566
 
2567
-	return $champ;
2567
+    return $champ;
2568 2568
 }
2569 2569
 
2570 2570
 
@@ -2583,84 +2583,84 @@  discard block
 block discarded – undo
2583 2583
  * @return bool|string
2584 2584
  */
2585 2585
 function _sqlite_requete_create(
2586
-	$nom,
2587
-	$champs,
2588
-	$cles,
2589
-	$autoinc = false,
2590
-	$temporary = false,
2591
-	$_ifnotexists = true,
2592
-	$serveur = '',
2593
-	$requeter = true
2586
+    $nom,
2587
+    $champs,
2588
+    $cles,
2589
+    $autoinc = false,
2590
+    $temporary = false,
2591
+    $_ifnotexists = true,
2592
+    $serveur = '',
2593
+    $requeter = true
2594 2594
 ) {
2595
-	$query = $keys = $s = $p = '';
2596
-
2597
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
2598
-	// sans les renseigner (laisse le compilo recuperer la description)
2599
-	if (!is_array($champs) || !is_array($cles)) {
2600
-		return;
2601
-	}
2602
-
2603
-	// sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2604
-	// il faut passer par des create index
2605
-	// Il gere par contre primary key !
2606
-	// Soit la PK est definie dans les cles, soit dans un champs
2607
-	// soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2608
-	$pk = 'PRIMARY KEY';
2609
-	// le champ de cle primaire
2610
-	$champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2611
-
2612
-	foreach ($champs as $k => $v) {
2613
-		if (false !== stripos($v, $pk)) {
2614
-			$champ_pk = $k;
2615
-			// on n'en a plus besoin dans field, vu que defini dans key
2616
-			$champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2617
-			break;
2618
-		}
2619
-	}
2620
-
2621
-	if ($champ_pk) {
2622
-		$keys = "\n\t\t$pk ($champ_pk)";
2623
-	}
2624
-	// Pas de DEFAULT 0 sur les cles primaires en auto-increment
2625
-	if (
2626
-		isset($champs[$champ_pk])
2627
-		and stripos($champs[$champ_pk], 'default 0') !== false
2628
-	) {
2629
-		$champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2630
-	}
2631
-
2632
-	$champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2633
-	foreach ($champs as $k => $v) {
2634
-		$query .= "$s\n\t\t$k $v";
2635
-		$s = ',';
2636
-	}
2637
-
2638
-	$ifnotexists = '';
2639
-	if ($_ifnotexists) {
2640
-		$version = spip_sqlite_fetch(
2641
-			spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2642
-			'',
2643
-			$serveur
2644
-		);
2645
-		if (!function_exists('spip_version_compare')) {
2646
-			include_spip('plugins/installer');
2647
-		}
2648
-
2649
-		if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2650
-			$ifnotexists = ' IF NOT EXISTS';
2651
-		} else {
2652
-			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2653
-			$a = spip_sqlite_showtable($nom, $serveur);
2654
-			if (isset($a['key']['KEY ' . $nom])) {
2655
-				return true;
2656
-			}
2657
-		}
2658
-	}
2659
-
2660
-	$temporary = $temporary ? ' TEMPORARY' : '';
2661
-	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2662
-
2663
-	return $q;
2595
+    $query = $keys = $s = $p = '';
2596
+
2597
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
2598
+    // sans les renseigner (laisse le compilo recuperer la description)
2599
+    if (!is_array($champs) || !is_array($cles)) {
2600
+        return;
2601
+    }
2602
+
2603
+    // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2604
+    // il faut passer par des create index
2605
+    // Il gere par contre primary key !
2606
+    // Soit la PK est definie dans les cles, soit dans un champs
2607
+    // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2608
+    $pk = 'PRIMARY KEY';
2609
+    // le champ de cle primaire
2610
+    $champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2611
+
2612
+    foreach ($champs as $k => $v) {
2613
+        if (false !== stripos($v, $pk)) {
2614
+            $champ_pk = $k;
2615
+            // on n'en a plus besoin dans field, vu que defini dans key
2616
+            $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2617
+            break;
2618
+        }
2619
+    }
2620
+
2621
+    if ($champ_pk) {
2622
+        $keys = "\n\t\t$pk ($champ_pk)";
2623
+    }
2624
+    // Pas de DEFAULT 0 sur les cles primaires en auto-increment
2625
+    if (
2626
+        isset($champs[$champ_pk])
2627
+        and stripos($champs[$champ_pk], 'default 0') !== false
2628
+    ) {
2629
+        $champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2630
+    }
2631
+
2632
+    $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2633
+    foreach ($champs as $k => $v) {
2634
+        $query .= "$s\n\t\t$k $v";
2635
+        $s = ',';
2636
+    }
2637
+
2638
+    $ifnotexists = '';
2639
+    if ($_ifnotexists) {
2640
+        $version = spip_sqlite_fetch(
2641
+            spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2642
+            '',
2643
+            $serveur
2644
+        );
2645
+        if (!function_exists('spip_version_compare')) {
2646
+            include_spip('plugins/installer');
2647
+        }
2648
+
2649
+        if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2650
+            $ifnotexists = ' IF NOT EXISTS';
2651
+        } else {
2652
+            /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2653
+            $a = spip_sqlite_showtable($nom, $serveur);
2654
+            if (isset($a['key']['KEY ' . $nom])) {
2655
+                return true;
2656
+            }
2657
+        }
2658
+    }
2659
+
2660
+    $temporary = $temporary ? ' TEMPORARY' : '';
2661
+    $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2662
+
2663
+    return $q;
2664 2664
 }
2665 2665
 
2666 2666
 
@@ -2679,41 +2679,41 @@  discard block
 block discarded – undo
2679 2679
  * @return
2680 2680
  */
2681 2681
 function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') {
2682
-	static $tables = [];
2683
-
2684
-	if (!isset($tables[$table])) {
2685
-		if (!$desc) {
2686
-			$trouver_table = charger_fonction('trouver_table', 'base');
2687
-			$desc = $trouver_table($table, $serveur);
2688
-			// si pas de description, on ne fait rien, ou on die() ?
2689
-			if (!$desc) {
2690
-				return $couples;
2691
-			}
2692
-		}
2693
-
2694
-		// recherche des champs avec simplement 'TIMESTAMP'
2695
-		// cependant, il faudra peut etre etendre
2696
-		// avec la gestion de DEFAULT et ON UPDATE
2697
-		// mais ceux-ci ne sont pas utilises dans le core
2698
-		$tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2699
-
2700
-		$now = _sqlite_func_now(true);
2701
-		foreach ($desc['field'] as $k => $v) {
2702
-			if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2703
-				$tables[$table]['desc'][$k] = $v;
2704
-				$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2705
-			}
2706
-		}
2707
-	}
2708
-	else {
2709
-		$now = _sqlite_func_now(true);
2710
-		foreach (array_keys($tables[$table]['desc']) as $k) {
2711
-			$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2712
-		}
2713
-	}
2714
-
2715
-	// ajout des champs type 'timestamp' absents
2716
-	return array_merge($tables[$table]['valeur'], $couples);
2682
+    static $tables = [];
2683
+
2684
+    if (!isset($tables[$table])) {
2685
+        if (!$desc) {
2686
+            $trouver_table = charger_fonction('trouver_table', 'base');
2687
+            $desc = $trouver_table($table, $serveur);
2688
+            // si pas de description, on ne fait rien, ou on die() ?
2689
+            if (!$desc) {
2690
+                return $couples;
2691
+            }
2692
+        }
2693
+
2694
+        // recherche des champs avec simplement 'TIMESTAMP'
2695
+        // cependant, il faudra peut etre etendre
2696
+        // avec la gestion de DEFAULT et ON UPDATE
2697
+        // mais ceux-ci ne sont pas utilises dans le core
2698
+        $tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2699
+
2700
+        $now = _sqlite_func_now(true);
2701
+        foreach ($desc['field'] as $k => $v) {
2702
+            if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2703
+                $tables[$table]['desc'][$k] = $v;
2704
+                $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2705
+            }
2706
+        }
2707
+    }
2708
+    else {
2709
+        $now = _sqlite_func_now(true);
2710
+        foreach (array_keys($tables[$table]['desc']) as $k) {
2711
+            $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2712
+        }
2713
+    }
2714
+
2715
+    // ajout des champs type 'timestamp' absents
2716
+    return array_merge($tables[$table]['valeur'], $couples);
2717 2717
 }
2718 2718
 
2719 2719
 
@@ -2724,7 +2724,7 @@  discard block
 block discarded – undo
2724 2724
  * @return array|bool
2725 2725
  */
2726 2726
 function spip_versions_sqlite() {
2727
-	return _sqlite_charger_version();
2727
+    return _sqlite_charger_version();
2728 2728
 }
2729 2729
 
2730 2730
 /**
@@ -2732,114 +2732,114 @@  discard block
 block discarded – undo
2732 2732
  * encadrées de transactions.
2733 2733
  **/
2734 2734
 class spip_sqlite {
2735
-	/** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2736
-	public static $requeteurs = [];
2737
-	/** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2738
-	public static $transaction_en_cours = [];
2739
-
2740
-
2741
-	/**
2742
-	 * Retourne une unique instance du requêteur
2743
-	 *
2744
-	 * Retourne une instance unique du requêteur pour une connexion SQLite
2745
-	 * donnée
2746
-	 *
2747
-	 * @param string $serveur
2748
-	 *    Nom du connecteur
2749
-	 * @return sqlite_requeteur
2750
-	 *    Instance unique du requêteur
2751
-	 **/
2752
-	public static function requeteur($serveur) {
2753
-		if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2754
-			spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2755
-		}
2756
-
2757
-		return spip_sqlite::$requeteurs[$serveur];
2758
-	}
2759
-
2760
-	/**
2761
-	 * Prépare le texte d'une requête avant son exécution
2762
-	 *
2763
-	 * Adapte la requête au format plus ou moins MySQL par un format
2764
-	 * compris de SQLite.
2765
-	 *
2766
-	 * Change les préfixes de tables SPIP par ceux véritables
2767
-	 *
2768
-	 * @param string $query Requête à préparer
2769
-	 * @param string $serveur Nom de la connexion
2770
-	 * @return string           Requête préparée
2771
-	 */
2772
-	public static function traduire_requete($query, $serveur) {
2773
-		$requeteur = spip_sqlite::requeteur($serveur);
2774
-		$traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2775
-
2776
-		return $traducteur->traduire_requete();
2777
-	}
2778
-
2779
-	/**
2780
-	 * Démarre une transaction
2781
-	 *
2782
-	 * @param string $serveur Nom de la connexion
2783
-	 **/
2784
-	public static function demarrer_transaction($serveur) {
2785
-		spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur);
2786
-		spip_sqlite::$transaction_en_cours[$serveur] = true;
2787
-	}
2788
-
2789
-	/**
2790
-	 * Exécute la requête donnée
2791
-	 *
2792
-	 * @param string $query Requête
2793
-	 * @param string $serveur Nom de la connexion
2794
-	 * @param null|bool $tracer Demander des statistiques (temps) ?
2795
-	 **/
2796
-	public static function executer_requete($query, $serveur, $tracer = null) {
2797
-		$requeteur = spip_sqlite::requeteur($serveur);
2798
-
2799
-		return $requeteur->executer_requete($query, $tracer);
2800
-	}
2801
-
2802
-	/**
2803
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2804
-	 *
2805
-	 * @param string $serveur Nom de la connexion
2806
-	 * return int                Identifiant
2807
-	 **/
2808
-	public static function last_insert_id($serveur) {
2809
-		$requeteur = spip_sqlite::requeteur($serveur);
2810
-
2811
-		return $requeteur->last_insert_id($serveur);
2812
-	}
2813
-
2814
-	/**
2815
-	 * Annule une transaction
2816
-	 *
2817
-	 * @param string $serveur Nom de la connexion
2818
-	 **/
2819
-	public static function annuler_transaction($serveur) {
2820
-		spip_sqlite::executer_requete('ROLLBACK', $serveur);
2821
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2822
-	}
2823
-
2824
-	/**
2825
-	 * Termine une transaction
2826
-	 *
2827
-	 * @param string $serveur Nom de la connexion
2828
-	 **/
2829
-	public static function finir_transaction($serveur) {
2830
-		// si pas de transaction en cours, ne rien faire et le dire
2831
-		if (
2832
-			!isset(spip_sqlite::$transaction_en_cours[$serveur])
2833
-			or spip_sqlite::$transaction_en_cours[$serveur] == false
2834
-		) {
2835
-			return false;
2836
-		}
2837
-		// sinon fermer la transaction et retourner true
2838
-		spip_sqlite::executer_requete('COMMIT', $serveur);
2839
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2840
-
2841
-		return true;
2842
-	}
2735
+    /** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2736
+    public static $requeteurs = [];
2737
+    /** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2738
+    public static $transaction_en_cours = [];
2739
+
2740
+
2741
+    /**
2742
+     * Retourne une unique instance du requêteur
2743
+     *
2744
+     * Retourne une instance unique du requêteur pour une connexion SQLite
2745
+     * donnée
2746
+     *
2747
+     * @param string $serveur
2748
+     *    Nom du connecteur
2749
+     * @return sqlite_requeteur
2750
+     *    Instance unique du requêteur
2751
+     **/
2752
+    public static function requeteur($serveur) {
2753
+        if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2754
+            spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2755
+        }
2756
+
2757
+        return spip_sqlite::$requeteurs[$serveur];
2758
+    }
2759
+
2760
+    /**
2761
+     * Prépare le texte d'une requête avant son exécution
2762
+     *
2763
+     * Adapte la requête au format plus ou moins MySQL par un format
2764
+     * compris de SQLite.
2765
+     *
2766
+     * Change les préfixes de tables SPIP par ceux véritables
2767
+     *
2768
+     * @param string $query Requête à préparer
2769
+     * @param string $serveur Nom de la connexion
2770
+     * @return string           Requête préparée
2771
+     */
2772
+    public static function traduire_requete($query, $serveur) {
2773
+        $requeteur = spip_sqlite::requeteur($serveur);
2774
+        $traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2775
+
2776
+        return $traducteur->traduire_requete();
2777
+    }
2778
+
2779
+    /**
2780
+     * Démarre une transaction
2781
+     *
2782
+     * @param string $serveur Nom de la connexion
2783
+     **/
2784
+    public static function demarrer_transaction($serveur) {
2785
+        spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur);
2786
+        spip_sqlite::$transaction_en_cours[$serveur] = true;
2787
+    }
2788
+
2789
+    /**
2790
+     * Exécute la requête donnée
2791
+     *
2792
+     * @param string $query Requête
2793
+     * @param string $serveur Nom de la connexion
2794
+     * @param null|bool $tracer Demander des statistiques (temps) ?
2795
+     **/
2796
+    public static function executer_requete($query, $serveur, $tracer = null) {
2797
+        $requeteur = spip_sqlite::requeteur($serveur);
2798
+
2799
+        return $requeteur->executer_requete($query, $tracer);
2800
+    }
2801
+
2802
+    /**
2803
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2804
+     *
2805
+     * @param string $serveur Nom de la connexion
2806
+     * return int                Identifiant
2807
+     **/
2808
+    public static function last_insert_id($serveur) {
2809
+        $requeteur = spip_sqlite::requeteur($serveur);
2810
+
2811
+        return $requeteur->last_insert_id($serveur);
2812
+    }
2813
+
2814
+    /**
2815
+     * Annule une transaction
2816
+     *
2817
+     * @param string $serveur Nom de la connexion
2818
+     **/
2819
+    public static function annuler_transaction($serveur) {
2820
+        spip_sqlite::executer_requete('ROLLBACK', $serveur);
2821
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2822
+    }
2823
+
2824
+    /**
2825
+     * Termine une transaction
2826
+     *
2827
+     * @param string $serveur Nom de la connexion
2828
+     **/
2829
+    public static function finir_transaction($serveur) {
2830
+        // si pas de transaction en cours, ne rien faire et le dire
2831
+        if (
2832
+            !isset(spip_sqlite::$transaction_en_cours[$serveur])
2833
+            or spip_sqlite::$transaction_en_cours[$serveur] == false
2834
+        ) {
2835
+            return false;
2836
+        }
2837
+        // sinon fermer la transaction et retourner true
2838
+        spip_sqlite::executer_requete('COMMIT', $serveur);
2839
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2840
+
2841
+        return true;
2842
+    }
2843 2843
 }
2844 2844
 
2845 2845
 /*
@@ -2852,127 +2852,127 @@  discard block
 block discarded – undo
2852 2852
  */
2853 2853
 
2854 2854
 class sqlite_requeteur {
2855
-	/** @var string Texte de la requête */
2856
-	public $query = ''; // la requete
2857
-	/** @var string Nom de la connexion */
2858
-	public $serveur = '';
2859
-	/** @var PDO Identifiant de la connexion SQLite */
2860
-	public $link = '';
2861
-	/** @var string Prefixe des tables SPIP */
2862
-	public $prefixe = '';
2863
-	/** @var string Nom de la base de donnée */
2864
-	public $db = '';
2865
-	/** @var bool Doit-on tracer les requetes (var_profile) ? */
2866
-	public $tracer = false; // doit-on tracer les requetes (var_profile)
2867
-
2868
-	/** @var string Version de SQLite (2 ou 3) */
2869
-	public $sqlite_version = '';
2870
-
2871
-	/**
2872
-	 * Constructeur
2873
-	 *
2874
-	 * @param string $serveur
2875
-	 * @return bool
2876
-	 */
2877
-	public function __construct($serveur = '') {
2878
-		_sqlite_init();
2879
-		$this->serveur = strtolower($serveur);
2880
-
2881
-		if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2882
-			spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
2883
-
2884
-			return false;
2885
-		}
2886
-
2887
-		$this->sqlite_version = _sqlite_is_version('', $this->link);
2888
-
2889
-		$this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2890
-		$this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2891
-
2892
-		// tracage des requetes ?
2893
-		$this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2894
-	}
2895
-
2896
-	/**
2897
-	 * Lancer la requête transmise et faire le tracage si demandé
2898
-	 *
2899
-	 * @param string $query
2900
-	 *     Requête à exécuter
2901
-	 * @param bool|null $tracer
2902
-	 *     true pour tracer la requête
2903
-	 * @return bool|PDOStatement|array
2904
-	 */
2905
-	public function executer_requete($query, $tracer = null) {
2906
-		if (is_null($tracer)) {
2907
-			$tracer = $this->tracer;
2908
-		}
2909
-		$err = '';
2910
-		$t = 0;
2911
-		if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
2912
-			include_spip('public/tracer');
2913
-			$t = trace_query_start();
2914
-		}
2915
-
2916
-		# spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2917
-		if ($this->link) {
2918
-			// memoriser la derniere erreur PHP vue
2919
-			$last_error = (function_exists('error_get_last') ? error_get_last() : '');
2920
-			$e = null;
2921
-			// sauver la derniere requete
2922
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2923
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2924
-
2925
-			try {
2926
-				$r = $this->link->query($query);
2927
-			} catch (\PDOException $e) {
2928
-				spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
2929
-				$r = false;
2930
-			}
2931
-			// sauvegarde de la requete (elle y est deja dans $r->queryString)
2932
-			# $r->spipQueryString = $query;
2933
-
2934
-			// comptage : oblige de compter le nombre d'entrees retournees
2935
-			// par une requete SELECT
2936
-			// aucune autre solution ne donne le nombre attendu :( !
2937
-			// particulierement s'il y a des LIMIT dans la requete.
2938
-			if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2939
-				if ($r) {
2940
-					// noter le link et la query pour faire le comptage *si* on en a besoin
2941
-					$r->spipSqliteRowCount = [$this->link, $query];
2942
-				} elseif ($r instanceof PDOStatement) {
2943
-					$r->spipSqliteRowCount = 0;
2944
-				}
2945
-			}
2946
-
2947
-			// loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2948
-			if ($e and $e instanceof \PDOException) {
2949
-				$err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
2950
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2951
-			} elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) {
2952
-				$err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
2953
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2954
-			} else {
2955
-				$err = '';
2956
-			}
2957
-		} else {
2958
-			$r = false;
2959
-		}
2960
-
2961
-		if (spip_sqlite_errno($this->serveur)) {
2962
-			$err .= spip_sqlite_error($query, $this->serveur);
2963
-		}
2964
-
2965
-		return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2966
-	}
2967
-
2968
-	/**
2969
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2970
-	 *
2971
-	 * @return string|false
2972
-	 **/
2973
-	public function last_insert_id() {
2974
-		return $this->link->lastInsertId();
2975
-	}
2855
+    /** @var string Texte de la requête */
2856
+    public $query = ''; // la requete
2857
+    /** @var string Nom de la connexion */
2858
+    public $serveur = '';
2859
+    /** @var PDO Identifiant de la connexion SQLite */
2860
+    public $link = '';
2861
+    /** @var string Prefixe des tables SPIP */
2862
+    public $prefixe = '';
2863
+    /** @var string Nom de la base de donnée */
2864
+    public $db = '';
2865
+    /** @var bool Doit-on tracer les requetes (var_profile) ? */
2866
+    public $tracer = false; // doit-on tracer les requetes (var_profile)
2867
+
2868
+    /** @var string Version de SQLite (2 ou 3) */
2869
+    public $sqlite_version = '';
2870
+
2871
+    /**
2872
+     * Constructeur
2873
+     *
2874
+     * @param string $serveur
2875
+     * @return bool
2876
+     */
2877
+    public function __construct($serveur = '') {
2878
+        _sqlite_init();
2879
+        $this->serveur = strtolower($serveur);
2880
+
2881
+        if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2882
+            spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
2883
+
2884
+            return false;
2885
+        }
2886
+
2887
+        $this->sqlite_version = _sqlite_is_version('', $this->link);
2888
+
2889
+        $this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2890
+        $this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2891
+
2892
+        // tracage des requetes ?
2893
+        $this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2894
+    }
2895
+
2896
+    /**
2897
+     * Lancer la requête transmise et faire le tracage si demandé
2898
+     *
2899
+     * @param string $query
2900
+     *     Requête à exécuter
2901
+     * @param bool|null $tracer
2902
+     *     true pour tracer la requête
2903
+     * @return bool|PDOStatement|array
2904
+     */
2905
+    public function executer_requete($query, $tracer = null) {
2906
+        if (is_null($tracer)) {
2907
+            $tracer = $this->tracer;
2908
+        }
2909
+        $err = '';
2910
+        $t = 0;
2911
+        if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
2912
+            include_spip('public/tracer');
2913
+            $t = trace_query_start();
2914
+        }
2915
+
2916
+        # spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2917
+        if ($this->link) {
2918
+            // memoriser la derniere erreur PHP vue
2919
+            $last_error = (function_exists('error_get_last') ? error_get_last() : '');
2920
+            $e = null;
2921
+            // sauver la derniere requete
2922
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2923
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2924
+
2925
+            try {
2926
+                $r = $this->link->query($query);
2927
+            } catch (\PDOException $e) {
2928
+                spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
2929
+                $r = false;
2930
+            }
2931
+            // sauvegarde de la requete (elle y est deja dans $r->queryString)
2932
+            # $r->spipQueryString = $query;
2933
+
2934
+            // comptage : oblige de compter le nombre d'entrees retournees
2935
+            // par une requete SELECT
2936
+            // aucune autre solution ne donne le nombre attendu :( !
2937
+            // particulierement s'il y a des LIMIT dans la requete.
2938
+            if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2939
+                if ($r) {
2940
+                    // noter le link et la query pour faire le comptage *si* on en a besoin
2941
+                    $r->spipSqliteRowCount = [$this->link, $query];
2942
+                } elseif ($r instanceof PDOStatement) {
2943
+                    $r->spipSqliteRowCount = 0;
2944
+                }
2945
+            }
2946
+
2947
+            // loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2948
+            if ($e and $e instanceof \PDOException) {
2949
+                $err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
2950
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2951
+            } elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) {
2952
+                $err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
2953
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2954
+            } else {
2955
+                $err = '';
2956
+            }
2957
+        } else {
2958
+            $r = false;
2959
+        }
2960
+
2961
+        if (spip_sqlite_errno($this->serveur)) {
2962
+            $err .= spip_sqlite_error($query, $this->serveur);
2963
+        }
2964
+
2965
+        return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2966
+    }
2967
+
2968
+    /**
2969
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2970
+     *
2971
+     * @return string|false
2972
+     **/
2973
+    public function last_insert_id() {
2974
+        return $this->link->lastInsertId();
2975
+    }
2976 2976
 }
2977 2977
 
2978 2978
 
@@ -2982,206 +2982,206 @@  discard block
 block discarded – undo
2982 2982
  * (fonction pour proteger les textes)
2983 2983
  */
2984 2984
 class sqlite_traducteur {
2985
-	/** @var string $query Texte de la requête */
2986
-	public $query = '';
2987
-	/** @var string $prefixe Préfixe des tables */
2988
-	public $prefixe = '';
2989
-	/** @var string $sqlite_version Version de sqlite (2 ou 3) */
2990
-	public $sqlite_version = '';
2991
-
2992
-	/** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
2993
-	 *
2994
-	 * @var array
2995
-	 */
2996
-	public $textes = [];
2997
-
2998
-	/**
2999
-	 * Constructeur
3000
-	 *
3001
-	 * @param string $query Requête à préparer
3002
-	 * @param string $prefixe Prefixe des tables à utiliser
3003
-	 * @param string $sqlite_version Version SQLite (2 ou 3)
3004
-	 */
3005
-	public function __construct($query, $prefixe, $sqlite_version) {
3006
-		$this->query = $query;
3007
-		$this->prefixe = $prefixe;
3008
-		$this->sqlite_version = $sqlite_version;
3009
-	}
3010
-
3011
-	/**
3012
-	 * Transformer la requete pour SQLite
3013
-	 *
3014
-	 * Enlève les textes, transforme la requête pour quelle soit
3015
-	 * bien interprétée par SQLite, puis remet les textes
3016
-	 * la fonction affecte `$this->query`
3017
-	 */
3018
-	public function traduire_requete() {
3019
-		//
3020
-		// 1) Protection des textes en les remplacant par des codes
3021
-		//
3022
-		// enlever les 'textes' et initialiser avec
3023
-		list($this->query, $textes) = query_echappe_textes($this->query);
3024
-
3025
-		//
3026
-		// 2) Corrections de la requete
3027
-		//
3028
-		// Correction Create Database
3029
-		// Create Database -> requete ignoree
3030
-		if (strpos($this->query, 'CREATE DATABASE') === 0) {
3031
-			spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
3032
-			$this->query = 'SELECT 1';
3033
-		}
3034
-
3035
-		// Correction Insert Ignore
3036
-		// INSERT IGNORE -> insert (tout court et pas 'insert or replace')
3037
-		if (strpos($this->query, 'INSERT IGNORE') === 0) {
3038
-			spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
3039
-			$this->query = 'INSERT ' . substr($this->query, '13');
3040
-		}
3041
-
3042
-		// Correction des dates avec INTERVAL
3043
-		// utiliser sql_date_proche() de preference
3044
-		if (strpos($this->query, 'INTERVAL') !== false) {
3045
-			$this->query = preg_replace_callback(
3046
-				'/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
3047
-				[&$this, '_remplacerDateParTime'],
3048
-				$this->query
3049
-			);
3050
-		}
3051
-
3052
-		if (strpos($this->query, 'LEFT(') !== false) {
3053
-			$this->query = str_replace('LEFT(', '_LEFT(', $this->query);
3054
-		}
3055
-
3056
-		if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
3057
-			$this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
3058
-		}
3059
-
3060
-
3061
-		// Correction Using
3062
-		// USING (non reconnu en sqlite2)
3063
-		// problematique car la jointure ne se fait pas du coup.
3064
-		if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) {
3065
-			spip_log(
3066
-				"'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
3067
-				'sqlite.' . _LOG_ERREUR
3068
-			);
3069
-			$this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
3070
-		}
3071
-
3072
-		// Correction Field
3073
-		// remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
3074
-		if (strpos($this->query, 'FIELD') !== false) {
3075
-			$this->query = preg_replace_callback(
3076
-				'/FIELD\s*\(([^\)]*)\)/',
3077
-				[&$this, '_remplacerFieldParCase'],
3078
-				$this->query
3079
-			);
3080
-		}
3081
-
3082
-		// Correction des noms de tables FROM
3083
-		// mettre les bons noms de table dans from, update, insert, replace...
3084
-		if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
3085
-			$suite = strstr($this->query, $regs[0]);
3086
-			$this->query = substr($this->query, 0, -strlen($suite));
3087
-		} else {
3088
-			$suite = '';
3089
-		}
3090
-		$pref = ($this->prefixe) ? $this->prefixe . '_' : '';
3091
-		$this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
3092
-
3093
-		// Correction zero AS x
3094
-		// pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
3095
-		// n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
3096
-		// il dit que x ne doit pas être un integer dans le order by !
3097
-		// on remplace du coup x par vide() dans ce cas uniquement
3098
-		//
3099
-		// apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
3100
-		// mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
3101
-		if ((strpos($this->query, '0 AS') !== false)) {
3102
-			// on ne remplace que dans ORDER BY ou GROUP BY
3103
-			if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
3104
-				$suite = strstr($this->query, $regs[0]);
3105
-				$this->query = substr($this->query, 0, -strlen($suite));
3106
-
3107
-				// on cherche les noms des x dans 0 AS x
3108
-				// on remplace dans $suite le nom par vide()
3109
-				preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3110
-				foreach ($matches[1] as $m) {
3111
-					if (strpos($suite, $m) !== false) {
3112
-						$suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
3113
-					}
3114
-				}
3115
-				$this->query .= $suite;
3116
-			}
3117
-		}
3118
-
3119
-		// Correction possible des divisions entieres
3120
-		// Le standard SQL (lequel? ou?) semble indiquer que
3121
-		// a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3122
-		// C'est ce que retournent effectivement SQL Server et SQLite
3123
-		// Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3124
-		//
3125
-		// On peut forcer la conversion en multipliant par 1.0 avant la division
3126
-		// /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
3127
-		// cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3128
-		//     http://www.sqlite.org/cvstrac/tktview?tn=3202
3129
-		// (4*1.0/3) n'est pas rendu dans ce cas !
3130
-		# $this->query = str_replace('/','* 1.00 / ',$this->query);
3131
-
3132
-
3133
-		// Correction critere REGEXP, non reconnu en sqlite2
3134
-		if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3135
-			$this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3136
-		}
3137
-
3138
-		//
3139
-		// 3) Remise en place des textes d'origine
3140
-		//
3141
-		// Correction Antiquotes et echappements
3142
-		// ` => rien
3143
-		if (strpos($this->query, '`') !== false) {
3144
-			$this->query = str_replace('`', '', $this->query);
3145
-		}
3146
-
3147
-		$this->query = query_reinjecte_textes($this->query, $textes);
3148
-
3149
-		return $this->query;
3150
-	}
3151
-
3152
-
3153
-	/**
3154
-	 * Callback pour remplacer `DATE_` / `INTERVAL`
3155
-	 * par `DATE ... strtotime`
3156
-	 *
3157
-	 * @param array $matches Captures
3158
-	 * @return string Texte de date compris par SQLite
3159
-	 */
3160
-	public function _remplacerDateParTime($matches) {
3161
-		$op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3162
-
3163
-		return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3164
-	}
3165
-
3166
-	/**
3167
-	 * Callback pour remplacer `FIELD(table,i,j,k...)`
3168
-	 * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3169
-	 *
3170
-	 * @param array $matches Captures
3171
-	 * @return string Texte de liste ordonnée compris par SQLite
3172
-	 */
3173
-	public function _remplacerFieldParCase($matches) {
3174
-		$fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3175
-		$t = explode(',', $fields);
3176
-		$index = array_shift($t);
3177
-
3178
-		$res = '';
3179
-		$n = 0;
3180
-		foreach ($t as $v) {
3181
-			$n++;
3182
-			$res .= "\nWHEN $index=$v THEN $n";
3183
-		}
3184
-
3185
-		return "CASE $res ELSE 0 END ";
3186
-	}
2985
+    /** @var string $query Texte de la requête */
2986
+    public $query = '';
2987
+    /** @var string $prefixe Préfixe des tables */
2988
+    public $prefixe = '';
2989
+    /** @var string $sqlite_version Version de sqlite (2 ou 3) */
2990
+    public $sqlite_version = '';
2991
+
2992
+    /** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
2993
+     *
2994
+     * @var array
2995
+     */
2996
+    public $textes = [];
2997
+
2998
+    /**
2999
+     * Constructeur
3000
+     *
3001
+     * @param string $query Requête à préparer
3002
+     * @param string $prefixe Prefixe des tables à utiliser
3003
+     * @param string $sqlite_version Version SQLite (2 ou 3)
3004
+     */
3005
+    public function __construct($query, $prefixe, $sqlite_version) {
3006
+        $this->query = $query;
3007
+        $this->prefixe = $prefixe;
3008
+        $this->sqlite_version = $sqlite_version;
3009
+    }
3010
+
3011
+    /**
3012
+     * Transformer la requete pour SQLite
3013
+     *
3014
+     * Enlève les textes, transforme la requête pour quelle soit
3015
+     * bien interprétée par SQLite, puis remet les textes
3016
+     * la fonction affecte `$this->query`
3017
+     */
3018
+    public function traduire_requete() {
3019
+        //
3020
+        // 1) Protection des textes en les remplacant par des codes
3021
+        //
3022
+        // enlever les 'textes' et initialiser avec
3023
+        list($this->query, $textes) = query_echappe_textes($this->query);
3024
+
3025
+        //
3026
+        // 2) Corrections de la requete
3027
+        //
3028
+        // Correction Create Database
3029
+        // Create Database -> requete ignoree
3030
+        if (strpos($this->query, 'CREATE DATABASE') === 0) {
3031
+            spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
3032
+            $this->query = 'SELECT 1';
3033
+        }
3034
+
3035
+        // Correction Insert Ignore
3036
+        // INSERT IGNORE -> insert (tout court et pas 'insert or replace')
3037
+        if (strpos($this->query, 'INSERT IGNORE') === 0) {
3038
+            spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
3039
+            $this->query = 'INSERT ' . substr($this->query, '13');
3040
+        }
3041
+
3042
+        // Correction des dates avec INTERVAL
3043
+        // utiliser sql_date_proche() de preference
3044
+        if (strpos($this->query, 'INTERVAL') !== false) {
3045
+            $this->query = preg_replace_callback(
3046
+                '/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
3047
+                [&$this, '_remplacerDateParTime'],
3048
+                $this->query
3049
+            );
3050
+        }
3051
+
3052
+        if (strpos($this->query, 'LEFT(') !== false) {
3053
+            $this->query = str_replace('LEFT(', '_LEFT(', $this->query);
3054
+        }
3055
+
3056
+        if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
3057
+            $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
3058
+        }
3059
+
3060
+
3061
+        // Correction Using
3062
+        // USING (non reconnu en sqlite2)
3063
+        // problematique car la jointure ne se fait pas du coup.
3064
+        if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) {
3065
+            spip_log(
3066
+                "'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
3067
+                'sqlite.' . _LOG_ERREUR
3068
+            );
3069
+            $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
3070
+        }
3071
+
3072
+        // Correction Field
3073
+        // remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
3074
+        if (strpos($this->query, 'FIELD') !== false) {
3075
+            $this->query = preg_replace_callback(
3076
+                '/FIELD\s*\(([^\)]*)\)/',
3077
+                [&$this, '_remplacerFieldParCase'],
3078
+                $this->query
3079
+            );
3080
+        }
3081
+
3082
+        // Correction des noms de tables FROM
3083
+        // mettre les bons noms de table dans from, update, insert, replace...
3084
+        if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
3085
+            $suite = strstr($this->query, $regs[0]);
3086
+            $this->query = substr($this->query, 0, -strlen($suite));
3087
+        } else {
3088
+            $suite = '';
3089
+        }
3090
+        $pref = ($this->prefixe) ? $this->prefixe . '_' : '';
3091
+        $this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
3092
+
3093
+        // Correction zero AS x
3094
+        // pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
3095
+        // n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
3096
+        // il dit que x ne doit pas être un integer dans le order by !
3097
+        // on remplace du coup x par vide() dans ce cas uniquement
3098
+        //
3099
+        // apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
3100
+        // mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
3101
+        if ((strpos($this->query, '0 AS') !== false)) {
3102
+            // on ne remplace que dans ORDER BY ou GROUP BY
3103
+            if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
3104
+                $suite = strstr($this->query, $regs[0]);
3105
+                $this->query = substr($this->query, 0, -strlen($suite));
3106
+
3107
+                // on cherche les noms des x dans 0 AS x
3108
+                // on remplace dans $suite le nom par vide()
3109
+                preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3110
+                foreach ($matches[1] as $m) {
3111
+                    if (strpos($suite, $m) !== false) {
3112
+                        $suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
3113
+                    }
3114
+                }
3115
+                $this->query .= $suite;
3116
+            }
3117
+        }
3118
+
3119
+        // Correction possible des divisions entieres
3120
+        // Le standard SQL (lequel? ou?) semble indiquer que
3121
+        // a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3122
+        // C'est ce que retournent effectivement SQL Server et SQLite
3123
+        // Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3124
+        //
3125
+        // On peut forcer la conversion en multipliant par 1.0 avant la division
3126
+        // /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
3127
+        // cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3128
+        //     http://www.sqlite.org/cvstrac/tktview?tn=3202
3129
+        // (4*1.0/3) n'est pas rendu dans ce cas !
3130
+        # $this->query = str_replace('/','* 1.00 / ',$this->query);
3131
+
3132
+
3133
+        // Correction critere REGEXP, non reconnu en sqlite2
3134
+        if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3135
+            $this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3136
+        }
3137
+
3138
+        //
3139
+        // 3) Remise en place des textes d'origine
3140
+        //
3141
+        // Correction Antiquotes et echappements
3142
+        // ` => rien
3143
+        if (strpos($this->query, '`') !== false) {
3144
+            $this->query = str_replace('`', '', $this->query);
3145
+        }
3146
+
3147
+        $this->query = query_reinjecte_textes($this->query, $textes);
3148
+
3149
+        return $this->query;
3150
+    }
3151
+
3152
+
3153
+    /**
3154
+     * Callback pour remplacer `DATE_` / `INTERVAL`
3155
+     * par `DATE ... strtotime`
3156
+     *
3157
+     * @param array $matches Captures
3158
+     * @return string Texte de date compris par SQLite
3159
+     */
3160
+    public function _remplacerDateParTime($matches) {
3161
+        $op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3162
+
3163
+        return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3164
+    }
3165
+
3166
+    /**
3167
+     * Callback pour remplacer `FIELD(table,i,j,k...)`
3168
+     * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3169
+     *
3170
+     * @param array $matches Captures
3171
+     * @return string Texte de liste ordonnée compris par SQLite
3172
+     */
3173
+    public function _remplacerFieldParCase($matches) {
3174
+        $fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3175
+        $t = explode(',', $fields);
3176
+        $index = array_shift($t);
3177
+
3178
+        $res = '';
3179
+        $n = 0;
3180
+        foreach ($t as $v) {
3181
+            $n++;
3182
+            $res .= "\nWHEN $index=$v THEN $n";
3183
+        }
3184
+
3185
+        return "CASE $res ELSE 0 END ";
3186
+    }
3187 3187
 }
Please login to merge, or discard this patch.
ecrire/balise/menu_lang.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -37,7 +37,7 @@  discard block
 block discarded – undo
37 37
  *     Pile complétée du code compilé
38 38
  **/
39 39
 function balise_MENU_LANG($p) {
40
-	return calculer_balise_dynamique($p, 'MENU_LANG', ['lang']);
40
+    return calculer_balise_dynamique($p, 'MENU_LANG', ['lang']);
41 41
 }
42 42
 
43 43
 /**
@@ -56,11 +56,11 @@  discard block
 block discarded – undo
56 56
  *   string: (vide) si pas de multilinguisme
57 57
  */
58 58
 function balise_MENU_LANG_stat($args, $context_compil) {
59
-	if (strpos($GLOBALS['meta']['langues_multilingue'], ',') === false) {
60
-		return '';
61
-	}
59
+    if (strpos($GLOBALS['meta']['langues_multilingue'], ',') === false) {
60
+        return '';
61
+    }
62 62
 
63
-	return $args;
63
+    return $args;
64 64
 }
65 65
 
66 66
 /**
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
  *     Liste : Chemin du squelette, durée du cache, contexte
77 77
  **/
78 78
 function balise_MENU_LANG_dyn($opt) {
79
-	include_spip('balise/menu_lang_ecrire');
79
+    include_spip('balise/menu_lang_ecrire');
80 80
 
81
-	return menu_lang_pour_tous('var_lang', $opt);
81
+    return menu_lang_pour_tous('var_lang', $opt);
82 82
 }
Please login to merge, or discard this patch.
ecrire/lang/ecrire_pt.php 1 patch
Indentation   +836 added lines, -836 removed lines patch added patch discarded remove patch
@@ -4,925 +4,925 @@
 block discarded – undo
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
-	'activer_plugin' => 'Activar o plugin',
14
-	'affichage' => 'Mostrar',
15
-	'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
16
-	'annuler_recherche' => 'Cancelar a pesquisa',
17
-	'auteur' => 'Autor :',
18
-	'avis_acces_interdit' => 'Accesso interdito. ',
19
-	'avis_acces_interdit_prive' => 'Não está autorizado a aceder à página <b>@exec@</b>.',
20
-	'avis_article_modifie' => 'Atenção, @nom_auteur_modif@  trabalhou neste artigo há @date_diff@ minutes',
21
-	'avis_aucun_resultat' => 'Sem resultados. ',
22
-	'avis_base_inaccessible' => 'Impossível conectar-se à base de dados @base@.',
23
-	'avis_chemin_invalide_1' => 'O caminho que escolheu ',
24
-	'avis_chemin_invalide_2' => 'não parece ser válido. Por favor regresse à página anterior e verifique as informações fornecidas. ',
25
-	'avis_connexion_echec_1' => 'A ligação ao servidor SQL falhou.',
26
-	'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que forneceu. ',
27
-	'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, precisa <b>solicitar</b> a activação do seu acesso à base de dados SQL antes de poder utilizá-la. Se não consegue ligar-se à sua base de dados, verifique se efectuou esse pedido.',
28
-	'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
29
-	'avis_connexion_erreur_nom_base' => 'O nome da base de dados só pode conter letras, números e hífen.',
30
-	'avis_connexion_ldap_echec_1' => 'A ligação ao servidor LDAP falhou.',
31
-	'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que forneceu ',
32
-	'avis_connexion_ldap_echec_3' => 'Alternativamente, não utilize o suporte LDAP para importar utilizadores.',
33
-	'avis_deplacement_rubrique' => 'Atenção ! Esta rubrica contém @contient_breves@ informação@scb@ : se a deslocar, por favor confirme-o nesta caixa.',
34
-	'avis_erreur_connexion_mysql' => 'Erro de ligação SQL',
35
-	'avis_espace_interdit' => '<b>Espaço interdito</b><p>SPIP já está instalado.',
36
-	'avis_lecture_noms_bases_1' => 'O programa de instalação não conseguiu ler os nomes das bases de dados instaladas. ',
37
-	'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados está disponível, ou a função que permite listá-las foi desactivada
12
+    // A
13
+    'activer_plugin' => 'Activar o plugin',
14
+    'affichage' => 'Mostrar',
15
+    'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
16
+    'annuler_recherche' => 'Cancelar a pesquisa',
17
+    'auteur' => 'Autor :',
18
+    'avis_acces_interdit' => 'Accesso interdito. ',
19
+    'avis_acces_interdit_prive' => 'Não está autorizado a aceder à página <b>@exec@</b>.',
20
+    'avis_article_modifie' => 'Atenção, @nom_auteur_modif@  trabalhou neste artigo há @date_diff@ minutes',
21
+    'avis_aucun_resultat' => 'Sem resultados. ',
22
+    'avis_base_inaccessible' => 'Impossível conectar-se à base de dados @base@.',
23
+    'avis_chemin_invalide_1' => 'O caminho que escolheu ',
24
+    'avis_chemin_invalide_2' => 'não parece ser válido. Por favor regresse à página anterior e verifique as informações fornecidas. ',
25
+    'avis_connexion_echec_1' => 'A ligação ao servidor SQL falhou.',
26
+    'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que forneceu. ',
27
+    'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, precisa <b>solicitar</b> a activação do seu acesso à base de dados SQL antes de poder utilizá-la. Se não consegue ligar-se à sua base de dados, verifique se efectuou esse pedido.',
28
+    'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
29
+    'avis_connexion_erreur_nom_base' => 'O nome da base de dados só pode conter letras, números e hífen.',
30
+    'avis_connexion_ldap_echec_1' => 'A ligação ao servidor LDAP falhou.',
31
+    'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que forneceu ',
32
+    'avis_connexion_ldap_echec_3' => 'Alternativamente, não utilize o suporte LDAP para importar utilizadores.',
33
+    'avis_deplacement_rubrique' => 'Atenção ! Esta rubrica contém @contient_breves@ informação@scb@ : se a deslocar, por favor confirme-o nesta caixa.',
34
+    'avis_erreur_connexion_mysql' => 'Erro de ligação SQL',
35
+    'avis_espace_interdit' => '<b>Espaço interdito</b><p>SPIP já está instalado.',
36
+    'avis_lecture_noms_bases_1' => 'O programa de instalação não conseguiu ler os nomes das bases de dados instaladas. ',
37
+    'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados está disponível, ou a função que permite listá-las foi desactivada
38 38
 por razões de segurança (o que é o caso em muitos serviços de hospedagem).  ',
39
-	'avis_lecture_noms_bases_3' => 'Na segunda alternativa, é provável que uma base tendo o  seu nome de login seja utilizável :',
40
-	'avis_non_acces_page' => 'Não tem acesso a esta página. ',
41
-	'avis_operation_echec' => 'A operação falhou. ',
42
-	'avis_operation_impossible' => 'Operação impossivel',
43
-	'avis_suppression_base' => 'Atenção, a supressão dos dados é irreversível',
39
+    'avis_lecture_noms_bases_3' => 'Na segunda alternativa, é provável que uma base tendo o  seu nome de login seja utilizável :',
40
+    'avis_non_acces_page' => 'Não tem acesso a esta página. ',
41
+    'avis_operation_echec' => 'A operação falhou. ',
42
+    'avis_operation_impossible' => 'Operação impossivel',
43
+    'avis_suppression_base' => 'Atenção, a supressão dos dados é irreversível',
44 44
 
45
-	// B
46
-	'bouton_acces_ldap' => 'Acrescentar o acesso a LDAP >>',
47
-	'bouton_ajouter' => 'Acrescentar ',
48
-	'bouton_annuler' => 'Cancelar',
49
-	'bouton_cache_activer' => 'Reactivar a cache',
50
-	'bouton_cache_desactiver' => 'Desactivar temporariamente a cache',
51
-	'bouton_demande_publication' => 'Pedir a publicação deste artigo ',
52
-	'bouton_desactive_tout' => 'Desactivar tudo',
53
-	'bouton_desinstaller' => 'Desinstalar',
54
-	'bouton_effacer_tout' => 'Apagar TUDO',
55
-	'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
56
-	'bouton_fermer' => 'Fechar',
57
-	'bouton_mettre_a_jour_base' => 'Actualizar a base de dados',
58
-	'bouton_modifier' => 'Modificar',
59
-	'bouton_radio_afficher' => 'Exibir',
60
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aparecer na lista dos redactores ligados',
61
-	'bouton_radio_envoi_annonces_adresse' => 'Enviar os anúncios para o endereço:',
62
-	'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista das novidades',
63
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não aparecer na lista dos redactores online',
64
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar anúncios editoriais',
65
-	'bouton_redirection' => 'REDIRECCIONAR',
66
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Repor para valores padrão',
67
-	'bouton_relancer_inscription' => 'Relançar o registo',
68
-	'bouton_relancer_inscriptions' => 'Relançar os registos',
69
-	'bouton_relancer_installation' => 'Recomeçar a instalação',
70
-	'bouton_reset_password' => 'Gerar uma nova senha e enviá-la por e-mail',
71
-	'bouton_suivant' => 'Seguinte',
72
-	'bouton_tenter_recuperation' => 'Tentar uma reparação',
73
-	'bouton_test_proxy' => 'Testar o proxy',
74
-	'bouton_vider_cache' => 'Esvaziar a cache',
45
+    // B
46
+    'bouton_acces_ldap' => 'Acrescentar o acesso a LDAP >>',
47
+    'bouton_ajouter' => 'Acrescentar ',
48
+    'bouton_annuler' => 'Cancelar',
49
+    'bouton_cache_activer' => 'Reactivar a cache',
50
+    'bouton_cache_desactiver' => 'Desactivar temporariamente a cache',
51
+    'bouton_demande_publication' => 'Pedir a publicação deste artigo ',
52
+    'bouton_desactive_tout' => 'Desactivar tudo',
53
+    'bouton_desinstaller' => 'Desinstalar',
54
+    'bouton_effacer_tout' => 'Apagar TUDO',
55
+    'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
56
+    'bouton_fermer' => 'Fechar',
57
+    'bouton_mettre_a_jour_base' => 'Actualizar a base de dados',
58
+    'bouton_modifier' => 'Modificar',
59
+    'bouton_radio_afficher' => 'Exibir',
60
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aparecer na lista dos redactores ligados',
61
+    'bouton_radio_envoi_annonces_adresse' => 'Enviar os anúncios para o endereço:',
62
+    'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista das novidades',
63
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não aparecer na lista dos redactores online',
64
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar anúncios editoriais',
65
+    'bouton_redirection' => 'REDIRECCIONAR',
66
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Repor para valores padrão',
67
+    'bouton_relancer_inscription' => 'Relançar o registo',
68
+    'bouton_relancer_inscriptions' => 'Relançar os registos',
69
+    'bouton_relancer_installation' => 'Recomeçar a instalação',
70
+    'bouton_reset_password' => 'Gerar uma nova senha e enviá-la por e-mail',
71
+    'bouton_suivant' => 'Seguinte',
72
+    'bouton_tenter_recuperation' => 'Tentar uma reparação',
73
+    'bouton_test_proxy' => 'Testar o proxy',
74
+    'bouton_vider_cache' => 'Esvaziar a cache',
75 75
 
76
-	// C
77
-	'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
78
-	'calendrier_synchro' => 'Se utilizar um software de agenda compatível <b>iCal</b>, pode sincronizá-lo com as informações deste sítio.',
79
-	'config_activer_champs' => 'Activar os campos seguintes',
80
-	'config_choix_base_sup' => 'Escolher uma base de dados neste servidor',
81
-	'config_erreur_base_sup' => 'SPIP não tem acesso à lista de bases de dados disponíveis',
82
-	'config_info_base_sup' => 'Se precisar de consultar outras bases de dados usando SPIP, quer seja neste servidor SQL ou noutro, use este formulário para as declarar. Se deixar alguns campos por preencher, os identificadores de conexão à base de dados principal serão usados.',
83
-	'config_info_base_sup_disponibles' => 'Bases de dados adicionais que se podem consultar:',
84
-	'config_info_enregistree' => 'A nova configuração foi guardada',
85
-	'config_info_logos' => 'Cada elemento do site pode ter o seu próprio logo, assim como um «mouseover»',
86
-	'config_info_logos_utiliser' => 'Utilizar os logos',
87
-	'config_info_logos_utiliser_non' => 'Não utilizar os logos',
88
-	'config_info_logos_utiliser_survol' => 'Usar os logos de "mouseover"',
89
-	'config_info_logos_utiliser_survol_non' => 'Não usar os logos de "mouseover"',
90
-	'config_info_redirection' => 'Activando esta opção, pode criar artigos virtuais, que são referências simples a artigos publicados noutros sítios, não necessariamente usando SPIP.',
91
-	'config_redirection' => 'Artigos virtuais',
92
-	'config_titre_base_sup' => 'Declaração de uma base de dados suplementar',
93
-	'config_titre_base_sup_choix' => 'Escolher uma base de dados suplementar',
94
-	'connexion_ldap' => 'Conexão:',
95
-	'creer_et_associer_un_auteur' => 'Criar e associar um autor',
76
+    // C
77
+    'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
78
+    'calendrier_synchro' => 'Se utilizar um software de agenda compatível <b>iCal</b>, pode sincronizá-lo com as informações deste sítio.',
79
+    'config_activer_champs' => 'Activar os campos seguintes',
80
+    'config_choix_base_sup' => 'Escolher uma base de dados neste servidor',
81
+    'config_erreur_base_sup' => 'SPIP não tem acesso à lista de bases de dados disponíveis',
82
+    'config_info_base_sup' => 'Se precisar de consultar outras bases de dados usando SPIP, quer seja neste servidor SQL ou noutro, use este formulário para as declarar. Se deixar alguns campos por preencher, os identificadores de conexão à base de dados principal serão usados.',
83
+    'config_info_base_sup_disponibles' => 'Bases de dados adicionais que se podem consultar:',
84
+    'config_info_enregistree' => 'A nova configuração foi guardada',
85
+    'config_info_logos' => 'Cada elemento do site pode ter o seu próprio logo, assim como um «mouseover»',
86
+    'config_info_logos_utiliser' => 'Utilizar os logos',
87
+    'config_info_logos_utiliser_non' => 'Não utilizar os logos',
88
+    'config_info_logos_utiliser_survol' => 'Usar os logos de "mouseover"',
89
+    'config_info_logos_utiliser_survol_non' => 'Não usar os logos de "mouseover"',
90
+    'config_info_redirection' => 'Activando esta opção, pode criar artigos virtuais, que são referências simples a artigos publicados noutros sítios, não necessariamente usando SPIP.',
91
+    'config_redirection' => 'Artigos virtuais',
92
+    'config_titre_base_sup' => 'Declaração de uma base de dados suplementar',
93
+    'config_titre_base_sup_choix' => 'Escolher uma base de dados suplementar',
94
+    'connexion_ldap' => 'Conexão:',
95
+    'creer_et_associer_un_auteur' => 'Criar e associar um autor',
96 96
 
97
-	// D
98
-	'date_mot_heures' => 'horas',
97
+    // D
98
+    'date_mot_heures' => 'horas',
99 99
 
100
-	// E
101
-	'ecran_connexion_couleur_principale' => 'Cor principal',
102
-	'ecran_connexion_image_fond' => 'Imagem de fundo',
103
-	'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
104
-	'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
105
-	'ecran_connexion_titre' => 'Ecrã de ligação',
106
-	'ecran_securite' => ' + ecrã de segurança @version@',
107
-	'email' => 'email',
108
-	'email_2' => 'email :',
109
-	'en_savoir_plus' => 'Para saber mais',
110
-	'entree_adresse_annuaire' => 'Endereço do directório',
111
-	'entree_adresse_email' => 'O seu endereço email',
112
-	'entree_adresse_email_2' => 'Endereço electrónico',
113
-	'entree_base_donnee_1' => 'Endereço da base de dados',
114
-	'entree_base_donnee_2' => '(Muitas vezes, este endereço corresponde ao do seu sítio, outras vezes, corresponde à menção «localhost», às vezes, fica totalmente vazio.)',
115
-	'entree_biographie' => 'Curta biografia',
116
-	'entree_chemin_acces' => '<b>Introduzir</b> o caminho de acesso :',
117
-	'entree_cle_pgp' => 'A sua chave PGP',
118
-	'entree_cle_pgp_2' => 'Chave PGP',
119
-	'entree_contenu_rubrique' => '(Conteúdo da rubrica em poucas palavras.)',
120
-	'entree_identifiants_connexion' => 'Os seus identificadores de ligação',
121
-	'entree_identifiants_connexion_2' => 'Identifcadores de conexão',
122
-	'entree_informations_connexion_ldap' => 'Por favor preencha este formulário com as informações de ligação ao seu anuário LDAP.
100
+    // E
101
+    'ecran_connexion_couleur_principale' => 'Cor principal',
102
+    'ecran_connexion_image_fond' => 'Imagem de fundo',
103
+    'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
104
+    'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
105
+    'ecran_connexion_titre' => 'Ecrã de ligação',
106
+    'ecran_securite' => ' + ecrã de segurança @version@',
107
+    'email' => 'email',
108
+    'email_2' => 'email :',
109
+    'en_savoir_plus' => 'Para saber mais',
110
+    'entree_adresse_annuaire' => 'Endereço do directório',
111
+    'entree_adresse_email' => 'O seu endereço email',
112
+    'entree_adresse_email_2' => 'Endereço electrónico',
113
+    'entree_base_donnee_1' => 'Endereço da base de dados',
114
+    'entree_base_donnee_2' => '(Muitas vezes, este endereço corresponde ao do seu sítio, outras vezes, corresponde à menção «localhost», às vezes, fica totalmente vazio.)',
115
+    'entree_biographie' => 'Curta biografia',
116
+    'entree_chemin_acces' => '<b>Introduzir</b> o caminho de acesso :',
117
+    'entree_cle_pgp' => 'A sua chave PGP',
118
+    'entree_cle_pgp_2' => 'Chave PGP',
119
+    'entree_contenu_rubrique' => '(Conteúdo da rubrica em poucas palavras.)',
120
+    'entree_identifiants_connexion' => 'Os seus identificadores de ligação',
121
+    'entree_identifiants_connexion_2' => 'Identifcadores de conexão',
122
+    'entree_informations_connexion_ldap' => 'Por favor preencha este formulário com as informações de ligação ao seu anuário LDAP.
123 123
 Essas informações devem poder ser fornecidas pelo administrador do sistema ou da rede',
124
-	'entree_infos_perso' => 'Quem é você?',
125
-	'entree_infos_perso_2' => 'Quem é o autor?',
126
-	'entree_interieur_rubrique' => 'Dentro da rubrica :',
127
-	'entree_liens_sites' => '<b>Ligação hipertexto</b> (referência, sítio a visitar...)',
128
-	'entree_login' => 'O seu login',
129
-	'entree_login_connexion_1' => 'O login de ligação',
130
-	'entree_login_connexion_2' => '(Corresponde às vezes ao seu login de acesso ao FTP; outras vezes deixado vazio.)',
131
-	'entree_mot_passe' => 'A sua palavra-passe',
132
-	'entree_mot_passe_1' => 'A palavra-passe de ligação',
133
-	'entree_mot_passe_2' => '(Corresponde, às vezes, à sua palavra-passe para o FTP; outras vezes fica vazio)',
134
-	'entree_nom_fichier' => 'Por favor introduza o nome do ficheiro @texte_compresse@:',
135
-	'entree_nom_pseudo' => 'O seu nome ou o seu pseudónimo',
136
-	'entree_nom_pseudo_1' => '(O seu nome ou o seu pseudónimo)',
137
-	'entree_nom_pseudo_2' => 'Nome ou pseudónimo',
138
-	'entree_nom_site' => 'O nome do seu sítio',
139
-	'entree_nom_site_2' => 'Nome do sítio do autor',
140
-	'entree_nouveau_passe' => 'Nova palavra-passe',
141
-	'entree_passe_ldap' => 'Palavra-passe',
142
-	'entree_port_annuaire' => 'O número de porta do anuário',
143
-	'entree_signature' => 'Assinatura',
144
-	'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
145
-	'entree_url' => 'O endereço (URL) do seu sítio',
146
-	'entree_url_2' => 'Endereço (URL) do sítio',
147
-	'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
148
-	'erreur_contenu_suspect' => 'Texto de caracteres de escape',
149
-	'erreur_email_deja_existant' => 'Este endereço de correio electrónico já está registado.',
150
-	'erreur_nom_connect_incorrect' => 'O nome de servidor não é autorizado',
151
-	'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ em falta no marcador @balise@.',
152
-	'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, pode desactivá-lo.',
153
-	'erreur_plugin_fichier_absent' => 'Ficheiro inexistente',
154
-	'erreur_plugin_fichier_def_absent' => 'Ficheiro de definição inexistente',
155
-	'erreur_plugin_nom_fonction_interdit' => 'Nome de função interdito',
156
-	'erreur_plugin_nom_manquant' => 'Nome de plugin inexistente',
157
-	'erreur_plugin_prefix_manquant' => 'Espaço de criação de nome não definido para este plugin ',
158
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; inexistente no ficheiro de definição',
159
-	'erreur_plugin_version_manquant' => 'Versão de plugin inexistente',
160
-	'erreur_type_fichier' => 'Tipo de ficheiro incorrecto',
124
+    'entree_infos_perso' => 'Quem é você?',
125
+    'entree_infos_perso_2' => 'Quem é o autor?',
126
+    'entree_interieur_rubrique' => 'Dentro da rubrica :',
127
+    'entree_liens_sites' => '<b>Ligação hipertexto</b> (referência, sítio a visitar...)',
128
+    'entree_login' => 'O seu login',
129
+    'entree_login_connexion_1' => 'O login de ligação',
130
+    'entree_login_connexion_2' => '(Corresponde às vezes ao seu login de acesso ao FTP; outras vezes deixado vazio.)',
131
+    'entree_mot_passe' => 'A sua palavra-passe',
132
+    'entree_mot_passe_1' => 'A palavra-passe de ligação',
133
+    'entree_mot_passe_2' => '(Corresponde, às vezes, à sua palavra-passe para o FTP; outras vezes fica vazio)',
134
+    'entree_nom_fichier' => 'Por favor introduza o nome do ficheiro @texte_compresse@:',
135
+    'entree_nom_pseudo' => 'O seu nome ou o seu pseudónimo',
136
+    'entree_nom_pseudo_1' => '(O seu nome ou o seu pseudónimo)',
137
+    'entree_nom_pseudo_2' => 'Nome ou pseudónimo',
138
+    'entree_nom_site' => 'O nome do seu sítio',
139
+    'entree_nom_site_2' => 'Nome do sítio do autor',
140
+    'entree_nouveau_passe' => 'Nova palavra-passe',
141
+    'entree_passe_ldap' => 'Palavra-passe',
142
+    'entree_port_annuaire' => 'O número de porta do anuário',
143
+    'entree_signature' => 'Assinatura',
144
+    'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
145
+    'entree_url' => 'O endereço (URL) do seu sítio',
146
+    'entree_url_2' => 'Endereço (URL) do sítio',
147
+    'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
148
+    'erreur_contenu_suspect' => 'Texto de caracteres de escape',
149
+    'erreur_email_deja_existant' => 'Este endereço de correio electrónico já está registado.',
150
+    'erreur_nom_connect_incorrect' => 'O nome de servidor não é autorizado',
151
+    'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ em falta no marcador @balise@.',
152
+    'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, pode desactivá-lo.',
153
+    'erreur_plugin_fichier_absent' => 'Ficheiro inexistente',
154
+    'erreur_plugin_fichier_def_absent' => 'Ficheiro de definição inexistente',
155
+    'erreur_plugin_nom_fonction_interdit' => 'Nome de função interdito',
156
+    'erreur_plugin_nom_manquant' => 'Nome de plugin inexistente',
157
+    'erreur_plugin_prefix_manquant' => 'Espaço de criação de nome não definido para este plugin ',
158
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; inexistente no ficheiro de definição',
159
+    'erreur_plugin_version_manquant' => 'Versão de plugin inexistente',
160
+    'erreur_type_fichier' => 'Tipo de ficheiro incorrecto',
161 161
 
162
-	// H
163
-	'htaccess_a_simuler' => 'Atenção: a configuração do servidor HTTP ignora @htaccess@. Para garantir uma boa segurança, deve alterar esta configuração. Alternativamente, deve assegurar que as constantes @constantes@ (definíveis no ficheiro mes_options.php) têm como valores diretórios fora de @document_root@.',
164
-	'htaccess_inoperant' => 'htaccess inoperacional',
162
+    // H
163
+    'htaccess_a_simuler' => 'Atenção: a configuração do servidor HTTP ignora @htaccess@. Para garantir uma boa segurança, deve alterar esta configuração. Alternativamente, deve assegurar que as constantes @constantes@ (definíveis no ficheiro mes_options.php) têm como valores diretórios fora de @document_root@.',
164
+    'htaccess_inoperant' => 'htaccess inoperacional',
165 165
 
166
-	// I
167
-	'ical_info1' => 'Esta página apresenta muitos modos de permanecer em contacto com as actividades deste sítio.',
168
-	'ical_info2' => 'Para mais informações sobre estas técnicas, consultar  <a href="@spipnet@">a documentação de SPIP</a>.',
169
-	'ical_info_calendrier' => 'Estão disponíveis dois calendários. O primeiro é uma planta do sítio anunciando todos os artigos publicados. O segundo é pessoal e contém os anúncios editoriais assim como as últimas mensagens privadas : está reservado para si graças a uma chave pessoal, que pode modificar a qualquer momento com a renovação da sua palavra-passe.',
170
-	'ical_methode_http' => 'Download',
171
-	'ical_methode_webcal' => 'Sincronização (webcal://)',
172
-	'ical_texte_js' => 'Uma linha de javascript permite-lhe facilmente exibir, em qualquer sítio que lhe pertença, os artigos recentes publicados neste sítio.',
173
-	'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, informa sobre a actividade editorial privada deste sítio (tarefas e encontros pessoais, artigos e notícias propostos...).',
174
-	'ical_texte_public' => 'Este calendário permite acompanhar a actividade pública deste sítio (artigos e notícias publicados).',
175
-	'ical_texte_rss' => 'Pode vincular as novidades deste sítio em qualquer leitor de ficheiros de formato XML/RSS (Rich Site Summary). É também o formato que permite a SPIP ler as novidades publicadas em outros sítios que utilizam um formato de troca compatível.',
176
-	'ical_titre_js' => 'Javascript',
177
-	'ical_titre_mailing' => 'Mailing-list',
178
-	'ical_titre_rss' => 'Ficheiros « backend »',
179
-	'icone_accueil' => 'Início',
180
-	'icone_activer_cookie' => 'Activar o cookie de correspondência',
181
-	'icone_activite' => 'Actividade',
182
-	'icone_admin_plugin' => 'Gerir plugins',
183
-	'icone_administration' => 'Manutenção',
184
-	'icone_afficher_auteurs' => 'Exibir os autores',
185
-	'icone_afficher_visiteurs' => 'Exibir os visitantes',
186
-	'icone_arret_discussion' => 'Não voltar a participar nesta discussão',
187
-	'icone_calendrier' => 'Calendário',
188
-	'icone_configuration' => 'Configuração',
189
-	'icone_creer_auteur' => 'Criar um novo autor e associá-lo a este artigo',
190
-	'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a este artigo',
191
-	'icone_creer_rubrique_2' => 'Criar uma nova rubrica',
192
-	'icone_developpement' => 'Desenvolvimento',
193
-	'icone_edition' => 'Editar',
194
-	'icone_ma_langue' => 'Idioma',
195
-	'icone_mes_infos' => 'Minhas informações',
196
-	'icone_mes_preferences' => 'Preferências',
197
-	'icone_modifier_article' => 'Modificar este artigo',
198
-	'icone_modifier_rubrique' => 'Modificar esta rubrica',
199
-	'icone_publication' => 'Publicação',
200
-	'icone_relancer_signataire' => 'Contactar o signatário novamente',
201
-	'icone_retour' => 'Voltar',
202
-	'icone_retour_article' => 'Voltar ao artigo',
203
-	'icone_squelette' => 'Modelos',
204
-	'icone_suivi_publication' => 'Monitorização da publicação',
205
-	'icone_supprimer_cookie' => 'Suprimir o cookie de correspondência',
206
-	'icone_supprimer_rubrique' => 'Suprimir esta rubrica',
207
-	'icone_supprimer_signature' => 'Suprimir esta assinatura',
208
-	'icone_valider_signature' => 'Validar esta assinatura',
209
-	'image_administrer_rubrique' => 'Pode administrar esta rubrica',
210
-	'impossible_modifier_login_auteur' => 'Impossível alterar o login.',
211
-	'impossible_modifier_pass_auteur' => 'Impossível alterar a palavra-passe.',
212
-	'info_1_article' => '1 artigo',
213
-	'info_1_auteur' => '1 autor',
214
-	'info_1_message' => '1 mensagem',
215
-	'info_1_mot_cle' => '1 palavra-chave',
216
-	'info_1_rubrique' => '1 rubrica',
217
-	'info_1_visiteur' => '1 visitante',
218
-	'info_activer_cookie' => 'Pode activar um <b>cookie de correspondência</b>, o que lhe
166
+    // I
167
+    'ical_info1' => 'Esta página apresenta muitos modos de permanecer em contacto com as actividades deste sítio.',
168
+    'ical_info2' => 'Para mais informações sobre estas técnicas, consultar  <a href="@spipnet@">a documentação de SPIP</a>.',
169
+    'ical_info_calendrier' => 'Estão disponíveis dois calendários. O primeiro é uma planta do sítio anunciando todos os artigos publicados. O segundo é pessoal e contém os anúncios editoriais assim como as últimas mensagens privadas : está reservado para si graças a uma chave pessoal, que pode modificar a qualquer momento com a renovação da sua palavra-passe.',
170
+    'ical_methode_http' => 'Download',
171
+    'ical_methode_webcal' => 'Sincronização (webcal://)',
172
+    'ical_texte_js' => 'Uma linha de javascript permite-lhe facilmente exibir, em qualquer sítio que lhe pertença, os artigos recentes publicados neste sítio.',
173
+    'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, informa sobre a actividade editorial privada deste sítio (tarefas e encontros pessoais, artigos e notícias propostos...).',
174
+    'ical_texte_public' => 'Este calendário permite acompanhar a actividade pública deste sítio (artigos e notícias publicados).',
175
+    'ical_texte_rss' => 'Pode vincular as novidades deste sítio em qualquer leitor de ficheiros de formato XML/RSS (Rich Site Summary). É também o formato que permite a SPIP ler as novidades publicadas em outros sítios que utilizam um formato de troca compatível.',
176
+    'ical_titre_js' => 'Javascript',
177
+    'ical_titre_mailing' => 'Mailing-list',
178
+    'ical_titre_rss' => 'Ficheiros « backend »',
179
+    'icone_accueil' => 'Início',
180
+    'icone_activer_cookie' => 'Activar o cookie de correspondência',
181
+    'icone_activite' => 'Actividade',
182
+    'icone_admin_plugin' => 'Gerir plugins',
183
+    'icone_administration' => 'Manutenção',
184
+    'icone_afficher_auteurs' => 'Exibir os autores',
185
+    'icone_afficher_visiteurs' => 'Exibir os visitantes',
186
+    'icone_arret_discussion' => 'Não voltar a participar nesta discussão',
187
+    'icone_calendrier' => 'Calendário',
188
+    'icone_configuration' => 'Configuração',
189
+    'icone_creer_auteur' => 'Criar um novo autor e associá-lo a este artigo',
190
+    'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a este artigo',
191
+    'icone_creer_rubrique_2' => 'Criar uma nova rubrica',
192
+    'icone_developpement' => 'Desenvolvimento',
193
+    'icone_edition' => 'Editar',
194
+    'icone_ma_langue' => 'Idioma',
195
+    'icone_mes_infos' => 'Minhas informações',
196
+    'icone_mes_preferences' => 'Preferências',
197
+    'icone_modifier_article' => 'Modificar este artigo',
198
+    'icone_modifier_rubrique' => 'Modificar esta rubrica',
199
+    'icone_publication' => 'Publicação',
200
+    'icone_relancer_signataire' => 'Contactar o signatário novamente',
201
+    'icone_retour' => 'Voltar',
202
+    'icone_retour_article' => 'Voltar ao artigo',
203
+    'icone_squelette' => 'Modelos',
204
+    'icone_suivi_publication' => 'Monitorização da publicação',
205
+    'icone_supprimer_cookie' => 'Suprimir o cookie de correspondência',
206
+    'icone_supprimer_rubrique' => 'Suprimir esta rubrica',
207
+    'icone_supprimer_signature' => 'Suprimir esta assinatura',
208
+    'icone_valider_signature' => 'Validar esta assinatura',
209
+    'image_administrer_rubrique' => 'Pode administrar esta rubrica',
210
+    'impossible_modifier_login_auteur' => 'Impossível alterar o login.',
211
+    'impossible_modifier_pass_auteur' => 'Impossível alterar a palavra-passe.',
212
+    'info_1_article' => '1 artigo',
213
+    'info_1_auteur' => '1 autor',
214
+    'info_1_message' => '1 mensagem',
215
+    'info_1_mot_cle' => '1 palavra-chave',
216
+    'info_1_rubrique' => '1 rubrica',
217
+    'info_1_visiteur' => '1 visitante',
218
+    'info_activer_cookie' => 'Pode activar um <b>cookie de correspondência</b>, o que lhe
219 219
  permitirá passar facilmente do sítio público ao sítio privado ',
220
-	'info_activer_menu_developpement' => 'Mostrar o menu Desenvolvimento',
221
-	'info_admin_etre_webmestre' => 'Conceder-me os direitos de webmaster',
222
-	'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
223
-	'info_admin_statuer_webmestre' => 'Conceder ao administrador os direitos de webmaster',
224
-	'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
225
-	'info_administrateur' => 'Administrador',
226
-	'info_administrateur_1' => 'Administrador',
227
-	'info_administrateur_2' => 'do sítio (<i>utilize com precaução</i>)',
228
-	'info_administrateur_site_01' => 'Se for o administrador do sítio, por favor',
229
-	'info_administrateur_site_02' => 'clicar sobre esta ligação',
230
-	'info_administrateurs' => 'Administradores',
231
-	'info_administrer_rubrique' => 'Pode administrar esta rubrica',
232
-	'info_adresse' => 'ao endereço :',
233
-	'info_adresse_desinscription' => 'Endereço de cancelamento da subscrição: ',
234
-	'info_adresse_url' => 'Endereço (URL) do sítio público',
235
-	'info_afficher_par_nb' => 'Exibir',
236
-	'info_aide_en_ligne' => 'Ajuda online SPIP',
237
-	'info_ajout_image' => 'Quando acrescentar imagens como documentos ligados a um artigo,
220
+    'info_activer_menu_developpement' => 'Mostrar o menu Desenvolvimento',
221
+    'info_admin_etre_webmestre' => 'Conceder-me os direitos de webmaster',
222
+    'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
223
+    'info_admin_statuer_webmestre' => 'Conceder ao administrador os direitos de webmaster',
224
+    'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
225
+    'info_administrateur' => 'Administrador',
226
+    'info_administrateur_1' => 'Administrador',
227
+    'info_administrateur_2' => 'do sítio (<i>utilize com precaução</i>)',
228
+    'info_administrateur_site_01' => 'Se for o administrador do sítio, por favor',
229
+    'info_administrateur_site_02' => 'clicar sobre esta ligação',
230
+    'info_administrateurs' => 'Administradores',
231
+    'info_administrer_rubrique' => 'Pode administrar esta rubrica',
232
+    'info_adresse' => 'ao endereço :',
233
+    'info_adresse_desinscription' => 'Endereço de cancelamento da subscrição: ',
234
+    'info_adresse_url' => 'Endereço (URL) do sítio público',
235
+    'info_afficher_par_nb' => 'Exibir',
236
+    'info_aide_en_ligne' => 'Ajuda online SPIP',
237
+    'info_ajout_image' => 'Quando acrescentar imagens como documentos ligados a um artigo,
238 238
  SPIP pode criar para si, automaticamente, vinhetas (miniaturas) das
239 239
  imagens inseridas. Isso permite por exemplo criar
240 240
  automaticamente uma galeria ou um portfolio.',
241
-	'info_ajouter_rubrique' => 'Acrescentar uma rubrica a administrar :',
242
-	'info_annonce_nouveautes' => 'Anúncio das novidades',
243
-	'info_article' => 'artigo',
244
-	'info_article_2' => 'artigos',
245
-	'info_article_a_paraitre' => 'Os artigos pós-datados a publicar',
246
-	'info_articles_02' => 'artigos',
247
-	'info_articles_2' => 'Artigos',
248
-	'info_articles_auteur' => 'Os artigos deste autor',
249
-	'info_articles_miens' => 'Os meus artigos',
250
-	'info_articles_tous' => 'Todos os artigos',
251
-	'info_articles_trouves' => 'Artigos encontrados',
252
-	'info_attente_validation' => 'Os seus artigos à espera de validação',
253
-	'info_aucun_article' => 'Nenhum artigo',
254
-	'info_aucun_auteur' => 'Nenhum autor',
255
-	'info_aucun_message' => 'Sem mensagens',
256
-	'info_aucun_rubrique' => 'Sem rubricas',
257
-	'info_aujourdhui' => 'hoje :',
258
-	'info_auteur_gere_rubriques' => 'Este autor gere as seguintes secções:',
259
-	'info_auteur_gere_toutes_rubriques' => 'Este autor gere <b>todas as secções</b>',
260
-	'info_auteur_gere_toutes_rubriques_2' => 'Eu administro <b>todas as rubricas</b>',
261
-	'info_auteurs' => 'Os autores',
262
-	'info_auteurs_par_tri' => 'Autores@partri@',
263
-	'info_auteurs_trouves' => 'Autores encontrados',
264
-	'info_authentification_externe' => 'Autenticação externa',
265
-	'info_avertissement' => 'Aviso',
266
-	'info_barre_outils' => 'com a sua barra de ferramentas?',
267
-	'info_base_installee' => 'A estrutura da sua base de dados está instalada.',
268
-	'info_bio' => 'Biografia',
269
-	'info_cache_desactive' => 'A cache encontra-se temporariamente desactivada.',
270
-	'info_chapeau' => 'Cabeçalho',
271
-	'info_chapeau_2' => 'Cabeçalho :',
272
-	'info_chemin_acces_1' => 'Opções : <b>Caminho de acesso no diretório</b>',
273
-	'info_chemin_acces_2' => 'Doravante, deve configurar o caminho de acesso às informações no anuário. Esta informação é indispensável para ler os perfis de utilizador armazenados no anuário.',
274
-	'info_chemin_acces_annuaire' => 'Opções : <b>Caminho de acesso no diretório',
275
-	'info_choix_base' => 'Terceira etapa :',
276
-	'info_classement_1' => '<sup>er</sup> no @liste@',
277
-	'info_classement_2' => '<sup>e</sup> no @liste@',
278
-	'info_code_acces' => 'Não se esqueça dos seus próprios códigos de acesso !',
279
-	'info_config_suivi' => 'Se este endereço corresponder a uma mailing-list, pode indicar, a seguir, o endereço no qual os participantes no sítio podem inscrever-se. Este endereço pode ser uma URL (por exemplo a página de inscrição na lista pela Web), ou um endereço email com um assunto específico (por exemplo: <tt>@adresse_suivi@?subject=subscribe</tt>):',
280
-	'info_config_suivi_explication' => ' Pode assinar a  mailing-list deste sítio. Receberá então, por correio electrónico, os anúncios de artigos e de notícias propostos para publicação.',
281
-	'info_confirmer_passe' => 'Confirmar esta nova palavra-passe',
282
-	'info_conflit_edition_avis_non_sauvegarde' => 'Atenção: os campos seguintes foram modificados anteriormente. As suas alterações a estes campos não foram portanto guardadas. ',
283
-	'info_conflit_edition_differences' => 'Diferenças:',
284
-	'info_conflit_edition_version_enregistree' => 'Versão guardada :',
285
-	'info_conflit_edition_votre_version' => 'A sua versão:',
286
-	'info_connexion_base' => 'Segunda etapa: <b>Teste de ligação à base de dados</b>',
287
-	'info_connexion_base_donnee' => 'Ligação à sua base de dados',
288
-	'info_connexion_ldap_ok' => 'A ligação LDAP foi bem sucedida.</b><p> Pode passar para a etapa seguinte.</p>',
289
-	'info_connexion_mysql' => 'Primeira etapa : <b>A sua ligação SQL<b>',
290
-	'info_connexion_ok' => 'A ligação foi bem sucedida.',
291
-	'info_contact' => 'Contacto',
292
-	'info_contenu_articles' => 'Conteúdo dos artigos',
293
-	'info_contributions' => 'Contributos',
294
-	'info_creation_paragraphe' => 'Para criar parágrafos, deixe simplesmente linhas vazias.',
295
-	'info_creation_rubrique' => 'Antes de poder escrever artigos, <br />deve criar pelo menos uma rubrica.<br />',
296
-	'info_creation_tables' => 'Quarta etapa : <b>Criação das tabelas da base de dados<b>',
297
-	'info_creer_base' => '<b>Criar</b> uma nova base de dados',
298
-	'info_dans_rubrique' => 'Na rubrica :',
299
-	'info_date_publication_anterieure' => 'Data de publicação anterior:',
300
-	'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SÍTIO :',
301
-	'info_derniere_etape' => 'Última etapa : <b>Terminou !',
302
-	'info_descriptif' => 'Descrição:',
303
-	'info_desinstaller_plugin' => 'elimina os dados e desactiva o plugin',
304
-	'info_discussion_cours' => 'Discussões em curso',
305
-	'info_ecrire_article' => 'Antes de poder escrever artigos, deve criar pelo menos uma rubrica.',
306
-	'info_email_envoi' => 'Endereço de email de envio (opcional)',
307
-	'info_email_envoi_txt' => 'Indique aqui o endereço a utilizar para enviar os emails (se não for o caso, o endereço do destinatário será utilizado como endereço de envio) :',
308
-	'info_email_webmestre' => 'Endereço e-mail do webmaster ',
309
-	'info_envoi_email_automatique' => 'Envio automático de mails',
310
-	'info_envoyer_maintenant' => 'Enviar agora',
311
-	'info_etape_suivante' => 'Passar para a seguinte etapa',
312
-	'info_etape_suivante_1' => 'Pode passar para a etapa seguinte',
313
-	'info_etape_suivante_2' => 'Pode passar para a etapa seguinte',
314
-	'info_exceptions_proxy' => 'Excepções para o proxy',
315
-	'info_exportation_base' => 'exportação da base para @archive@',
316
-	'info_facilite_suivi_activite' => 'A fim de facilitar o acompanhamento da actividade
241
+    'info_ajouter_rubrique' => 'Acrescentar uma rubrica a administrar :',
242
+    'info_annonce_nouveautes' => 'Anúncio das novidades',
243
+    'info_article' => 'artigo',
244
+    'info_article_2' => 'artigos',
245
+    'info_article_a_paraitre' => 'Os artigos pós-datados a publicar',
246
+    'info_articles_02' => 'artigos',
247
+    'info_articles_2' => 'Artigos',
248
+    'info_articles_auteur' => 'Os artigos deste autor',
249
+    'info_articles_miens' => 'Os meus artigos',
250
+    'info_articles_tous' => 'Todos os artigos',
251
+    'info_articles_trouves' => 'Artigos encontrados',
252
+    'info_attente_validation' => 'Os seus artigos à espera de validação',
253
+    'info_aucun_article' => 'Nenhum artigo',
254
+    'info_aucun_auteur' => 'Nenhum autor',
255
+    'info_aucun_message' => 'Sem mensagens',
256
+    'info_aucun_rubrique' => 'Sem rubricas',
257
+    'info_aujourdhui' => 'hoje :',
258
+    'info_auteur_gere_rubriques' => 'Este autor gere as seguintes secções:',
259
+    'info_auteur_gere_toutes_rubriques' => 'Este autor gere <b>todas as secções</b>',
260
+    'info_auteur_gere_toutes_rubriques_2' => 'Eu administro <b>todas as rubricas</b>',
261
+    'info_auteurs' => 'Os autores',
262
+    'info_auteurs_par_tri' => 'Autores@partri@',
263
+    'info_auteurs_trouves' => 'Autores encontrados',
264
+    'info_authentification_externe' => 'Autenticação externa',
265
+    'info_avertissement' => 'Aviso',
266
+    'info_barre_outils' => 'com a sua barra de ferramentas?',
267
+    'info_base_installee' => 'A estrutura da sua base de dados está instalada.',
268
+    'info_bio' => 'Biografia',
269
+    'info_cache_desactive' => 'A cache encontra-se temporariamente desactivada.',
270
+    'info_chapeau' => 'Cabeçalho',
271
+    'info_chapeau_2' => 'Cabeçalho :',
272
+    'info_chemin_acces_1' => 'Opções : <b>Caminho de acesso no diretório</b>',
273
+    'info_chemin_acces_2' => 'Doravante, deve configurar o caminho de acesso às informações no anuário. Esta informação é indispensável para ler os perfis de utilizador armazenados no anuário.',
274
+    'info_chemin_acces_annuaire' => 'Opções : <b>Caminho de acesso no diretório',
275
+    'info_choix_base' => 'Terceira etapa :',
276
+    'info_classement_1' => '<sup>er</sup> no @liste@',
277
+    'info_classement_2' => '<sup>e</sup> no @liste@',
278
+    'info_code_acces' => 'Não se esqueça dos seus próprios códigos de acesso !',
279
+    'info_config_suivi' => 'Se este endereço corresponder a uma mailing-list, pode indicar, a seguir, o endereço no qual os participantes no sítio podem inscrever-se. Este endereço pode ser uma URL (por exemplo a página de inscrição na lista pela Web), ou um endereço email com um assunto específico (por exemplo: <tt>@adresse_suivi@?subject=subscribe</tt>):',
280
+    'info_config_suivi_explication' => ' Pode assinar a  mailing-list deste sítio. Receberá então, por correio electrónico, os anúncios de artigos e de notícias propostos para publicação.',
281
+    'info_confirmer_passe' => 'Confirmar esta nova palavra-passe',
282
+    'info_conflit_edition_avis_non_sauvegarde' => 'Atenção: os campos seguintes foram modificados anteriormente. As suas alterações a estes campos não foram portanto guardadas. ',
283
+    'info_conflit_edition_differences' => 'Diferenças:',
284
+    'info_conflit_edition_version_enregistree' => 'Versão guardada :',
285
+    'info_conflit_edition_votre_version' => 'A sua versão:',
286
+    'info_connexion_base' => 'Segunda etapa: <b>Teste de ligação à base de dados</b>',
287
+    'info_connexion_base_donnee' => 'Ligação à sua base de dados',
288
+    'info_connexion_ldap_ok' => 'A ligação LDAP foi bem sucedida.</b><p> Pode passar para a etapa seguinte.</p>',
289
+    'info_connexion_mysql' => 'Primeira etapa : <b>A sua ligação SQL<b>',
290
+    'info_connexion_ok' => 'A ligação foi bem sucedida.',
291
+    'info_contact' => 'Contacto',
292
+    'info_contenu_articles' => 'Conteúdo dos artigos',
293
+    'info_contributions' => 'Contributos',
294
+    'info_creation_paragraphe' => 'Para criar parágrafos, deixe simplesmente linhas vazias.',
295
+    'info_creation_rubrique' => 'Antes de poder escrever artigos, <br />deve criar pelo menos uma rubrica.<br />',
296
+    'info_creation_tables' => 'Quarta etapa : <b>Criação das tabelas da base de dados<b>',
297
+    'info_creer_base' => '<b>Criar</b> uma nova base de dados',
298
+    'info_dans_rubrique' => 'Na rubrica :',
299
+    'info_date_publication_anterieure' => 'Data de publicação anterior:',
300
+    'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SÍTIO :',
301
+    'info_derniere_etape' => 'Última etapa : <b>Terminou !',
302
+    'info_descriptif' => 'Descrição:',
303
+    'info_desinstaller_plugin' => 'elimina os dados e desactiva o plugin',
304
+    'info_discussion_cours' => 'Discussões em curso',
305
+    'info_ecrire_article' => 'Antes de poder escrever artigos, deve criar pelo menos uma rubrica.',
306
+    'info_email_envoi' => 'Endereço de email de envio (opcional)',
307
+    'info_email_envoi_txt' => 'Indique aqui o endereço a utilizar para enviar os emails (se não for o caso, o endereço do destinatário será utilizado como endereço de envio) :',
308
+    'info_email_webmestre' => 'Endereço e-mail do webmaster ',
309
+    'info_envoi_email_automatique' => 'Envio automático de mails',
310
+    'info_envoyer_maintenant' => 'Enviar agora',
311
+    'info_etape_suivante' => 'Passar para a seguinte etapa',
312
+    'info_etape_suivante_1' => 'Pode passar para a etapa seguinte',
313
+    'info_etape_suivante_2' => 'Pode passar para a etapa seguinte',
314
+    'info_exceptions_proxy' => 'Excepções para o proxy',
315
+    'info_exportation_base' => 'exportação da base para @archive@',
316
+    'info_facilite_suivi_activite' => 'A fim de facilitar o acompanhamento da actividade
317 317
  editorial do sítio, SPIP pode fazer chegar por email, por exemplo
318 318
  a uma <i>mailing-list</i> dos redactores, o anúncio dos pedidos de
319 319
  publicação e das validações de artigos.',
320
-	'info_fichiers_authent' => 'Ficheiros de autenticação « .htpasswd »',
321
-	'info_forums_abo_invites' => 'O seu sítio contém fóruns por assinatura; os visitantes são convidados a registar-se no sítio público.',
322
-	'info_gauche_admin_tech' => '<b>Esta página está acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio.</p>',
323
-	'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo sítio.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio web</p>',
324
-	'info_gauche_auteurs' => 'Encontrará aqui todos os autores do sítio.
320
+    'info_fichiers_authent' => 'Ficheiros de autenticação « .htpasswd »',
321
+    'info_forums_abo_invites' => 'O seu sítio contém fóruns por assinatura; os visitantes são convidados a registar-se no sítio público.',
322
+    'info_gauche_admin_tech' => '<b>Esta página está acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio.</p>',
323
+    'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo sítio.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio web</p>',
324
+    'info_gauche_auteurs' => 'Encontrará aqui todos os autores do sítio.
325 325
 Os estatuto dos autores é indicado pela cor dos ícones (administrador = verde; redactor = amarelo).',
326
-	'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao sítio, são indicados por um ícone azul;
326
+    'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao sítio, são indicados por um ícone azul;
327 327
 os autores apagados, por um ícone cinzento.',
328
-	'info_gauche_messagerie' => 'A caixa de correio permite-lhe trocar mensagens entre redactores, conservar memorandos (para o seu uso pessoal) ou exibir anúncios na página de abertura do espaço privado (se for administrador).',
329
-	'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos  <i>referers</i>, ou seja, dos sítios que contêm links para o seu sítio, unicamente para ontem e hoje; esta lista é actualizada a cada 24 horas.',
330
-	'info_gauche_visiteurs_enregistres' => 'Encontrará aqui os visitantes registados
328
+    'info_gauche_messagerie' => 'A caixa de correio permite-lhe trocar mensagens entre redactores, conservar memorandos (para o seu uso pessoal) ou exibir anúncios na página de abertura do espaço privado (se for administrador).',
329
+    'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos  <i>referers</i>, ou seja, dos sítios que contêm links para o seu sítio, unicamente para ontem e hoje; esta lista é actualizada a cada 24 horas.',
330
+    'info_gauche_visiteurs_enregistres' => 'Encontrará aqui os visitantes registados
331 331
  no espaço público do sítio (fóruns por assinatura).',
332
-	'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
333
-	'info_gerer_trad_objets' => '@objets@ : gerir as ligações de tradução',
334
-	'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desactivam o envio automático de
332
+    'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
333
+    'info_gerer_trad_objets' => '@objets@ : gerir as ligações de tradução',
334
+    'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desactivam o envio automático de
335 335
  e-mails a partir dos seus  servidores. Nesse caso, as seguintes
336 336
  funcionalidades de SPIP não funcionarão.',
337
-	'info_hier' => 'ontem :',
338
-	'info_identification_publique' => 'A sua identidade pública...',
339
-	'info_image_process' => 'Seleccione o melhor método para criar as vinhetas clicando sobre a imagem correspondente.',
340
-	'info_image_process2' => '<b>N.B.</b> <i> Se nenhuma imagem aparece, então o servidor que alberga o seu sítio não foi configurado para utilizar tais ferramentas. Se deseja utilizar essas funções, contacte o responsavel técnico e peça as extensões  «GD» ou «Imagick».</i>',
341
-	'info_images_auto' => 'Imagens calculadas automaticamente',
342
-	'info_informations_personnelles' => 'Quinta etapa : <b>Informações pessoais<b>',
343
-	'info_inscription' => 'Inscrição em ',
344
-	'info_inscription_automatique' => 'Inscrição automática de novos redactores',
345
-	'info_jeu_caractere' => 'Conjunto de caracteres do sítio',
346
-	'info_jours' => 'dias',
347
-	'info_laisser_champs_vides' => 'deixar estes campos vazios)',
348
-	'info_langues' => 'Idiomas do sítio',
349
-	'info_ldap_ok' => 'A autenticação LDAP está instalada.',
350
-	'info_lien_hypertexte' => 'Hiperligação :',
351
-	'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada.',
352
-	'info_liste_redacteurs_connectes' => 'Lista dos redactores ligados',
353
-	'info_login_existant' => 'Este login já existe.',
354
-	'info_login_trop_court' => 'Login demasiado curto.',
355
-	'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
356
-	'info_logos' => 'Os logos',
357
-	'info_maximum' => 'máximo :',
358
-	'info_meme_rubrique' => 'Na mesma rubrica',
359
-	'info_message_en_redaction' => 'As suas mensagens em rascunho',
360
-	'info_message_technique' => 'Mensagem técnica:',
361
-	'info_messagerie_interne' => 'Correio interno',
362
-	'info_mise_a_niveau_base' => 'melhoramento da sua base de dados SQL',
363
-	'info_mise_a_niveau_base_2' => '{{Atenção!}} Instalou uma versão
337
+    'info_hier' => 'ontem :',
338
+    'info_identification_publique' => 'A sua identidade pública...',
339
+    'info_image_process' => 'Seleccione o melhor método para criar as vinhetas clicando sobre a imagem correspondente.',
340
+    'info_image_process2' => '<b>N.B.</b> <i> Se nenhuma imagem aparece, então o servidor que alberga o seu sítio não foi configurado para utilizar tais ferramentas. Se deseja utilizar essas funções, contacte o responsavel técnico e peça as extensões  «GD» ou «Imagick».</i>',
341
+    'info_images_auto' => 'Imagens calculadas automaticamente',
342
+    'info_informations_personnelles' => 'Quinta etapa : <b>Informações pessoais<b>',
343
+    'info_inscription' => 'Inscrição em ',
344
+    'info_inscription_automatique' => 'Inscrição automática de novos redactores',
345
+    'info_jeu_caractere' => 'Conjunto de caracteres do sítio',
346
+    'info_jours' => 'dias',
347
+    'info_laisser_champs_vides' => 'deixar estes campos vazios)',
348
+    'info_langues' => 'Idiomas do sítio',
349
+    'info_ldap_ok' => 'A autenticação LDAP está instalada.',
350
+    'info_lien_hypertexte' => 'Hiperligação :',
351
+    'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada.',
352
+    'info_liste_redacteurs_connectes' => 'Lista dos redactores ligados',
353
+    'info_login_existant' => 'Este login já existe.',
354
+    'info_login_trop_court' => 'Login demasiado curto.',
355
+    'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
356
+    'info_logos' => 'Os logos',
357
+    'info_maximum' => 'máximo :',
358
+    'info_meme_rubrique' => 'Na mesma rubrica',
359
+    'info_message_en_redaction' => 'As suas mensagens em rascunho',
360
+    'info_message_technique' => 'Mensagem técnica:',
361
+    'info_messagerie_interne' => 'Correio interno',
362
+    'info_mise_a_niveau_base' => 'melhoramento da sua base de dados SQL',
363
+    'info_mise_a_niveau_base_2' => '{{Atenção!}} Instalou uma versão
364 364
  dos ficheiros SPIP {anterior} à que se encontrava
365 365
  antes neste sítio: a sua base de dados corre o risco de se perder
366 366
  e o seu sítio já não funcionará .<br />{{Re-instalar os
367 367
  ficheiros de SPIP.}}',
368
-	'info_modification_enregistree' => 'As suas modificações foram guardadas',
369
-	'info_modifier_auteur' => 'Modifcar o autor :',
370
-	'info_modifier_rubrique' => 'Modificar a rubrica :',
371
-	'info_modifier_titre' => 'Modificar : @titre@',
372
-	'info_mon_site_spip' => 'O meu sítio SPIP',
373
-	'info_moyenne' => 'média :',
374
-	'info_multi_cet_article' => 'Idioma deste artigo :',
375
-	'info_multi_langues_choisies' => 'Por favor seleccione a seguir os idiomas à disposição dos redactores do seu sítio.
368
+    'info_modification_enregistree' => 'As suas modificações foram guardadas',
369
+    'info_modifier_auteur' => 'Modifcar o autor :',
370
+    'info_modifier_rubrique' => 'Modificar a rubrica :',
371
+    'info_modifier_titre' => 'Modificar : @titre@',
372
+    'info_mon_site_spip' => 'O meu sítio SPIP',
373
+    'info_moyenne' => 'média :',
374
+    'info_multi_cet_article' => 'Idioma deste artigo :',
375
+    'info_multi_langues_choisies' => 'Por favor seleccione a seguir os idiomas à disposição dos redactores do seu sítio.
376 376
  Os idiomas já utilizados no seu sítio (exibidos em primeiro lugar) não podem ser desactivados.',
377
-	'info_multi_objets' => '@objets@ : activar o menu de idioma',
378
-	'info_multi_secteurs' => '... só para as rubricas situadas na raíz ?',
379
-	'info_nb_articles' => '@nb@ artigos',
380
-	'info_nb_auteurs' => '@nb@ autores',
381
-	'info_nb_messages' => '@nb@ mensagens',
382
-	'info_nb_mots_cles' => '@nb@ palavras-chave',
383
-	'info_nb_rubriques' => '@nb@ rubricas',
384
-	'info_nb_visiteurs' => '@nb@ visitantes',
385
-	'info_nom' => 'Nome',
386
-	'info_nom_destinataire' => 'Nome do destinatário',
387
-	'info_nom_pas_conforme' => 'as tags html não são autorizadas',
388
-	'info_nom_site' => 'Nome do seu sítio',
389
-	'info_nombre_articles' => '@nb_articles@ artigos,',
390
-	'info_nombre_rubriques' => '@nb_rubriques@ rubricas,',
391
-	'info_nombre_sites' => '@nb_sites@ sítios,',
392
-	'info_non_deplacer' => 'Não deslocar...',
393
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP pode enviar regularmente o anúncio das últimas novidades do sítio
377
+    'info_multi_objets' => '@objets@ : activar o menu de idioma',
378
+    'info_multi_secteurs' => '... só para as rubricas situadas na raíz ?',
379
+    'info_nb_articles' => '@nb@ artigos',
380
+    'info_nb_auteurs' => '@nb@ autores',
381
+    'info_nb_messages' => '@nb@ mensagens',
382
+    'info_nb_mots_cles' => '@nb@ palavras-chave',
383
+    'info_nb_rubriques' => '@nb@ rubricas',
384
+    'info_nb_visiteurs' => '@nb@ visitantes',
385
+    'info_nom' => 'Nome',
386
+    'info_nom_destinataire' => 'Nome do destinatário',
387
+    'info_nom_pas_conforme' => 'as tags html não são autorizadas',
388
+    'info_nom_site' => 'Nome do seu sítio',
389
+    'info_nombre_articles' => '@nb_articles@ artigos,',
390
+    'info_nombre_rubriques' => '@nb_rubriques@ rubricas,',
391
+    'info_nombre_sites' => '@nb_sites@ sítios,',
392
+    'info_non_deplacer' => 'Não deslocar...',
393
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP pode enviar regularmente o anúncio das últimas novidades do sítio
394 394
  (artigos e notícias recentemente publicados).',
395
-	'info_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
396
-	'info_non_modifiable' => 'não pode ser modificado',
397
-	'info_non_suppression_mot_cle' => 'Não quero suprimir esta palavra-chave.',
398
-	'info_notes' => 'Notas',
399
-	'info_nouvel_article' => 'Novo artigo',
400
-	'info_nouvelle_traduction' => 'Nova tradução :',
401
-	'info_numero_article' => 'ARTIGO NÚMERO :',
402
-	'info_obligatoire_02' => '(obrigatório)',
403
-	'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do sítio público',
404
-	'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição de visitantes',
405
-	'info_options_avancees' => 'OPÇÕES AVANÇADAS',
406
-	'info_ou' => 'ou...',
407
-	'info_page_interdite' => 'Página proibida',
408
-	'info_par_nom' => 'por nome',
409
-	'info_par_nombre_article' => 'por número de artigos',
410
-	'info_par_statut' => 'por estado',
411
-	'info_par_tri' => '’(por @tri@)’',
412
-	'info_passe_trop_court' => 'Palavra-passe demasiado curta.',
413
-	'info_passe_trop_court_car_pluriel' => 'A palavra-passe deve conter pelo menos @nb@ caracteres.',
414
-	'info_passes_identiques' => 'As duas palavras-passe não são idênticas.',
415
-	'info_plus_cinq_car' => 'mais de 5 caracteres',
416
-	'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
417
-	'info_plus_trois_car' => '(Mais de 3 caracteres)',
418
-	'info_popularite' => 'popularidade : @popularite@ ; visitas : @visites@',
419
-	'info_post_scriptum' => 'Post-Scriptum',
420
-	'info_post_scriptum_2' => 'Post-scriptum :',
421
-	'info_pour' => 'para',
422
-	'info_preview_texte' => 'É possível visualizar os vários elementos editoriais do site que têm pelo menos o estatuto "proposto", bem como os artigos em processo de escrita dos quais se é o autor. Esta funcionalidade deve estar disponível para administradores, editores ou para ninguém?',
423
-	'info_procedez_par_etape' => 'proceder etapa por etapa',
424
-	'info_procedure_maj_version' => 'o procedimento de actualização deve ser lançado para adaptar
395
+    'info_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
396
+    'info_non_modifiable' => 'não pode ser modificado',
397
+    'info_non_suppression_mot_cle' => 'Não quero suprimir esta palavra-chave.',
398
+    'info_notes' => 'Notas',
399
+    'info_nouvel_article' => 'Novo artigo',
400
+    'info_nouvelle_traduction' => 'Nova tradução :',
401
+    'info_numero_article' => 'ARTIGO NÚMERO :',
402
+    'info_obligatoire_02' => '(obrigatório)',
403
+    'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do sítio público',
404
+    'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição de visitantes',
405
+    'info_options_avancees' => 'OPÇÕES AVANÇADAS',
406
+    'info_ou' => 'ou...',
407
+    'info_page_interdite' => 'Página proibida',
408
+    'info_par_nom' => 'por nome',
409
+    'info_par_nombre_article' => 'por número de artigos',
410
+    'info_par_statut' => 'por estado',
411
+    'info_par_tri' => '’(por @tri@)’',
412
+    'info_passe_trop_court' => 'Palavra-passe demasiado curta.',
413
+    'info_passe_trop_court_car_pluriel' => 'A palavra-passe deve conter pelo menos @nb@ caracteres.',
414
+    'info_passes_identiques' => 'As duas palavras-passe não são idênticas.',
415
+    'info_plus_cinq_car' => 'mais de 5 caracteres',
416
+    'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
417
+    'info_plus_trois_car' => '(Mais de 3 caracteres)',
418
+    'info_popularite' => 'popularidade : @popularite@ ; visitas : @visites@',
419
+    'info_post_scriptum' => 'Post-Scriptum',
420
+    'info_post_scriptum_2' => 'Post-scriptum :',
421
+    'info_pour' => 'para',
422
+    'info_preview_texte' => 'É possível visualizar os vários elementos editoriais do site que têm pelo menos o estatuto "proposto", bem como os artigos em processo de escrita dos quais se é o autor. Esta funcionalidade deve estar disponível para administradores, editores ou para ninguém?',
423
+    'info_procedez_par_etape' => 'proceder etapa por etapa',
424
+    'info_procedure_maj_version' => 'o procedimento de actualização deve ser lançado para adaptar
425 425
 a base de dados à nova versão de SPIP.',
426
-	'info_proxy_ok' => 'Proxy testado com sucesso.',
427
-	'info_ps' => 'P.S.',
428
-	'info_publier' => 'publicar',
429
-	'info_publies' => 'Os seus artigos publicados online',
430
-	'info_question_accepter_visiteurs' => 'Se os parâmetros do seu site prevêem o registo de visitantes sem acesso ao espaço privado, por favor, active a opção abaixo:',
431
-	'info_question_inscription_nouveaux_redacteurs' => 'Aceita as inscrições de novos redactores a
426
+    'info_proxy_ok' => 'Proxy testado com sucesso.',
427
+    'info_ps' => 'P.S.',
428
+    'info_publier' => 'publicar',
429
+    'info_publies' => 'Os seus artigos publicados online',
430
+    'info_question_accepter_visiteurs' => 'Se os parâmetros do seu site prevêem o registo de visitantes sem acesso ao espaço privado, por favor, active a opção abaixo:',
431
+    'info_question_inscription_nouveaux_redacteurs' => 'Aceita as inscrições de novos redactores a
432 432
  partir do sítio público? Se aceitar, os visitantes poderão inscrever-se
433 433
  a partir de um formulário automatizado e acederão então ao espaço privado para
434 434
 propor os seus próprios artigos. <blockquote><i>Durante a fase de inscrição, os utilizadores recebem um e-mail automático
435 435
 fornecendo-lhes os seus códigos de acesso ao sítio privado. Alguns
436 436
 serviços de hospedagem desactivam o envio de e-mails a partir dos seus
437 437
  servidores: nesse caso, a inscrição automática é impossível.',
438
-	'info_qui_edite' => '@nom_auteur_modif@ modificou o conteúdo há @date_diff@ minutos',
439
-	'info_racine_site' => 'Raiz do sítio',
440
-	'info_recharger_page' => 'Por favor volte a carregar esta página daqui a pouco.',
441
-	'info_recherche_auteur_zero' => 'Nenhum resultado para "@cherche_auteur@".',
442
-	'info_recommencer' => 'Por favor tente de novo.',
443
-	'info_redacteur_1' => 'Redactor',
444
-	'info_redacteur_2' => 'tendo acesso ao espaço privado(<i>recomendado</i>)',
445
-	'info_redacteurs' => 'Redactores',
446
-	'info_redaction_en_cours' => 'EM CURSO DE REDACÇÃO',
447
-	'info_redirection' => 'Redirigir',
448
-	'info_redirection_activee' => 'O redireccionamento está activado.',
449
-	'info_redirection_boucle' => 'Está a tentar redireccionar o artigo para este mesmo artigo.',
450
-	'info_redirection_desactivee' => 'O redireccionamento foi eliminado.',
451
-	'info_refuses' => 'Os seus artigos recusados',
452
-	'info_reglage_ldap' => 'Opções : <b>Acerto da importação LDAP</b>',
453
-	'info_renvoi_article' => '<b>Redireccionar.</b> Este artigo remete para a página:',
454
-	'info_reserve_admin' => 'Só os administradores podem modificar este endereço.',
455
-	'info_restreindre_rubrique' => 'Limitar a gestão à rubrica : ',
456
-	'info_resultat_recherche' => 'Resultados da pesquisa ;',
457
-	'info_rubriques' => 'Rubricas',
458
-	'info_rubriques_02' => 'rubricas',
459
-	'info_rubriques_trouvees' => 'Rubricas encontradas',
460
-	'info_sans_titre' => 'Sem título',
461
-	'info_selection_chemin_acces' => '<b>Seleccione</b> a seguir o caminho de acesso no anuário :',
462
-	'info_signatures' => 'assinaturas',
463
-	'info_site' => 'Sítio',
464
-	'info_site_2' => 'sítio :',
465
-	'info_site_min' => 'sítio',
466
-	'info_site_reference_2' => 'Sítio referenciado',
467
-	'info_site_web' => 'Sítio web :',
468
-	'info_sites' => 'sítios',
469
-	'info_sites_lies_mot' => 'Os sítios referenciados ligados a esta palavra-chave',
470
-	'info_sites_proxy' => 'Utilizar um proxy',
471
-	'info_sites_trouves' => 'Sítios encontrados',
472
-	'info_sous_titre' => 'Sub-título :',
473
-	'info_statut_administrateur' => 'Administrador',
474
-	'info_statut_auteur' => 'Estatuto deste autor :',
475
-	'info_statut_auteur_2' => 'Eu sou',
476
-	'info_statut_auteur_a_confirmer' => 'Registo a confirmar',
477
-	'info_statut_auteur_autre' => 'Outro estado:',
478
-	'info_statut_redacteur' => 'Redactor',
479
-	'info_statut_utilisateurs_1' => 'Estatuto por defeito dos utilizadores importados',
480
-	'info_statut_utilisateurs_2' => 'Escolha o estatuto atribuído às pessoas presentes no anuário LDAP quando elas se ligam pela primeira vez. Poderá depois modificar este valor para cada autor, caso a caso.',
481
-	'info_suivi_activite' => 'Acompanhamento da actividade editorial',
482
-	'info_surtitre' => 'Antetítulo',
483
-	'info_syndication_integrale_1' => 'O seu sítio propõe os ficheiros redifundidos (ver « <a href="@url@">@titre@</a> »).',
484
-	'info_syndication_integrale_2' => 'Deseja enviar os artigos completos ou apenas um resumo de algumas centenas de caracteres?',
485
-	'info_table_prefix' => 'Pode modificar o prefixo do nome das tabelas das bases de dados. (Precisa de o fazer se estiver a instalar vários sítios na mesma base de dados.) O prefixo tem de ser escrito sem acentos, em minúsculas e sem espaços.',
486
-	'info_taille_maximale_images' => 'SPIP testará o tamanho máximo de imagem que pode processar (em milhões de pixels).<br /> As imagens maiores não serão reduzidas.',
487
-	'info_taille_maximale_vignette' => 'Tamanho máximo das vinhetas geradas pelo sistema :',
488
-	'info_terminer_installation' => 'Pode agora acabar o procedimento de instalação tipo.',
489
-	'info_texte' => 'Texto',
490
-	'info_texte_explicatif' => 'Texto explicativo',
491
-	'info_texte_long' => '(o texto é comprido : aparece, por isso, em muitas partes que serão coladas depois da validação.)',
492
-	'info_texte_message' => 'Texto da sua mensagem :',
493
-	'info_texte_message_02' => 'Texto da mensagem',
494
-	'info_titre' => 'Título :',
495
-	'info_total' => 'total :',
496
-	'info_tous_articles_en_redaction' => 'Todos os artigos em curso de redacção',
497
-	'info_tous_articles_presents' => 'Todos os artigos publicados nesta rubrica',
498
-	'info_tous_articles_refuses' => 'Todos os artigos rejeitados',
499
-	'info_tous_les' => 'todos os',
500
-	'info_tout_site' => 'Todo o sítio',
501
-	'info_tout_site2' => 'O artigo não está traduzido neste idioma.',
502
-	'info_tout_site3' => 'O artigo foi traduzido neste idioma, mas foram feitas modificações ao artigo original. A tradução necessita ser actualizada.',
503
-	'info_tout_site4' => 'O artigo foi traduzido neste idioma e a tradução está actual.',
504
-	'info_tout_site5' => 'Artigo original.',
505
-	'info_tout_site6' => '<b>Atenção:</b> só os artigos originais são mostrados.
438
+    'info_qui_edite' => '@nom_auteur_modif@ modificou o conteúdo há @date_diff@ minutos',
439
+    'info_racine_site' => 'Raiz do sítio',
440
+    'info_recharger_page' => 'Por favor volte a carregar esta página daqui a pouco.',
441
+    'info_recherche_auteur_zero' => 'Nenhum resultado para "@cherche_auteur@".',
442
+    'info_recommencer' => 'Por favor tente de novo.',
443
+    'info_redacteur_1' => 'Redactor',
444
+    'info_redacteur_2' => 'tendo acesso ao espaço privado(<i>recomendado</i>)',
445
+    'info_redacteurs' => 'Redactores',
446
+    'info_redaction_en_cours' => 'EM CURSO DE REDACÇÃO',
447
+    'info_redirection' => 'Redirigir',
448
+    'info_redirection_activee' => 'O redireccionamento está activado.',
449
+    'info_redirection_boucle' => 'Está a tentar redireccionar o artigo para este mesmo artigo.',
450
+    'info_redirection_desactivee' => 'O redireccionamento foi eliminado.',
451
+    'info_refuses' => 'Os seus artigos recusados',
452
+    'info_reglage_ldap' => 'Opções : <b>Acerto da importação LDAP</b>',
453
+    'info_renvoi_article' => '<b>Redireccionar.</b> Este artigo remete para a página:',
454
+    'info_reserve_admin' => 'Só os administradores podem modificar este endereço.',
455
+    'info_restreindre_rubrique' => 'Limitar a gestão à rubrica : ',
456
+    'info_resultat_recherche' => 'Resultados da pesquisa ;',
457
+    'info_rubriques' => 'Rubricas',
458
+    'info_rubriques_02' => 'rubricas',
459
+    'info_rubriques_trouvees' => 'Rubricas encontradas',
460
+    'info_sans_titre' => 'Sem título',
461
+    'info_selection_chemin_acces' => '<b>Seleccione</b> a seguir o caminho de acesso no anuário :',
462
+    'info_signatures' => 'assinaturas',
463
+    'info_site' => 'Sítio',
464
+    'info_site_2' => 'sítio :',
465
+    'info_site_min' => 'sítio',
466
+    'info_site_reference_2' => 'Sítio referenciado',
467
+    'info_site_web' => 'Sítio web :',
468
+    'info_sites' => 'sítios',
469
+    'info_sites_lies_mot' => 'Os sítios referenciados ligados a esta palavra-chave',
470
+    'info_sites_proxy' => 'Utilizar um proxy',
471
+    'info_sites_trouves' => 'Sítios encontrados',
472
+    'info_sous_titre' => 'Sub-título :',
473
+    'info_statut_administrateur' => 'Administrador',
474
+    'info_statut_auteur' => 'Estatuto deste autor :',
475
+    'info_statut_auteur_2' => 'Eu sou',
476
+    'info_statut_auteur_a_confirmer' => 'Registo a confirmar',
477
+    'info_statut_auteur_autre' => 'Outro estado:',
478
+    'info_statut_redacteur' => 'Redactor',
479
+    'info_statut_utilisateurs_1' => 'Estatuto por defeito dos utilizadores importados',
480
+    'info_statut_utilisateurs_2' => 'Escolha o estatuto atribuído às pessoas presentes no anuário LDAP quando elas se ligam pela primeira vez. Poderá depois modificar este valor para cada autor, caso a caso.',
481
+    'info_suivi_activite' => 'Acompanhamento da actividade editorial',
482
+    'info_surtitre' => 'Antetítulo',
483
+    'info_syndication_integrale_1' => 'O seu sítio propõe os ficheiros redifundidos (ver « <a href="@url@">@titre@</a> »).',
484
+    'info_syndication_integrale_2' => 'Deseja enviar os artigos completos ou apenas um resumo de algumas centenas de caracteres?',
485
+    'info_table_prefix' => 'Pode modificar o prefixo do nome das tabelas das bases de dados. (Precisa de o fazer se estiver a instalar vários sítios na mesma base de dados.) O prefixo tem de ser escrito sem acentos, em minúsculas e sem espaços.',
486
+    'info_taille_maximale_images' => 'SPIP testará o tamanho máximo de imagem que pode processar (em milhões de pixels).<br /> As imagens maiores não serão reduzidas.',
487
+    'info_taille_maximale_vignette' => 'Tamanho máximo das vinhetas geradas pelo sistema :',
488
+    'info_terminer_installation' => 'Pode agora acabar o procedimento de instalação tipo.',
489
+    'info_texte' => 'Texto',
490
+    'info_texte_explicatif' => 'Texto explicativo',
491
+    'info_texte_long' => '(o texto é comprido : aparece, por isso, em muitas partes que serão coladas depois da validação.)',
492
+    'info_texte_message' => 'Texto da sua mensagem :',
493
+    'info_texte_message_02' => 'Texto da mensagem',
494
+    'info_titre' => 'Título :',
495
+    'info_total' => 'total :',
496
+    'info_tous_articles_en_redaction' => 'Todos os artigos em curso de redacção',
497
+    'info_tous_articles_presents' => 'Todos os artigos publicados nesta rubrica',
498
+    'info_tous_articles_refuses' => 'Todos os artigos rejeitados',
499
+    'info_tous_les' => 'todos os',
500
+    'info_tout_site' => 'Todo o sítio',
501
+    'info_tout_site2' => 'O artigo não está traduzido neste idioma.',
502
+    'info_tout_site3' => 'O artigo foi traduzido neste idioma, mas foram feitas modificações ao artigo original. A tradução necessita ser actualizada.',
503
+    'info_tout_site4' => 'O artigo foi traduzido neste idioma e a tradução está actual.',
504
+    'info_tout_site5' => 'Artigo original.',
505
+    'info_tout_site6' => '<b>Atenção:</b> só os artigos originais são mostrados.
506 506
 As traduções estão associadas ao original,
507 507
 numa cor que indica o seu estado:',
508
-	'info_traductions' => 'Traduções',
509
-	'info_travail_colaboratif' => 'Trabalho colaborativo sobre os artigos',
510
-	'info_un_article' => 'um artigo',
511
-	'info_un_site' => 'um sítio',
512
-	'info_une_rubrique' => 'uma rubrica,',
513
-	'info_une_rubrique_02' => '1 rubrica',
514
-	'info_url' => 'URL :',
515
-	'info_url_proxy' => 'URL do proxy',
516
-	'info_url_proxy_pas_conforme' => 'o URL do proxy não é válido.',
517
-	'info_url_site_pas_conforme' => 'O URL do sítio não é válido',
518
-	'info_url_test_proxy' => 'URL de teste',
519
-	'info_urlref' => 'Ligação hipertexto :',
520
-	'info_utilisation_spip' => 'Pode começar agora a utilizar o sistema de publicação assistida...',
521
-	'info_visites_par_mois' => 'Exibição por mês :',
522
-	'info_visiteur_1' => 'Visitante',
523
-	'info_visiteur_2' => 'do sítio público',
524
-	'info_visiteurs' => 'Visitantes',
525
-	'info_visiteurs_02' => 'Visitantes do sítio público',
526
-	'info_webmestre_forces' => 'Os webmasters são actualmente definidos em <tt>@file_options@</tt>.',
527
-	'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem',
528
-	'install_connect_ok' => 'A nova base de dados foi declarada usando o nome de servidor @connect@.',
529
-	'install_echec_annonce' => 'A instalação vai provavelmente falhar,ou criar um sítio não funcional',
530
-	'install_extension_mbstring' => 'O SPIP não funciona com :',
531
-	'install_extension_php_obligatoire' => 'O SPIP exige a extensão php :',
532
-	'install_login_base_hebergeur' => 'Login de ligação atribuído pelo serviço de hospedagem',
533
-	'install_nom_base_hebergeur' => 'Nome da base de dados atribuído pelo serviço de hospedagem:',
534
-	'install_pas_table' => 'A base de dados não tem tabelas',
535
-	'install_pass_base_hebergeur' => 'Palavra-passe atribuída pelo serviço de hospedagem',
536
-	'install_php_version' => 'Esta versão de PHP @version@ é demasiado curta (minimum = @minimum@)',
537
-	'install_select_langue' => 'Seleccione um idioma e depois clique no botão " seguinte " para lançar o procedimento de instalação.',
538
-	'install_select_type_db' => 'Indicar o tipo de base de dados :',
539
-	'install_select_type_mysql' => 'MySQL',
540
-	'install_select_type_pg' => 'PostgreSQL',
541
-	'install_select_type_sqlite2' => 'SQLite 2',
542
-	'install_select_type_sqlite3' => 'SQLite 3',
543
-	'install_serveur_hebergeur' => 'Servidor da base de dados atribuído pelo serviço de hospedagem',
544
-	'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
545
-	'install_tables_base' => 'Tabelas da base de dados',
546
-	'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (o mais comum), <b>PostgreSQL</b> e <b>SQLite</b>.',
547
-	'install_types_db_connus_avertissement' => 'O suporte de <b>PostgreSQL</b> está proposto a nível experimental',
548
-	'instituer_erreur_statut_a_change' => 'O estado já tinha sido modificado',
549
-	'instituer_erreur_statut_non_autorise' => 'Não pode seleccionar este estado',
550
-	'intem_redacteur' => 'redactor',
551
-	'intitule_licence' => 'Licença',
552
-	'item_accepter_inscriptions' => 'Aceitar as inscrições',
553
-	'item_activer_messages_avertissement' => 'Activar as mensagens de aviso',
554
-	'item_administrateur_2' => 'administrador',
555
-	'item_afficher_calendrier' => 'Exibir o calendário',
556
-	'item_autoriser_syndication_integrale' => 'Incluir artigos completos nos ficheiros de redifusão',
557
-	'item_choix_administrateurs' => 'os administradores',
558
-	'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
559
-	'item_choix_non_generation_miniature' => 'Não gerar miniaturas das imagens.',
560
-	'item_choix_redacteurs' => 'os redactores',
561
-	'item_choix_visiteurs' => 'os visitadores do sítio público',
562
-	'item_creer_fichiers_authent' => 'Criar os ficheiros .htpasswd',
563
-	'item_login' => 'Login',
564
-	'item_messagerie_agenda' => 'Activar as mensagens e a agenda',
565
-	'item_mots_cles_association_articles' => 'aos artigos',
566
-	'item_mots_cles_association_rubriques' => 'às rubricas',
567
-	'item_mots_cles_association_sites' => 'aos sítios referenciados ou vinculados.',
568
-	'item_non' => 'Não',
569
-	'item_non_accepter_inscriptions' => 'Não aceitar as inscrições',
570
-	'item_non_activer_messages_avertissement' => 'Não há mensagens de aviso',
571
-	'item_non_afficher_calendrier' => 'Não exibir no calendário',
572
-	'item_non_autoriser_syndication_integrale' => 'Enviar apenas um resumo',
573
-	'item_non_creer_fichiers_authent' => 'Não criar estes ficheiros',
574
-	'item_non_messagerie_agenda' => 'Desactivar as mensagens e a agenda',
575
-	'item_non_publier_articles' => 'Não publicar os artigos antes da data de publicação fixada.',
576
-	'item_nouvel_auteur' => 'Novo autor',
577
-	'item_nouvelle_rubrique' => 'Nova rubrica',
578
-	'item_oui' => 'Sim',
579
-	'item_publier_articles' => 'Publicar os artigos, seja qual for a sua data de publicação.',
580
-	'item_reponse_article' => 'Resposta ao artigo',
581
-	'item_visiteur' => 'visitante',
508
+    'info_traductions' => 'Traduções',
509
+    'info_travail_colaboratif' => 'Trabalho colaborativo sobre os artigos',
510
+    'info_un_article' => 'um artigo',
511
+    'info_un_site' => 'um sítio',
512
+    'info_une_rubrique' => 'uma rubrica,',
513
+    'info_une_rubrique_02' => '1 rubrica',
514
+    'info_url' => 'URL :',
515
+    'info_url_proxy' => 'URL do proxy',
516
+    'info_url_proxy_pas_conforme' => 'o URL do proxy não é válido.',
517
+    'info_url_site_pas_conforme' => 'O URL do sítio não é válido',
518
+    'info_url_test_proxy' => 'URL de teste',
519
+    'info_urlref' => 'Ligação hipertexto :',
520
+    'info_utilisation_spip' => 'Pode começar agora a utilizar o sistema de publicação assistida...',
521
+    'info_visites_par_mois' => 'Exibição por mês :',
522
+    'info_visiteur_1' => 'Visitante',
523
+    'info_visiteur_2' => 'do sítio público',
524
+    'info_visiteurs' => 'Visitantes',
525
+    'info_visiteurs_02' => 'Visitantes do sítio público',
526
+    'info_webmestre_forces' => 'Os webmasters são actualmente definidos em <tt>@file_options@</tt>.',
527
+    'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem',
528
+    'install_connect_ok' => 'A nova base de dados foi declarada usando o nome de servidor @connect@.',
529
+    'install_echec_annonce' => 'A instalação vai provavelmente falhar,ou criar um sítio não funcional',
530
+    'install_extension_mbstring' => 'O SPIP não funciona com :',
531
+    'install_extension_php_obligatoire' => 'O SPIP exige a extensão php :',
532
+    'install_login_base_hebergeur' => 'Login de ligação atribuído pelo serviço de hospedagem',
533
+    'install_nom_base_hebergeur' => 'Nome da base de dados atribuído pelo serviço de hospedagem:',
534
+    'install_pas_table' => 'A base de dados não tem tabelas',
535
+    'install_pass_base_hebergeur' => 'Palavra-passe atribuída pelo serviço de hospedagem',
536
+    'install_php_version' => 'Esta versão de PHP @version@ é demasiado curta (minimum = @minimum@)',
537
+    'install_select_langue' => 'Seleccione um idioma e depois clique no botão " seguinte " para lançar o procedimento de instalação.',
538
+    'install_select_type_db' => 'Indicar o tipo de base de dados :',
539
+    'install_select_type_mysql' => 'MySQL',
540
+    'install_select_type_pg' => 'PostgreSQL',
541
+    'install_select_type_sqlite2' => 'SQLite 2',
542
+    'install_select_type_sqlite3' => 'SQLite 3',
543
+    'install_serveur_hebergeur' => 'Servidor da base de dados atribuído pelo serviço de hospedagem',
544
+    'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
545
+    'install_tables_base' => 'Tabelas da base de dados',
546
+    'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (o mais comum), <b>PostgreSQL</b> e <b>SQLite</b>.',
547
+    'install_types_db_connus_avertissement' => 'O suporte de <b>PostgreSQL</b> está proposto a nível experimental',
548
+    'instituer_erreur_statut_a_change' => 'O estado já tinha sido modificado',
549
+    'instituer_erreur_statut_non_autorise' => 'Não pode seleccionar este estado',
550
+    'intem_redacteur' => 'redactor',
551
+    'intitule_licence' => 'Licença',
552
+    'item_accepter_inscriptions' => 'Aceitar as inscrições',
553
+    'item_activer_messages_avertissement' => 'Activar as mensagens de aviso',
554
+    'item_administrateur_2' => 'administrador',
555
+    'item_afficher_calendrier' => 'Exibir o calendário',
556
+    'item_autoriser_syndication_integrale' => 'Incluir artigos completos nos ficheiros de redifusão',
557
+    'item_choix_administrateurs' => 'os administradores',
558
+    'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
559
+    'item_choix_non_generation_miniature' => 'Não gerar miniaturas das imagens.',
560
+    'item_choix_redacteurs' => 'os redactores',
561
+    'item_choix_visiteurs' => 'os visitadores do sítio público',
562
+    'item_creer_fichiers_authent' => 'Criar os ficheiros .htpasswd',
563
+    'item_login' => 'Login',
564
+    'item_messagerie_agenda' => 'Activar as mensagens e a agenda',
565
+    'item_mots_cles_association_articles' => 'aos artigos',
566
+    'item_mots_cles_association_rubriques' => 'às rubricas',
567
+    'item_mots_cles_association_sites' => 'aos sítios referenciados ou vinculados.',
568
+    'item_non' => 'Não',
569
+    'item_non_accepter_inscriptions' => 'Não aceitar as inscrições',
570
+    'item_non_activer_messages_avertissement' => 'Não há mensagens de aviso',
571
+    'item_non_afficher_calendrier' => 'Não exibir no calendário',
572
+    'item_non_autoriser_syndication_integrale' => 'Enviar apenas um resumo',
573
+    'item_non_creer_fichiers_authent' => 'Não criar estes ficheiros',
574
+    'item_non_messagerie_agenda' => 'Desactivar as mensagens e a agenda',
575
+    'item_non_publier_articles' => 'Não publicar os artigos antes da data de publicação fixada.',
576
+    'item_nouvel_auteur' => 'Novo autor',
577
+    'item_nouvelle_rubrique' => 'Nova rubrica',
578
+    'item_oui' => 'Sim',
579
+    'item_publier_articles' => 'Publicar os artigos, seja qual for a sua data de publicação.',
580
+    'item_reponse_article' => 'Resposta ao artigo',
581
+    'item_visiteur' => 'visitante',
582 582
 
583
-	// J
584
-	'jour_non_connu_nc' => 'n.c.',
583
+    // J
584
+    'jour_non_connu_nc' => 'n.c.',
585 585
 
586
-	// L
587
-	'label_bando_outils' => 'Barra de ferramentas',
588
-	'label_bando_outils_afficher' => 'Exibir as ferramentas',
589
-	'label_bando_outils_masquer' => 'Ocultar as ferramentas',
590
-	'label_choix_langue' => 'Seleccione o seu idioma',
591
-	'label_nom_fichier_connect' => 'Indique o nome para este servidor',
592
-	'label_slogan_site' => 'Slogan do sítio',
593
-	'label_taille_ecran' => 'Largura do ecrã',
594
-	'label_texte_et_icones_navigation' => 'Menu de navegação',
595
-	'label_texte_et_icones_page' => 'Exibição da página',
596
-	'ldap_correspondance' => 'sucessão do campo @champ@',
597
-	'ldap_correspondance_1' => 'Sucessão dos campos LDAP',
598
-	'ldap_correspondance_2' => 'Para cada um destes campos SPIP, indique o nome do campo LDAP correspondente. Deixe em branco se não o deseja preenchido. Separe com espaços ou vírgulas, para tentar vários campos LDAP.',
599
-	'lien_ajouter_auteur' => 'Acrescentar este autor',
600
-	'lien_ajouter_une_rubrique' => 'Adicionar esta rubrica',
601
-	'lien_email' => 'email',
602
-	'lien_nom_site' => 'NOME DO SÍTIO',
603
-	'lien_rapide_contenu' => 'Ir para o conteúdo',
604
-	'lien_rapide_navigation' => 'Ir para a navegação',
605
-	'lien_rapide_recherche' => 'Ir para a pesquisa',
606
-	'lien_retirer_auteur' => 'Remover o autor',
607
-	'lien_retirer_rubrique' => 'Eliminar a rubrica',
608
-	'lien_retirer_tous_auteurs' => 'Eliminar todos os autores',
609
-	'lien_retirer_toutes_rubriques' => 'Remover todas as rubricas',
610
-	'lien_site' => 'sítio',
611
-	'lien_tout_decocher' => 'Desmarcar tudo',
612
-	'lien_tout_deplier' => 'Expandir tudo',
613
-	'lien_tout_replier' => 'Recolher tudo',
614
-	'lien_tout_supprimer' => 'Eliminar tudo',
615
-	'lien_trier_nom' => 'Seleccionar por nome',
616
-	'lien_trier_nombre_articles' => 'seleccionar por número de artigos',
617
-	'lien_trier_statut' => 'Seleccionar por estatuto',
618
-	'lien_voir_en_ligne' => 'VER EM LINHA',
619
-	'logo_article' => 'Logotipo do artigo',
620
-	'logo_auteur' => 'Logotipo do autor ',
621
-	'logo_rubrique' => 'Logotipo da rubrica',
622
-	'logo_site' => 'Logotipo deste sítio',
623
-	'logo_standard_rubrique' => 'Logotipo modelo das rubricas',
624
-	'logo_survol' => 'Logotipo "mouseover"',
586
+    // L
587
+    'label_bando_outils' => 'Barra de ferramentas',
588
+    'label_bando_outils_afficher' => 'Exibir as ferramentas',
589
+    'label_bando_outils_masquer' => 'Ocultar as ferramentas',
590
+    'label_choix_langue' => 'Seleccione o seu idioma',
591
+    'label_nom_fichier_connect' => 'Indique o nome para este servidor',
592
+    'label_slogan_site' => 'Slogan do sítio',
593
+    'label_taille_ecran' => 'Largura do ecrã',
594
+    'label_texte_et_icones_navigation' => 'Menu de navegação',
595
+    'label_texte_et_icones_page' => 'Exibição da página',
596
+    'ldap_correspondance' => 'sucessão do campo @champ@',
597
+    'ldap_correspondance_1' => 'Sucessão dos campos LDAP',
598
+    'ldap_correspondance_2' => 'Para cada um destes campos SPIP, indique o nome do campo LDAP correspondente. Deixe em branco se não o deseja preenchido. Separe com espaços ou vírgulas, para tentar vários campos LDAP.',
599
+    'lien_ajouter_auteur' => 'Acrescentar este autor',
600
+    'lien_ajouter_une_rubrique' => 'Adicionar esta rubrica',
601
+    'lien_email' => 'email',
602
+    'lien_nom_site' => 'NOME DO SÍTIO',
603
+    'lien_rapide_contenu' => 'Ir para o conteúdo',
604
+    'lien_rapide_navigation' => 'Ir para a navegação',
605
+    'lien_rapide_recherche' => 'Ir para a pesquisa',
606
+    'lien_retirer_auteur' => 'Remover o autor',
607
+    'lien_retirer_rubrique' => 'Eliminar a rubrica',
608
+    'lien_retirer_tous_auteurs' => 'Eliminar todos os autores',
609
+    'lien_retirer_toutes_rubriques' => 'Remover todas as rubricas',
610
+    'lien_site' => 'sítio',
611
+    'lien_tout_decocher' => 'Desmarcar tudo',
612
+    'lien_tout_deplier' => 'Expandir tudo',
613
+    'lien_tout_replier' => 'Recolher tudo',
614
+    'lien_tout_supprimer' => 'Eliminar tudo',
615
+    'lien_trier_nom' => 'Seleccionar por nome',
616
+    'lien_trier_nombre_articles' => 'seleccionar por número de artigos',
617
+    'lien_trier_statut' => 'Seleccionar por estatuto',
618
+    'lien_voir_en_ligne' => 'VER EM LINHA',
619
+    'logo_article' => 'Logotipo do artigo',
620
+    'logo_auteur' => 'Logotipo do autor ',
621
+    'logo_rubrique' => 'Logotipo da rubrica',
622
+    'logo_site' => 'Logotipo deste sítio',
623
+    'logo_standard_rubrique' => 'Logotipo modelo das rubricas',
624
+    'logo_survol' => 'Logotipo "mouseover"',
625 625
 
626
-	// M
627
-	'menu_aide_installation_choix_base' => 'Escolha da sua base',
628
-	'module_fichier_langue' => 'Ficheiro de idioma',
629
-	'module_raccourci' => 'Atalhos',
630
-	'module_texte_affiche' => 'Texto exibido',
631
-	'module_texte_explicatif' => 'Pode inserir os seguintes atalhos nos esqueletos do seu sítio público. Serão automaticamente traduzidos para os vários idiomas nos quais há um ficheiro de idioma.',
632
-	'module_texte_traduction' => 'O ficheiro de idioma « @module@ » está disponível em :',
633
-	'mois_non_connu' => 'não conhecido',
626
+    // M
627
+    'menu_aide_installation_choix_base' => 'Escolha da sua base',
628
+    'module_fichier_langue' => 'Ficheiro de idioma',
629
+    'module_raccourci' => 'Atalhos',
630
+    'module_texte_affiche' => 'Texto exibido',
631
+    'module_texte_explicatif' => 'Pode inserir os seguintes atalhos nos esqueletos do seu sítio público. Serão automaticamente traduzidos para os vários idiomas nos quais há um ficheiro de idioma.',
632
+    'module_texte_traduction' => 'O ficheiro de idioma « @module@ » está disponível em :',
633
+    'mois_non_connu' => 'não conhecido',
634 634
 
635
-	// N
636
-	'nouvelle_version_spip' => 'A versão @version@ de SPIP está disponível',
637
-	'nouvelle_version_spip_majeure' => 'Um novo SPIP @version@ está disponível',
635
+    // N
636
+    'nouvelle_version_spip' => 'A versão @version@ de SPIP está disponível',
637
+    'nouvelle_version_spip_majeure' => 'Um novo SPIP @version@ está disponível',
638 638
 
639
-	// O
640
-	'onglet_contenu' => 'Conteúdo',
641
-	'onglet_declarer_une_autre_base' => 'Declarar outra base de dados',
642
-	'onglet_discuter' => 'Discussão',
643
-	'onglet_interactivite' => 'Interactividade',
644
-	'onglet_proprietes' => 'Propriedades',
645
-	'onglet_repartition_actuelle' => 'actualmente',
646
-	'onglet_sous_rubriques' => 'Sub-rubricas',
639
+    // O
640
+    'onglet_contenu' => 'Conteúdo',
641
+    'onglet_declarer_une_autre_base' => 'Declarar outra base de dados',
642
+    'onglet_discuter' => 'Discussão',
643
+    'onglet_interactivite' => 'Interactividade',
644
+    'onglet_proprietes' => 'Propriedades',
645
+    'onglet_repartition_actuelle' => 'actualmente',
646
+    'onglet_sous_rubriques' => 'Sub-rubricas',
647 647
 
648
-	// P
649
-	'page_pas_proxy' => 'Esta página não deve passar através do proxy',
650
-	'pas_de_proxy_pour' => 'Se necessário, indique a que máquinas ou domínios este proxy não se deve aplicar (por exemplo : @exemple@)',
651
-	'phpinfo' => 'Configuração PHP',
652
-	'plugin_charge_paquet' => 'Carregamento do ficheiro @name@',
653
-	'plugin_charger' => 'Download',
654
-	'plugin_erreur_charger' => 'erro : impossível carregar @zip@',
655
-	'plugin_erreur_droit1' => 'Não pode escrever no directório <code>@dest@</code>.',
656
-	'plugin_erreur_droit2' => 'Por favor verifique as autorizações para este directório (e crie o directório se necessário). Alternativamente, instale os ficheiros por FTP.',
657
-	'plugin_erreur_zip' => 'falha pclzip : erro @status@',
658
-	'plugin_etat_developpement' => 'em desenvolvimento',
659
-	'plugin_etat_experimental' => 'experimental',
660
-	'plugin_etat_stable' => 'estável',
661
-	'plugin_etat_test' => 'em teste',
662
-	'plugin_impossible_activer' => 'Impossível activar o plugin @plugin@',
663
-	'plugin_info_automatique1' => 'Se deseja autorizar a instalação automática de plugins, por favor:',
664
-	'plugin_info_automatique1_lib' => 'Se deseja que a biblioteca seja instalada automaticamente, por favor:',
665
-	'plugin_info_automatique2' => 'criar um directório <code>@rep@</code> ;',
666
-	'plugin_info_automatique3' => 'Verifique se o servidor está autorizado a escrever neste directório.',
667
-	'plugin_info_automatique_creer' => 'a criar na raiz do sítio.',
668
-	'plugin_info_automatique_exemples' => 'exemplos:',
669
-	'plugin_info_automatique_ftp' => 'Pode instalar os plugins, por FTP, no directório <tt>@rep@</tt>',
670
-	'plugin_info_automatique_lib' => 'Alguns plugins precisam de estar aptos a carregar ficheiros no directório <code>lib/</code>. Este directório deve ser criado na raiz do sítio.',
671
-	'plugin_info_automatique_liste' => 'As suas listas de plugins :',
672
-	'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
673
-	'plugin_info_automatique_liste_update' => 'Actualizar as listas',
674
-	'plugin_info_automatique_ou' => 'ou...',
675
-	'plugin_info_automatique_select' => 'Seleccione um plugin abaixo: SPIP irá carregá-lo e instalá-lo no directório <code>@rep@</code>. Se o plugin já existir, será actualizado.',
676
-	'plugin_info_credit' => 'Créditos',
677
-	'plugin_info_erreur_xml' => 'A declaração do plugin está incorrecta',
678
-	'plugin_info_install_ok' => 'Instalado com sucesso',
679
-	'plugin_info_necessite' => 'Requer:',
680
-	'plugin_info_non_compatible_spip' => 'O plugin é incompatível com esta versão de SPIP',
681
-	'plugin_info_plugins_dist_1' => 'Os plugins seguintes estão carregados e activados no directório @plugins_dist@.',
682
-	'plugin_info_plugins_dist_2' => 'Não podem ser desactivados.',
683
-	'plugin_info_telecharger' => 'carregar de @url@ e instalar em @rep@',
684
-	'plugin_info_upgrade_ok' => 'Actualizado com sucesso',
685
-	'plugin_librairies_installees' => 'Bibliotecas instaladas',
686
-	'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ em @version@.',
687
-	'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
688
-	'plugin_necessite_lib' => 'Este plugin requer a biblioteca @lib@',
689
-	'plugin_necessite_php' => 'Requer @plugin@ em versão @version@.',
690
-	'plugin_necessite_plugin' => 'Requer o plugin @plugin@ em versão @version@ ou mais recente.',
691
-	'plugin_necessite_plugin_sans_version' => 'Requer o plugin @plugin@',
692
-	'plugin_necessite_spip' => 'Requer SPIP em version @version@ ou mais recente.',
693
-	'plugin_source' => 'fonte: ',
694
-	'plugin_titre_automatique' => 'Instalação automática',
695
-	'plugin_titre_automatique_ajouter' => 'Adicionar plugins',
696
-	'plugin_titre_installation' => 'Instalação do plugin @plugin@',
697
-	'plugin_titre_modifier' => 'Os meus plugins',
698
-	'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
699
-	'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
700
-	'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
701
-	'plugin_zip_active' => 'Continue para activar',
702
-	'plugin_zip_adresse' => 'Para carregar um ficheiro zip de plugin, ou uma lista de plugins, introduza o caminho abaixo.',
703
-	'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
704
-	'plugin_zip_content' => 'Contém os seguintes ficheiros  (@taille@),<br /> prontos a ser instalados no directório <code>@rep@</code>',
705
-	'plugin_zip_installe_finie' => 'O ficheiro @zip@ foi descomprimido e instalado.',
706
-	'plugin_zip_installe_rep_finie' => 'O ficheiro @zip@ foi descompactado e instalado no directório @rep@',
707
-	'plugin_zip_installer' => 'Agora pode instalar.',
708
-	'plugin_zip_telecharge' => 'O ficheiro @zip@ foi carregado',
709
-	'plugins_actif_aucun' => 'Sem plugins activados.',
710
-	'plugins_actif_un' => 'Um plugin activado.',
711
-	'plugins_actifs' => '@count@ plugins activados.',
712
-	'plugins_actifs_liste' => 'Activados',
713
-	'plugins_compte' => '@count@ plugins',
714
-	'plugins_disponible_un' => 'Um plugin disponível.',
715
-	'plugins_disponibles' => '@count@ plugins disponíveis.',
716
-	'plugins_erreur' => 'Erro nos plugins : @plugins@',
717
-	'plugins_liste' => 'Lista de plugins',
718
-	'plugins_liste_dist' => 'Plugins bloqueados',
719
-	'plugins_recents' => 'Plugins recentes.',
720
-	'plugins_tous_liste' => 'Todos',
721
-	'plugins_vue_hierarchie' => 'Hierarquia',
722
-	'plugins_vue_liste' => 'Lista',
723
-	'protocole_ldap' => 'Versão do protocolo:',
648
+    // P
649
+    'page_pas_proxy' => 'Esta página não deve passar através do proxy',
650
+    'pas_de_proxy_pour' => 'Se necessário, indique a que máquinas ou domínios este proxy não se deve aplicar (por exemplo : @exemple@)',
651
+    'phpinfo' => 'Configuração PHP',
652
+    'plugin_charge_paquet' => 'Carregamento do ficheiro @name@',
653
+    'plugin_charger' => 'Download',
654
+    'plugin_erreur_charger' => 'erro : impossível carregar @zip@',
655
+    'plugin_erreur_droit1' => 'Não pode escrever no directório <code>@dest@</code>.',
656
+    'plugin_erreur_droit2' => 'Por favor verifique as autorizações para este directório (e crie o directório se necessário). Alternativamente, instale os ficheiros por FTP.',
657
+    'plugin_erreur_zip' => 'falha pclzip : erro @status@',
658
+    'plugin_etat_developpement' => 'em desenvolvimento',
659
+    'plugin_etat_experimental' => 'experimental',
660
+    'plugin_etat_stable' => 'estável',
661
+    'plugin_etat_test' => 'em teste',
662
+    'plugin_impossible_activer' => 'Impossível activar o plugin @plugin@',
663
+    'plugin_info_automatique1' => 'Se deseja autorizar a instalação automática de plugins, por favor:',
664
+    'plugin_info_automatique1_lib' => 'Se deseja que a biblioteca seja instalada automaticamente, por favor:',
665
+    'plugin_info_automatique2' => 'criar um directório <code>@rep@</code> ;',
666
+    'plugin_info_automatique3' => 'Verifique se o servidor está autorizado a escrever neste directório.',
667
+    'plugin_info_automatique_creer' => 'a criar na raiz do sítio.',
668
+    'plugin_info_automatique_exemples' => 'exemplos:',
669
+    'plugin_info_automatique_ftp' => 'Pode instalar os plugins, por FTP, no directório <tt>@rep@</tt>',
670
+    'plugin_info_automatique_lib' => 'Alguns plugins precisam de estar aptos a carregar ficheiros no directório <code>lib/</code>. Este directório deve ser criado na raiz do sítio.',
671
+    'plugin_info_automatique_liste' => 'As suas listas de plugins :',
672
+    'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
673
+    'plugin_info_automatique_liste_update' => 'Actualizar as listas',
674
+    'plugin_info_automatique_ou' => 'ou...',
675
+    'plugin_info_automatique_select' => 'Seleccione um plugin abaixo: SPIP irá carregá-lo e instalá-lo no directório <code>@rep@</code>. Se o plugin já existir, será actualizado.',
676
+    'plugin_info_credit' => 'Créditos',
677
+    'plugin_info_erreur_xml' => 'A declaração do plugin está incorrecta',
678
+    'plugin_info_install_ok' => 'Instalado com sucesso',
679
+    'plugin_info_necessite' => 'Requer:',
680
+    'plugin_info_non_compatible_spip' => 'O plugin é incompatível com esta versão de SPIP',
681
+    'plugin_info_plugins_dist_1' => 'Os plugins seguintes estão carregados e activados no directório @plugins_dist@.',
682
+    'plugin_info_plugins_dist_2' => 'Não podem ser desactivados.',
683
+    'plugin_info_telecharger' => 'carregar de @url@ e instalar em @rep@',
684
+    'plugin_info_upgrade_ok' => 'Actualizado com sucesso',
685
+    'plugin_librairies_installees' => 'Bibliotecas instaladas',
686
+    'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ em @version@.',
687
+    'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
688
+    'plugin_necessite_lib' => 'Este plugin requer a biblioteca @lib@',
689
+    'plugin_necessite_php' => 'Requer @plugin@ em versão @version@.',
690
+    'plugin_necessite_plugin' => 'Requer o plugin @plugin@ em versão @version@ ou mais recente.',
691
+    'plugin_necessite_plugin_sans_version' => 'Requer o plugin @plugin@',
692
+    'plugin_necessite_spip' => 'Requer SPIP em version @version@ ou mais recente.',
693
+    'plugin_source' => 'fonte: ',
694
+    'plugin_titre_automatique' => 'Instalação automática',
695
+    'plugin_titre_automatique_ajouter' => 'Adicionar plugins',
696
+    'plugin_titre_installation' => 'Instalação do plugin @plugin@',
697
+    'plugin_titre_modifier' => 'Os meus plugins',
698
+    'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
699
+    'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
700
+    'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
701
+    'plugin_zip_active' => 'Continue para activar',
702
+    'plugin_zip_adresse' => 'Para carregar um ficheiro zip de plugin, ou uma lista de plugins, introduza o caminho abaixo.',
703
+    'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
704
+    'plugin_zip_content' => 'Contém os seguintes ficheiros  (@taille@),<br /> prontos a ser instalados no directório <code>@rep@</code>',
705
+    'plugin_zip_installe_finie' => 'O ficheiro @zip@ foi descomprimido e instalado.',
706
+    'plugin_zip_installe_rep_finie' => 'O ficheiro @zip@ foi descompactado e instalado no directório @rep@',
707
+    'plugin_zip_installer' => 'Agora pode instalar.',
708
+    'plugin_zip_telecharge' => 'O ficheiro @zip@ foi carregado',
709
+    'plugins_actif_aucun' => 'Sem plugins activados.',
710
+    'plugins_actif_un' => 'Um plugin activado.',
711
+    'plugins_actifs' => '@count@ plugins activados.',
712
+    'plugins_actifs_liste' => 'Activados',
713
+    'plugins_compte' => '@count@ plugins',
714
+    'plugins_disponible_un' => 'Um plugin disponível.',
715
+    'plugins_disponibles' => '@count@ plugins disponíveis.',
716
+    'plugins_erreur' => 'Erro nos plugins : @plugins@',
717
+    'plugins_liste' => 'Lista de plugins',
718
+    'plugins_liste_dist' => 'Plugins bloqueados',
719
+    'plugins_recents' => 'Plugins recentes.',
720
+    'plugins_tous_liste' => 'Todos',
721
+    'plugins_vue_hierarchie' => 'Hierarquia',
722
+    'plugins_vue_liste' => 'Lista',
723
+    'protocole_ldap' => 'Versão do protocolo:',
724 724
 
725
-	// Q
726
-	'queue_executer_maintenant' => 'Executar agora',
727
-	'queue_info_purger' => 'Pode eliminar todas as tarefas em espera e pôr a zeros a lista de tarefas periódicas',
728
-	'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
729
-	'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
730
-	'queue_no_job_in_queue' => 'Sem tarefas em espera',
731
-	'queue_one_job_in_queue' => '1 tarefa em espera',
732
-	'queue_priorite_tache' => 'prioridade',
733
-	'queue_purger_queue' => 'Pôr a zeros a lista de tarefas',
734
-	'queue_titre' => 'Lista de tarefas',
725
+    // Q
726
+    'queue_executer_maintenant' => 'Executar agora',
727
+    'queue_info_purger' => 'Pode eliminar todas as tarefas em espera e pôr a zeros a lista de tarefas periódicas',
728
+    'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
729
+    'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
730
+    'queue_no_job_in_queue' => 'Sem tarefas em espera',
731
+    'queue_one_job_in_queue' => '1 tarefa em espera',
732
+    'queue_priorite_tache' => 'prioridade',
733
+    'queue_purger_queue' => 'Pôr a zeros a lista de tarefas',
734
+    'queue_titre' => 'Lista de tarefas',
735 735
 
736
-	// R
737
-	'repertoire_plugins' => 'Directório :',
738
-	'required' => '(obrigatório)',
736
+    // R
737
+    'repertoire_plugins' => 'Directório :',
738
+    'required' => '(obrigatório)',
739 739
 
740
-	// S
741
-	'sans_heure' => 'tempo não especificado',
742
-	'statut_admin_restreint' => 'administrador restrito',
743
-	'statut_webmestre' => 'webmaster',
740
+    // S
741
+    'sans_heure' => 'tempo não especificado',
742
+    'statut_admin_restreint' => 'administrador restrito',
743
+    'statut_webmestre' => 'webmaster',
744 744
 
745
-	// T
746
-	'tache_cron_asap' => 'Tarefas CRON @function@ (ASAP)',
747
-	'tache_cron_secondes' => 'Tarefa CRON @function@ (todas as @nb@ s)',
748
-	'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (miniaturas dos documentos, títulos apresentados sob forma gráfica, funções matemáticas no formato TeX...) ocupam no directório @dir@ um total de @taille@.',
749
-	'taille_cache_infinie' => 'Este sítio não prevê limitação de tamanho do directório de cache <code>CACHE/</code>.',
750
-	'taille_cache_maxi' => 'SPIP tenta limitar o tamanho do diretório cache <code>CACHE/</code> deste sítio em cerca de <b>@octets@</b>.',
751
-	'taille_cache_moins_de' => 'O tamanho da cache é menor do que @octets@.',
752
-	'taille_cache_octets' => 'O tamanho da cache é actualmente cerca de  @octets@.',
753
-	'taille_cache_vide' => 'A cache está vazia.',
754
-	'taille_repertoire_cache' => 'Tamanho do directório cache',
755
-	'text_article_propose_publication' => 'Artigo proposto para publicação. Não hesite em dar a sua opinião graças ao fórum ligado a este artigo (no fundo da página).',
756
-	'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anónimo. Nesse caso, é preciso especificar um identificador de acesso inicial a fim de poder depois procurar informações no anuário. Na maior parte dos casos, porém, os seguintes campos poderão ser deixados vazios.',
757
-	'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados,
745
+    // T
746
+    'tache_cron_asap' => 'Tarefas CRON @function@ (ASAP)',
747
+    'tache_cron_secondes' => 'Tarefa CRON @function@ (todas as @nb@ s)',
748
+    'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (miniaturas dos documentos, títulos apresentados sob forma gráfica, funções matemáticas no formato TeX...) ocupam no directório @dir@ um total de @taille@.',
749
+    'taille_cache_infinie' => 'Este sítio não prevê limitação de tamanho do directório de cache <code>CACHE/</code>.',
750
+    'taille_cache_maxi' => 'SPIP tenta limitar o tamanho do diretório cache <code>CACHE/</code> deste sítio em cerca de <b>@octets@</b>.',
751
+    'taille_cache_moins_de' => 'O tamanho da cache é menor do que @octets@.',
752
+    'taille_cache_octets' => 'O tamanho da cache é actualmente cerca de  @octets@.',
753
+    'taille_cache_vide' => 'A cache está vazia.',
754
+    'taille_repertoire_cache' => 'Tamanho do directório cache',
755
+    'text_article_propose_publication' => 'Artigo proposto para publicação. Não hesite em dar a sua opinião graças ao fórum ligado a este artigo (no fundo da página).',
756
+    'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anónimo. Nesse caso, é preciso especificar um identificador de acesso inicial a fim de poder depois procurar informações no anuário. Na maior parte dos casos, porém, os seguintes campos poderão ser deixados vazios.',
757
+    'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados,
758 758
 inclusive <i>todos</i> os acessos de redactores e administradores. Depois de o ter executado, deverá
759 759
 reinstalar SPIP para recriar uma nova base assim como uma primeira conta de administrador.',
760
-	'texte_adresse_annuaire_1' => '(Se o seu anuário está instalado na mesma máquina que este sítio Web, trata-se de «localhost».)',
761
-	'texte_ajout_auteur' => 'O seguinte autor foi acrescentado ao artigo :',
762
-	'texte_annuaire_ldap_1' => 'Se tiver acesso a um anuário (LDAP), pode utilizá-lo para importar automaticamente utilizadores sob SPIP.',
763
-	'texte_article_statut' => 'Este artigo está:',
764
-	'texte_article_virtuel' => 'Artigo virtual',
765
-	'texte_article_virtuel_reference' => '<b>Artigo virtual :</b> artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL. Para suprimir a redirecção, apague a URL acima.',
766
-	'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
767
-	'texte_auteur_messagerie' => 'Este site pode indicar permanentemente a lista dos redactores ligados, o que lhe permite trocar mensagens  em directo ( quando o correio está desactivado mais acima, a lista dos redactores está desactivada). Pode decidir não aparecer nesta lista (estando « invisível » para os outros utilizadores).',
768
-	'texte_auteurs' => 'OS AUTORES',
769
-	'texte_choix_base_1' => 'Escolha a sua base de dados :',
770
-	'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
771
-	'texte_choix_base_3' => '<b>Seleccione</b> a seguir a que lhe foi atribuida pelo seu serviço de hospedagem.',
772
-	'texte_choix_table_prefix' => 'Prefixo das tabelas:',
773
-	'texte_compte_element' => '@count@ elemento',
774
-	'texte_compte_elements' => '@count@ elementos',
775
-	'texte_conflit_edition_correction' => 'Por favor compare as diferenças entre as duas versões. Pode também copiar as suas alterações e recomeçar.',
776
-	'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: deve encontrar nelas, se o seu hospedeiro suporta SQL, os códigos de ligação ao servidor SQL.',
777
-	'texte_contenu_article' => '(Conteúdo do artigo em poucas palavras.)',
778
-	'texte_contenu_articles' => 'Segundo a maqueta adoptada para o seu sítio, pode decidir
760
+    'texte_adresse_annuaire_1' => '(Se o seu anuário está instalado na mesma máquina que este sítio Web, trata-se de «localhost».)',
761
+    'texte_ajout_auteur' => 'O seguinte autor foi acrescentado ao artigo :',
762
+    'texte_annuaire_ldap_1' => 'Se tiver acesso a um anuário (LDAP), pode utilizá-lo para importar automaticamente utilizadores sob SPIP.',
763
+    'texte_article_statut' => 'Este artigo está:',
764
+    'texte_article_virtuel' => 'Artigo virtual',
765
+    'texte_article_virtuel_reference' => '<b>Artigo virtual :</b> artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL. Para suprimir a redirecção, apague a URL acima.',
766
+    'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
767
+    'texte_auteur_messagerie' => 'Este site pode indicar permanentemente a lista dos redactores ligados, o que lhe permite trocar mensagens  em directo ( quando o correio está desactivado mais acima, a lista dos redactores está desactivada). Pode decidir não aparecer nesta lista (estando « invisível » para os outros utilizadores).',
768
+    'texte_auteurs' => 'OS AUTORES',
769
+    'texte_choix_base_1' => 'Escolha a sua base de dados :',
770
+    'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
771
+    'texte_choix_base_3' => '<b>Seleccione</b> a seguir a que lhe foi atribuida pelo seu serviço de hospedagem.',
772
+    'texte_choix_table_prefix' => 'Prefixo das tabelas:',
773
+    'texte_compte_element' => '@count@ elemento',
774
+    'texte_compte_elements' => '@count@ elementos',
775
+    'texte_conflit_edition_correction' => 'Por favor compare as diferenças entre as duas versões. Pode também copiar as suas alterações e recomeçar.',
776
+    'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: deve encontrar nelas, se o seu hospedeiro suporta SQL, os códigos de ligação ao servidor SQL.',
777
+    'texte_contenu_article' => '(Conteúdo do artigo em poucas palavras.)',
778
+    'texte_contenu_articles' => 'Segundo a maqueta adoptada para o seu sítio, pode decidir
779 779
 que alguns elementos dos artigos não são utilizados.
780 780
    Utilize a lista a seguir para indicar quais são os elementos disponíveis.',
781
-	'texte_crash_base' => 'Se a sua base de dados foi
781
+    'texte_crash_base' => 'Se a sua base de dados foi
782 782
  destruída, pode tentar uma reparação
783 783
  automática.',
784
-	'texte_creer_rubrique' => 'Antes de poder escrever artigos, <br /> deve criar uma rubrica.',
785
-	'texte_date_creation_article' => 'DATA DE CRIAÇÃO DO ARTIGO:',
786
-	'texte_date_creation_objet' => 'Data de criação:', # on ajoute le ":"
787
-	'texte_date_publication_anterieure' => 'Data de redacção anterior :',
788
-	'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redacção anterior',
789
-	'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
790
-	'texte_date_publication_objet' => 'Data de publicação online:',
791
-	'texte_definir_comme_traduction_rubrique' => 'Esta secção é uma tradução da secção número: ',
792
-	'texte_descriptif_rapide' => 'Descrição rápida',
793
-	'texte_effacer_base' => 'Apagar a base de dados SPIP',
794
-	'texte_effacer_statistiques' => 'Apagar as estatísticas',
795
-	'texte_en_cours_validation' => 'Os artigos e notícias seguintes estão propostos para publicação. Não hesite em dar a sua opinião graças aos fóruns que lhes estão ligados.',
796
-	'texte_enrichir_mise_a_jour' => 'Pode enriquecer a paginação do seu texto, utilizando « atalhos tipográficos ».',
797
-	'texte_fichier_authent' => '<b>Deverá o SPIP criar os ficheiros especiais<tt>.htpasswd-admin</tt> no directório @dossier@?</b>
784
+    'texte_creer_rubrique' => 'Antes de poder escrever artigos, <br /> deve criar uma rubrica.',
785
+    'texte_date_creation_article' => 'DATA DE CRIAÇÃO DO ARTIGO:',
786
+    'texte_date_creation_objet' => 'Data de criação:', # on ajoute le ":"
787
+    'texte_date_publication_anterieure' => 'Data de redacção anterior :',
788
+    'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redacção anterior',
789
+    'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
790
+    'texte_date_publication_objet' => 'Data de publicação online:',
791
+    'texte_definir_comme_traduction_rubrique' => 'Esta secção é uma tradução da secção número: ',
792
+    'texte_descriptif_rapide' => 'Descrição rápida',
793
+    'texte_effacer_base' => 'Apagar a base de dados SPIP',
794
+    'texte_effacer_statistiques' => 'Apagar as estatísticas',
795
+    'texte_en_cours_validation' => 'Os artigos e notícias seguintes estão propostos para publicação. Não hesite em dar a sua opinião graças aos fóruns que lhes estão ligados.',
796
+    'texte_enrichir_mise_a_jour' => 'Pode enriquecer a paginação do seu texto, utilizando « atalhos tipográficos ».',
797
+    'texte_fichier_authent' => '<b>Deverá o SPIP criar os ficheiros especiais<tt>.htpasswd-admin</tt> no directório @dossier@?</b>
798 798
 <p>Estes ficheiros podem servir-lhe para restringir o acesso aos autores
799 799
 e administradores a outras partes do seu sítio (por exemplo, um programa externo de estatísticas).<p>
800 800
 Se não utilizar os ficheiros especiais, pode deixar esta opção no seu valor por omissão (não há criação de ficheiros).',
801
-	'texte_informations_personnelles_1' => 'O sistema vai agora criar-lhe um acesso personalizado ao sítio',
802
-	'texte_informations_personnelles_2' => '(Nota : se se tratar de uma reinstalação e se o seu acesso continua funcional, pode',
803
-	'texte_introductif_article' => '(Texto introdutório do artigo.)',
804
-	'texte_jeu_caractere' => 'Esta opção é útil se o seu sítio precisa de exibir alfabetos diferentes do alfabeto romano (ou  «ocidental») e seus derivados. Nesse caso, pode ser preferível mudar a definição por defeito para utilizar um conjunto de carácteres adequado; aconselhamos, em todos os casos, a proceder a experiências a fim de encontrar uma solução satisfatória. Se modificar este parâmetro, não esqueça também de adaptar o sítio público (balisa<tt>#CHARSET</tt>).',
805
-	'texte_jeu_caractere_3' => 'O seu sítio usa actualmente o conjunto de caracteres:',
806
-	'texte_jeu_caractere_4' => 'Se não corresponde aos seus dados actuais (pode ocorrer após restaurar a base de dados a partir de uma cópia de segurança), ou se <em> estiver a configurar este sítio </em> e deseja usar um conjunto diferente de caracteres, por favor indique-o aqui :',
807
-	'texte_login_ldap_1' => '(Deixar vazio para um acesso anónimo, ou introduzir o caminho completo, por exemplo, « <tt>uid=silva, ou=users, dc=meu-dominio, dc=com</tt> ».)',
808
-	'texte_login_precaution' => 'Atenção ! Isto é o login sob o qual está ligado actualmente.
801
+    'texte_informations_personnelles_1' => 'O sistema vai agora criar-lhe um acesso personalizado ao sítio',
802
+    'texte_informations_personnelles_2' => '(Nota : se se tratar de uma reinstalação e se o seu acesso continua funcional, pode',
803
+    'texte_introductif_article' => '(Texto introdutório do artigo.)',
804
+    'texte_jeu_caractere' => 'Esta opção é útil se o seu sítio precisa de exibir alfabetos diferentes do alfabeto romano (ou  «ocidental») e seus derivados. Nesse caso, pode ser preferível mudar a definição por defeito para utilizar um conjunto de carácteres adequado; aconselhamos, em todos os casos, a proceder a experiências a fim de encontrar uma solução satisfatória. Se modificar este parâmetro, não esqueça também de adaptar o sítio público (balisa<tt>#CHARSET</tt>).',
805
+    'texte_jeu_caractere_3' => 'O seu sítio usa actualmente o conjunto de caracteres:',
806
+    'texte_jeu_caractere_4' => 'Se não corresponde aos seus dados actuais (pode ocorrer após restaurar a base de dados a partir de uma cópia de segurança), ou se <em> estiver a configurar este sítio </em> e deseja usar um conjunto diferente de caracteres, por favor indique-o aqui :',
807
+    'texte_login_ldap_1' => '(Deixar vazio para um acesso anónimo, ou introduzir o caminho completo, por exemplo, « <tt>uid=silva, ou=users, dc=meu-dominio, dc=com</tt> ».)',
808
+    'texte_login_precaution' => 'Atenção ! Isto é o login sob o qual está ligado actualmente.
809 809
 Utilize este formulário com precaução...',
810
-	'texte_messagerie_agenda' => 'Um sistema de mensagens permite aos redactores deste sítio comunicar directamente entre si na área privada. Está associado a uma agenda.',
811
-	'texte_mise_a_niveau_base_1' => 'Acaba de actualizar os ficheiros SPIP.
810
+    'texte_messagerie_agenda' => 'Um sistema de mensagens permite aos redactores deste sítio comunicar directamente entre si na área privada. Está associado a uma agenda.',
811
+    'texte_mise_a_niveau_base_1' => 'Acaba de actualizar os ficheiros SPIP.
812 812
 Agora é preciso pôr a nível a base de dados do sítio. ',
813
-	'texte_modifier_article' => 'Modificar o artigo :',
814
-	'texte_multilinguisme' => 'Se desejar gerir artigos em muitos idiomas, com uma navegação complexa, pode acrescentar um menu de idioma aos artigos e/ou às rubricas, em função da organização do seu sítio.',
815
-	'texte_multilinguisme_trad' => 'Pode também activar um sistema de gestão de ligações entre as diferentes traduções de um artigo.',
816
-	'texte_non_compresse' => '<i>não comprimido</i> ( o seu servidor não suporta esta funcionalidade)',
817
-	'texte_nouvelle_version_spip_1' => 'Instalou uma nova versão de SPIP.',
818
-	'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma actualização mais completa do que o normal. Se é o webmaster do sítio, por favor, apague o ficheiro <tt>inc_connect.php3</tt> do directório <tt>ecrire</tt> e retome a instalação de modo a incluir os seus parâmetros de ligação à base de dados.<p> (NB.: se não se lembra dos seus parâmetros de ligação, consulte o arquivo @connect@ antes de o apagar...)</p>',
819
-	'texte_operation_echec' => 'Volte à página anterior, seleccione uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.',
820
-	'texte_plus_trois_car' => 'mais de 3 carácteres',
821
-	'texte_plusieurs_articles' => 'Muitos autores encontrados para "@cherche_auteur@":',
822
-	'texte_port_annuaire' => '(O valor indicado por defeito geralmente convém.)',
823
-	'texte_presente_plugin' => 'Esta página mostra os plugins disponíveis neste sítio. Pode activar os plugins necessários selaccionando a caixa correspondente.',
824
-	'texte_proposer_publication' => 'Quando terminar o seu artigo, <br /> pode propor a sua publicação.',
825
-	'texte_proxy' => 'Em alguns caso (intranet, redes protegidas...),
813
+    'texte_modifier_article' => 'Modificar o artigo :',
814
+    'texte_multilinguisme' => 'Se desejar gerir artigos em muitos idiomas, com uma navegação complexa, pode acrescentar um menu de idioma aos artigos e/ou às rubricas, em função da organização do seu sítio.',
815
+    'texte_multilinguisme_trad' => 'Pode também activar um sistema de gestão de ligações entre as diferentes traduções de um artigo.',
816
+    'texte_non_compresse' => '<i>não comprimido</i> ( o seu servidor não suporta esta funcionalidade)',
817
+    'texte_nouvelle_version_spip_1' => 'Instalou uma nova versão de SPIP.',
818
+    'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma actualização mais completa do que o normal. Se é o webmaster do sítio, por favor, apague o ficheiro <tt>inc_connect.php3</tt> do directório <tt>ecrire</tt> e retome a instalação de modo a incluir os seus parâmetros de ligação à base de dados.<p> (NB.: se não se lembra dos seus parâmetros de ligação, consulte o arquivo @connect@ antes de o apagar...)</p>',
819
+    'texte_operation_echec' => 'Volte à página anterior, seleccione uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.',
820
+    'texte_plus_trois_car' => 'mais de 3 carácteres',
821
+    'texte_plusieurs_articles' => 'Muitos autores encontrados para "@cherche_auteur@":',
822
+    'texte_port_annuaire' => '(O valor indicado por defeito geralmente convém.)',
823
+    'texte_presente_plugin' => 'Esta página mostra os plugins disponíveis neste sítio. Pode activar os plugins necessários selaccionando a caixa correspondente.',
824
+    'texte_proposer_publication' => 'Quando terminar o seu artigo, <br /> pode propor a sua publicação.',
825
+    'texte_proxy' => 'Em alguns caso (intranet, redes protegidas...),
826 826
  pode ser necessário utilizar um <i>proxy HTTP</i>  para atingir os sítios vinculados.
827 827
  Se for o caso, indique a seguir o endereço, sob a forma
828 828
  @proxy_en_cours@. Em geral,
829 829
  poderá deixar esta caixa vazia.',
830
-	'texte_publication_articles_post_dates' => 'Que comportamento SPIP deve adoptar perante os artigos cuja
830
+    'texte_publication_articles_post_dates' => 'Que comportamento SPIP deve adoptar perante os artigos cuja
831 831
  data de publicação foi fixada para um prazo futuro ?',
832
-	'texte_rappel_selection_champs' => '[Não esquecer de seleccionar correctamente este campo.]',
833
-	'texte_recalcul_page' => 'Se quiser
832
+    'texte_rappel_selection_champs' => '[Não esquecer de seleccionar correctamente este campo.]',
833
+    'texte_recalcul_page' => 'Se quiser
834 834
 recompor uma única página, passe pelo espaço público e utilize o botão «recompor».',
835
-	'texte_recuperer_base' => 'Reparar a base de dados',
836
-	'texte_reference_mais_redirige' => 'artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL.',
837
-	'texte_requetes_echouent' => '<b>Quando algumas consultas SQL falharem sistematicamente e sem razão aparente, é possível que seja por causa da  própria base de dados
835
+    'texte_recuperer_base' => 'Reparar a base de dados',
836
+    'texte_reference_mais_redirige' => 'artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL.',
837
+    'texte_requetes_echouent' => '<b>Quando algumas consultas SQL falharem sistematicamente e sem razão aparente, é possível que seja por causa da  própria base de dados
838 838
 .</b><p>
839 839
 SQL dispõe de uma funcionalidade de reparação das suas tabelas quando forem acidententalmente danificadas. Pode tentar aqui essa reparação: se falhar, conserve uma cópia da exibição que talvez contenha
840 840
 indícios daquilo que não funciona...<p>
841 841
 Se o problema persistir, contacte o seu serviço de hospedagem.',
842
-	'texte_selection_langue_principale' => 'Pode seleccionar a seguir o  « idioma principal » do sítio. Esta opção não o obriga - felizmente ! - a escrever os seus artigos no idioma seleccionado, mas permite determinar :
842
+    'texte_selection_langue_principale' => 'Pode seleccionar a seguir o  « idioma principal » do sítio. Esta opção não o obriga - felizmente ! - a escrever os seus artigos no idioma seleccionado, mas permite determinar :
843 843
  <u><li> o formato por defeito das datas no sítio público ;</li>
844 844
  <li> a natureza do motor tipográfico que SPIP deve utilizar para a restituição dos textos ;</li>
845 845
   <li> o idioma utilizado nos formulários do sítio público ;</li>
846 846
   <li> o idioma apresentado por defeito no espaço privado.</li></ul> ',
847
-	'texte_sous_titre' => 'Sub-título',
848
-	'texte_statistiques_visites' => '(barras escuras : domingo / curva escura : evolução da média)',
849
-	'texte_statut_attente_validation' => 'à espera de validação',
850
-	'texte_statut_publies' => 'publicados online',
851
-	'texte_statut_refuses' => 'recusados',
852
-	'texte_suppression_fichiers' => 'Utilize este comando para suprimir todos os ficheiros presentes
847
+    'texte_sous_titre' => 'Sub-título',
848
+    'texte_statistiques_visites' => '(barras escuras : domingo / curva escura : evolução da média)',
849
+    'texte_statut_attente_validation' => 'à espera de validação',
850
+    'texte_statut_publies' => 'publicados online',
851
+    'texte_statut_refuses' => 'recusados',
852
+    'texte_suppression_fichiers' => 'Utilize este comando para suprimir todos os ficheiros presentes
853 853
 na cache SPIP. Isso permite, por exemplo, obrigar uma recomposição de todas as páginas se você
854 854
  fez modificações importantes de grafismo ou de estrutura do sítio.',
855
-	'texte_sur_titre' => 'Supra-título',
856
-	'texte_table_ok' => ': esta tabela está OK.',
857
-	'texte_tentative_recuperation' => 'Tentativa de reparação',
858
-	'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
859
-	'texte_test_proxy' => 'Para experimentar este proxy, indique aqui o endereço de um sítio Web
855
+    'texte_sur_titre' => 'Supra-título',
856
+    'texte_table_ok' => ': esta tabela está OK.',
857
+    'texte_tentative_recuperation' => 'Tentativa de reparação',
858
+    'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
859
+    'texte_test_proxy' => 'Para experimentar este proxy, indique aqui o endereço de um sítio Web
860 860
   que deseje testar;',
861
-	'texte_titre_02' => 'Título',
862
-	'texte_titre_obligatoire' => '<b>Título</b> [Obrigatório]',
863
-	'texte_travail_article' => '@nom_auteur_modif@ trabalhou sobre este artigo há @date_diff@ minutes',
864
-	'texte_travail_collaboratif' => 'Se é frequente muitos redactores
861
+    'texte_titre_02' => 'Título',
862
+    'texte_titre_obligatoire' => '<b>Título</b> [Obrigatório]',
863
+    'texte_travail_article' => '@nom_auteur_modif@ trabalhou sobre este artigo há @date_diff@ minutes',
864
+    'texte_travail_collaboratif' => 'Se é frequente muitos redactores
865 865
  trabalharem no mesmo artigo, o sistema
866 866
  pode exibir os artigos recentemente « abertos »
867 867
 a fim de evitar as modificações simultâneas.
868 868
   Esta opção está desactivada por defeito
869 869
   a fim de evitar exibir mensagens de aviso
870 870
  intempestivas.',
871
-	'texte_vide' => 'vazio',
872
-	'texte_vider_cache' => 'Esvaziar a cache',
873
-	'titre_admin_tech' => 'Manutenção técnica',
874
-	'titre_admin_vider' => 'Manutenção técnica',
875
-	'titre_ajouter_un_auteur' => 'Adicionar um autor',
876
-	'titre_ajouter_un_mot' => 'Adicionar uma palavra-chave',
877
-	'titre_cadre_afficher_article' => 'Exibir os artigos',
878
-	'titre_cadre_afficher_traductions' => 'Exibir o estado das traduções para estes idiomas:',
879
-	'titre_cadre_ajouter_auteur' => 'ACRESCENTAR UM AUTOR :',
880
-	'titre_cadre_interieur_rubrique' => 'Dentro da rubrica',
881
-	'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
882
-	'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
883
-	'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [Obrigatória]<br />',
884
-	'titre_config_contenu_notifications' => 'Notificações',
885
-	'titre_config_contenu_prive' => 'Na área privada',
886
-	'titre_config_contenu_public' => 'No sítio público',
887
-	'titre_config_fonctions' => 'Configuração do sítio',
888
-	'titre_config_langage' => 'Configurar o idioma',
889
-	'titre_configuration' => 'Configuração do sítio',
890
-	'titre_configurer_preferences' => 'Configure as suas preferências',
891
-	'titre_configurer_preferences_menus' => 'Definir as suas preferências de menu',
892
-	'titre_conflit_edition' => 'Conflito durante a redacção',
893
-	'titre_connexion_ldap' => 'Opções: <b>Sua ligação LDAP</b>',
894
-	'titre_groupe_mots' => 'GRUPO DE PALAVRAS :',
895
-	'titre_identite_site' => 'Identidade do sítio',
896
-	'titre_langue_article' => 'IDIOMA DO ARTIGO ',
897
-	'titre_langue_rubrique' => 'Idioma da rubrica',
898
-	'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DO ARTIGO',
899
-	'titre_les_articles' => 'OS ARTIGOS',
900
-	'titre_messagerie_agenda' => 'Mensagens e agenda',
901
-	'titre_naviguer_dans_le_site' => 'Navegar no sítio',
902
-	'titre_nouvelle_rubrique' => 'Nova rubrica',
903
-	'titre_numero_rubrique' => 'RUBRICA NÚMERO :',
904
-	'titre_page_articles_edit' => 'Modificar : @titre@',
905
-	'titre_page_articles_page' => 'Os artigos',
906
-	'titre_page_articles_tous' => 'Todo o sítio',
907
-	'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
908
-	'titre_page_config_contenu' => 'Configuração do sítio',
909
-	'titre_page_delete_all' => 'Supressão total e irreversível',
910
-	'titre_page_recherche' => 'Resultados da pesquisa @recherche@',
911
-	'titre_page_statistiques_referers' => 'Estatísticas (ligações de entrada)',
912
-	'titre_page_upgrade' => 'Reactualização de SPIP',
913
-	'titre_preference_menus_favoris' => 'Menus de marcadores',
914
-	'titre_publication_articles_post_dates' => 'Publicação dos artigos pós-datados',
915
-	'titre_reparation' => 'Reparação',
916
-	'titre_suivi_petition' => 'Seguimento dos abaixo-assinados',
917
-	'tls_ldap' => 'Transport Layer Security :',
918
-	'trad_article_traduction' => 'Todas as versões deste artigo :',
919
-	'trad_delier' => 'Não voltar a ligar este artigo a estas traduções',
920
-	'trad_lier' => 'Este artigo é uma tradução do artigo número :',
921
-	'trad_new' => 'Escrever uma nova tradução deste artigo',
871
+    'texte_vide' => 'vazio',
872
+    'texte_vider_cache' => 'Esvaziar a cache',
873
+    'titre_admin_tech' => 'Manutenção técnica',
874
+    'titre_admin_vider' => 'Manutenção técnica',
875
+    'titre_ajouter_un_auteur' => 'Adicionar um autor',
876
+    'titre_ajouter_un_mot' => 'Adicionar uma palavra-chave',
877
+    'titre_cadre_afficher_article' => 'Exibir os artigos',
878
+    'titre_cadre_afficher_traductions' => 'Exibir o estado das traduções para estes idiomas:',
879
+    'titre_cadre_ajouter_auteur' => 'ACRESCENTAR UM AUTOR :',
880
+    'titre_cadre_interieur_rubrique' => 'Dentro da rubrica',
881
+    'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
882
+    'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
883
+    'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [Obrigatória]<br />',
884
+    'titre_config_contenu_notifications' => 'Notificações',
885
+    'titre_config_contenu_prive' => 'Na área privada',
886
+    'titre_config_contenu_public' => 'No sítio público',
887
+    'titre_config_fonctions' => 'Configuração do sítio',
888
+    'titre_config_langage' => 'Configurar o idioma',
889
+    'titre_configuration' => 'Configuração do sítio',
890
+    'titre_configurer_preferences' => 'Configure as suas preferências',
891
+    'titre_configurer_preferences_menus' => 'Definir as suas preferências de menu',
892
+    'titre_conflit_edition' => 'Conflito durante a redacção',
893
+    'titre_connexion_ldap' => 'Opções: <b>Sua ligação LDAP</b>',
894
+    'titre_groupe_mots' => 'GRUPO DE PALAVRAS :',
895
+    'titre_identite_site' => 'Identidade do sítio',
896
+    'titre_langue_article' => 'IDIOMA DO ARTIGO ',
897
+    'titre_langue_rubrique' => 'Idioma da rubrica',
898
+    'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DO ARTIGO',
899
+    'titre_les_articles' => 'OS ARTIGOS',
900
+    'titre_messagerie_agenda' => 'Mensagens e agenda',
901
+    'titre_naviguer_dans_le_site' => 'Navegar no sítio',
902
+    'titre_nouvelle_rubrique' => 'Nova rubrica',
903
+    'titre_numero_rubrique' => 'RUBRICA NÚMERO :',
904
+    'titre_page_articles_edit' => 'Modificar : @titre@',
905
+    'titre_page_articles_page' => 'Os artigos',
906
+    'titre_page_articles_tous' => 'Todo o sítio',
907
+    'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
908
+    'titre_page_config_contenu' => 'Configuração do sítio',
909
+    'titre_page_delete_all' => 'Supressão total e irreversível',
910
+    'titre_page_recherche' => 'Resultados da pesquisa @recherche@',
911
+    'titre_page_statistiques_referers' => 'Estatísticas (ligações de entrada)',
912
+    'titre_page_upgrade' => 'Reactualização de SPIP',
913
+    'titre_preference_menus_favoris' => 'Menus de marcadores',
914
+    'titre_publication_articles_post_dates' => 'Publicação dos artigos pós-datados',
915
+    'titre_reparation' => 'Reparação',
916
+    'titre_suivi_petition' => 'Seguimento dos abaixo-assinados',
917
+    'tls_ldap' => 'Transport Layer Security :',
918
+    'trad_article_traduction' => 'Todas as versões deste artigo :',
919
+    'trad_delier' => 'Não voltar a ligar este artigo a estas traduções',
920
+    'trad_lier' => 'Este artigo é uma tradução do artigo número :',
921
+    'trad_new' => 'Escrever uma nova tradução deste artigo',
922 922
 
923
-	// U
924
-	'utf8_convert_erreur_orig' => 'Erro : o conjunto de caracteres @charset@ não é suportado.',
923
+    // U
924
+    'utf8_convert_erreur_orig' => 'Erro : o conjunto de caracteres @charset@ não é suportado.',
925 925
 
926
-	// V
927
-	'version' => 'Versão:'
926
+    // V
927
+    'version' => 'Versão:'
928 928
 );
Please login to merge, or discard this patch.
ecrire/exec/admin_plugin.php 1 patch
Indentation   +203 added lines, -203 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 include_spip('inc/config');
@@ -37,26 +37,26 @@  discard block
 block discarded – undo
37 37
  */
38 38
 function exec_admin_plugin_dist($retour = '') {
39 39
 
40
-	if (!autoriser('configurer', '_plugins')) {
41
-		include_spip('inc/minipres');
42
-		echo minipres();
43
-	} else {
44
-		// on fait la verif du path avant tout,
45
-		// et l'installation des qu'on est dans la colonne principale
46
-		// si jamais la liste des plugins actifs change, il faut faire un refresh du hit
47
-		// pour etre sur que les bons fichiers seront charges lors de l'install
48
-		$new = actualise_plugins_actifs();
49
-		if ($new and _request('actualise') < 2) {
50
-			include_spip('inc/headers');
51
-			if (isset($GLOBALS['fichier_php_compile_recent'])) {
52
-				// attendre eventuellement l'invalidation du cache opcode
53
-				spip_attend_invalidation_opcode_cache($GLOBALS['fichier_php_compile_recent']);
54
-			}
55
-			redirige_par_entete(parametre_url(self(), 'actualise', _request('actualise') + 1, '&'));
56
-		} else {
57
-			admin_plug_args(_request('voir'), _request('erreur'), _request('format'));
58
-		}
59
-	}
40
+    if (!autoriser('configurer', '_plugins')) {
41
+        include_spip('inc/minipres');
42
+        echo minipres();
43
+    } else {
44
+        // on fait la verif du path avant tout,
45
+        // et l'installation des qu'on est dans la colonne principale
46
+        // si jamais la liste des plugins actifs change, il faut faire un refresh du hit
47
+        // pour etre sur que les bons fichiers seront charges lors de l'install
48
+        $new = actualise_plugins_actifs();
49
+        if ($new and _request('actualise') < 2) {
50
+            include_spip('inc/headers');
51
+            if (isset($GLOBALS['fichier_php_compile_recent'])) {
52
+                // attendre eventuellement l'invalidation du cache opcode
53
+                spip_attend_invalidation_opcode_cache($GLOBALS['fichier_php_compile_recent']);
54
+            }
55
+            redirige_par_entete(parametre_url(self(), 'actualise', _request('actualise') + 1, '&'));
56
+        } else {
57
+            admin_plug_args(_request('voir'), _request('erreur'), _request('format'));
58
+        }
59
+    }
60 60
 }
61 61
 
62 62
 /**
@@ -81,132 +81,132 @@  discard block
 block discarded – undo
81 81
  *     Format d'affichage (liste ou arborescence)
82 82
  **/
83 83
 function admin_plug_args($quoi, $erreur, $format) {
84
-	$lpf = null;
85
-	$lcpas = null;
86
-	$lcpaffichesup = null;
87
-	if (!$quoi) {
88
-		$quoi = 'actifs';
89
-	}
90
-	// empecher l'affichage des erreurs dans le bandeau, on le donne ensuite
91
-	// format brut par plugin
92
-	$GLOBALS['erreurs_activation_raw'] = plugin_donne_erreurs(true, false);
93
-	// format resume mis en forme
94
-	$erreur_activation = plugin_donne_erreurs();
95
-	$commencer_page = charger_fonction('commencer_page', 'inc');
96
-	echo $commencer_page(_T('icone_admin_plugin'), 'configuration', 'plugin');
97
-
98
-	echo debut_gauche();
99
-	echo recuperer_fond('prive/squelettes/navigation/configurer', ['exec' => 'admin_plugin']);
100
-
101
-	echo pipeline(
102
-		'affiche_gauche',
103
-		[
104
-			'args' => ['exec' => 'admin_plugin'],
105
-			'data' => afficher_librairies()
106
-		]
107
-	);
108
-
109
-	echo debut_droite();
110
-	echo gros_titre(_T('icone_admin_plugin'), '');
111
-
112
-	// Barre d'onglets de premier niveau
113
-	echo barre_onglets('plugins', 'plugins_actifs');
114
-	// Barre d'onglets de second niveau
115
-	$onglet2 = $quoi == 'actifs' ? 'plugins_actifs' : 'admin_plugin';
116
-	echo debut_onglet('onglets_simple second');
117
-	echo onglet(_T('plugins_tous_liste'), generer_url_ecrire('admin_plugin', 'voir=tous'), 'admin_plugin', $onglet2);
118
-	echo onglet(_T('plugins_actifs_liste'), generer_url_ecrire('admin_plugin'), 'plugins_actifs', $onglet2);
119
-	echo fin_onglet();
120
-
121
-	// message d'erreur au retour d'une operation
122
-	if ($erreur) {
123
-		echo "<div class='error'>$erreur</div>";
124
-	}
125
-	if ($erreur_activation) {
126
-		echo "<div class='error'>$erreur_activation</div>";
127
-	}
128
-
129
-	// la mise a jour de cette meta a ete faite par ecrire_plugin_actifs
130
-	$actifs = (array) unserialize($GLOBALS['meta']['plugin']);
131
-	$lcpa = $actifs + (array) unserialize($GLOBALS['meta']['plugin_attente']);
132
-
133
-	// Les affichages se basent sur le repertoire, pas sur le nom
134
-	$actifs = liste_chemin_plugin($actifs, '');
135
-	if (defined('_DIR_PLUGINS_SUPPL')) {
136
-		$lcpas = liste_chemin_plugin($lcpa, _DIR_PLUGINS_SUPPL);
137
-	}
138
-	$lcpa = liste_chemin_plugin($lcpa);
139
-
140
-	// on installe les plugins maintenant,
141
-	// cela permet aux scripts d'install de faire des affichages (moches...)
142
-	plugin_installes_meta();
143
-
144
-	echo "<div class='liste-plugins formulaire_spip'>";
145
-	echo debut_cadre_trait_couleur('plugin-24.png', true, '', _T('plugins_liste'), 'plugins');
146
-
147
-	if ($quoi !== 'actifs') {
148
-		$lpf = liste_plugin_files();
149
-		if ($lpf) {
150
-			echo '<p>' . _T('texte_presente_plugin') . '</p>';
151
-		} else {
152
-			if (!@is_dir(_DIR_PLUGINS)) {
153
-				echo '<p>' . _T('plugin_info_automatique_ftp', ['rep' => joli_repertoire(_DIR_PLUGINS)])
154
-					. ' &mdash; ' . _T('plugin_info_automatique_creer') . '</p>';
155
-			}
156
-		}
157
-		$lcpaffiche = $lpf;
158
-		if (defined('_DIR_PLUGINS_SUPPL')) {
159
-			$lcpaffichesup = liste_plugin_files(_DIR_PLUGINS_SUPPL);
160
-		}
161
-	} else {
162
-		// la liste
163
-		// $quoi=='actifs'
164
-		$lcpaffiche = $lcpa;
165
-		if (defined('_DIR_PLUGINS_SUPPL')) {
166
-			$lcpaffichesup = $lcpas;
167
-		}
168
-	}
169
-
170
-	if ($quoi == 'actifs' or $lpf) {
171
-		$nb = is_countable($lcpa) ? count($lcpa) : 0;
172
-		if (defined('_DIR_PLUGINS_SUPPL')) {
173
-			$nb += is_countable($lcpas) ? count($lcpas) : 0;
174
-		}
175
-		echo '<h3>' . sinon(
176
-			singulier_ou_pluriel($nb, 'plugins_actif_un', 'plugins_actifs', 'count'),
177
-			_T('plugins_actif_aucun')
178
-		) . '</h3>';
179
-	}
180
-
181
-	if (empty($format)) {
182
-		$format = 'liste';
183
-	} elseif (!in_array($format, ['liste', 'repertoires'])) {
184
-		$format = 'repertoires';
185
-	}
186
-
187
-	$afficher = charger_fonction("afficher_$format", 'plugins');
188
-	$corps = $afficher(self(), $lcpaffiche, $lcpa, $actifs);
189
-	if (defined('_DIR_PLUGINS_SUPPL')) {
190
-		$corps .= $afficher(self(), $lcpaffichesup, $lcpas, $actifs, _DIR_PLUGINS_SUPPL);
191
-	}
192
-
193
-	if ($corps) {
194
-		$corps .= "\n<div class='boutons' style='display:none;'>"
195
-			. "<input type='submit' class='submit save' value='" . _T('bouton_enregistrer')
196
-			. "' />"
197
-			. '</div>';
198
-	}
199
-
200
-	echo redirige_action_post('activer_plugins', 'activer', 'admin_plugin', '', $corps);
201
-
202
-	echo fin_cadre_trait_couleur();
203
-
204
-	if ($quoi == 'actifs') {
205
-		echo affiche_les_plugins_verrouilles($actifs);
206
-	}
207
-	echo '</div>';
208
-
209
-	echo http_script("
84
+    $lpf = null;
85
+    $lcpas = null;
86
+    $lcpaffichesup = null;
87
+    if (!$quoi) {
88
+        $quoi = 'actifs';
89
+    }
90
+    // empecher l'affichage des erreurs dans le bandeau, on le donne ensuite
91
+    // format brut par plugin
92
+    $GLOBALS['erreurs_activation_raw'] = plugin_donne_erreurs(true, false);
93
+    // format resume mis en forme
94
+    $erreur_activation = plugin_donne_erreurs();
95
+    $commencer_page = charger_fonction('commencer_page', 'inc');
96
+    echo $commencer_page(_T('icone_admin_plugin'), 'configuration', 'plugin');
97
+
98
+    echo debut_gauche();
99
+    echo recuperer_fond('prive/squelettes/navigation/configurer', ['exec' => 'admin_plugin']);
100
+
101
+    echo pipeline(
102
+        'affiche_gauche',
103
+        [
104
+            'args' => ['exec' => 'admin_plugin'],
105
+            'data' => afficher_librairies()
106
+        ]
107
+    );
108
+
109
+    echo debut_droite();
110
+    echo gros_titre(_T('icone_admin_plugin'), '');
111
+
112
+    // Barre d'onglets de premier niveau
113
+    echo barre_onglets('plugins', 'plugins_actifs');
114
+    // Barre d'onglets de second niveau
115
+    $onglet2 = $quoi == 'actifs' ? 'plugins_actifs' : 'admin_plugin';
116
+    echo debut_onglet('onglets_simple second');
117
+    echo onglet(_T('plugins_tous_liste'), generer_url_ecrire('admin_plugin', 'voir=tous'), 'admin_plugin', $onglet2);
118
+    echo onglet(_T('plugins_actifs_liste'), generer_url_ecrire('admin_plugin'), 'plugins_actifs', $onglet2);
119
+    echo fin_onglet();
120
+
121
+    // message d'erreur au retour d'une operation
122
+    if ($erreur) {
123
+        echo "<div class='error'>$erreur</div>";
124
+    }
125
+    if ($erreur_activation) {
126
+        echo "<div class='error'>$erreur_activation</div>";
127
+    }
128
+
129
+    // la mise a jour de cette meta a ete faite par ecrire_plugin_actifs
130
+    $actifs = (array) unserialize($GLOBALS['meta']['plugin']);
131
+    $lcpa = $actifs + (array) unserialize($GLOBALS['meta']['plugin_attente']);
132
+
133
+    // Les affichages se basent sur le repertoire, pas sur le nom
134
+    $actifs = liste_chemin_plugin($actifs, '');
135
+    if (defined('_DIR_PLUGINS_SUPPL')) {
136
+        $lcpas = liste_chemin_plugin($lcpa, _DIR_PLUGINS_SUPPL);
137
+    }
138
+    $lcpa = liste_chemin_plugin($lcpa);
139
+
140
+    // on installe les plugins maintenant,
141
+    // cela permet aux scripts d'install de faire des affichages (moches...)
142
+    plugin_installes_meta();
143
+
144
+    echo "<div class='liste-plugins formulaire_spip'>";
145
+    echo debut_cadre_trait_couleur('plugin-24.png', true, '', _T('plugins_liste'), 'plugins');
146
+
147
+    if ($quoi !== 'actifs') {
148
+        $lpf = liste_plugin_files();
149
+        if ($lpf) {
150
+            echo '<p>' . _T('texte_presente_plugin') . '</p>';
151
+        } else {
152
+            if (!@is_dir(_DIR_PLUGINS)) {
153
+                echo '<p>' . _T('plugin_info_automatique_ftp', ['rep' => joli_repertoire(_DIR_PLUGINS)])
154
+                    . ' &mdash; ' . _T('plugin_info_automatique_creer') . '</p>';
155
+            }
156
+        }
157
+        $lcpaffiche = $lpf;
158
+        if (defined('_DIR_PLUGINS_SUPPL')) {
159
+            $lcpaffichesup = liste_plugin_files(_DIR_PLUGINS_SUPPL);
160
+        }
161
+    } else {
162
+        // la liste
163
+        // $quoi=='actifs'
164
+        $lcpaffiche = $lcpa;
165
+        if (defined('_DIR_PLUGINS_SUPPL')) {
166
+            $lcpaffichesup = $lcpas;
167
+        }
168
+    }
169
+
170
+    if ($quoi == 'actifs' or $lpf) {
171
+        $nb = is_countable($lcpa) ? count($lcpa) : 0;
172
+        if (defined('_DIR_PLUGINS_SUPPL')) {
173
+            $nb += is_countable($lcpas) ? count($lcpas) : 0;
174
+        }
175
+        echo '<h3>' . sinon(
176
+            singulier_ou_pluriel($nb, 'plugins_actif_un', 'plugins_actifs', 'count'),
177
+            _T('plugins_actif_aucun')
178
+        ) . '</h3>';
179
+    }
180
+
181
+    if (empty($format)) {
182
+        $format = 'liste';
183
+    } elseif (!in_array($format, ['liste', 'repertoires'])) {
184
+        $format = 'repertoires';
185
+    }
186
+
187
+    $afficher = charger_fonction("afficher_$format", 'plugins');
188
+    $corps = $afficher(self(), $lcpaffiche, $lcpa, $actifs);
189
+    if (defined('_DIR_PLUGINS_SUPPL')) {
190
+        $corps .= $afficher(self(), $lcpaffichesup, $lcpas, $actifs, _DIR_PLUGINS_SUPPL);
191
+    }
192
+
193
+    if ($corps) {
194
+        $corps .= "\n<div class='boutons' style='display:none;'>"
195
+            . "<input type='submit' class='submit save' value='" . _T('bouton_enregistrer')
196
+            . "' />"
197
+            . '</div>';
198
+    }
199
+
200
+    echo redirige_action_post('activer_plugins', 'activer', 'admin_plugin', '', $corps);
201
+
202
+    echo fin_cadre_trait_couleur();
203
+
204
+    if ($quoi == 'actifs') {
205
+        echo affiche_les_plugins_verrouilles($actifs);
206
+    }
207
+    echo '</div>';
208
+
209
+    echo http_script("
210 210
 	jQuery(function(){
211 211
 		jQuery('.plugins li.item a[rel=info]').click(function(){
212 212
 			var li = jQuery(this).parents('li').eq(0);
@@ -232,15 +232,15 @@  discard block
 block discarded – undo
232 232
 	});
233 233
 	");
234 234
 
235
-	echo pipeline(
236
-		'affiche_milieu',
237
-		[
238
-			'args' => ['exec' => 'admin_plugin'],
239
-			'data' => ''
240
-		]
241
-	);
235
+    echo pipeline(
236
+        'affiche_milieu',
237
+        [
238
+            'args' => ['exec' => 'admin_plugin'],
239
+            'data' => ''
240
+        ]
241
+    );
242 242
 
243
-	echo fin_gauche(), fin_page();
243
+    echo fin_gauche(), fin_page();
244 244
 }
245 245
 
246 246
 /**
@@ -254,23 +254,23 @@  discard block
 block discarded – undo
254 254
  *     Code HTML
255 255
  **/
256 256
 function affiche_les_plugins_verrouilles($actifs) {
257
-	if ((!$liste = liste_plugin_files(_DIR_PLUGINS_DIST))) {
258
-		return '';
259
-	}
260
-
261
-	$afficher = charger_fonction('afficher_liste', 'plugins');
262
-	$liste = $afficher(self(), $liste, [], $actifs, _DIR_PLUGINS_DIST);
263
-
264
-	return
265
-		"<div id='plugins_dist'>"
266
-		. debut_cadre_trait_couleur('', true, '', _T('plugins_liste_dist'), 'liste_plugins_dist')
267
-		. '<p>'
268
-		. _T('plugin_info_plugins_dist_1', ['plugins_dist' => joli_repertoire(_DIR_PLUGINS_DIST)])
269
-		. '<br />' . _T('plugin_info_plugins_dist_2')
270
-		. '</p>'
271
-		. $liste
272
-		. fin_cadre_trait_couleur()
273
-		. "</div>\n";
257
+    if ((!$liste = liste_plugin_files(_DIR_PLUGINS_DIST))) {
258
+        return '';
259
+    }
260
+
261
+    $afficher = charger_fonction('afficher_liste', 'plugins');
262
+    $liste = $afficher(self(), $liste, [], $actifs, _DIR_PLUGINS_DIST);
263
+
264
+    return
265
+        "<div id='plugins_dist'>"
266
+        . debut_cadre_trait_couleur('', true, '', _T('plugins_liste_dist'), 'liste_plugins_dist')
267
+        . '<p>'
268
+        . _T('plugin_info_plugins_dist_1', ['plugins_dist' => joli_repertoire(_DIR_PLUGINS_DIST)])
269
+        . '<br />' . _T('plugin_info_plugins_dist_2')
270
+        . '</p>'
271
+        . $liste
272
+        . fin_cadre_trait_couleur()
273
+        . "</div>\n";
274 274
 }
275 275
 
276 276
 /**
@@ -282,19 +282,19 @@  discard block
 block discarded – undo
282 282
  */
283 283
 function afficher_librairies() {
284 284
 
285
-	if (!$libs = liste_librairies()) {
286
-		return '';
287
-	}
288
-	ksort($libs);
289
-	$res = debut_cadre_enfonce('', true, '', _T('plugin_librairies_installees'));
290
-	$res .= '<dl>';
291
-	foreach ($libs as $lib => $rep) {
292
-		$res .= "<dt>$lib</dt><dd>" . joli_repertoire($rep) . "</dd>\n";
293
-	}
294
-	$res .= '</dl>';
295
-	$res .= fin_cadre_enfonce();
296
-
297
-	return $res;
285
+    if (!$libs = liste_librairies()) {
286
+        return '';
287
+    }
288
+    ksort($libs);
289
+    $res = debut_cadre_enfonce('', true, '', _T('plugin_librairies_installees'));
290
+    $res .= '<dl>';
291
+    foreach ($libs as $lib => $rep) {
292
+        $res .= "<dt>$lib</dt><dd>" . joli_repertoire($rep) . "</dd>\n";
293
+    }
294
+    $res .= '</dl>';
295
+    $res .= fin_cadre_enfonce();
296
+
297
+    return $res;
298 298
 }
299 299
 
300 300
 
@@ -305,22 +305,22 @@  discard block
 block discarded – undo
305 305
  *     Tableau (nom de la lib => repertoire , ...)
306 306
  */
307 307
 function liste_librairies() {
308
-	$libs = [];
309
-	foreach (array_reverse(creer_chemin()) as $d) {
310
-		if (
311
-			is_dir($dir = $d . 'lib/')
312
-			and $t = opendir($dir)
313
-		) {
314
-			while (($f = readdir($t)) !== false) {
315
-				if (
316
-					$f[0] != '.'
317
-					and is_dir("$dir/$f")
318
-				) {
319
-					$libs[$f] = $dir;
320
-				}
321
-			}
322
-		}
323
-	}
324
-
325
-	return $libs;
308
+    $libs = [];
309
+    foreach (array_reverse(creer_chemin()) as $d) {
310
+        if (
311
+            is_dir($dir = $d . 'lib/')
312
+            and $t = opendir($dir)
313
+        ) {
314
+            while (($f = readdir($t)) !== false) {
315
+                if (
316
+                    $f[0] != '.'
317
+                    and is_dir("$dir/$f")
318
+                ) {
319
+                    $libs[$f] = $dir;
320
+                }
321
+            }
322
+        }
323
+    }
324
+
325
+    return $libs;
326 326
 }
Please login to merge, or discard this patch.