Completed
Push — master ( d9afd7...afcd40 )
by cam
01:15
created
ecrire/lang/spip_pt.php 1 patch
Indentation   +643 added lines, -643 removed lines patch added patch discarded remove patch
@@ -4,571 +4,571 @@  discard block
 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
-	'access_interface_graphique' => 'Voltar à interface gráfica completa',
14
-	'access_mode_texte' => 'Exibir a interface textual simplificada',
15
-	'admin_debug' => 'debug',
16
-	'admin_modifier_article' => 'Modificar este artigo',
17
-	'admin_modifier_auteur' => 'Modificar este autor',
18
-	'admin_modifier_breve' => 'Modificar esta notícia',
19
-	'admin_modifier_mot' => 'Modificar esta palavra-chave',
20
-	'admin_modifier_rubrique' => 'Modificar esta rubrica',
21
-	'admin_recalculer' => 'Recompor esta página',
22
-	'afficher_calendrier' => 'Exibir o calendário',
23
-	'afficher_trad' => 'exibir as traduções',
24
-	'alerte_maj_impossible' => '<b>Alerta !</b> A actualização da base de dados SQL para a versão @version@ é impossível, talvez por causa de um problema de permissão de modificação na base de dados. Por favor contacte o seu serviço de hospedagem.',
25
-	'alerte_modif_info_concourante' => 'ATTENÇÃO : Esta informação já foi modificada noutro menu. O valor actual é :',
26
-	'analyse_xml' => 'Análise XML',
27
-	'annuler' => 'Cancelar',
28
-	'antispam_champ_vide' => 'Por favor deixe este campo vazio :',
29
-	'articles_recents' => 'Artigos mais recentes',
30
-	'avis_archive_incorrect' => 'o ficheiro arquivo não é um ficheiro SPIP',
31
-	'avis_archive_invalide' => 'o ficheiro arquivo não é válido ',
32
-	'avis_attention' => ' ATENÇÂO!',
33
-	'avis_champ_incorrect_type_objet' => 'Nome de campo incorrecto @name@ para objecto de tipo @type@',
34
-	'avis_colonne_inexistante' => 'A coluna  @col@ não existe',
35
-	'avis_erreur' => 'Erro: ver mais abaixo',
36
-	'avis_erreur_connexion' => 'Erro de ligação ',
37
-	'avis_erreur_cookie' => 'problema de cookie',
38
-	'avis_erreur_fonction_contexte' => 'Erro de programação. Não se pode chamar esta função neste contexto.',
39
-	'avis_erreur_mysql' => 'Erro SQL',
40
-	'avis_erreur_sauvegarde' => 'Erro na cópia de segurança  (@type@ @id_objet@) !',
41
-	'avis_erreur_visiteur' => 'Problema de acesso à área privada',
12
+    // A
13
+    'access_interface_graphique' => 'Voltar à interface gráfica completa',
14
+    'access_mode_texte' => 'Exibir a interface textual simplificada',
15
+    'admin_debug' => 'debug',
16
+    'admin_modifier_article' => 'Modificar este artigo',
17
+    'admin_modifier_auteur' => 'Modificar este autor',
18
+    'admin_modifier_breve' => 'Modificar esta notícia',
19
+    'admin_modifier_mot' => 'Modificar esta palavra-chave',
20
+    'admin_modifier_rubrique' => 'Modificar esta rubrica',
21
+    'admin_recalculer' => 'Recompor esta página',
22
+    'afficher_calendrier' => 'Exibir o calendário',
23
+    'afficher_trad' => 'exibir as traduções',
24
+    'alerte_maj_impossible' => '<b>Alerta !</b> A actualização da base de dados SQL para a versão @version@ é impossível, talvez por causa de um problema de permissão de modificação na base de dados. Por favor contacte o seu serviço de hospedagem.',
25
+    'alerte_modif_info_concourante' => 'ATTENÇÃO : Esta informação já foi modificada noutro menu. O valor actual é :',
26
+    'analyse_xml' => 'Análise XML',
27
+    'annuler' => 'Cancelar',
28
+    'antispam_champ_vide' => 'Por favor deixe este campo vazio :',
29
+    'articles_recents' => 'Artigos mais recentes',
30
+    'avis_archive_incorrect' => 'o ficheiro arquivo não é um ficheiro SPIP',
31
+    'avis_archive_invalide' => 'o ficheiro arquivo não é válido ',
32
+    'avis_attention' => ' ATENÇÂO!',
33
+    'avis_champ_incorrect_type_objet' => 'Nome de campo incorrecto @name@ para objecto de tipo @type@',
34
+    'avis_colonne_inexistante' => 'A coluna  @col@ não existe',
35
+    'avis_erreur' => 'Erro: ver mais abaixo',
36
+    'avis_erreur_connexion' => 'Erro de ligação ',
37
+    'avis_erreur_cookie' => 'problema de cookie',
38
+    'avis_erreur_fonction_contexte' => 'Erro de programação. Não se pode chamar esta função neste contexto.',
39
+    'avis_erreur_mysql' => 'Erro SQL',
40
+    'avis_erreur_sauvegarde' => 'Erro na cópia de segurança  (@type@ @id_objet@) !',
41
+    'avis_erreur_visiteur' => 'Problema de acesso à área privada',
42 42
 
43
-	// B
44
-	'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
45
-	'barre_aide' => 'Utilize as abreviaturas tipográficas para enriquecer a sua paginação.',
46
-	'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo ',
47
-	'barre_eo' => 'Inserir um E no O',
48
-	'barre_eo_maj' => 'Inserir um E no O maiúsculo',
49
-	'barre_euro' => 'Inserir o símbolo €',
50
-	'barre_gras' => '  Escrever em {{negro}}',
51
-	'barre_guillemets' => 'Colocar entre "aspas" ',
52
-	'barre_guillemets_simples' => 'Colocar entre ’aspas simples’',
53
-	'barre_intertitre' => 'Transfomar em  {{{intertítulo}}} ',
54
-	'barre_italic' => 'Pôr em itálico ',
55
-	'barre_lien' => 'Transformar em [ligação hipertexto->http://...]',
56
-	'barre_lien_input' => 'Por favor indique o endereço da sua ligação (pode indicar um endereço Web sob a forma  http://www.monsite/com ou simplesmente indicar o número de um artigo deste sítio.) ',
57
-	'barre_note' => 'Transformar em  [[Nota de rodapé ]]',
58
-	'barre_paragraphe' => 'Criar um parágrafo',
59
-	'barre_quote' => '<quote>Citar uma  mensagem</quote>',
60
-	'bouton_changer' => 'Modificar',
61
-	'bouton_chercher' => 'Procurar',
62
-	'bouton_choisir' => 'Seleccionar',
63
-	'bouton_deplacer' => 'Mover',
64
-	'bouton_download' => 'Download',
65
-	'bouton_enregistrer' => 'Guardar',
66
-	'bouton_radio_desactiver_messagerie_interne' => 'Desactivar a caixa de correio interno',
67
-	'bouton_radio_envoi_annonces' => 'Enviar os anúncios editoriais',
68
-	'bouton_radio_non_envoi_annonces' => 'Não enviar anúncios',
69
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
70
-	'bouton_recharger_page' => 'recarregar esta página',
71
-	'bouton_telecharger' => 'Carregar',
72
-	'bouton_upload' => 'Carregar',
73
-	'bouton_valider' => 'Submeter',
43
+    // B
44
+    'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
45
+    'barre_aide' => 'Utilize as abreviaturas tipográficas para enriquecer a sua paginação.',
46
+    'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo ',
47
+    'barre_eo' => 'Inserir um E no O',
48
+    'barre_eo_maj' => 'Inserir um E no O maiúsculo',
49
+    'barre_euro' => 'Inserir o símbolo €',
50
+    'barre_gras' => '  Escrever em {{negro}}',
51
+    'barre_guillemets' => 'Colocar entre "aspas" ',
52
+    'barre_guillemets_simples' => 'Colocar entre ’aspas simples’',
53
+    'barre_intertitre' => 'Transfomar em  {{{intertítulo}}} ',
54
+    'barre_italic' => 'Pôr em itálico ',
55
+    'barre_lien' => 'Transformar em [ligação hipertexto->http://...]',
56
+    'barre_lien_input' => 'Por favor indique o endereço da sua ligação (pode indicar um endereço Web sob a forma  http://www.monsite/com ou simplesmente indicar o número de um artigo deste sítio.) ',
57
+    'barre_note' => 'Transformar em  [[Nota de rodapé ]]',
58
+    'barre_paragraphe' => 'Criar um parágrafo',
59
+    'barre_quote' => '<quote>Citar uma  mensagem</quote>',
60
+    'bouton_changer' => 'Modificar',
61
+    'bouton_chercher' => 'Procurar',
62
+    'bouton_choisir' => 'Seleccionar',
63
+    'bouton_deplacer' => 'Mover',
64
+    'bouton_download' => 'Download',
65
+    'bouton_enregistrer' => 'Guardar',
66
+    'bouton_radio_desactiver_messagerie_interne' => 'Desactivar a caixa de correio interno',
67
+    'bouton_radio_envoi_annonces' => 'Enviar os anúncios editoriais',
68
+    'bouton_radio_non_envoi_annonces' => 'Não enviar anúncios',
69
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
70
+    'bouton_recharger_page' => 'recarregar esta página',
71
+    'bouton_telecharger' => 'Carregar',
72
+    'bouton_upload' => 'Carregar',
73
+    'bouton_valider' => 'Submeter',
74 74
 
75
-	// C
76
-	'cal_apresmidi' => 'tarde',
77
-	'cal_jour_entier' => 'dia todo',
78
-	'cal_matin' => 'manhã',
79
-	'cal_par_jour' => 'calendário por dia',
80
-	'cal_par_mois' => 'calendário por mês',
81
-	'cal_par_semaine' => 'calendário por semana',
82
-	'choix_couleur_interface' => 'cor',
83
-	'choix_interface' => 'escolha da interface',
84
-	'colonne' => 'Coluna',
85
-	'confirm_changer_statut' => 'Atenção, solicitou a alteração do estatuto deste elemento. Deseja continuar?',
86
-	'correcte' => 'correcto',
75
+    // C
76
+    'cal_apresmidi' => 'tarde',
77
+    'cal_jour_entier' => 'dia todo',
78
+    'cal_matin' => 'manhã',
79
+    'cal_par_jour' => 'calendário por dia',
80
+    'cal_par_mois' => 'calendário por mês',
81
+    'cal_par_semaine' => 'calendário por semana',
82
+    'choix_couleur_interface' => 'cor',
83
+    'choix_interface' => 'escolha da interface',
84
+    'colonne' => 'Coluna',
85
+    'confirm_changer_statut' => 'Atenção, solicitou a alteração do estatuto deste elemento. Deseja continuar?',
86
+    'correcte' => 'correcto',
87 87
 
88
-	// D
89
-	'date_aujourdhui' => 'hoje',
90
-	'date_avant_jc' => 'a. J.C.',
91
-	'date_dans' => 'entre @delai@',
92
-	'date_de_mois_1' => '@j@ de @nommois@',
93
-	'date_de_mois_10' => '@j@ de @nommois@',
94
-	'date_de_mois_11' => '@j@ de @nommois@',
95
-	'date_de_mois_12' => '@j@ de @nommois@',
96
-	'date_de_mois_2' => '@j@ de @nommois@',
97
-	'date_de_mois_3' => '@j@ de @nommois@',
98
-	'date_de_mois_4' => '@j@ de @nommois@',
99
-	'date_de_mois_5' => '@j@ de @nommois@',
100
-	'date_de_mois_6' => '@j@ de @nommois@',
101
-	'date_de_mois_7' => '@j@ de @nommois@',
102
-	'date_de_mois_8' => '@j@ de @nommois@',
103
-	'date_de_mois_9' => '@j@ de @nommois@',
104
-	'date_demain' => 'amanhã',
105
-	'date_fmt_heures_minutes' => '@h@h@m@min',
106
-	'date_fmt_heures_minutes_court' => '@h@:@m@',
107
-	'date_fmt_jour' => '@nomjour@ @jour@',
108
-	'date_fmt_jour_heure' => '@jour@ a @heure@',
109
-	'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ a @heure_fin@', # MODIF
110
-	'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@', # MODIF
111
-	'date_fmt_jour_mois' => '@jour@ de @nommois@',
112
-	'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
113
-	'date_fmt_mois_annee' => '@nommois@ de @annee@',
114
-	'date_fmt_nomjour' => '@nomjour@ @date@',
115
-	'date_fmt_nomjour_date' => ' @nomjour@ @date@',
116
-	'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
117
-	'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
118
-	'date_fmt_periode_from' => 'De',
119
-	'date_fmt_periode_to' => 'a',
120
-	'date_heures' => 'horas',
121
-	'date_hier' => 'ontem',
122
-	'date_il_y_a' => 'há @delai@',
123
-	'date_jnum1' => '1',
124
-	'date_jnum10' => '10',
125
-	'date_jnum11' => '11',
126
-	'date_jnum12' => '12',
127
-	'date_jnum13' => '13',
128
-	'date_jnum14' => '14',
129
-	'date_jnum15' => '15',
130
-	'date_jnum16' => '16',
131
-	'date_jnum17' => '17',
132
-	'date_jnum18' => '18',
133
-	'date_jnum19' => '19',
134
-	'date_jnum2' => '2',
135
-	'date_jnum20' => '20',
136
-	'date_jnum21' => '21',
137
-	'date_jnum22' => '22',
138
-	'date_jnum23' => '23',
139
-	'date_jnum24' => '24',
140
-	'date_jnum25' => '25',
141
-	'date_jnum26' => '26',
142
-	'date_jnum27' => '27',
143
-	'date_jnum28' => '28',
144
-	'date_jnum29' => '29',
145
-	'date_jnum3' => '3',
146
-	'date_jnum30' => '30',
147
-	'date_jnum31' => '31',
148
-	'date_jnum4' => '4',
149
-	'date_jnum5' => '5',
150
-	'date_jnum6' => '6',
151
-	'date_jnum7' => '7',
152
-	'date_jnum8' => '8',
153
-	'date_jnum9' => '9',
154
-	'date_jour_1' => 'domingo',
155
-	'date_jour_1_abbr' => 'Dom.',
156
-	'date_jour_1_initiale' => 'D.',
157
-	'date_jour_2' => 'segunda-feira',
158
-	'date_jour_2_abbr' => 'Seg.',
159
-	'date_jour_2_initiale' => 'S.',
160
-	'date_jour_3' => 'terça-feira',
161
-	'date_jour_3_abbr' => 'Ter.',
162
-	'date_jour_3_initiale' => 'T.',
163
-	'date_jour_4' => 'quarta-feira',
164
-	'date_jour_4_abbr' => 'Qua.',
165
-	'date_jour_4_initiale' => 'Q.',
166
-	'date_jour_5' => 'quinta-feira',
167
-	'date_jour_5_abbr' => 'Qui.',
168
-	'date_jour_5_initiale' => 'Q.',
169
-	'date_jour_6' => 'sexta-feira',
170
-	'date_jour_6_abbr' => 'Sex.',
171
-	'date_jour_6_initiale' => 'S.',
172
-	'date_jour_7' => 'sábado',
173
-	'date_jour_7_abbr' => 'Sab.',
174
-	'date_jour_7_initiale' => 'S.',
175
-	'date_jours' => 'dias',
176
-	'date_minutes' => 'minutos',
177
-	'date_mois' => 'meses',
178
-	'date_mois_1' => 'Janeiro',
179
-	'date_mois_10' => 'Outubro',
180
-	'date_mois_10_abbr' => 'Out.',
181
-	'date_mois_11' => 'Novembro',
182
-	'date_mois_11_abbr' => 'Nov.',
183
-	'date_mois_12' => 'Dezembro',
184
-	'date_mois_12_abbr' => 'Dez.',
185
-	'date_mois_1_abbr' => 'Jan.',
186
-	'date_mois_2' => 'Fevereiro',
187
-	'date_mois_2_abbr' => 'Feb.',
188
-	'date_mois_3' => 'Março',
189
-	'date_mois_3_abbr' => 'Mar',
190
-	'date_mois_4' => 'Abril',
191
-	'date_mois_4_abbr' => 'Abr.',
192
-	'date_mois_5' => 'Maio',
193
-	'date_mois_5_abbr' => 'Mai',
194
-	'date_mois_6' => 'Junho',
195
-	'date_mois_6_abbr' => 'Jun',
196
-	'date_mois_7' => 'Julho',
197
-	'date_mois_7_abbr' => 'Jul',
198
-	'date_mois_8' => 'Agosto',
199
-	'date_mois_8_abbr' => 'Ago',
200
-	'date_mois_9' => 'Setembro',
201
-	'date_mois_9_abbr' => 'Set',
202
-	'date_saison_1' => 'inverno',
203
-	'date_saison_2' => 'primavera',
204
-	'date_saison_3' => 'verão',
205
-	'date_saison_4' => 'outono',
206
-	'date_secondes' => 'segundos',
207
-	'date_semaines' => 'semanas',
208
-	'date_un_mois' => 'mês',
209
-	'date_une_heure' => 'hora',
210
-	'date_une_minute' => 'minuto',
211
-	'date_une_seconde' => 'segundo',
212
-	'date_une_semaine' => 'semana',
213
-	'dirs_commencer' => 'a fim de começar realmente a instalação',
214
-	'dirs_preliminaire' => 'Preliminar : <b>Configurar os direitos de acesso</b>',
215
-	'dirs_probleme_droits' => 'Problema de direitos de acesso',
216
-	'dirs_repertoires_absents' => '<b>Os seguintes directórios não foram encontrados : <ul>@bad_dirs@.</ul> </b>
88
+    // D
89
+    'date_aujourdhui' => 'hoje',
90
+    'date_avant_jc' => 'a. J.C.',
91
+    'date_dans' => 'entre @delai@',
92
+    'date_de_mois_1' => '@j@ de @nommois@',
93
+    'date_de_mois_10' => '@j@ de @nommois@',
94
+    'date_de_mois_11' => '@j@ de @nommois@',
95
+    'date_de_mois_12' => '@j@ de @nommois@',
96
+    'date_de_mois_2' => '@j@ de @nommois@',
97
+    'date_de_mois_3' => '@j@ de @nommois@',
98
+    'date_de_mois_4' => '@j@ de @nommois@',
99
+    'date_de_mois_5' => '@j@ de @nommois@',
100
+    'date_de_mois_6' => '@j@ de @nommois@',
101
+    'date_de_mois_7' => '@j@ de @nommois@',
102
+    'date_de_mois_8' => '@j@ de @nommois@',
103
+    'date_de_mois_9' => '@j@ de @nommois@',
104
+    'date_demain' => 'amanhã',
105
+    'date_fmt_heures_minutes' => '@h@h@m@min',
106
+    'date_fmt_heures_minutes_court' => '@h@:@m@',
107
+    'date_fmt_jour' => '@nomjour@ @jour@',
108
+    'date_fmt_jour_heure' => '@jour@ a @heure@',
109
+    'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ a @heure_fin@', # MODIF
110
+    'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@', # MODIF
111
+    'date_fmt_jour_mois' => '@jour@ de @nommois@',
112
+    'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
113
+    'date_fmt_mois_annee' => '@nommois@ de @annee@',
114
+    'date_fmt_nomjour' => '@nomjour@ @date@',
115
+    'date_fmt_nomjour_date' => ' @nomjour@ @date@',
116
+    'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
117
+    'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
118
+    'date_fmt_periode_from' => 'De',
119
+    'date_fmt_periode_to' => 'a',
120
+    'date_heures' => 'horas',
121
+    'date_hier' => 'ontem',
122
+    'date_il_y_a' => 'há @delai@',
123
+    'date_jnum1' => '1',
124
+    'date_jnum10' => '10',
125
+    'date_jnum11' => '11',
126
+    'date_jnum12' => '12',
127
+    'date_jnum13' => '13',
128
+    'date_jnum14' => '14',
129
+    'date_jnum15' => '15',
130
+    'date_jnum16' => '16',
131
+    'date_jnum17' => '17',
132
+    'date_jnum18' => '18',
133
+    'date_jnum19' => '19',
134
+    'date_jnum2' => '2',
135
+    'date_jnum20' => '20',
136
+    'date_jnum21' => '21',
137
+    'date_jnum22' => '22',
138
+    'date_jnum23' => '23',
139
+    'date_jnum24' => '24',
140
+    'date_jnum25' => '25',
141
+    'date_jnum26' => '26',
142
+    'date_jnum27' => '27',
143
+    'date_jnum28' => '28',
144
+    'date_jnum29' => '29',
145
+    'date_jnum3' => '3',
146
+    'date_jnum30' => '30',
147
+    'date_jnum31' => '31',
148
+    'date_jnum4' => '4',
149
+    'date_jnum5' => '5',
150
+    'date_jnum6' => '6',
151
+    'date_jnum7' => '7',
152
+    'date_jnum8' => '8',
153
+    'date_jnum9' => '9',
154
+    'date_jour_1' => 'domingo',
155
+    'date_jour_1_abbr' => 'Dom.',
156
+    'date_jour_1_initiale' => 'D.',
157
+    'date_jour_2' => 'segunda-feira',
158
+    'date_jour_2_abbr' => 'Seg.',
159
+    'date_jour_2_initiale' => 'S.',
160
+    'date_jour_3' => 'terça-feira',
161
+    'date_jour_3_abbr' => 'Ter.',
162
+    'date_jour_3_initiale' => 'T.',
163
+    'date_jour_4' => 'quarta-feira',
164
+    'date_jour_4_abbr' => 'Qua.',
165
+    'date_jour_4_initiale' => 'Q.',
166
+    'date_jour_5' => 'quinta-feira',
167
+    'date_jour_5_abbr' => 'Qui.',
168
+    'date_jour_5_initiale' => 'Q.',
169
+    'date_jour_6' => 'sexta-feira',
170
+    'date_jour_6_abbr' => 'Sex.',
171
+    'date_jour_6_initiale' => 'S.',
172
+    'date_jour_7' => 'sábado',
173
+    'date_jour_7_abbr' => 'Sab.',
174
+    'date_jour_7_initiale' => 'S.',
175
+    'date_jours' => 'dias',
176
+    'date_minutes' => 'minutos',
177
+    'date_mois' => 'meses',
178
+    'date_mois_1' => 'Janeiro',
179
+    'date_mois_10' => 'Outubro',
180
+    'date_mois_10_abbr' => 'Out.',
181
+    'date_mois_11' => 'Novembro',
182
+    'date_mois_11_abbr' => 'Nov.',
183
+    'date_mois_12' => 'Dezembro',
184
+    'date_mois_12_abbr' => 'Dez.',
185
+    'date_mois_1_abbr' => 'Jan.',
186
+    'date_mois_2' => 'Fevereiro',
187
+    'date_mois_2_abbr' => 'Feb.',
188
+    'date_mois_3' => 'Março',
189
+    'date_mois_3_abbr' => 'Mar',
190
+    'date_mois_4' => 'Abril',
191
+    'date_mois_4_abbr' => 'Abr.',
192
+    'date_mois_5' => 'Maio',
193
+    'date_mois_5_abbr' => 'Mai',
194
+    'date_mois_6' => 'Junho',
195
+    'date_mois_6_abbr' => 'Jun',
196
+    'date_mois_7' => 'Julho',
197
+    'date_mois_7_abbr' => 'Jul',
198
+    'date_mois_8' => 'Agosto',
199
+    'date_mois_8_abbr' => 'Ago',
200
+    'date_mois_9' => 'Setembro',
201
+    'date_mois_9_abbr' => 'Set',
202
+    'date_saison_1' => 'inverno',
203
+    'date_saison_2' => 'primavera',
204
+    'date_saison_3' => 'verão',
205
+    'date_saison_4' => 'outono',
206
+    'date_secondes' => 'segundos',
207
+    'date_semaines' => 'semanas',
208
+    'date_un_mois' => 'mês',
209
+    'date_une_heure' => 'hora',
210
+    'date_une_minute' => 'minuto',
211
+    'date_une_seconde' => 'segundo',
212
+    'date_une_semaine' => 'semana',
213
+    'dirs_commencer' => 'a fim de começar realmente a instalação',
214
+    'dirs_preliminaire' => 'Preliminar : <b>Configurar os direitos de acesso</b>',
215
+    'dirs_probleme_droits' => 'Problema de direitos de acesso',
216
+    'dirs_repertoires_absents' => '<b>Os seguintes directórios não foram encontrados : <ul>@bad_dirs@.</ul> </b>
217 217
   <p>É provável que resulte de um problema de má colocação de maiúsculas ou minúsculas.
218 218
   Verifique que as minúsculas e maiúsculas destes directórios concordam com o que está exibido
219 219
  acima; se não for o caso, renomeie os repertórios com o seu software FTP de modo a corrigir o erro.
220 220
   <p>Terminada esta operação, poderá</p>',
221
-	'dirs_repertoires_suivants' => '<b>Os seguintes directórios não estão acessíveis para escrita: <ul>@bad_dirs@.</ul> </b>
221
+    'dirs_repertoires_suivants' => '<b>Os seguintes directórios não estão acessíveis para escrita: <ul>@bad_dirs@.</ul> </b>
222 222
   <p>Para corrigir, utilize o seu programa de FTP para configurar os direitos de acesso de cada um
223 223
   destes directórios. O procedimento está explicado em detalhe no manual de instalação.
224 224
   <p>Uma vez efectuada esta alteração, poderá',
225
-	'double_occurrence' => 'Dupla ocorrência de @balise@',
225
+    'double_occurrence' => 'Dupla ocorrência de @balise@',
226 226
 
227
-	// E
228
-	'en_cours' => 'em curso',
229
-	'envoi_via_le_site' => 'Envio pelo sítio',
230
-	'erreur' => 'Erro',
231
-	'erreur_balise_non_fermee' => 'última tag não fechada :',
232
-	'erreur_technique_ajaxform' => 'Ooops. Uum erro inesperado impediu o formulário de ser enviado. Por favor tente novamente.',
233
-	'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu o registo correcto do campo @champs@.',
234
-	'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu o registo.',
235
-	'erreur_texte' => 'erro(s)',
236
-	'etape' => 'Etapa',
227
+    // E
228
+    'en_cours' => 'em curso',
229
+    'envoi_via_le_site' => 'Envio pelo sítio',
230
+    'erreur' => 'Erro',
231
+    'erreur_balise_non_fermee' => 'última tag não fechada :',
232
+    'erreur_technique_ajaxform' => 'Ooops. Uum erro inesperado impediu o formulário de ser enviado. Por favor tente novamente.',
233
+    'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu o registo correcto do campo @champs@.',
234
+    'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu o registo.',
235
+    'erreur_texte' => 'erro(s)',
236
+    'etape' => 'Etapa',
237 237
 
238
-	// F
239
-	'fichier_introuvable' => 'Ficheiro @fichier@ não localizado',
240
-	'form_auteur_confirmation' => 'Confirme o seu endereço e-mail',
241
-	'form_auteur_email_modifie' => 'O seu endereço e-mail foi alterado.',
242
-	'form_auteur_envoi_mail_confirmation' => 'Um e-mail de confirmação foi enviado para @email@. Para validar o seu endereço de e-mail, deve abrir o endereço Web mencionado na mensagem.',
243
-	'form_auteur_mail_confirmation' => 'Olá,
238
+    // F
239
+    'fichier_introuvable' => 'Ficheiro @fichier@ não localizado',
240
+    'form_auteur_confirmation' => 'Confirme o seu endereço e-mail',
241
+    'form_auteur_email_modifie' => 'O seu endereço e-mail foi alterado.',
242
+    'form_auteur_envoi_mail_confirmation' => 'Um e-mail de confirmação foi enviado para @email@. Para validar o seu endereço de e-mail, deve abrir o endereço Web mencionado na mensagem.',
243
+    'form_auteur_mail_confirmation' => 'Olá,
244 244
 
245 245
 Pediu para alterar o seu endereço e-mail. Para confirmar o seu novo endereço, precisa de se conectar ao endereço abaixo (caso contrário, o seu pedido será ignorado) :
246 246
 
247 247
     @url@
248 248
 ',
249
-	'form_deja_inscrit' => 'Já está inscrito.',
250
-	'form_email_non_valide' => 'O seu endereço email não é válido',
251
-	'form_forum_access_refuse' => 'Você já não tem acesso a este sítio',
252
-	'form_forum_bonjour' => 'Bom dia @nom@,',
253
-	'form_forum_confirmer_email' => 'Para confirmar o seu endereço e-maill, abra esta ligação : @url_confirm@',
254
-	'form_forum_email_deja_enregistre' => 'Este endereço e-mail já está registado,pode portanto utilizar a sua palavra-passe habitual',
255
-	'form_forum_identifiant_mail' => 'O seu novo identificador acabou de lhe ser enviado por email.',
256
-	'form_forum_identifiants' => 'Identificadores pessoais',
257
-	'form_forum_indiquer_nom_email' => 'Indicar aqui o seu nome e o seu endereço email. O seu identificador pessoal ser-lhe-á enviado rapidamente por correio electrónico.',
258
-	'form_forum_login' => 'login:',
259
-	'form_forum_message_auto' => '(esta é uma mensagem automática)',
260
-	'form_forum_pass' => 'palavra-passe',
261
-	'form_forum_probleme_mail' => 'Problema de mail :o identificador não pôde ser enviado',
262
-	'form_forum_voici1' => 'Aqui estão os seus dados para poder aceder ao sítio Internet do  "@nom_site_spip@" (@adresse_site@):',
263
-	'form_forum_voici2' => 'Eis os seus identificadores para propor artigos no
249
+    'form_deja_inscrit' => 'Já está inscrito.',
250
+    'form_email_non_valide' => 'O seu endereço email não é válido',
251
+    'form_forum_access_refuse' => 'Você já não tem acesso a este sítio',
252
+    'form_forum_bonjour' => 'Bom dia @nom@,',
253
+    'form_forum_confirmer_email' => 'Para confirmar o seu endereço e-maill, abra esta ligação : @url_confirm@',
254
+    'form_forum_email_deja_enregistre' => 'Este endereço e-mail já está registado,pode portanto utilizar a sua palavra-passe habitual',
255
+    'form_forum_identifiant_mail' => 'O seu novo identificador acabou de lhe ser enviado por email.',
256
+    'form_forum_identifiants' => 'Identificadores pessoais',
257
+    'form_forum_indiquer_nom_email' => 'Indicar aqui o seu nome e o seu endereço email. O seu identificador pessoal ser-lhe-á enviado rapidamente por correio electrónico.',
258
+    'form_forum_login' => 'login:',
259
+    'form_forum_message_auto' => '(esta é uma mensagem automática)',
260
+    'form_forum_pass' => 'palavra-passe',
261
+    'form_forum_probleme_mail' => 'Problema de mail :o identificador não pôde ser enviado',
262
+    'form_forum_voici1' => 'Aqui estão os seus dados para poder aceder ao sítio Internet do  "@nom_site_spip@" (@adresse_site@):',
263
+    'form_forum_voici2' => 'Eis os seus identificadores para propor artigos no
264 264
  sítio "@nom_site_spip@" (@adresse_login@):',
265
-	'form_indiquer_email' => 'Por favor indique o seu endereço email.',
266
-	'form_indiquer_nom' => 'Por favor indique o seu nome.',
267
-	'form_indiquer_nom_site' => 'Por favor indique o nome do seu sítio.',
268
-	'form_pet_deja_enregistre' => 'Este sítio já está registado',
269
-	'form_pet_signature_pasprise' => 'A sua assinatura não está tomada em conta.',
270
-	'form_prop_confirmer_envoi' => 'Confirmar o envio',
271
-	'form_prop_description' => 'Descrição/comentário',
272
-	'form_prop_enregistre' => 'A sua proposta foi registada. Aparecerá online após a validação pelos responsáveis deste sítio.',
273
-	'form_prop_envoyer' => 'Enviar uma mensagem',
274
-	'form_prop_indiquer_email' => 'Por favor indique um endereço email válido',
275
-	'form_prop_indiquer_nom_site' => 'Por favor indique o nome do sítio.',
276
-	'form_prop_indiquer_sujet' => 'Por favor indique um tema',
277
-	'form_prop_message_envoye' => 'Mensagem enviada',
278
-	'form_prop_non_enregistre' => 'A sua proposta não foi registada.',
279
-	'form_prop_sujet' => 'Tema',
280
-	'form_prop_url_site' => 'Endereço (URL) do sítio',
281
-	'forum_non_inscrit' => 'Não está inscrito, ou o endereço ou a palavra-passe estão errados.',
282
-	'forum_par_auteur' => 'por @auteur@',
283
-	'forum_titre_erreur' => 'Erro...',
265
+    'form_indiquer_email' => 'Por favor indique o seu endereço email.',
266
+    'form_indiquer_nom' => 'Por favor indique o seu nome.',
267
+    'form_indiquer_nom_site' => 'Por favor indique o nome do seu sítio.',
268
+    'form_pet_deja_enregistre' => 'Este sítio já está registado',
269
+    'form_pet_signature_pasprise' => 'A sua assinatura não está tomada em conta.',
270
+    'form_prop_confirmer_envoi' => 'Confirmar o envio',
271
+    'form_prop_description' => 'Descrição/comentário',
272
+    'form_prop_enregistre' => 'A sua proposta foi registada. Aparecerá online após a validação pelos responsáveis deste sítio.',
273
+    'form_prop_envoyer' => 'Enviar uma mensagem',
274
+    'form_prop_indiquer_email' => 'Por favor indique um endereço email válido',
275
+    'form_prop_indiquer_nom_site' => 'Por favor indique o nome do sítio.',
276
+    'form_prop_indiquer_sujet' => 'Por favor indique um tema',
277
+    'form_prop_message_envoye' => 'Mensagem enviada',
278
+    'form_prop_non_enregistre' => 'A sua proposta não foi registada.',
279
+    'form_prop_sujet' => 'Tema',
280
+    'form_prop_url_site' => 'Endereço (URL) do sítio',
281
+    'forum_non_inscrit' => 'Não está inscrito, ou o endereço ou a palavra-passe estão errados.',
282
+    'forum_par_auteur' => 'por @auteur@',
283
+    'forum_titre_erreur' => 'Erro...',
284 284
 
285
-	// I
286
-	'ical_texte_rss_articles' => 'O ficheiro «backend» dos artigos deste sítio encontra-se neste endereço:',
287
-	'ical_texte_rss_articles2' => 'Pode igualmente obter os ficheiros «backend» para os artigos de cada rubrica do sítio:',
288
-	'ical_texte_rss_breves' => 'Existe também um ficheiro contendo notícias do sítio. Especificando um número de rubrica, obterá unicamente as notícias dessa rubrica.',
289
-	'icone_a_suivre' => 'Continua',
290
-	'icone_admin_site' => 'Administração do sítio',
291
-	'icone_agenda' => 'Agenda e correio',
292
-	'icone_aide_ligne' => 'Ajuda',
293
-	'icone_articles' => 'Artigos',
294
-	'icone_auteurs' => 'Autores',
295
-	'icone_brouteur' => 'Navegação rápida',
296
-	'icone_configuration_site' => 'Configuração',
297
-	'icone_configurer_site' => 'Configurar o seu sítio',
298
-	'icone_creer_nouvel_auteur' => 'Criar um novo autor',
299
-	'icone_creer_rubrique' => 'Criar uma rubrica',
300
-	'icone_creer_sous_rubrique' => 'Criar uma sub-rubrica',
301
-	'icone_deconnecter' => 'Sair',
302
-	'icone_discussions' => 'Discussões',
303
-	'icone_doc_rubrique' => 'Documentos das rubricas',
304
-	'icone_ecrire_article' => 'Escrever um novo artigo',
305
-	'icone_edition_site' => 'Edição',
306
-	'icone_gestion_langues' => 'Opções de idiomas',
307
-	'icone_informations_personnelles' => 'Informações pessoais',
308
-	'icone_interface_complet' => 'interface completa',
309
-	'icone_interface_simple' => 'Interface simplificada',
310
-	'icone_maintenance_site' => 'Manutenção do sítio',
311
-	'icone_messagerie_personnelle' => 'Mensagens privadas',
312
-	'icone_repartition_debut' => 'Exibir a distribuição desde o início',
313
-	'icone_rubriques' => 'Rubricas',
314
-	'icone_sauver_site' => 'Cópia de segurança do sítio',
315
-	'icone_site_entier' => 'Todo o sítio',
316
-	'icone_sites_references' => 'Sítios referenciados',
317
-	'icone_statistiques' => 'Estatísticas do sítio',
318
-	'icone_suivi_activite' => 'Acompanhar a actividade do sítio',
319
-	'icone_suivi_actualite' => 'Evolução do sítio',
320
-	'icone_suivi_pettions' => 'Seguir/gerir os abaixo-assinados',
321
-	'icone_suivi_revisions' => 'Modificações dos artigos',
322
-	'icone_supprimer_document' => 'Suprimir este documento',
323
-	'icone_supprimer_image' => 'Suprimir esta imagem',
324
-	'icone_tous_articles' => 'Todos os seus artigos',
325
-	'icone_tous_auteur' => 'Todos os autores',
326
-	'icone_tous_visiteur' => 'Todos os visitantes',
327
-	'icone_visiter_site' => 'Visitar o sítio público',
328
-	'icone_voir_en_ligne' => 'Ver online',
329
-	'img_indisponible' => 'imagem indisponível',
330
-	'impossible' => 'impossível',
331
-	'info_a_suivre' => 'A SEGUIR »',
332
-	'info_acces_interdit' => 'Acesso proibido',
333
-	'info_acces_refuse' => 'Acesso recusado',
334
-	'info_action' => 'Acção : @action@',
335
-	'info_administrer_rubriques' => 'Pode administrar esta rubrica e as suas sub-rubricas',
336
-	'info_adresse_non_indiquee' => 'Não indicou endereço a testar !',
337
-	'info_aide' => 'AJUDA',
338
-	'info_ajouter_mot' => 'Acrescentar esta palavra',
339
-	'info_annonce' => 'ANÚNCIO',
340
-	'info_annonces_generales' => 'Anúncios gerais :',
341
-	'info_article_propose' => 'Artigo proposto',
342
-	'info_article_publie' => 'Artigo publicado',
343
-	'info_article_redaction' => 'Artigo em curso de redacção',
344
-	'info_article_refuse' => 'Artigo recusado',
345
-	'info_article_supprime' => 'Artigo suprimido',
346
-	'info_articles' => 'Artigos',
347
-	'info_articles_a_valider' => 'Os artigos a validar',
348
-	'info_articles_nb' => '@nb@ artigos',
349
-	'info_articles_proposes' => 'Artigos propostos',
350
-	'info_articles_un' => '1 artigo',
351
-	'info_auteurs_nombre' => 'autor(es) :',
352
-	'info_authentification_ftp' => 'Autenticação (por FTP)',
353
-	'info_breves_2' => 'notícias',
354
-	'info_breves_nb' => '@nb@ notícias',
355
-	'info_breves_un' => '1 notícia',
356
-	'info_connexion_refusee' => 'Ligação recusada',
357
-	'info_contact_developpeur' => 'Por favor contacte um programador',
358
-	'info_contenance' => 'Este sítio contém:',
359
-	'info_contribution' => 'contribuições de fórum',
360
-	'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
361
-	'info_copyright_doc' => 'Para mais informações, visite o sítio <a href="@spipnet@">@spipnet_affiche@</a',
362
-	'info_copyright_gpl' => 'sob licença GPL',
363
-	'info_cours_edition' => 'Os seus artigos em curso de redacção', # MODIF
364
-	'info_creer_repertoire' => 'Por favor crie um ficheiro ou um directório chamado :',
365
-	'info_creer_repertoire_2' => 'dentro do sub-directório <b>@repertoire@</b>, depois :',
366
-	'info_creer_vignette' => 'criação automática de miniatura',
367
-	'info_creerdansrubrique_non_autorise' => 'Não tem direitos suficientes para criar conteúdo nesta rubrica.',
368
-	'info_deplier' => 'Desenvolver',
369
-	'info_descriptif_nombre' => 'descritivo(s) :',
370
-	'info_description' => 'Descrição :',
371
-	'info_description_2' => 'Descrição :',
372
-	'info_dimension' => 'Dimensões :',
373
-	'info_documents_nb' => '@nb@ documentos',
374
-	'info_documents_un' => '1 documento',
375
-	'info_ecire_message_prive' => 'Escrever uma mensagem privada',
376
-	'info_email_invalide' => 'Endereço email inválido.',
377
-	'info_en_cours_validation' => 'Os seus artigos em curso de redação',
378
-	'info_en_ligne' => 'Actualmente online:',
379
-	'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
380
-	'info_erreur_requete' => 'Erro no pedido :',
381
-	'info_erreur_squelette2' => 'Modelo <b>@fichier@</b> não disponível...',
382
-	'info_erreur_systeme' => 'Erro de Sistema (errno @errsys@)',
383
-	'info_erreur_systeme2' => 'O disco rígido poderá estar cheio, ou a base de dados danificada.<br />
285
+    // I
286
+    'ical_texte_rss_articles' => 'O ficheiro «backend» dos artigos deste sítio encontra-se neste endereço:',
287
+    'ical_texte_rss_articles2' => 'Pode igualmente obter os ficheiros «backend» para os artigos de cada rubrica do sítio:',
288
+    'ical_texte_rss_breves' => 'Existe também um ficheiro contendo notícias do sítio. Especificando um número de rubrica, obterá unicamente as notícias dessa rubrica.',
289
+    'icone_a_suivre' => 'Continua',
290
+    'icone_admin_site' => 'Administração do sítio',
291
+    'icone_agenda' => 'Agenda e correio',
292
+    'icone_aide_ligne' => 'Ajuda',
293
+    'icone_articles' => 'Artigos',
294
+    'icone_auteurs' => 'Autores',
295
+    'icone_brouteur' => 'Navegação rápida',
296
+    'icone_configuration_site' => 'Configuração',
297
+    'icone_configurer_site' => 'Configurar o seu sítio',
298
+    'icone_creer_nouvel_auteur' => 'Criar um novo autor',
299
+    'icone_creer_rubrique' => 'Criar uma rubrica',
300
+    'icone_creer_sous_rubrique' => 'Criar uma sub-rubrica',
301
+    'icone_deconnecter' => 'Sair',
302
+    'icone_discussions' => 'Discussões',
303
+    'icone_doc_rubrique' => 'Documentos das rubricas',
304
+    'icone_ecrire_article' => 'Escrever um novo artigo',
305
+    'icone_edition_site' => 'Edição',
306
+    'icone_gestion_langues' => 'Opções de idiomas',
307
+    'icone_informations_personnelles' => 'Informações pessoais',
308
+    'icone_interface_complet' => 'interface completa',
309
+    'icone_interface_simple' => 'Interface simplificada',
310
+    'icone_maintenance_site' => 'Manutenção do sítio',
311
+    'icone_messagerie_personnelle' => 'Mensagens privadas',
312
+    'icone_repartition_debut' => 'Exibir a distribuição desde o início',
313
+    'icone_rubriques' => 'Rubricas',
314
+    'icone_sauver_site' => 'Cópia de segurança do sítio',
315
+    'icone_site_entier' => 'Todo o sítio',
316
+    'icone_sites_references' => 'Sítios referenciados',
317
+    'icone_statistiques' => 'Estatísticas do sítio',
318
+    'icone_suivi_activite' => 'Acompanhar a actividade do sítio',
319
+    'icone_suivi_actualite' => 'Evolução do sítio',
320
+    'icone_suivi_pettions' => 'Seguir/gerir os abaixo-assinados',
321
+    'icone_suivi_revisions' => 'Modificações dos artigos',
322
+    'icone_supprimer_document' => 'Suprimir este documento',
323
+    'icone_supprimer_image' => 'Suprimir esta imagem',
324
+    'icone_tous_articles' => 'Todos os seus artigos',
325
+    'icone_tous_auteur' => 'Todos os autores',
326
+    'icone_tous_visiteur' => 'Todos os visitantes',
327
+    'icone_visiter_site' => 'Visitar o sítio público',
328
+    'icone_voir_en_ligne' => 'Ver online',
329
+    'img_indisponible' => 'imagem indisponível',
330
+    'impossible' => 'impossível',
331
+    'info_a_suivre' => 'A SEGUIR »',
332
+    'info_acces_interdit' => 'Acesso proibido',
333
+    'info_acces_refuse' => 'Acesso recusado',
334
+    'info_action' => 'Acção : @action@',
335
+    'info_administrer_rubriques' => 'Pode administrar esta rubrica e as suas sub-rubricas',
336
+    'info_adresse_non_indiquee' => 'Não indicou endereço a testar !',
337
+    'info_aide' => 'AJUDA',
338
+    'info_ajouter_mot' => 'Acrescentar esta palavra',
339
+    'info_annonce' => 'ANÚNCIO',
340
+    'info_annonces_generales' => 'Anúncios gerais :',
341
+    'info_article_propose' => 'Artigo proposto',
342
+    'info_article_publie' => 'Artigo publicado',
343
+    'info_article_redaction' => 'Artigo em curso de redacção',
344
+    'info_article_refuse' => 'Artigo recusado',
345
+    'info_article_supprime' => 'Artigo suprimido',
346
+    'info_articles' => 'Artigos',
347
+    'info_articles_a_valider' => 'Os artigos a validar',
348
+    'info_articles_nb' => '@nb@ artigos',
349
+    'info_articles_proposes' => 'Artigos propostos',
350
+    'info_articles_un' => '1 artigo',
351
+    'info_auteurs_nombre' => 'autor(es) :',
352
+    'info_authentification_ftp' => 'Autenticação (por FTP)',
353
+    'info_breves_2' => 'notícias',
354
+    'info_breves_nb' => '@nb@ notícias',
355
+    'info_breves_un' => '1 notícia',
356
+    'info_connexion_refusee' => 'Ligação recusada',
357
+    'info_contact_developpeur' => 'Por favor contacte um programador',
358
+    'info_contenance' => 'Este sítio contém:',
359
+    'info_contribution' => 'contribuições de fórum',
360
+    'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
361
+    'info_copyright_doc' => 'Para mais informações, visite o sítio <a href="@spipnet@">@spipnet_affiche@</a',
362
+    'info_copyright_gpl' => 'sob licença GPL',
363
+    'info_cours_edition' => 'Os seus artigos em curso de redacção', # MODIF
364
+    'info_creer_repertoire' => 'Por favor crie um ficheiro ou um directório chamado :',
365
+    'info_creer_repertoire_2' => 'dentro do sub-directório <b>@repertoire@</b>, depois :',
366
+    'info_creer_vignette' => 'criação automática de miniatura',
367
+    'info_creerdansrubrique_non_autorise' => 'Não tem direitos suficientes para criar conteúdo nesta rubrica.',
368
+    'info_deplier' => 'Desenvolver',
369
+    'info_descriptif_nombre' => 'descritivo(s) :',
370
+    'info_description' => 'Descrição :',
371
+    'info_description_2' => 'Descrição :',
372
+    'info_dimension' => 'Dimensões :',
373
+    'info_documents_nb' => '@nb@ documentos',
374
+    'info_documents_un' => '1 documento',
375
+    'info_ecire_message_prive' => 'Escrever uma mensagem privada',
376
+    'info_email_invalide' => 'Endereço email inválido.',
377
+    'info_en_cours_validation' => 'Os seus artigos em curso de redação',
378
+    'info_en_ligne' => 'Actualmente online:',
379
+    'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
380
+    'info_erreur_requete' => 'Erro no pedido :',
381
+    'info_erreur_squelette2' => 'Modelo <b>@fichier@</b> não disponível...',
382
+    'info_erreur_systeme' => 'Erro de Sistema (errno @errsys@)',
383
+    'info_erreur_systeme2' => 'O disco rígido poderá estar cheio, ou a base de dados danificada.<br />
384 384
 <span style="color:red;">Tente <a href=\'@script@\'>reparar a base de dados </a>, ou contacte o seu fornecedor de internet.</span>',
385
-	'info_fini' => 'Terminou !',
386
-	'info_format_image' => 'Formatos de imagens que podem ser utilizadas para criar vinhetas : @gd_formats@.',
387
-	'info_format_non_defini' => 'formato não definido',
388
-	'info_grand_ecran' => 'Ecrã total',
389
-	'info_image_aide' => 'AJUDA',
390
-	'info_image_process_titre' => 'Como criar miniaturas',
391
-	'info_impossible_lire_page' => '<b>Erro !</b> Impossível ler a página<tt><html>@test_proxy@</html></tt> através do proxy <tt>',
392
-	'info_installation_systeme_publication' => 'Instalação do sistema de publicação',
393
-	'info_installer_documents' => 'Pode instalar automaticamente todos os documentos contidos na pasta @upload@.',
394
-	'info_installer_ftp' => 'Como administrador, pode instalar (por FTP) ficheiros na pasta @upload@ para depois seleccioná-los directamente aqui.',
395
-	'info_installer_images' => 'Pode instalar imagens nos formatos JPEG, GIF e PNG.',
396
-	'info_installer_images_dossier' => 'Instalar imagens na pasta @upload@ para poder seleccioná-los aqui.',
397
-	'info_interface_complete' => 'Interface completa',
398
-	'info_interface_simple' => 'Interface simplificada',
399
-	'info_joindre_document_article' => 'Pode juntar a este artigo documentos de tipo',
400
-	'info_joindre_document_rubrique' => 'Pode acrescentar a esta rubrica documentos de tipo',
401
-	'info_joindre_documents_article' => 'Pode juntar ao seu artigo documentos de tipo :',
402
-	'info_l_article' => 'o artigo',
403
-	'info_la_breve' => 'a notícia',
404
-	'info_la_rubrique' => 'a rubrica',
405
-	'info_langue_principale' => 'Idioma principal do sítio',
406
-	'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixels',
407
-	'info_les_auteurs_1' => 'por @les_auteurs@',
408
-	'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
409
-	'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
410
-	'info_mail_fournisseur' => 'você@seucorreio.com',
411
-	'info_message_2' => 'MENSAGEM',
412
-	'info_message_supprime' => 'MENSAGEM ELIMINADA',
413
-	'info_messages_nb' => '@nb@ mensagens',
414
-	'info_messages_un' => '1 mensagem',
415
-	'info_mise_en_ligne' => 'Data de colocação online :',
416
-	'info_modification_parametres_securite' => 'modificação dos parâmetros de segurança',
417
-	'info_mois_courant' => 'Durante o mês :',
418
-	'info_mot_cle_ajoute' => 'A seguinte palavra-chave foi acrescentada a',
419
-	'info_multi_herit' => 'Idioma por defeito',
420
-	'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhadas</u> beneficiam de uma tradução de todos os textos da interface. Se seleccionar esses idiomas, muitos elementos do sítio público (datas, formulários) serão automaticamente traduzidos. Para os idiomas não sublinhadas, esses elementos aparecerão no idioma principal do sítio.',
421
-	'info_multilinguisme' => 'Multilinguismo',
422
-	'info_nom_non_utilisateurs_connectes' => 'O seu nome não aparece na lista dos utilizadores ligados.',
423
-	'info_nom_utilisateurs_connectes' => 'O seu nome aparece na lista dos utilizadores ligados.',
424
-	'info_nombre_en_ligne' => 'Actualmente online :',
425
-	'info_non_resultat' => 'Nenhum resultado para "@cherche_mot@"',
426
-	'info_non_utilisation_messagerie' => 'Não utiliza o correio interno deste sítio.',
427
-	'info_nouveau_message' => 'TEM UMA NOVA MENSAGEM',
428
-	'info_nouveaux_messages' => 'TEM @total_messages@ NOVAS MENSAGENS',
429
-	'info_numero_abbreviation' => '<N° >',
430
-	'info_obligatoire' => 'Esta informação é obrigatória',
431
-	'info_pense_bete' => 'MEMORANDO',
432
-	'info_petit_ecran' => 'Ecrã Pequeno',
433
-	'info_petition_close' => 'Petição encerrada',
434
-	'info_pixels' => 'pixels',
435
-	'info_plusieurs_mots_trouves' => 'Muitas palavras-chave encontradas para "@cherche_mot@":',
436
-	'info_portfolio_automatique' => 'Portfolio automático :',
437
-	'info_premier_resultat' => '[@debut_limit@ primeiros resultados em @total@]',
438
-	'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados em @total@]',
439
-	'info_propose_1' => '[@nom_site_spip@] Proposto : @titre@',
440
-	'info_propose_2' => 'Artigos propostos
385
+    'info_fini' => 'Terminou !',
386
+    'info_format_image' => 'Formatos de imagens que podem ser utilizadas para criar vinhetas : @gd_formats@.',
387
+    'info_format_non_defini' => 'formato não definido',
388
+    'info_grand_ecran' => 'Ecrã total',
389
+    'info_image_aide' => 'AJUDA',
390
+    'info_image_process_titre' => 'Como criar miniaturas',
391
+    'info_impossible_lire_page' => '<b>Erro !</b> Impossível ler a página<tt><html>@test_proxy@</html></tt> através do proxy <tt>',
392
+    'info_installation_systeme_publication' => 'Instalação do sistema de publicação',
393
+    'info_installer_documents' => 'Pode instalar automaticamente todos os documentos contidos na pasta @upload@.',
394
+    'info_installer_ftp' => 'Como administrador, pode instalar (por FTP) ficheiros na pasta @upload@ para depois seleccioná-los directamente aqui.',
395
+    'info_installer_images' => 'Pode instalar imagens nos formatos JPEG, GIF e PNG.',
396
+    'info_installer_images_dossier' => 'Instalar imagens na pasta @upload@ para poder seleccioná-los aqui.',
397
+    'info_interface_complete' => 'Interface completa',
398
+    'info_interface_simple' => 'Interface simplificada',
399
+    'info_joindre_document_article' => 'Pode juntar a este artigo documentos de tipo',
400
+    'info_joindre_document_rubrique' => 'Pode acrescentar a esta rubrica documentos de tipo',
401
+    'info_joindre_documents_article' => 'Pode juntar ao seu artigo documentos de tipo :',
402
+    'info_l_article' => 'o artigo',
403
+    'info_la_breve' => 'a notícia',
404
+    'info_la_rubrique' => 'a rubrica',
405
+    'info_langue_principale' => 'Idioma principal do sítio',
406
+    'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixels',
407
+    'info_les_auteurs_1' => 'por @les_auteurs@',
408
+    'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
409
+    'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
410
+    'info_mail_fournisseur' => 'você@seucorreio.com',
411
+    'info_message_2' => 'MENSAGEM',
412
+    'info_message_supprime' => 'MENSAGEM ELIMINADA',
413
+    'info_messages_nb' => '@nb@ mensagens',
414
+    'info_messages_un' => '1 mensagem',
415
+    'info_mise_en_ligne' => 'Data de colocação online :',
416
+    'info_modification_parametres_securite' => 'modificação dos parâmetros de segurança',
417
+    'info_mois_courant' => 'Durante o mês :',
418
+    'info_mot_cle_ajoute' => 'A seguinte palavra-chave foi acrescentada a',
419
+    'info_multi_herit' => 'Idioma por defeito',
420
+    'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhadas</u> beneficiam de uma tradução de todos os textos da interface. Se seleccionar esses idiomas, muitos elementos do sítio público (datas, formulários) serão automaticamente traduzidos. Para os idiomas não sublinhadas, esses elementos aparecerão no idioma principal do sítio.',
421
+    'info_multilinguisme' => 'Multilinguismo',
422
+    'info_nom_non_utilisateurs_connectes' => 'O seu nome não aparece na lista dos utilizadores ligados.',
423
+    'info_nom_utilisateurs_connectes' => 'O seu nome aparece na lista dos utilizadores ligados.',
424
+    'info_nombre_en_ligne' => 'Actualmente online :',
425
+    'info_non_resultat' => 'Nenhum resultado para "@cherche_mot@"',
426
+    'info_non_utilisation_messagerie' => 'Não utiliza o correio interno deste sítio.',
427
+    'info_nouveau_message' => 'TEM UMA NOVA MENSAGEM',
428
+    'info_nouveaux_messages' => 'TEM @total_messages@ NOVAS MENSAGENS',
429
+    'info_numero_abbreviation' => '<N° >',
430
+    'info_obligatoire' => 'Esta informação é obrigatória',
431
+    'info_pense_bete' => 'MEMORANDO',
432
+    'info_petit_ecran' => 'Ecrã Pequeno',
433
+    'info_petition_close' => 'Petição encerrada',
434
+    'info_pixels' => 'pixels',
435
+    'info_plusieurs_mots_trouves' => 'Muitas palavras-chave encontradas para "@cherche_mot@":',
436
+    'info_portfolio_automatique' => 'Portfolio automático :',
437
+    'info_premier_resultat' => '[@debut_limit@ primeiros resultados em @total@]',
438
+    'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados em @total@]',
439
+    'info_propose_1' => '[@nom_site_spip@] Proposto : @titre@',
440
+    'info_propose_2' => 'Artigos propostos
441 441
 ----------------',
442
-	'info_propose_3' => 'O artigo "@titre@" é proposto para publicação.',
443
-	'info_propose_4' => 'Está convidado a vir consultá-lo e a dar a sua opinião',
444
-	'info_propose_5' => 'no fórum que lhe está ligado. Está disponível no endereço:',
445
-	'info_publie_01' => 'O artigo "@titre@" foi validado por @connect_nom@.',
446
-	'info_publie_1' => '[@nom_site_spip@] PUBLICADO : @titre@',
447
-	'info_publie_2' => 'Artigo publicado
442
+    'info_propose_3' => 'O artigo "@titre@" é proposto para publicação.',
443
+    'info_propose_4' => 'Está convidado a vir consultá-lo e a dar a sua opinião',
444
+    'info_propose_5' => 'no fórum que lhe está ligado. Está disponível no endereço:',
445
+    'info_publie_01' => 'O artigo "@titre@" foi validado por @connect_nom@.',
446
+    'info_publie_1' => '[@nom_site_spip@] PUBLICADO : @titre@',
447
+    'info_publie_2' => 'Artigo publicado
448 448
 --------------',
449
-	'info_rechercher' => 'Procurar',
450
-	'info_rechercher_02' => 'Procurar :',
451
-	'info_remplacer_vignette' => 'Substituir a miniatura por defeito por um logotipo personalizado :',
452
-	'info_rubriques_nb' => '@nb@ rubricas',
453
-	'info_rubriques_un' => '1 rubrica',
454
-	'info_sans_titre_2' => 'sem título',
455
-	'info_selectionner_fichier' => 'Pode seleccionar um ficheiro da pasta @upload@',
456
-	'info_selectionner_fichier_2' => 'Seleccionar um ficheiro :',
457
-	'info_sites_nb' => '@nb@ sítios',
458
-	'info_sites_un' => '1 sítio',
459
-	'info_supprimer_vignette' => 'suprimir a miniatura',
460
-	'info_symbole_bleu' => 'O símbolo <b>azul</b> indica um<b>memorando </b>: isto é uma mensagem para o seu uso pessoal.',
461
-	'info_symbole_jaune' => 'O símbolo<b>amarelo</b> indica um <b>anúncio a todos os redactores</b> : modificável por todos os administradores, e visível por todos os redactores.',
462
-	'info_symbole_vert' => 'O símbolo<b>verde</b> indica as <b>mensagens trocadas com outros utilizadores</b> do sítio.',
463
-	'info_telecharger_nouveau_logo' => 'Telecarregar um novo logotipo :',
464
-	'info_telecharger_ordinateur' => 'Telecarregar do seu computador :',
465
-	'info_tous_resultats_enregistres' => '[todos os  resultados estão registados]',
466
-	'info_tout_afficher' => 'Exibir tudo',
467
-	'info_travaux_texte' => 'Este sítio ainda não está configurado. Volte mais tarde...',
468
-	'info_travaux_titre' => 'Sítio em construção',
469
-	'info_trop_resultat' => 'Demasiado resultados para "@cherche_mot@". Por favor afine a pesquisa.',
470
-	'info_utilisation_messagerie_interne' => 'Você utiliza o correio interno deste sítio.',
471
-	'info_valider_lien' => 'validar esta ligação',
472
-	'info_verifier_image' => ', Por favor verifique se as suas imagens foram transferidas correctamente.',
473
-	'info_vignette_defaut' => 'Miniatura por defeito',
474
-	'info_vignette_personnalisee' => 'Miniatura personalizada',
475
-	'info_visite' => 'visita :',
476
-	'info_vos_rendez_vous' => 'Os seus futuros encontros',
477
-	'infos_vos_pense_bete' => 'Os seus memorandos',
449
+    'info_rechercher' => 'Procurar',
450
+    'info_rechercher_02' => 'Procurar :',
451
+    'info_remplacer_vignette' => 'Substituir a miniatura por defeito por um logotipo personalizado :',
452
+    'info_rubriques_nb' => '@nb@ rubricas',
453
+    'info_rubriques_un' => '1 rubrica',
454
+    'info_sans_titre_2' => 'sem título',
455
+    'info_selectionner_fichier' => 'Pode seleccionar um ficheiro da pasta @upload@',
456
+    'info_selectionner_fichier_2' => 'Seleccionar um ficheiro :',
457
+    'info_sites_nb' => '@nb@ sítios',
458
+    'info_sites_un' => '1 sítio',
459
+    'info_supprimer_vignette' => 'suprimir a miniatura',
460
+    'info_symbole_bleu' => 'O símbolo <b>azul</b> indica um<b>memorando </b>: isto é uma mensagem para o seu uso pessoal.',
461
+    'info_symbole_jaune' => 'O símbolo<b>amarelo</b> indica um <b>anúncio a todos os redactores</b> : modificável por todos os administradores, e visível por todos os redactores.',
462
+    'info_symbole_vert' => 'O símbolo<b>verde</b> indica as <b>mensagens trocadas com outros utilizadores</b> do sítio.',
463
+    'info_telecharger_nouveau_logo' => 'Telecarregar um novo logotipo :',
464
+    'info_telecharger_ordinateur' => 'Telecarregar do seu computador :',
465
+    'info_tous_resultats_enregistres' => '[todos os  resultados estão registados]',
466
+    'info_tout_afficher' => 'Exibir tudo',
467
+    'info_travaux_texte' => 'Este sítio ainda não está configurado. Volte mais tarde...',
468
+    'info_travaux_titre' => 'Sítio em construção',
469
+    'info_trop_resultat' => 'Demasiado resultados para "@cherche_mot@". Por favor afine a pesquisa.',
470
+    'info_utilisation_messagerie_interne' => 'Você utiliza o correio interno deste sítio.',
471
+    'info_valider_lien' => 'validar esta ligação',
472
+    'info_verifier_image' => ', Por favor verifique se as suas imagens foram transferidas correctamente.',
473
+    'info_vignette_defaut' => 'Miniatura por defeito',
474
+    'info_vignette_personnalisee' => 'Miniatura personalizada',
475
+    'info_visite' => 'visita :',
476
+    'info_vos_rendez_vous' => 'Os seus futuros encontros',
477
+    'infos_vos_pense_bete' => 'Os seus memorandos',
478 478
 
479
-	// L
480
-	'label_ajout_id_rapide' => 'Adição rápida',
481
-	'label_poids_fichier' => 'Dimensões',
482
-	'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
483
-	'lien_afficher_texte_icones' => 'Exibir ícones e o texto',
484
-	'lien_afficher_texte_seul' => 'Exibir apenas o texto',
485
-	'lien_liberer' => 'desbloquear',
486
-	'lien_liberer_tous' => 'desbloquear estes artigos',
487
-	'lien_nouvea_pense_bete' => 'NOVO MEMORANDO',
488
-	'lien_nouveau_message' => 'NOVA MENSAGEM',
489
-	'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
490
-	'lien_petitions' => 'PETIÇÃO',
491
-	'lien_popularite' => 'popularidade : @popularite@%',
492
-	'lien_racine_site' => 'RAIZ DO SÍTIO',
493
-	'lien_reessayer' => 'tentar de novo',
494
-	'lien_repondre_message' => 'Responder a esta mensagem',
495
-	'lien_supprimer' => 'eliminar',
496
-	'lien_tout_afficher' => 'Exibir tudo',
497
-	'lien_visite_site' => 'visitar este sítio',
498
-	'lien_visites' => '@visites@ visitas',
499
-	'lien_voir_auteur' => 'Ver este autor',
500
-	'ligne' => 'Linha',
501
-	'login' => 'Ligação',
502
-	'login_acces_prive' => 'acesso ao espaço privado',
503
-	'login_autre_identifiant' => 'ligar-se sob um outro identificador',
504
-	'login_cookie_accepte' => 'Por favor configure o seu navegador para que os aceite (pelo menos para este sítio).',
505
-	'login_cookie_oblige' => 'Para se identificar de maneira segura neste sítio, deve aceitar os cookies.',
506
-	'login_deconnexion_ok' => 'Ligação terminada.',
507
-	'login_erreur_pass' => 'Erro de palavra-passe',
508
-	'login_espace_prive' => 'área privada',
509
-	'login_identifiant_inconnu' => 'O identificador « @login@ » é desconhecido.',
510
-	'login_login' => 'Login :',
511
-	'login_login2' => 'Login ou endereço de e-mail :',
512
-	'login_login_pass_incorrect' => '(Login ou palavra-passe incorrecta.)',
513
-	'login_motpasseoublie' => 'palavra - passe esquecida ?',
514
-	'login_non_securise' => 'Atenção, este formulário não é seguro.
479
+    // L
480
+    'label_ajout_id_rapide' => 'Adição rápida',
481
+    'label_poids_fichier' => 'Dimensões',
482
+    'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
483
+    'lien_afficher_texte_icones' => 'Exibir ícones e o texto',
484
+    'lien_afficher_texte_seul' => 'Exibir apenas o texto',
485
+    'lien_liberer' => 'desbloquear',
486
+    'lien_liberer_tous' => 'desbloquear estes artigos',
487
+    'lien_nouvea_pense_bete' => 'NOVO MEMORANDO',
488
+    'lien_nouveau_message' => 'NOVA MENSAGEM',
489
+    'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
490
+    'lien_petitions' => 'PETIÇÃO',
491
+    'lien_popularite' => 'popularidade : @popularite@%',
492
+    'lien_racine_site' => 'RAIZ DO SÍTIO',
493
+    'lien_reessayer' => 'tentar de novo',
494
+    'lien_repondre_message' => 'Responder a esta mensagem',
495
+    'lien_supprimer' => 'eliminar',
496
+    'lien_tout_afficher' => 'Exibir tudo',
497
+    'lien_visite_site' => 'visitar este sítio',
498
+    'lien_visites' => '@visites@ visitas',
499
+    'lien_voir_auteur' => 'Ver este autor',
500
+    'ligne' => 'Linha',
501
+    'login' => 'Ligação',
502
+    'login_acces_prive' => 'acesso ao espaço privado',
503
+    'login_autre_identifiant' => 'ligar-se sob um outro identificador',
504
+    'login_cookie_accepte' => 'Por favor configure o seu navegador para que os aceite (pelo menos para este sítio).',
505
+    'login_cookie_oblige' => 'Para se identificar de maneira segura neste sítio, deve aceitar os cookies.',
506
+    'login_deconnexion_ok' => 'Ligação terminada.',
507
+    'login_erreur_pass' => 'Erro de palavra-passe',
508
+    'login_espace_prive' => 'área privada',
509
+    'login_identifiant_inconnu' => 'O identificador « @login@ » é desconhecido.',
510
+    'login_login' => 'Login :',
511
+    'login_login2' => 'Login ou endereço de e-mail :',
512
+    'login_login_pass_incorrect' => '(Login ou palavra-passe incorrecta.)',
513
+    'login_motpasseoublie' => 'palavra - passe esquecida ?',
514
+    'login_non_securise' => 'Atenção, este formulário não é seguro.
515 515
  Se não quiser que a sua palavra-passe seja
516 516
  interceptada na rede, por favor active Javascript
517 517
  no seu navegador e',
518
-	'login_nouvelle_tentative' => 'Nova tentativa',
519
-	'login_par_ici' => 'Você está registado... por aqui....',
520
-	'login_pass2' => 'Palavra-passe :',
521
-	'login_preferez_refuser' => '<b>Se prefere recusar os cookies</b>, um outro método de ligação (menos seguro) está à sua disposição',
522
-	'login_recharger' => 'carregar de novo esta página ',
523
-	'login_rester_identifie' => 'Permanecer identificado durante alguns dias ', # MODIF
524
-	'login_retour_public' => 'Regresso ao sítio público',
525
-	'login_retour_site' => 'Regresso ao sítio público',
526
-	'login_retoursitepublic' => 'Regresso ao sítio público',
527
-	'login_securise' => 'Login seguro',
528
-	'login_sinscrire' => 'inscrever-se',
529
-	'login_test_navigateur' => 'teste navegação/nova ligação',
530
-	'login_verifiez_navigateur' => '(Verifique, porém, que o seu navegador não memorizou a sua palavra-passe...)',
518
+    'login_nouvelle_tentative' => 'Nova tentativa',
519
+    'login_par_ici' => 'Você está registado... por aqui....',
520
+    'login_pass2' => 'Palavra-passe :',
521
+    'login_preferez_refuser' => '<b>Se prefere recusar os cookies</b>, um outro método de ligação (menos seguro) está à sua disposição',
522
+    'login_recharger' => 'carregar de novo esta página ',
523
+    'login_rester_identifie' => 'Permanecer identificado durante alguns dias ', # MODIF
524
+    'login_retour_public' => 'Regresso ao sítio público',
525
+    'login_retour_site' => 'Regresso ao sítio público',
526
+    'login_retoursitepublic' => 'Regresso ao sítio público',
527
+    'login_securise' => 'Login seguro',
528
+    'login_sinscrire' => 'inscrever-se',
529
+    'login_test_navigateur' => 'teste navegação/nova ligação',
530
+    'login_verifiez_navigateur' => '(Verifique, porém, que o seu navegador não memorizou a sua palavra-passe...)',
531 531
 
532
-	// M
533
-	'masquer_colonne' => 'Ocultar esta coluna',
534
-	'masquer_trad' => 'ocultar as traduções',
535
-	'module_fichiers_langues' => 'Ficheiros de idioma',
532
+    // M
533
+    'masquer_colonne' => 'Ocultar esta coluna',
534
+    'masquer_trad' => 'ocultar as traduções',
535
+    'module_fichiers_langues' => 'Ficheiros de idioma',
536 536
 
537
-	// N
538
-	'navigateur_pas_redirige' => 'Se o seu navegador não está redireccionado, clique aqui para continuar.',
539
-	'numero' => 'Número',
537
+    // N
538
+    'navigateur_pas_redirige' => 'Se o seu navegador não está redireccionado, clique aqui para continuar.',
539
+    'numero' => 'Número',
540 540
 
541
-	// O
542
-	'occurence' => 'Ocorrência',
543
-	'onglet_affacer_base' => 'Apagar a base de dados',
544
-	'onglet_auteur' => 'O autor',
545
-	'onglet_contenu_site' => 'Conteúdo do sítio',
546
-	'onglet_evolution_visite_mod' => 'Evolução',
547
-	'onglet_fonctions_avances' => 'Funções avançadas',
548
-	'onglet_informations_personnelles' => 'Informações pessoais',
549
-	'onglet_interactivite' => 'Interactividade',
550
-	'onglet_messagerie' => 'Correio',
551
-	'onglet_repartition_rubrique' => 'Distribuição das rubricas',
552
-	'onglet_save_restaur_base' => 'Guardar uma cópia/restaurar a base',
553
-	'onglet_vider_cache' => 'Esvaziar a cache',
541
+    // O
542
+    'occurence' => 'Ocorrência',
543
+    'onglet_affacer_base' => 'Apagar a base de dados',
544
+    'onglet_auteur' => 'O autor',
545
+    'onglet_contenu_site' => 'Conteúdo do sítio',
546
+    'onglet_evolution_visite_mod' => 'Evolução',
547
+    'onglet_fonctions_avances' => 'Funções avançadas',
548
+    'onglet_informations_personnelles' => 'Informações pessoais',
549
+    'onglet_interactivite' => 'Interactividade',
550
+    'onglet_messagerie' => 'Correio',
551
+    'onglet_repartition_rubrique' => 'Distribuição das rubricas',
552
+    'onglet_save_restaur_base' => 'Guardar uma cópia/restaurar a base',
553
+    'onglet_vider_cache' => 'Esvaziar a cache',
554 554
 
555
-	// P
556
-	'pass_choix_pass' => 'Por favor escolha a sua nova palavra-passe',
557
-	'pass_erreur' => 'Erro',
558
-	'pass_erreur_acces_refuse' => '<b>Erro :</b> já não tem acesso a este sítio.',
559
-	'pass_erreur_code_inconnu' => '<b>Erro :</b> este código não corresponde a nenhum dos visitantes com acesso a este sítio.',
560
-	'pass_erreur_non_enregistre' => '<b>Erro :</b> o endereço <tt>@email_oubli@</tt> não está registado neste sítio. ',
561
-	'pass_erreur_non_valide' => '<b>Erro :</b> este email <tt>@email_oubli@</tt> não é válido !  ',
562
-	'pass_erreur_probleme_technique' => '<b>Erro :</b> por causa de um problema técnico, o email não pôde ser enviado.',
563
-	'pass_espace_prive_bla' => 'O espaço privado deste sítio está aberto aos
555
+    // P
556
+    'pass_choix_pass' => 'Por favor escolha a sua nova palavra-passe',
557
+    'pass_erreur' => 'Erro',
558
+    'pass_erreur_acces_refuse' => '<b>Erro :</b> já não tem acesso a este sítio.',
559
+    'pass_erreur_code_inconnu' => '<b>Erro :</b> este código não corresponde a nenhum dos visitantes com acesso a este sítio.',
560
+    'pass_erreur_non_enregistre' => '<b>Erro :</b> o endereço <tt>@email_oubli@</tt> não está registado neste sítio. ',
561
+    'pass_erreur_non_valide' => '<b>Erro :</b> este email <tt>@email_oubli@</tt> não é válido !  ',
562
+    'pass_erreur_probleme_technique' => '<b>Erro :</b> por causa de um problema técnico, o email não pôde ser enviado.',
563
+    'pass_espace_prive_bla' => 'O espaço privado deste sítio está aberto aos
564 564
  visitantes, após inscrição. Uma vez registado poderá consultar os artigos em curso de redacção,
565 565
 propor artigos e participar em todos os fóruns.',
566
-	'pass_forum_bla' => 'Pediu para intervir num fórum
566
+    'pass_forum_bla' => 'Pediu para intervir num fórum
567 567
  reservado aos visitadores registados.',
568
-	'pass_indiquez_cidessous' => 'Indique abaixo o endereço email sob o qual se registou. Receberá
568
+    'pass_indiquez_cidessous' => 'Indique abaixo o endereço email sob o qual se registou. Receberá
569 569
  um mail que indicará o procedimento a seguir para
570 570
         recuperar o seu acesso.',
571
-	'pass_mail_passcookie' => '(esta é uma mensagem automática)
571
+    'pass_mail_passcookie' => '(esta é uma mensagem automática)
572 572
 Para recuperar o seu acesso ao sítio
573 573
 @nom_site_spip@ (@adresse_site@)
574 574
 
@@ -578,136 +578,136 @@  discard block
 block discarded – undo
578 578
 
579 579
 Poderá então introduzir uma nova palavra-passe e reconectar-se ao sítio.
580 580
 ',
581
-	'pass_mot_oublie' => 'Palavra-passe esquecida',
582
-	'pass_nouveau_enregistre' => 'A sua nova palavra-passe foi registada',
583
-	'pass_nouveau_pass' => 'Nova palavra-passe',
584
-	'pass_ok' => 'OK',
585
-	'pass_oubli_mot' => 'Palavra-passe esquecida',
586
-	'pass_procedure_changer' => 'Para alterar a sua palavra-passe, temos primeiro de verificar a sua identidade. Por favor escreva o endereço e-mail associado a esta conta.', # MODIF
587
-	'pass_quitter_fenetre' => 'Fechar esta janela',
588
-	'pass_rappel_login' => 'Recorde : o seu identificador (login) é « @login@ ».',
589
-	'pass_recevoir_mail' => 'Vai receber um email que indica como recuperar o seu acesso ao sítio.', # MODIF
590
-	'pass_retour_public' => 'Regresso ao sítio público',
591
-	'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
592
-	'pass_vousinscrire' => 'Inscrever-se neste sítio',
593
-	'precedent' => 'anterior',
594
-	'previsualisation' => 'Visualização',
595
-	'previsualiser' => 'Pré-visualizar',
581
+    'pass_mot_oublie' => 'Palavra-passe esquecida',
582
+    'pass_nouveau_enregistre' => 'A sua nova palavra-passe foi registada',
583
+    'pass_nouveau_pass' => 'Nova palavra-passe',
584
+    'pass_ok' => 'OK',
585
+    'pass_oubli_mot' => 'Palavra-passe esquecida',
586
+    'pass_procedure_changer' => 'Para alterar a sua palavra-passe, temos primeiro de verificar a sua identidade. Por favor escreva o endereço e-mail associado a esta conta.', # MODIF
587
+    'pass_quitter_fenetre' => 'Fechar esta janela',
588
+    'pass_rappel_login' => 'Recorde : o seu identificador (login) é « @login@ ».',
589
+    'pass_recevoir_mail' => 'Vai receber um email que indica como recuperar o seu acesso ao sítio.', # MODIF
590
+    'pass_retour_public' => 'Regresso ao sítio público',
591
+    'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
592
+    'pass_vousinscrire' => 'Inscrever-se neste sítio',
593
+    'precedent' => 'anterior',
594
+    'previsualisation' => 'Visualização',
595
+    'previsualiser' => 'Pré-visualizar',
596 596
 
597
-	// R
598
-	'retour' => 'Retroceder',
597
+    // R
598
+    'retour' => 'Retroceder',
599 599
 
600
-	// S
601
-	'spip_conforme_dtd' => 'SPIP considera esta página em conforme com o seu DOCTYPE :',
602
-	'squelette' => 'modelo',
603
-	'squelette_inclus_ligne' => 'modelo incluído, linha',
604
-	'squelette_ligne' => 'modelo, linha',
605
-	'stats_visites_et_popularite' => '@visites@ visitas ; popularidade : @popularite@',
606
-	'suivant' => 'seguinte',
600
+    // S
601
+    'spip_conforme_dtd' => 'SPIP considera esta página em conforme com o seu DOCTYPE :',
602
+    'squelette' => 'modelo',
603
+    'squelette_inclus_ligne' => 'modelo incluído, linha',
604
+    'squelette_ligne' => 'modelo, linha',
605
+    'stats_visites_et_popularite' => '@visites@ visitas ; popularidade : @popularite@',
606
+    'suivant' => 'seguinte',
607 607
 
608
-	// T
609
-	'taille_go' => '@taille@ Gb',
610
-	'taille_ko' => '@taille@ kb',
611
-	'taille_mo' => '@taille@ Mb',
612
-	'taille_octets' => ' @taille@ bytes',
613
-	'texte_actualite_site_1' => 'Quando estiver familiarizado(a) com a interface, poderá clicar em «',
614
-	'texte_actualite_site_2' => 'interface completa',
615
-	'texte_actualite_site_3' => '» para abrir mais possibilidades.',
616
-	'texte_creation_automatique_vignette' => 'A criação automática de miniaturas de pré-visualização está activada neste sítio. Se instalar a partir deste formulário imagens de formato(s) @gd_formats@, serão acompanhadas de uma miniatura de um tamanho máximo de @taille_preview@ pixels.',
617
-	'texte_documents_associes' => 'Os documentos seguintes estão associados ao artigo,
608
+    // T
609
+    'taille_go' => '@taille@ Gb',
610
+    'taille_ko' => '@taille@ kb',
611
+    'taille_mo' => '@taille@ Mb',
612
+    'taille_octets' => ' @taille@ bytes',
613
+    'texte_actualite_site_1' => 'Quando estiver familiarizado(a) com a interface, poderá clicar em «',
614
+    'texte_actualite_site_2' => 'interface completa',
615
+    'texte_actualite_site_3' => '» para abrir mais possibilidades.',
616
+    'texte_creation_automatique_vignette' => 'A criação automática de miniaturas de pré-visualização está activada neste sítio. Se instalar a partir deste formulário imagens de formato(s) @gd_formats@, serão acompanhadas de uma miniatura de um tamanho máximo de @taille_preview@ pixels.',
617
+    'texte_documents_associes' => 'Os documentos seguintes estão associados ao artigo,
618 618
   mas não foram directamente
619 619
  inseridos nele. Conforme a paginação do sítio público,
620 620
   poderão aparecer sob forma de documentos anexados.',
621
-	'texte_erreur_mise_niveau_base' => 'Erro de base de dados por ocasião do nivelamento.
621
+    'texte_erreur_mise_niveau_base' => 'Erro de base de dados por ocasião do nivelamento.
622 622
    A imagem <b>@fichier@</b> não passou (artigo @id_article@).
623 623
   Note bem esta referência, volte a tentar o nivelamento, e verifique se as imagens aparecem sempre nos artigos.',
624
-	'texte_erreur_visiteur' => 'Tentou aceder à área privada usando um login não autorizado.',
625
-	'texte_inc_auth_1' => 'Você está identificado sob o
624
+    'texte_erreur_visiteur' => 'Tentou aceder à área privada usando um login não autorizado.',
625
+    'texte_inc_auth_1' => 'Você está identificado sob o
626 626
    login <b>@auth_login@</b>, mas este já/ não existe na base de dados.
627 627
  Tente',
628
-	'texte_inc_auth_2' => 'refazer a ligação',
629
-	'texte_inc_auth_3' => ', depois de eventualmente ter fechado e
628
+    'texte_inc_auth_2' => 'refazer a ligação',
629
+    'texte_inc_auth_3' => ', depois de eventualmente ter fechado e
630 630
  voltado a abrir o seu navegador.',
631
-	'texte_inc_config' => 'As modificações efectuadas nestas páginas influenciam muito o
631
+    'texte_inc_config' => 'As modificações efectuadas nestas páginas influenciam muito o
632 632
  funcionamento do seu sítio. Recomendamos que não intervenha enquanto não estiver familiarizado com o funcionamento do sistema SPIP. <br /><br /><b> Em
633 633
  geral, é fortemente recomendado
634 634
  deixar a responsabilidade dessas páginas ao webmaster principal do seu sítio. <b>',
635
-	'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do sítio, por favor,',
636
-	'texte_inc_meta_2' => 'verificar as permissões de escrita',
637
-	'texte_inc_meta_3' => 'no directório <code>@repertoire@</code>.',
638
-	'texte_statut_en_cours_redaction' => 'em curso de redacção',
639
-	'texte_statut_poubelle' => 'para o caixote de lixo',
640
-	'texte_statut_propose_evaluation' => 'proposto para avaliação',
641
-	'texte_statut_publie' => 'publicado online',
642
-	'texte_statut_refuse' => 'recusado',
643
-	'titre_ajouter_mot_cle' => 'ACRESCENTAR UMA PALAVRA-CHAVE',
644
-	'titre_cadre_raccourcis' => 'ATALHOS :',
645
-	'titre_changer_couleur_interface' => 'Mudar a cor da interface',
646
-	'titre_image_admin_article' => 'Pode administrar este artigo',
647
-	'titre_image_administrateur' => 'Administrador',
648
-	'titre_image_aide' => 'Ajuda sobre este elemento',
649
-	'titre_image_auteur_supprime' => 'Autor eliminado',
650
-	'titre_image_redacteur' => 'Redactor sem acesso',
651
-	'titre_image_redacteur_02' => 'Redactor',
652
-	'titre_image_selecteur' => 'Exibir a lista',
653
-	'titre_image_visiteur' => 'Visitante',
654
-	'titre_joindre_document' => 'ANEXAR UM DOCUMENTO',
655
-	'titre_mots_cles' => 'PALAVRAS-CHAVE',
656
-	'titre_probleme_technique' => 'Atenção : um problema técnico (servidor SQL) impede o acesso a esta parte do sítio. Obrigado pela sua compreensão.',
657
-	'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA RUBRICA',
658
-	'titre_signatures_attente' => 'Assinaturas aguardando validação',
659
-	'titre_signatures_confirmees' => 'Assinaturas confirmadas',
660
-	'titre_statistiques' => 'Estatísticas do sítio',
661
-	'titre_titre_document' => 'Título do documento :',
662
-	'todo' => 'a caminho',
663
-	'trad_reference' => '(referência para as traduções)',
635
+    'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do sítio, por favor,',
636
+    'texte_inc_meta_2' => 'verificar as permissões de escrita',
637
+    'texte_inc_meta_3' => 'no directório <code>@repertoire@</code>.',
638
+    'texte_statut_en_cours_redaction' => 'em curso de redacção',
639
+    'texte_statut_poubelle' => 'para o caixote de lixo',
640
+    'texte_statut_propose_evaluation' => 'proposto para avaliação',
641
+    'texte_statut_publie' => 'publicado online',
642
+    'texte_statut_refuse' => 'recusado',
643
+    'titre_ajouter_mot_cle' => 'ACRESCENTAR UMA PALAVRA-CHAVE',
644
+    'titre_cadre_raccourcis' => 'ATALHOS :',
645
+    'titre_changer_couleur_interface' => 'Mudar a cor da interface',
646
+    'titre_image_admin_article' => 'Pode administrar este artigo',
647
+    'titre_image_administrateur' => 'Administrador',
648
+    'titre_image_aide' => 'Ajuda sobre este elemento',
649
+    'titre_image_auteur_supprime' => 'Autor eliminado',
650
+    'titre_image_redacteur' => 'Redactor sem acesso',
651
+    'titre_image_redacteur_02' => 'Redactor',
652
+    'titre_image_selecteur' => 'Exibir a lista',
653
+    'titre_image_visiteur' => 'Visitante',
654
+    'titre_joindre_document' => 'ANEXAR UM DOCUMENTO',
655
+    'titre_mots_cles' => 'PALAVRAS-CHAVE',
656
+    'titre_probleme_technique' => 'Atenção : um problema técnico (servidor SQL) impede o acesso a esta parte do sítio. Obrigado pela sua compreensão.',
657
+    'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA RUBRICA',
658
+    'titre_signatures_attente' => 'Assinaturas aguardando validação',
659
+    'titre_signatures_confirmees' => 'Assinaturas confirmadas',
660
+    'titre_statistiques' => 'Estatísticas do sítio',
661
+    'titre_titre_document' => 'Título do documento :',
662
+    'todo' => 'a caminho',
663
+    'trad_reference' => '(referência para as traduções)',
664 664
 
665
-	// Z
666
-	'zbug_balise_b_aval' => ': tag B colocada demasiado tarde no laço infinito',
667
-	'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
668
-	'zbug_balise_sans_argument' => 'Argumento em falta na tag @balise@',
669
-	'zbug_boucle' => 'laço infinito',
670
-	'zbug_boucle_recursive_undef' => 'laço recursivo não definido @nom@',
671
-	'zbug_calcul' => 'cálculo',
672
-	'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço infinito',
673
-	'zbug_champ_hors_motif' => 'Campo @champ@ fora de contexto @motif@',
674
-	'zbug_code' => 'código',
675
-	'zbug_critere_inconnu' => 'critério desconhecido @critere@ ',
676
-	'zbug_distant_interdit' => 'Dados externos interditos',
677
-	'zbug_doublon_table_sans_cle_primaire' => 'Entradas duplas numa tabela que não tem uma chave primária simples',
678
-	'zbug_doublon_table_sans_index' => 'Entradas duplas numa tabela sem índice',
679
-	'zbug_erreur_boucle_double' => 'laço @id@: Dupla definição ',
680
-	'zbug_erreur_boucle_fermant' => 'laço @id@: tag final em falta   ',
681
-	'zbug_erreur_boucle_syntaxe' => 'Laço com sintaxe incorrecta @id@',
682
-	'zbug_erreur_compilation' => 'Erro de compilação',
683
-	'zbug_erreur_execution_page' => 'erro de execução da página',
684
-	'zbug_erreur_filtre' => 'Erro : filtro indefinido @filtre@ ',
685
-	'zbug_erreur_meme_parent' => '{meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
686
-	'zbug_erreur_squelette' => 'Erro(s) no modelo',
687
-	'zbug_hors_compilation' => 'Não compilado',
688
-	'zbug_info_erreur_squelette' => 'Erro no sítio',
689
-	'zbug_inversion_ordre_inexistant' => 'inversão de uma ordem inexistente',
690
-	'zbug_pagination_sans_critere' => '#PAGINAÇÃO sem critério {paginação} ou usada num laço recursivo',
691
-	'zbug_parametres_inclus_incorrects' => 'Parâmetros de inclusão incorrectos: @param@',
692
-	'zbug_profile' => 'Cálculo de tempo : @time@',
693
-	'zbug_resultat' => 'resultado',
694
-	'zbug_serveur_indefini' => 'Sevidor SQL não definido',
695
-	'zbug_statistiques' => 'Estatísticas das consulta SQL classificadas por duração',
696
-	'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
697
-	'zxml_connus_attributs' => 'attributos conhecidos',
698
-	'zxml_de' => 'de',
699
-	'zxml_inconnu_attribut' => 'atributo desconhecido',
700
-	'zxml_inconnu_balise' => 'tag desconhecida',
701
-	'zxml_inconnu_entite' => 'entidade desconhecida',
702
-	'zxml_inconnu_id' => 'ID desconhecido',
703
-	'zxml_mais_de' => 'mas de',
704
-	'zxml_non_conforme' => 'não está de acordo com o princípio',
705
-	'zxml_non_fils' => 'não é um filho de ',
706
-	'zxml_nonvide_balise' => 'a tag não está vazia',
707
-	'zxml_obligatoire_attribut' => 'atributo obrigatório está em falta',
708
-	'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorrecta',
709
-	'zxml_survoler' => 'para visualizar os correctos, mover o rato por cima',
710
-	'zxml_valeur_attribut' => 'valor do atributo',
711
-	'zxml_vide_balise' => 'tag vazia',
712
-	'zxml_vu' => 'visualizado antes'
665
+    // Z
666
+    'zbug_balise_b_aval' => ': tag B colocada demasiado tarde no laço infinito',
667
+    'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
668
+    'zbug_balise_sans_argument' => 'Argumento em falta na tag @balise@',
669
+    'zbug_boucle' => 'laço infinito',
670
+    'zbug_boucle_recursive_undef' => 'laço recursivo não definido @nom@',
671
+    'zbug_calcul' => 'cálculo',
672
+    'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço infinito',
673
+    'zbug_champ_hors_motif' => 'Campo @champ@ fora de contexto @motif@',
674
+    'zbug_code' => 'código',
675
+    'zbug_critere_inconnu' => 'critério desconhecido @critere@ ',
676
+    'zbug_distant_interdit' => 'Dados externos interditos',
677
+    'zbug_doublon_table_sans_cle_primaire' => 'Entradas duplas numa tabela que não tem uma chave primária simples',
678
+    'zbug_doublon_table_sans_index' => 'Entradas duplas numa tabela sem índice',
679
+    'zbug_erreur_boucle_double' => 'laço @id@: Dupla definição ',
680
+    'zbug_erreur_boucle_fermant' => 'laço @id@: tag final em falta   ',
681
+    'zbug_erreur_boucle_syntaxe' => 'Laço com sintaxe incorrecta @id@',
682
+    'zbug_erreur_compilation' => 'Erro de compilação',
683
+    'zbug_erreur_execution_page' => 'erro de execução da página',
684
+    'zbug_erreur_filtre' => 'Erro : filtro indefinido @filtre@ ',
685
+    'zbug_erreur_meme_parent' => '{meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
686
+    'zbug_erreur_squelette' => 'Erro(s) no modelo',
687
+    'zbug_hors_compilation' => 'Não compilado',
688
+    'zbug_info_erreur_squelette' => 'Erro no sítio',
689
+    'zbug_inversion_ordre_inexistant' => 'inversão de uma ordem inexistente',
690
+    'zbug_pagination_sans_critere' => '#PAGINAÇÃO sem critério {paginação} ou usada num laço recursivo',
691
+    'zbug_parametres_inclus_incorrects' => 'Parâmetros de inclusão incorrectos: @param@',
692
+    'zbug_profile' => 'Cálculo de tempo : @time@',
693
+    'zbug_resultat' => 'resultado',
694
+    'zbug_serveur_indefini' => 'Sevidor SQL não definido',
695
+    'zbug_statistiques' => 'Estatísticas das consulta SQL classificadas por duração',
696
+    'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
697
+    'zxml_connus_attributs' => 'attributos conhecidos',
698
+    'zxml_de' => 'de',
699
+    'zxml_inconnu_attribut' => 'atributo desconhecido',
700
+    'zxml_inconnu_balise' => 'tag desconhecida',
701
+    'zxml_inconnu_entite' => 'entidade desconhecida',
702
+    'zxml_inconnu_id' => 'ID desconhecido',
703
+    'zxml_mais_de' => 'mas de',
704
+    'zxml_non_conforme' => 'não está de acordo com o princípio',
705
+    'zxml_non_fils' => 'não é um filho de ',
706
+    'zxml_nonvide_balise' => 'a tag não está vazia',
707
+    'zxml_obligatoire_attribut' => 'atributo obrigatório está em falta',
708
+    'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorrecta',
709
+    'zxml_survoler' => 'para visualizar os correctos, mover o rato por cima',
710
+    'zxml_valeur_attribut' => 'valor do atributo',
711
+    'zxml_vide_balise' => 'tag vazia',
712
+    'zxml_vu' => 'visualizado antes'
713 713
 );
Please login to merge, or discard this patch.
ecrire/inc/modifier.php 2 patches
Indentation   +256 added lines, -256 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
 /**
@@ -39,28 +39,28 @@  discard block
 block discarded – undo
39 39
  *     Tableau des champs et valeurs collectées
40 40
  */
41 41
 function collecter_requests($white_list, $black_list = [], $set = null, $tous = false) {
42
-	$c = $set;
43
-	if (!$c) {
44
-		$c = [];
45
-		foreach ($white_list as $champ) {
46
-			// on ne collecte que les champs reellement envoyes par defaut.
47
-			// le cas d'un envoi de valeur NULL peut du coup poser probleme.
48
-			$val = _request($champ);
49
-			if ($tous or $val !== null) {
50
-				$c[$champ] = $val;
51
-			}
52
-		}
53
-		// on ajoute toujours la lang en saisie possible
54
-		// meme si pas prevu au depart pour l'objet concerne
55
-		if ($l = _request('changer_lang')) {
56
-			$c['lang'] = $l;
57
-		}
58
-	}
59
-	foreach ($black_list as $champ) {
60
-		unset($c[$champ]);
61
-	}
62
-
63
-	return $c;
42
+    $c = $set;
43
+    if (!$c) {
44
+        $c = [];
45
+        foreach ($white_list as $champ) {
46
+            // on ne collecte que les champs reellement envoyes par defaut.
47
+            // le cas d'un envoi de valeur NULL peut du coup poser probleme.
48
+            $val = _request($champ);
49
+            if ($tous or $val !== null) {
50
+                $c[$champ] = $val;
51
+            }
52
+        }
53
+        // on ajoute toujours la lang en saisie possible
54
+        // meme si pas prevu au depart pour l'objet concerne
55
+        if ($l = _request('changer_lang')) {
56
+            $c['lang'] = $l;
57
+        }
58
+    }
59
+    foreach ($black_list as $champ) {
60
+        unset($c[$champ]);
61
+    }
62
+
63
+    return $c;
64 64
 }
65 65
 
66 66
 /**
@@ -97,237 +97,237 @@  discard block
 block discarded – undo
97 97
  *     - chaîne : Texte d'un message d'erreur
98 98
  */
99 99
 function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur = '') {
100
-	if (!$id_objet = intval($id_objet)) {
101
-		spip_log('Erreur $id_objet non defini', 'warn');
102
-
103
-		return _T('erreur_technique_enregistrement_impossible');
104
-	}
105
-
106
-	include_spip('inc/filtres');
107
-
108
-	$table_objet = table_objet($objet, $serveur);
109
-	$spip_table_objet = table_objet_sql($objet, $serveur);
110
-	$id_table_objet = id_table_objet($objet, $serveur);
111
-	$trouver_table = charger_fonction('trouver_table', 'base');
112
-	$desc = $trouver_table($spip_table_objet, $serveur);
113
-
114
-	// Appels incomplets (sans $c)
115
-	if (!is_array($c)) {
116
-		spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
117
-
118
-		return _T('erreur_technique_enregistrement_impossible');
119
-	}
120
-
121
-	// Securite : certaines variables ne sont jamais acceptees ici
122
-	// car elles ne relevent pas de autoriser(xxx, modifier) ;
123
-	// il faut passer par instituer_XX()
124
-	// TODO: faut-il passer ces variables interdites
125
-	// dans un fichier de description separe ?
126
-	unset($c['statut']);
127
-	unset($c['id_parent']);
128
-	unset($c['id_rubrique']);
129
-	unset($c['id_secteur']);
130
-
131
-	// Gerer les champs non vides
132
-	if (isset($options['nonvide']) and is_array($options['nonvide'])) {
133
-		foreach ($options['nonvide'] as $champ => $sinon) {
134
-			if (isset($c[$champ]) and $c[$champ] === '') {
135
-				$c[$champ] = $sinon;
136
-			}
137
-		}
138
-	}
139
-
140
-	// N'accepter que les champs qui existent
141
-	// TODO: ici aussi on peut valider les contenus
142
-	// en fonction du type
143
-	$champs = array_intersect_key($c, $desc['field']);
144
-
145
-	// Nettoyer les valeurs
146
-	$champs = array_map('corriger_caracteres', $champs);
147
-
148
-	// On récupère l'état avant toute modification
149
-	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
150
-
151
-	// Envoyer aux plugins
152
-	$champs = pipeline(
153
-		'pre_edition',
154
-		[
155
-			'args' => [
156
-				'table' => $spip_table_objet, // compatibilite
157
-				'table_objet' => $table_objet,
158
-				'spip_table_objet' => $spip_table_objet,
159
-				'desc' => $desc,
160
-				'type' => $objet,
161
-				'id_objet' => $id_objet,
162
-				'data' => $options['data'] ?? null,
163
-				'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
164
-				'champs_anciens' => $row, // état du contenu avant modif
165
-				'serveur' => $serveur,
166
-				'action' => $options['action'] ?? 'modifier'
167
-			],
168
-			'data' => $champs
169
-		]
170
-	);
171
-
172
-	if (!$champs) {
173
-		return false;
174
-	}
175
-
176
-
177
-	// marquer le fait que l'objet est travaille par toto a telle date
178
-	if ($GLOBALS['meta']['articles_modif'] != 'non') {
179
-		include_spip('inc/drapeau_edition');
180
-		signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet);
181
-	}
182
-
183
-	// Verifier si les mises a jour sont pertinentes, datees, en conflit etc
184
-	include_spip('inc/editer');
185
-	if (!isset($options['data']) or is_null($options['data'])) {
186
-		$options['data'] = &$_POST;
187
-	}
188
-	$conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur);
189
-	// cas hypothetique : normalement inc/editer verifie en amont le conflit edition
190
-	// et gere l'interface
191
-	// ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme
192
-	if ($conflits) {
193
-		return _T('titre_conflit_edition');
194
-	}
195
-
196
-	if ($champs) {
197
-		// cas particulier de la langue : passer par instituer_langue_objet
198
-		if (isset($champs['lang'])) {
199
-			if ($changer_lang = $champs['lang']) {
200
-				$id_rubrique = 0;
201
-				if (isset($desc['field']['id_rubrique'])) {
202
-					$parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
203
-					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
204
-				}
205
-				$instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
206
-				$champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
207
-			}
208
-			// on laisse 'lang' dans $champs,
209
-			// ca permet de passer dans le pipeline post_edition et de journaliser
210
-			// et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir
211
-			// deja pris en compte
212
-		}
213
-
214
-		// la modif peut avoir lieu
215
-
216
-		// faut-il ajouter date_modif ?
217
-		if (
218
-			!empty($options['date_modif'])
219
-			and !isset($champs[$options['date_modif']])
220
-		) {
221
-			$champs[$options['date_modif']] = date('Y-m-d H:i:s');
222
-		}
223
-
224
-		// allez on commit la modif
225
-		sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur);
226
-
227
-		// on verifie si elle est bien passee
228
-		$moof = sql_fetsel(
229
-			array_keys($champs),
230
-			$spip_table_objet,
231
-			"$id_table_objet=" . intval($id_objet),
232
-			[],
233
-			[],
234
-			'',
235
-			[],
236
-			$serveur
237
-		);
238
-		// si difference entre les champs, reperer les champs mal enregistres
239
-		if ($moof != $champs) {
240
-			$liste = [];
241
-			foreach ($moof as $k => $v) {
242
-				if (
243
-					$v !== $champs[$k]
244
-					// ne pas alerter si le champ est numerique est que les valeurs sont equivalentes
245
-					and (!is_numeric($v) or intval($v) !== intval($champs[$k]))
246
-					// ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle
247
-					and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00']))
248
-				) {
249
-					$liste[] = $k;
250
-					$conflits[$k]['post'] = $champs[$k];
251
-					$conflits[$k]['save'] = $v;
252
-
253
-					// cas specifique MySQL+emoji : si l'un est la
254
-					// conversion utf8_noplanes de l'autre alors c'est OK
255
-					if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) {
256
-						include_spip('inc/charsets');
257
-						if ($v == utf8_noplanes($champs[$k])) {
258
-							array_pop($liste);
259
-						}
260
-					}
261
-				}
262
-			}
263
-			// si un champ n'a pas ete correctement enregistre, loger et retourner une erreur
264
-			// c'est un cas exceptionnel
265
-			if (count($liste)) {
266
-				spip_log(
267
-					"Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
268
-					'modifier.' . _LOG_CRITIQUE
269
-				);
270
-
271
-				return _T(
272
-					'erreur_technique_enregistrement_champs',
273
-					['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
274
-				);
275
-			}
276
-		}
277
-
278
-		// Invalider les caches
279
-		if (isset($options['invalideur']) and $options['invalideur']) {
280
-			include_spip('inc/invalideur');
281
-			if (is_array($options['invalideur'])) {
282
-				array_map('suivre_invalideur', $options['invalideur']);
283
-			} else {
284
-				suivre_invalideur($options['invalideur']);
285
-			}
286
-		}
287
-
288
-		// Notifications, gestion des revisions...
289
-		// en standard, appelle |nouvelle_revision ci-dessous
290
-		pipeline(
291
-			'post_edition',
292
-			[
293
-				'args' => [
294
-					'table' => $spip_table_objet,
295
-					'table_objet' => $table_objet,
296
-					'spip_table_objet' => $spip_table_objet,
297
-					'desc' => $desc,
298
-					'type' => $objet,
299
-					'id_objet' => $id_objet,
300
-					'champs' => $options['champs'] ?? [], // [doc] kesako ?
301
-					'champs_anciens' => $row, // état du contenu avant modif
302
-					'serveur' => $serveur,
303
-					'action' => $options['action'] ?? 'modifier'
304
-				],
305
-				'data' => $champs
306
-			]
307
-		);
308
-	}
309
-
310
-	// journaliser l'affaire
311
-	// message a affiner :-)
312
-	include_spip('inc/filtres_mini');
313
-	$qui = '';
314
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
315
-		$qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
316
-	}
317
-	if (!empty($GLOBALS['visiteur_session']['nom'])) {
318
-		$qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
319
-	}
320
-	if ($qui == '') {
321
-		$qui = '#ip:' . $GLOBALS['ip'] . '#';
322
-	}
323
-	journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
324
-		'+',
325
-		array_diff(array_keys($champs), ['date_modif'])
326
-	) . ')'), [
327
-		'faire' => 'modifier',
328
-		'quoi' => $objet,
329
-		'id' => $id_objet
330
-	]);
331
-
332
-	return '';
100
+    if (!$id_objet = intval($id_objet)) {
101
+        spip_log('Erreur $id_objet non defini', 'warn');
102
+
103
+        return _T('erreur_technique_enregistrement_impossible');
104
+    }
105
+
106
+    include_spip('inc/filtres');
107
+
108
+    $table_objet = table_objet($objet, $serveur);
109
+    $spip_table_objet = table_objet_sql($objet, $serveur);
110
+    $id_table_objet = id_table_objet($objet, $serveur);
111
+    $trouver_table = charger_fonction('trouver_table', 'base');
112
+    $desc = $trouver_table($spip_table_objet, $serveur);
113
+
114
+    // Appels incomplets (sans $c)
115
+    if (!is_array($c)) {
116
+        spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
117
+
118
+        return _T('erreur_technique_enregistrement_impossible');
119
+    }
120
+
121
+    // Securite : certaines variables ne sont jamais acceptees ici
122
+    // car elles ne relevent pas de autoriser(xxx, modifier) ;
123
+    // il faut passer par instituer_XX()
124
+    // TODO: faut-il passer ces variables interdites
125
+    // dans un fichier de description separe ?
126
+    unset($c['statut']);
127
+    unset($c['id_parent']);
128
+    unset($c['id_rubrique']);
129
+    unset($c['id_secteur']);
130
+
131
+    // Gerer les champs non vides
132
+    if (isset($options['nonvide']) and is_array($options['nonvide'])) {
133
+        foreach ($options['nonvide'] as $champ => $sinon) {
134
+            if (isset($c[$champ]) and $c[$champ] === '') {
135
+                $c[$champ] = $sinon;
136
+            }
137
+        }
138
+    }
139
+
140
+    // N'accepter que les champs qui existent
141
+    // TODO: ici aussi on peut valider les contenus
142
+    // en fonction du type
143
+    $champs = array_intersect_key($c, $desc['field']);
144
+
145
+    // Nettoyer les valeurs
146
+    $champs = array_map('corriger_caracteres', $champs);
147
+
148
+    // On récupère l'état avant toute modification
149
+    $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
150
+
151
+    // Envoyer aux plugins
152
+    $champs = pipeline(
153
+        'pre_edition',
154
+        [
155
+            'args' => [
156
+                'table' => $spip_table_objet, // compatibilite
157
+                'table_objet' => $table_objet,
158
+                'spip_table_objet' => $spip_table_objet,
159
+                'desc' => $desc,
160
+                'type' => $objet,
161
+                'id_objet' => $id_objet,
162
+                'data' => $options['data'] ?? null,
163
+                'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
164
+                'champs_anciens' => $row, // état du contenu avant modif
165
+                'serveur' => $serveur,
166
+                'action' => $options['action'] ?? 'modifier'
167
+            ],
168
+            'data' => $champs
169
+        ]
170
+    );
171
+
172
+    if (!$champs) {
173
+        return false;
174
+    }
175
+
176
+
177
+    // marquer le fait que l'objet est travaille par toto a telle date
178
+    if ($GLOBALS['meta']['articles_modif'] != 'non') {
179
+        include_spip('inc/drapeau_edition');
180
+        signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet);
181
+    }
182
+
183
+    // Verifier si les mises a jour sont pertinentes, datees, en conflit etc
184
+    include_spip('inc/editer');
185
+    if (!isset($options['data']) or is_null($options['data'])) {
186
+        $options['data'] = &$_POST;
187
+    }
188
+    $conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur);
189
+    // cas hypothetique : normalement inc/editer verifie en amont le conflit edition
190
+    // et gere l'interface
191
+    // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme
192
+    if ($conflits) {
193
+        return _T('titre_conflit_edition');
194
+    }
195
+
196
+    if ($champs) {
197
+        // cas particulier de la langue : passer par instituer_langue_objet
198
+        if (isset($champs['lang'])) {
199
+            if ($changer_lang = $champs['lang']) {
200
+                $id_rubrique = 0;
201
+                if (isset($desc['field']['id_rubrique'])) {
202
+                    $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
203
+                    $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
204
+                }
205
+                $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
206
+                $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
207
+            }
208
+            // on laisse 'lang' dans $champs,
209
+            // ca permet de passer dans le pipeline post_edition et de journaliser
210
+            // et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir
211
+            // deja pris en compte
212
+        }
213
+
214
+        // la modif peut avoir lieu
215
+
216
+        // faut-il ajouter date_modif ?
217
+        if (
218
+            !empty($options['date_modif'])
219
+            and !isset($champs[$options['date_modif']])
220
+        ) {
221
+            $champs[$options['date_modif']] = date('Y-m-d H:i:s');
222
+        }
223
+
224
+        // allez on commit la modif
225
+        sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur);
226
+
227
+        // on verifie si elle est bien passee
228
+        $moof = sql_fetsel(
229
+            array_keys($champs),
230
+            $spip_table_objet,
231
+            "$id_table_objet=" . intval($id_objet),
232
+            [],
233
+            [],
234
+            '',
235
+            [],
236
+            $serveur
237
+        );
238
+        // si difference entre les champs, reperer les champs mal enregistres
239
+        if ($moof != $champs) {
240
+            $liste = [];
241
+            foreach ($moof as $k => $v) {
242
+                if (
243
+                    $v !== $champs[$k]
244
+                    // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes
245
+                    and (!is_numeric($v) or intval($v) !== intval($champs[$k]))
246
+                    // ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle
247
+                    and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00']))
248
+                ) {
249
+                    $liste[] = $k;
250
+                    $conflits[$k]['post'] = $champs[$k];
251
+                    $conflits[$k]['save'] = $v;
252
+
253
+                    // cas specifique MySQL+emoji : si l'un est la
254
+                    // conversion utf8_noplanes de l'autre alors c'est OK
255
+                    if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) {
256
+                        include_spip('inc/charsets');
257
+                        if ($v == utf8_noplanes($champs[$k])) {
258
+                            array_pop($liste);
259
+                        }
260
+                    }
261
+                }
262
+            }
263
+            // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur
264
+            // c'est un cas exceptionnel
265
+            if (count($liste)) {
266
+                spip_log(
267
+                    "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
268
+                    'modifier.' . _LOG_CRITIQUE
269
+                );
270
+
271
+                return _T(
272
+                    'erreur_technique_enregistrement_champs',
273
+                    ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
274
+                );
275
+            }
276
+        }
277
+
278
+        // Invalider les caches
279
+        if (isset($options['invalideur']) and $options['invalideur']) {
280
+            include_spip('inc/invalideur');
281
+            if (is_array($options['invalideur'])) {
282
+                array_map('suivre_invalideur', $options['invalideur']);
283
+            } else {
284
+                suivre_invalideur($options['invalideur']);
285
+            }
286
+        }
287
+
288
+        // Notifications, gestion des revisions...
289
+        // en standard, appelle |nouvelle_revision ci-dessous
290
+        pipeline(
291
+            'post_edition',
292
+            [
293
+                'args' => [
294
+                    'table' => $spip_table_objet,
295
+                    'table_objet' => $table_objet,
296
+                    'spip_table_objet' => $spip_table_objet,
297
+                    'desc' => $desc,
298
+                    'type' => $objet,
299
+                    'id_objet' => $id_objet,
300
+                    'champs' => $options['champs'] ?? [], // [doc] kesako ?
301
+                    'champs_anciens' => $row, // état du contenu avant modif
302
+                    'serveur' => $serveur,
303
+                    'action' => $options['action'] ?? 'modifier'
304
+                ],
305
+                'data' => $champs
306
+            ]
307
+        );
308
+    }
309
+
310
+    // journaliser l'affaire
311
+    // message a affiner :-)
312
+    include_spip('inc/filtres_mini');
313
+    $qui = '';
314
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
315
+        $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
316
+    }
317
+    if (!empty($GLOBALS['visiteur_session']['nom'])) {
318
+        $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
319
+    }
320
+    if ($qui == '') {
321
+        $qui = '#ip:' . $GLOBALS['ip'] . '#';
322
+    }
323
+    journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
324
+        '+',
325
+        array_diff(array_keys($champs), ['date_modif'])
326
+    ) . ')'), [
327
+        'faire' => 'modifier',
328
+        'quoi' => $objet,
329
+        'id' => $id_objet
330
+    ]);
331
+
332
+    return '';
333 333
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -113,7 +113,7 @@  discard block
 block discarded – undo
113 113
 
114 114
 	// Appels incomplets (sans $c)
115 115
 	if (!is_array($c)) {
116
-		spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
116
+		spip_log('erreur appel objet_modifier_champs('.$objet.'), manque $c');
117 117
 
118 118
 		return _T('erreur_technique_enregistrement_impossible');
119 119
 	}
@@ -146,7 +146,7 @@  discard block
 block discarded – undo
146 146
 	$champs = array_map('corriger_caracteres', $champs);
147 147
 
148 148
 	// On récupère l'état avant toute modification
149
-	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
149
+	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet.'='.$id_objet);
150 150
 
151 151
 	// Envoyer aux plugins
152 152
 	$champs = pipeline(
@@ -200,7 +200,7 @@  discard block
 block discarded – undo
200 200
 				$id_rubrique = 0;
201 201
 				if (isset($desc['field']['id_rubrique'])) {
202 202
 					$parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
203
-					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
203
+					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet));
204 204
 				}
205 205
 				$instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
206 206
 				$champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
@@ -222,13 +222,13 @@  discard block
 block discarded – undo
222 222
 		}
223 223
 
224 224
 		// allez on commit la modif
225
-		sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur);
225
+		sql_updateq($spip_table_objet, $champs, "$id_table_objet=".intval($id_objet), $serveur);
226 226
 
227 227
 		// on verifie si elle est bien passee
228 228
 		$moof = sql_fetsel(
229 229
 			array_keys($champs),
230 230
 			$spip_table_objet,
231
-			"$id_table_objet=" . intval($id_objet),
231
+			"$id_table_objet=".intval($id_objet),
232 232
 			[],
233 233
 			[],
234 234
 			'',
@@ -264,13 +264,13 @@  discard block
 block discarded – undo
264 264
 			// c'est un cas exceptionnel
265 265
 			if (count($liste)) {
266 266
 				spip_log(
267
-					"Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
268
-					'modifier.' . _LOG_CRITIQUE
267
+					"Erreur enregistrement en base $objet/$id_objet champs :".var_export($conflits, true),
268
+					'modifier.'._LOG_CRITIQUE
269 269
 				);
270 270
 
271 271
 				return _T(
272 272
 					'erreur_technique_enregistrement_champs',
273
-					['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
273
+					['champs' => "<i>'".implode("'</i>,<i>'", $liste)."'</i>"]
274 274
 				);
275 275
 			}
276 276
 		}
@@ -312,18 +312,18 @@  discard block
 block discarded – undo
312 312
 	include_spip('inc/filtres_mini');
313 313
 	$qui = '';
314 314
 	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
315
-		$qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
315
+		$qui .= ' #id_auteur:'.$GLOBALS['visiteur_session']['id_auteur'].'#';
316 316
 	}
317 317
 	if (!empty($GLOBALS['visiteur_session']['nom'])) {
318
-		$qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
318
+		$qui .= ' #nom:'.$GLOBALS['visiteur_session']['nom'].'#';
319 319
 	}
320 320
 	if ($qui == '') {
321
-		$qui = '#ip:' . $GLOBALS['ip'] . '#';
321
+		$qui = '#ip:'.$GLOBALS['ip'].'#';
322 322
 	}
323
-	journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
323
+	journal(_L($qui.' a édité '.$objet.' '.$id_objet.' ('.join(
324 324
 		'+',
325 325
 		array_diff(array_keys($champs), ['date_modif'])
326
-	) . ')'), [
326
+	).')'), [
327 327
 		'faire' => 'modifier',
328 328
 		'quoi' => $objet,
329 329
 		'id' => $id_objet
Please login to merge, or discard this patch.
ecrire/base/trouver_table.php 2 patches
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -90,9 +90,9 @@  discard block
 block discarded – undo
90 90
 	// de connexion, et tout risque d'ambiguite
91 91
 	if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
92 92
 		$nom_cache_desc_sql[$serveur][$objets_sql] =
93
-			_DIR_CACHE . 'sql_desc_'
93
+			_DIR_CACHE.'sql_desc_'
94 94
 			. ($serveur ? "{$serveur}_" : '')
95
-			. substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
95
+			. substr(md5($connexion['db'].':'.$connexion['prefixe'].":$objets_sql"), 0, 8)
96 96
 			. '.txt';
97 97
 		// nouveau nom de cache = nouvelle version en memoire
98 98
 		unset($connexion['tables']);
@@ -120,7 +120,7 @@  discard block
 block discarded – undo
120 120
 	if ($connexion['spip_connect_version']) {
121 121
 		if ($table_spip and isset($GLOBALS['table_des_tables'][$nom])) {
122 122
 			$nom = $GLOBALS['table_des_tables'][$nom];
123
-			$nom_sql = 'spip_' . $nom;
123
+			$nom_sql = 'spip_'.$nom;
124 124
 		}
125 125
 	}
126 126
 
@@ -147,12 +147,12 @@  discard block
 block discarded – undo
147 147
 		// meme si pas d'abreviation declaree, trouver la table spip_$nom
148 148
 		// si c'est une table principale,
149 149
 		// puisqu'on le fait aussi pour les tables auxiliaires
150
-		elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_' . $nom])) {
151
-			$nom_sql = 'spip_' . $nom;
150
+		elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_'.$nom])) {
151
+			$nom_sql = 'spip_'.$nom;
152 152
 			$fdesc = &$GLOBALS['tables_principales'][$nom_sql];
153 153
 		} elseif (
154 154
 			isset($GLOBALS['tables_auxiliaires'][$n = $nom])
155
-			or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
155
+			or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_'.$nom])
156 156
 		) {
157 157
 			$nom_sql = $n;
158 158
 			$fdesc = &$GLOBALS['tables_auxiliaires'][$n];
@@ -168,7 +168,7 @@  discard block
 block discarded – undo
168 168
 		) {
169 169
 			if (!$fdesc) {
170 170
 				$log_level = $options['log_missing'] ? _LOG_INFO_IMPORTANTE : _LOG_DEBUG;
171
-				spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base' . $log_level);
171
+				spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base'.$log_level);
172 172
 
173 173
 				return null;
174 174
 			}
@@ -180,7 +180,7 @@  discard block
 block discarded – undo
180 180
 			$desc['exist'] = true;
181 181
 			// gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
182 182
 			// pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
183
-			if (! $desc['key']) {
183
+			if (!$desc['key']) {
184 184
 				spip_log("trouver_table: table sans cle '$serveur' '$nom'", 'base');
185 185
 				unset($desc['key']);
186 186
 			}
@@ -197,7 +197,7 @@  discard block
 block discarded – undo
197 197
 		if (!isset($desc['key']) && !empty($fdesc['key'])) {
198 198
 			$desc['key'] = $fdesc['key'];
199 199
 		}
200
-		if (! isset($desc['key'])) {
200
+		if (!isset($desc['key'])) {
201 201
 			$desc['key'] = [];
202 202
 		}
203 203
 
Please login to merge, or discard this patch.
Indentation   +151 added lines, -151 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\SQL\Tables
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 include_spip('base/objets');
22 22
 
@@ -68,154 +68,154 @@  discard block
 block discarded – undo
68 68
  *
69 69
  **/
70 70
 function base_trouver_table_dist($nom, $serveur = '', $table_spip = true, array $options = []) {
71
-	$desc_cache = null;
72
-	static $nom_cache_desc_sql = [];
73
-
74
-	if (
75
-		!spip_connect($serveur)
76
-		or !preg_match('/^[a-zA-Z0-9._-]*/', $nom)
77
-	) {
78
-		return null;
79
-	}
80
-
81
-	$options = $options + [
82
-		// si false, baissera le niveau de log si une table demandée n’existe pas
83
-		'log_missing' => true,
84
-	];
85
-
86
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
87
-	$objets_sql = lister_tables_objets_sql('::md5');
88
-
89
-	// le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
90
-	// ce qui permet une auto invalidation en cas de modif manuelle du fichier
91
-	// de connexion, et tout risque d'ambiguite
92
-	if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
93
-		$nom_cache_desc_sql[$serveur][$objets_sql] =
94
-			_DIR_CACHE . 'sql_desc_'
95
-			. ($serveur ? "{$serveur}_" : '')
96
-			. substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
97
-			. '.txt';
98
-		// nouveau nom de cache = nouvelle version en memoire
99
-		unset($connexion['tables']);
100
-	}
101
-
102
-	// un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
103
-	if (!$nom) {
104
-		spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
105
-		$connexion['tables'] = [];
106
-
107
-		return null;
108
-	}
109
-
110
-	$nom_sql = $nom;
111
-	if (preg_match('/\.(.*)$/', $nom, $s)) {
112
-		$nom_sql = $s[1];
113
-	} else {
114
-		$nom_sql = $nom;
115
-	}
116
-
117
-	$fdesc = $desc = '';
118
-	$connexion = &$GLOBALS['connexions'][$serveur ?: 0];
119
-
120
-	// base sous SPIP: gerer les abreviations explicites des noms de table
121
-	if ($connexion['spip_connect_version']) {
122
-		if ($table_spip and isset($GLOBALS['table_des_tables'][$nom])) {
123
-			$nom = $GLOBALS['table_des_tables'][$nom];
124
-			$nom_sql = 'spip_' . $nom;
125
-		}
126
-	}
127
-
128
-	// si c'est la premiere table qu'on cherche
129
-	// et si on est pas explicitement en recalcul
130
-	// on essaye de recharger le cache des decriptions de ce serveur
131
-	// dans le fichier cache
132
-	if (
133
-		!isset($connexion['tables'][$nom_sql])
134
-		and defined('_VAR_MODE') and _VAR_MODE !== 'recalcul'
135
-		and (!isset($connexion['tables']) or !$connexion['tables'])
136
-	) {
137
-		if (
138
-			lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache)
139
-			and $desc_cache = unserialize($desc_cache)
140
-		) {
141
-			$connexion['tables'] = $desc_cache;
142
-		}
143
-	}
144
-	if ($table_spip and !isset($connexion['tables'][$nom_sql])) {
145
-		if (isset($GLOBALS['tables_principales'][$nom_sql])) {
146
-			$fdesc = $GLOBALS['tables_principales'][$nom_sql];
147
-		}
148
-		// meme si pas d'abreviation declaree, trouver la table spip_$nom
149
-		// si c'est une table principale,
150
-		// puisqu'on le fait aussi pour les tables auxiliaires
151
-		elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_' . $nom])) {
152
-			$nom_sql = 'spip_' . $nom;
153
-			$fdesc = &$GLOBALS['tables_principales'][$nom_sql];
154
-		} elseif (
155
-			isset($GLOBALS['tables_auxiliaires'][$n = $nom])
156
-			or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
157
-		) {
158
-			$nom_sql = $n;
159
-			$fdesc = &$GLOBALS['tables_auxiliaires'][$n];
160
-		}  # table locale a cote de SPIP, comme non SPIP:
161
-	}
162
-	if (!isset($connexion['tables'][$nom_sql])) {
163
-		// La *vraie* base a la priorite
164
-		$exists = sql_table_exists($nom_sql, $table_spip, $serveur);
165
-		if (
166
-			!$exists
167
-			or !$desc = sql_showtable($nom_sql, $table_spip, $serveur)
168
-			or !$desc['field']
169
-		) {
170
-			if (!$fdesc) {
171
-				$log_level = $options['log_missing'] ? _LOG_INFO_IMPORTANTE : _LOG_DEBUG;
172
-				spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base' . $log_level);
173
-
174
-				return null;
175
-			}
176
-			// on ne sait pas lire la structure de la table :
177
-			// on retombe sur la description donnee dans les fichiers spip
178
-			$desc = $fdesc;
179
-			$desc['exist'] = false;
180
-		} else {
181
-			$desc['exist'] = true;
182
-			// gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
183
-			// pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
184
-			if (! $desc['key']) {
185
-				spip_log("trouver_table: table sans cle '$serveur' '$nom'", 'base');
186
-				unset($desc['key']);
187
-			}
188
-		}
189
-
190
-		$desc['table'] = $desc['table_sql'] = $nom_sql;
191
-		$desc['connexion'] = $serveur;
192
-
193
-		// charger les infos declarees pour cette table
194
-		// en lui passant les infos connues
195
-		// $desc est prioritaire pour la description de la table
196
-		$desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
197
-		// s'assurer qu'on a toujours un 'key'
198
-		if (!isset($desc['key']) && !empty($fdesc['key'])) {
199
-			$desc['key'] = $fdesc['key'];
200
-		}
201
-		if (! isset($desc['key'])) {
202
-			$desc['key'] = [];
203
-		}
204
-
205
-		// si tables_objets_sql est bien fini d'init, on peut cacher
206
-		$connexion['tables'][$nom_sql] = $desc;
207
-		$res = &$connexion['tables'][$nom_sql];
208
-		// une nouvelle table a ete decrite
209
-		// mettons donc a jour le cache des descriptions de ce serveur
210
-		if (is_writeable(_DIR_CACHE)) {
211
-			ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true);
212
-		}
213
-	} else {
214
-		$res = &$connexion['tables'][$nom_sql];
215
-	}
216
-
217
-	// toujours retourner $nom dans id_table
218
-	$res['id_table'] = $nom;
219
-
220
-	return $res;
71
+    $desc_cache = null;
72
+    static $nom_cache_desc_sql = [];
73
+
74
+    if (
75
+        !spip_connect($serveur)
76
+        or !preg_match('/^[a-zA-Z0-9._-]*/', $nom)
77
+    ) {
78
+        return null;
79
+    }
80
+
81
+    $options = $options + [
82
+        // si false, baissera le niveau de log si une table demandée n’existe pas
83
+        'log_missing' => true,
84
+    ];
85
+
86
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
87
+    $objets_sql = lister_tables_objets_sql('::md5');
88
+
89
+    // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
90
+    // ce qui permet une auto invalidation en cas de modif manuelle du fichier
91
+    // de connexion, et tout risque d'ambiguite
92
+    if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
93
+        $nom_cache_desc_sql[$serveur][$objets_sql] =
94
+            _DIR_CACHE . 'sql_desc_'
95
+            . ($serveur ? "{$serveur}_" : '')
96
+            . substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
97
+            . '.txt';
98
+        // nouveau nom de cache = nouvelle version en memoire
99
+        unset($connexion['tables']);
100
+    }
101
+
102
+    // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
103
+    if (!$nom) {
104
+        spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
105
+        $connexion['tables'] = [];
106
+
107
+        return null;
108
+    }
109
+
110
+    $nom_sql = $nom;
111
+    if (preg_match('/\.(.*)$/', $nom, $s)) {
112
+        $nom_sql = $s[1];
113
+    } else {
114
+        $nom_sql = $nom;
115
+    }
116
+
117
+    $fdesc = $desc = '';
118
+    $connexion = &$GLOBALS['connexions'][$serveur ?: 0];
119
+
120
+    // base sous SPIP: gerer les abreviations explicites des noms de table
121
+    if ($connexion['spip_connect_version']) {
122
+        if ($table_spip and isset($GLOBALS['table_des_tables'][$nom])) {
123
+            $nom = $GLOBALS['table_des_tables'][$nom];
124
+            $nom_sql = 'spip_' . $nom;
125
+        }
126
+    }
127
+
128
+    // si c'est la premiere table qu'on cherche
129
+    // et si on est pas explicitement en recalcul
130
+    // on essaye de recharger le cache des decriptions de ce serveur
131
+    // dans le fichier cache
132
+    if (
133
+        !isset($connexion['tables'][$nom_sql])
134
+        and defined('_VAR_MODE') and _VAR_MODE !== 'recalcul'
135
+        and (!isset($connexion['tables']) or !$connexion['tables'])
136
+    ) {
137
+        if (
138
+            lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache)
139
+            and $desc_cache = unserialize($desc_cache)
140
+        ) {
141
+            $connexion['tables'] = $desc_cache;
142
+        }
143
+    }
144
+    if ($table_spip and !isset($connexion['tables'][$nom_sql])) {
145
+        if (isset($GLOBALS['tables_principales'][$nom_sql])) {
146
+            $fdesc = $GLOBALS['tables_principales'][$nom_sql];
147
+        }
148
+        // meme si pas d'abreviation declaree, trouver la table spip_$nom
149
+        // si c'est une table principale,
150
+        // puisqu'on le fait aussi pour les tables auxiliaires
151
+        elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_' . $nom])) {
152
+            $nom_sql = 'spip_' . $nom;
153
+            $fdesc = &$GLOBALS['tables_principales'][$nom_sql];
154
+        } elseif (
155
+            isset($GLOBALS['tables_auxiliaires'][$n = $nom])
156
+            or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
157
+        ) {
158
+            $nom_sql = $n;
159
+            $fdesc = &$GLOBALS['tables_auxiliaires'][$n];
160
+        }  # table locale a cote de SPIP, comme non SPIP:
161
+    }
162
+    if (!isset($connexion['tables'][$nom_sql])) {
163
+        // La *vraie* base a la priorite
164
+        $exists = sql_table_exists($nom_sql, $table_spip, $serveur);
165
+        if (
166
+            !$exists
167
+            or !$desc = sql_showtable($nom_sql, $table_spip, $serveur)
168
+            or !$desc['field']
169
+        ) {
170
+            if (!$fdesc) {
171
+                $log_level = $options['log_missing'] ? _LOG_INFO_IMPORTANTE : _LOG_DEBUG;
172
+                spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base' . $log_level);
173
+
174
+                return null;
175
+            }
176
+            // on ne sait pas lire la structure de la table :
177
+            // on retombe sur la description donnee dans les fichiers spip
178
+            $desc = $fdesc;
179
+            $desc['exist'] = false;
180
+        } else {
181
+            $desc['exist'] = true;
182
+            // gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
183
+            // pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
184
+            if (! $desc['key']) {
185
+                spip_log("trouver_table: table sans cle '$serveur' '$nom'", 'base');
186
+                unset($desc['key']);
187
+            }
188
+        }
189
+
190
+        $desc['table'] = $desc['table_sql'] = $nom_sql;
191
+        $desc['connexion'] = $serveur;
192
+
193
+        // charger les infos declarees pour cette table
194
+        // en lui passant les infos connues
195
+        // $desc est prioritaire pour la description de la table
196
+        $desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
197
+        // s'assurer qu'on a toujours un 'key'
198
+        if (!isset($desc['key']) && !empty($fdesc['key'])) {
199
+            $desc['key'] = $fdesc['key'];
200
+        }
201
+        if (! isset($desc['key'])) {
202
+            $desc['key'] = [];
203
+        }
204
+
205
+        // si tables_objets_sql est bien fini d'init, on peut cacher
206
+        $connexion['tables'][$nom_sql] = $desc;
207
+        $res = &$connexion['tables'][$nom_sql];
208
+        // une nouvelle table a ete decrite
209
+        // mettons donc a jour le cache des descriptions de ce serveur
210
+        if (is_writeable(_DIR_CACHE)) {
211
+            ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true);
212
+        }
213
+    } else {
214
+        $res = &$connexion['tables'][$nom_sql];
215
+    }
216
+
217
+    // toujours retourner $nom dans id_table
218
+    $res['id_table'] = $nom;
219
+
220
+    return $res;
221 221
 }
Please login to merge, or discard this patch.
ecrire/inc/livrer_fichier.php 3 patches
Indentation   +125 added lines, -125 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Fichier
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -36,28 +36,28 @@  discard block
 block discarded – undo
36 36
  */
37 37
 function spip_livrer_fichier($fichier, $content_type = 'application/octet-stream', $options = []) {
38 38
 
39
-	$defaut = [
40
-		'attachment' => false,
41
-		'expires' => 3600,
42
-		'range' => null
43
-	];
44
-	$options = array_merge($defaut, $options);
45
-	if (is_numeric($options['expire']) and $options['expire'] > 0) {
46
-		$options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT';
47
-	}
48
-
49
-	if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) {
50
-		$options['range'] = $_SERVER['HTTP_RANGE'];
51
-	}
52
-
53
-	spip_livrer_fichier_entetes($fichier, $content_type, $options['attachment'] && !$options['range'], $options['expires']);
54
-
55
-	if (!is_null($options['range'])) {
56
-		spip_livrer_fichier_partie($fichier, $options['range']);
57
-	}
58
-	else {
59
-		spip_livrer_fichier_entier($fichier);
60
-	}
39
+    $defaut = [
40
+        'attachment' => false,
41
+        'expires' => 3600,
42
+        'range' => null
43
+    ];
44
+    $options = array_merge($defaut, $options);
45
+    if (is_numeric($options['expire']) and $options['expire'] > 0) {
46
+        $options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT';
47
+    }
48
+
49
+    if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) {
50
+        $options['range'] = $_SERVER['HTTP_RANGE'];
51
+    }
52
+
53
+    spip_livrer_fichier_entetes($fichier, $content_type, $options['attachment'] && !$options['range'], $options['expires']);
54
+
55
+    if (!is_null($options['range'])) {
56
+        spip_livrer_fichier_partie($fichier, $options['range']);
57
+    }
58
+    else {
59
+        spip_livrer_fichier_entier($fichier);
60
+    }
61 61
 }
62 62
 
63 63
 /**
@@ -70,28 +70,28 @@  discard block
 block discarded – undo
70 70
  * @param int|string $expires
71 71
  */
72 72
 function spip_livrer_fichier_entetes($fichier, $content_type = 'application/octet-stream', $attachment = false, $expires = 0) {
73
-	// toujours envoyer un content type, meme vide !
74
-	header('Accept-Ranges: bytes');
75
-	header('Content-Type: ' . $content_type);
76
-
77
-	if ($attachment) {
78
-		$f = basename($fichier);
79
-		// ce content-type est necessaire pour eviter des corruptions de zip dans ie6
80
-		header('Content-Type: application/octet-stream');
81
-
82
-		header("Content-Disposition: attachment; filename=\"$f\";");
83
-		header('Content-Transfer-Encoding: binary');
84
-
85
-		// fix for IE caching or PHP bug issue
86
-		header('Expires: 0'); // set expiration time
87
-		header('Pragma: public');
88
-		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
89
-	}
90
-	else {
91
-		$f = basename($fichier);
92
-		header("Content-Disposition: inline; filename=\"$f\";");
93
-		header('Expires: ' . $expires); // set expiration time
94
-	}
73
+    // toujours envoyer un content type, meme vide !
74
+    header('Accept-Ranges: bytes');
75
+    header('Content-Type: ' . $content_type);
76
+
77
+    if ($attachment) {
78
+        $f = basename($fichier);
79
+        // ce content-type est necessaire pour eviter des corruptions de zip dans ie6
80
+        header('Content-Type: application/octet-stream');
81
+
82
+        header("Content-Disposition: attachment; filename=\"$f\";");
83
+        header('Content-Transfer-Encoding: binary');
84
+
85
+        // fix for IE caching or PHP bug issue
86
+        header('Expires: 0'); // set expiration time
87
+        header('Pragma: public');
88
+        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
89
+    }
90
+    else {
91
+        $f = basename($fichier);
92
+        header("Content-Disposition: inline; filename=\"$f\";");
93
+        header('Expires: ' . $expires); // set expiration time
94
+    }
95 95
 }
96 96
 
97 97
 /**
@@ -99,20 +99,20 @@  discard block
 block discarded – undo
99 99
  * @param string $fichier
100 100
  */
101 101
 function spip_livrer_fichier_entier($fichier) {
102
-	if (!file_exists($fichier)) {
103
-		throw new \Exception(sprintf('File not found: %s', $fichier));
104
-	}
102
+    if (!file_exists($fichier)) {
103
+        throw new \Exception(sprintf('File not found: %s', $fichier));
104
+    }
105 105
 
106
-	if (!is_readable($fichier)) {
107
-		throw new \Exception(sprintf('File not readable: %s', $fichier));
108
-	}
106
+    if (!is_readable($fichier)) {
107
+        throw new \Exception(sprintf('File not readable: %s', $fichier));
108
+    }
109 109
 
110
-	if ($size = filesize($fichier)) {
111
-		header(sprintf('Content-Length: %d', $size));
112
-	}
110
+    if ($size = filesize($fichier)) {
111
+        header(sprintf('Content-Length: %d', $size));
112
+    }
113 113
 
114
-	readfile($fichier);
115
-	exit();
114
+    readfile($fichier);
115
+    exit();
116 116
 }
117 117
 
118 118
 /**
@@ -125,98 +125,98 @@  discard block
 block discarded – undo
125 125
  * @throws Exception
126 126
  */
127 127
 function spip_livrer_fichier_partie($fichier, $range = null) {
128
-	if (!file_exists($fichier)) {
129
-		throw new \Exception(sprintf('File not found: %s', $fichier));
130
-	}
128
+    if (!file_exists($fichier)) {
129
+        throw new \Exception(sprintf('File not found: %s', $fichier));
130
+    }
131 131
 
132
-	if (!is_readable($fichier)) {
133
-		throw new \Exception(sprintf('File not readable: %s', $fichier));
134
-	}
132
+    if (!is_readable($fichier)) {
133
+        throw new \Exception(sprintf('File not readable: %s', $fichier));
134
+    }
135 135
 
136 136
 
137
-	// Par defaut on envoie tout
138
-	$byteOffset = 0;
139
-	$byteLength = $fileSize = filesize($fichier);
137
+    // Par defaut on envoie tout
138
+    $byteOffset = 0;
139
+    $byteLength = $fileSize = filesize($fichier);
140 140
 
141 141
 
142
-	// Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451"
143
-	if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) {
144
-		### Offset signifies where we should begin to read the file
145
-		$byteOffset = (int)$match[1];
142
+    // Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451"
143
+    if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) {
144
+        ### Offset signifies where we should begin to read the file
145
+        $byteOffset = (int)$match[1];
146 146
 
147 147
 
148
-		### Length is for how long we should read the file according to the browser, and can never go beyond the file size
149
-		if (isset($match[2])) {
150
-			$finishBytes = (int)$match[2];
151
-			$byteLength = $finishBytes + 1;
152
-		} else {
153
-			$finishBytes = $fileSize - 1;
154
-		}
148
+        ### Length is for how long we should read the file according to the browser, and can never go beyond the file size
149
+        if (isset($match[2])) {
150
+            $finishBytes = (int)$match[2];
151
+            $byteLength = $finishBytes + 1;
152
+        } else {
153
+            $finishBytes = $fileSize - 1;
154
+        }
155 155
 
156
-		$cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize);
157
-	}
158
-	else {
159
-		// si pas de range valide, on delegue a la methode d'envoi complet
160
-		spip_livrer_fichier_entier($fichier);
161
-		// redondant, mais facilite la comprehension du code
162
-		exit();
163
-	}
156
+        $cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize);
157
+    }
158
+    else {
159
+        // si pas de range valide, on delegue a la methode d'envoi complet
160
+        spip_livrer_fichier_entier($fichier);
161
+        // redondant, mais facilite la comprehension du code
162
+        exit();
163
+    }
164 164
 
165
-	// Remove headers that might unnecessarily clutter up the output
166
-	header_remove('Cache-Control');
167
-	header_remove('Pragma');
165
+    // Remove headers that might unnecessarily clutter up the output
166
+    header_remove('Cache-Control');
167
+    header_remove('Pragma');
168 168
 
169
-	// partial content
170
-	header('HTTP/1.1 206 Partial content');
171
-	header($cr_header);  ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
169
+    // partial content
170
+    header('HTTP/1.1 206 Partial content');
171
+    header($cr_header);  ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
172 172
 
173 173
 
174
-	$byteRange = $byteLength - $byteOffset;
174
+    $byteRange = $byteLength - $byteOffset;
175 175
 
176
-	header(sprintf('Content-Length: %d', $byteRange));
176
+    header(sprintf('Content-Length: %d', $byteRange));
177 177
 
178
-	// Variable containing the buffer
179
-	$buffer = '';
180
-	// Just a reasonable buffer size
181
-	$bufferSize = 512 * 16;
182
-	// Contains how much is left to read of the byteRange
183
-	$bytePool = $byteRange;
178
+    // Variable containing the buffer
179
+    $buffer = '';
180
+    // Just a reasonable buffer size
181
+    $bufferSize = 512 * 16;
182
+    // Contains how much is left to read of the byteRange
183
+    $bytePool = $byteRange;
184 184
 
185
-	if (!$handle = fopen($fichier, 'r')) {
186
-		throw new \Exception(sprintf('Could not get handle for file %s', $fichier));
187
-	}
185
+    if (!$handle = fopen($fichier, 'r')) {
186
+        throw new \Exception(sprintf('Could not get handle for file %s', $fichier));
187
+    }
188 188
 
189
-	if (fseek($handle, $byteOffset, SEEK_SET) == -1) {
190
-		throw new \Exception(sprintf('Could not seek to byte offset %d', $byteOffset));
191
-	}
189
+    if (fseek($handle, $byteOffset, SEEK_SET) == -1) {
190
+        throw new \Exception(sprintf('Could not seek to byte offset %d', $byteOffset));
191
+    }
192 192
 
193 193
 
194
-	while ($bytePool > 0) {
195
-		// How many bytes we request on this iteration
196
-		$chunkSizeRequested = min($bufferSize, $bytePool);
194
+    while ($bytePool > 0) {
195
+        // How many bytes we request on this iteration
196
+        $chunkSizeRequested = min($bufferSize, $bytePool);
197 197
 
198
-		// Try readin $chunkSizeRequested bytes from $handle and put data in $buffer
199
-		$buffer = fread($handle, $chunkSizeRequested);
198
+        // Try readin $chunkSizeRequested bytes from $handle and put data in $buffer
199
+        $buffer = fread($handle, $chunkSizeRequested);
200 200
 
201
-		// Store how many bytes were actually read
202
-		$chunkSizeActual = strlen($buffer);
201
+        // Store how many bytes were actually read
202
+        $chunkSizeActual = strlen($buffer);
203 203
 
204
-		// If we didn't get any bytes that means something unexpected has happened since $bytePool should be zero already
205
-		if ($chunkSizeActual == 0) {
206
-			// For production servers this should go in your php error log, since it will break the output
207
-			trigger_error('Chunksize became 0', E_USER_WARNING);
208
-			break;
209
-		}
204
+        // If we didn't get any bytes that means something unexpected has happened since $bytePool should be zero already
205
+        if ($chunkSizeActual == 0) {
206
+            // For production servers this should go in your php error log, since it will break the output
207
+            trigger_error('Chunksize became 0', E_USER_WARNING);
208
+            break;
209
+        }
210 210
 
211
-		// Decrease byte pool with amount of bytes that were read during this iteration
212
-		$bytePool -= $chunkSizeActual;
211
+        // Decrease byte pool with amount of bytes that were read during this iteration
212
+        $bytePool -= $chunkSizeActual;
213 213
 
214
-		// Write the buffer to output
215
-		print $buffer;
214
+        // Write the buffer to output
215
+        print $buffer;
216 216
 
217
-		// Try to output the data to the client immediately
218
-		flush();
219
-	}
217
+        // Try to output the data to the client immediately
218
+        flush();
219
+    }
220 220
 
221
-	exit();
221
+    exit();
222 222
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
 	];
44 44
 	$options = array_merge($defaut, $options);
45 45
 	if (is_numeric($options['expire']) and $options['expire'] > 0) {
46
-		$options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT';
46
+		$options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']).' GMT';
47 47
 	}
48 48
 
49 49
 	if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) {
@@ -72,7 +72,7 @@  discard block
 block discarded – undo
72 72
 function spip_livrer_fichier_entetes($fichier, $content_type = 'application/octet-stream', $attachment = false, $expires = 0) {
73 73
 	// toujours envoyer un content type, meme vide !
74 74
 	header('Accept-Ranges: bytes');
75
-	header('Content-Type: ' . $content_type);
75
+	header('Content-Type: '.$content_type);
76 76
 
77 77
 	if ($attachment) {
78 78
 		$f = basename($fichier);
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 	else {
91 91
 		$f = basename($fichier);
92 92
 		header("Content-Disposition: inline; filename=\"$f\";");
93
-		header('Expires: ' . $expires); // set expiration time
93
+		header('Expires: '.$expires); // set expiration time
94 94
 	}
95 95
 }
96 96
 
@@ -142,12 +142,12 @@  discard block
 block discarded – undo
142 142
 	// Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451"
143 143
 	if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) {
144 144
 		### Offset signifies where we should begin to read the file
145
-		$byteOffset = (int)$match[1];
145
+		$byteOffset = (int) $match[1];
146 146
 
147 147
 
148 148
 		### Length is for how long we should read the file according to the browser, and can never go beyond the file size
149 149
 		if (isset($match[2])) {
150
-			$finishBytes = (int)$match[2];
150
+			$finishBytes = (int) $match[2];
151 151
 			$byteLength = $finishBytes + 1;
152 152
 		} else {
153 153
 			$finishBytes = $fileSize - 1;
@@ -168,7 +168,7 @@  discard block
 block discarded – undo
168 168
 
169 169
 	// partial content
170 170
 	header('HTTP/1.1 206 Partial content');
171
-	header($cr_header);  ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
171
+	header($cr_header); ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
172 172
 
173 173
 
174 174
 	$byteRange = $byteLength - $byteOffset;
Please login to merge, or discard this patch.
Braces   +3 added lines, -6 removed lines patch added patch discarded remove patch
@@ -54,8 +54,7 @@  discard block
 block discarded – undo
54 54
 
55 55
 	if (!is_null($options['range'])) {
56 56
 		spip_livrer_fichier_partie($fichier, $options['range']);
57
-	}
58
-	else {
57
+	} else {
59 58
 		spip_livrer_fichier_entier($fichier);
60 59
 	}
61 60
 }
@@ -86,8 +85,7 @@  discard block
 block discarded – undo
86 85
 		header('Expires: 0'); // set expiration time
87 86
 		header('Pragma: public');
88 87
 		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
89
-	}
90
-	else {
88
+	} else {
91 89
 		$f = basename($fichier);
92 90
 		header("Content-Disposition: inline; filename=\"$f\";");
93 91
 		header('Expires: ' . $expires); // set expiration time
@@ -154,8 +152,7 @@  discard block
 block discarded – undo
154 152
 		}
155 153
 
156 154
 		$cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize);
157
-	}
158
-	else {
155
+	} else {
159 156
 		// si pas de range valide, on delegue a la methode d'envoi complet
160 157
 		spip_livrer_fichier_entier($fichier);
161 158
 		// redondant, mais facilite la comprehension du code
Please login to merge, or discard this patch.
ecrire/inc/distant.php 3 patches
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -116,8 +116,7 @@  discard block
 block discarded – undo
116 116
 		);
117 117
 		if (!$res or (!$res['length'] and $res['status'] != 304)) {
118 118
 			spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE);
119
-		}
120
-		else {
119
+		} else {
121 120
 			spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant');
122 121
 		}
123 122
 		if (!$res or !$res['length']) {
@@ -222,8 +221,7 @@  discard block
 block discarded – undo
222 221
 						break;
223 222
 					}
224 223
 				}
225
-			}
226
-			else {
224
+			} else {
227 225
 				$ip = false;
228 226
 			}
229 227
 		}
Please login to merge, or discard this patch.
Indentation   +1055 added lines, -1055 removed lines patch added patch discarded remove patch
@@ -16,32 +16,32 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Distant
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 if (!defined('_INC_DISTANT_VERSION_HTTP')) {
23
-	define('_INC_DISTANT_VERSION_HTTP', 'HTTP/1.0');
23
+    define('_INC_DISTANT_VERSION_HTTP', 'HTTP/1.0');
24 24
 }
25 25
 if (!defined('_INC_DISTANT_CONTENT_ENCODING')) {
26
-	define('_INC_DISTANT_CONTENT_ENCODING', 'gzip');
26
+    define('_INC_DISTANT_CONTENT_ENCODING', 'gzip');
27 27
 }
28 28
 if (!defined('_INC_DISTANT_USER_AGENT')) {
29
-	define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')');
29
+    define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')');
30 30
 }
31 31
 if (!defined('_INC_DISTANT_MAX_SIZE')) {
32
-	define('_INC_DISTANT_MAX_SIZE', 2_097_152);
32
+    define('_INC_DISTANT_MAX_SIZE', 2_097_152);
33 33
 }
34 34
 if (!defined('_INC_DISTANT_CONNECT_TIMEOUT')) {
35
-	define('_INC_DISTANT_CONNECT_TIMEOUT', 10);
35
+    define('_INC_DISTANT_CONNECT_TIMEOUT', 10);
36 36
 }
37 37
 
38 38
 define('_REGEXP_COPIE_LOCALE', ',' 	.
39
-	preg_replace(
40
-		'@^https?:@',
41
-		'https?:',
42
-		($GLOBALS['meta']['adresse_site'] ?? '')
43
-	)
44
-	. '/?spip.php[?]action=acceder_document.*file=(.*)$,');
39
+    preg_replace(
40
+        '@^https?:@',
41
+        'https?:',
42
+        ($GLOBALS['meta']['adresse_site'] ?? '')
43
+    )
44
+    . '/?spip.php[?]action=acceder_document.*file=(.*)$,');
45 45
 
46 46
 //@define('_COPIE_LOCALE_MAX_SIZE',2097152); // poids (inc/utils l'a fait)
47 47
 
@@ -68,89 +68,89 @@  discard block
 block discarded – undo
68 68
  */
69 69
 function copie_locale($source, $mode = 'auto', $local = null, $taille_max = null) {
70 70
 
71
-	// si c'est la protection de soi-meme, retourner le path
72
-	if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) {
73
-		$source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]);
74
-
75
-		return @file_exists($source) ? $source : false;
76
-	}
77
-
78
-	if (is_null($local)) {
79
-		$local = fichier_copie_locale($source);
80
-	} else {
81
-		if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) {
82
-			$local = substr($local, strlen(_DIR_RACINE));
83
-		}
84
-	}
85
-
86
-	// si $local = '' c'est un fichier refuse par fichier_copie_locale(),
87
-	// par exemple un fichier qui ne figure pas dans nos documents ;
88
-	// dans ce cas on n'essaie pas de le telecharger pour ensuite echouer
89
-	if (!$local) {
90
-		return false;
91
-	}
92
-
93
-	$localrac = _DIR_RACINE . $local;
94
-	$t = ($mode === 'force') ? false : @file_exists($localrac);
95
-
96
-	// test d'existence du fichier
97
-	if ($mode === 'test') {
98
-		return $t ? $local : '';
99
-	}
100
-
101
-	// sinon voir si on doit/peut le telecharger
102
-	if ($local === $source or !tester_url_absolue($source)) {
103
-		return $local;
104
-	}
105
-
106
-	if ($mode === 'modif' or !$t) {
107
-		// passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation
108
-		// et des eventuelles recuperations concurantes
109
-		include_spip('inc/acces');
110
-		if (!$taille_max) {
111
-			$taille_max = _COPIE_LOCALE_MAX_SIZE;
112
-		}
113
-		$res = recuperer_url(
114
-			$source,
115
-			['file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : '']
116
-		);
117
-		if (!$res or (!$res['length'] and $res['status'] != 304)) {
118
-			spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE);
119
-		}
120
-		else {
121
-			spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant');
122
-		}
123
-		if (!$res or !$res['length']) {
124
-			// si $t c'est sans doute juste un not-modified-since
125
-			return $t ? $local : false;
126
-		}
127
-
128
-		// si on retrouve l'extension
129
-		if (
130
-			!empty($res['headers'])
131
-			and $extension = distant_trouver_extension_selon_headers($source, $res['headers'])
132
-		) {
133
-			if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) {
134
-				$sanitizer($localrac);
135
-			}
136
-		}
137
-
138
-		// pour une eventuelle indexation
139
-		pipeline(
140
-			'post_edition',
141
-			[
142
-				'args' => [
143
-					'operation' => 'copie_locale',
144
-					'source' => $source,
145
-					'fichier' => $local,
146
-					'http_res' => $res['length'],
147
-				],
148
-				'data' => null
149
-			]
150
-		);
151
-	}
152
-
153
-	return $local;
71
+    // si c'est la protection de soi-meme, retourner le path
72
+    if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) {
73
+        $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]);
74
+
75
+        return @file_exists($source) ? $source : false;
76
+    }
77
+
78
+    if (is_null($local)) {
79
+        $local = fichier_copie_locale($source);
80
+    } else {
81
+        if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) {
82
+            $local = substr($local, strlen(_DIR_RACINE));
83
+        }
84
+    }
85
+
86
+    // si $local = '' c'est un fichier refuse par fichier_copie_locale(),
87
+    // par exemple un fichier qui ne figure pas dans nos documents ;
88
+    // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer
89
+    if (!$local) {
90
+        return false;
91
+    }
92
+
93
+    $localrac = _DIR_RACINE . $local;
94
+    $t = ($mode === 'force') ? false : @file_exists($localrac);
95
+
96
+    // test d'existence du fichier
97
+    if ($mode === 'test') {
98
+        return $t ? $local : '';
99
+    }
100
+
101
+    // sinon voir si on doit/peut le telecharger
102
+    if ($local === $source or !tester_url_absolue($source)) {
103
+        return $local;
104
+    }
105
+
106
+    if ($mode === 'modif' or !$t) {
107
+        // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation
108
+        // et des eventuelles recuperations concurantes
109
+        include_spip('inc/acces');
110
+        if (!$taille_max) {
111
+            $taille_max = _COPIE_LOCALE_MAX_SIZE;
112
+        }
113
+        $res = recuperer_url(
114
+            $source,
115
+            ['file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : '']
116
+        );
117
+        if (!$res or (!$res['length'] and $res['status'] != 304)) {
118
+            spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE);
119
+        }
120
+        else {
121
+            spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant');
122
+        }
123
+        if (!$res or !$res['length']) {
124
+            // si $t c'est sans doute juste un not-modified-since
125
+            return $t ? $local : false;
126
+        }
127
+
128
+        // si on retrouve l'extension
129
+        if (
130
+            !empty($res['headers'])
131
+            and $extension = distant_trouver_extension_selon_headers($source, $res['headers'])
132
+        ) {
133
+            if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) {
134
+                $sanitizer($localrac);
135
+            }
136
+        }
137
+
138
+        // pour une eventuelle indexation
139
+        pipeline(
140
+            'post_edition',
141
+            [
142
+                'args' => [
143
+                    'operation' => 'copie_locale',
144
+                    'source' => $source,
145
+                    'fichier' => $local,
146
+                    'http_res' => $res['length'],
147
+                ],
148
+                'data' => null
149
+            ]
150
+        );
151
+    }
152
+
153
+    return $local;
154 154
 }
155 155
 
156 156
 /**
@@ -165,99 +165,99 @@  discard block
 block discarded – undo
165 165
  *   url ou false en cas d'echec
166 166
  */
167 167
 function valider_url_distante($url, $known_hosts = []) {
168
-	if (!function_exists('protocole_verifier')) {
169
-		include_spip('inc/filtres_mini');
170
-	}
171
-
172
-	if (!protocole_verifier($url, ['http', 'https'])) {
173
-		return false;
174
-	}
175
-
176
-	$parsed_url = parse_url($url);
177
-	if (!$parsed_url or empty($parsed_url['host'])) {
178
-		return false;
179
-	}
180
-
181
-	if (isset($parsed_url['user']) or isset($parsed_url['pass'])) {
182
-		return false;
183
-	}
184
-
185
-	if (false !== strpbrk($parsed_url['host'], ':#?[]')) {
186
-		return false;
187
-	}
188
-
189
-	if (!is_array($known_hosts)) {
190
-		$known_hosts = [$known_hosts];
191
-	}
192
-	$known_hosts[] = $GLOBALS['meta']['adresse_site'];
193
-	$known_hosts[] = url_de_base();
194
-	$known_hosts = pipeline('declarer_hosts_distants', $known_hosts);
195
-
196
-	$is_known_host = false;
197
-	foreach ($known_hosts as $known_host) {
198
-		$parse_known = parse_url($known_host);
199
-		if (
200
-			$parse_known
201
-			and strtolower($parse_known['host']) === strtolower($parsed_url['host'])
202
-		) {
203
-			$is_known_host = true;
204
-			break;
205
-		}
206
-	}
207
-
208
-	if (!$is_known_host) {
209
-		$host = trim($parsed_url['host'], '.');
210
-		if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) {
211
-			$ip = gethostbyname($host);
212
-			if ($ip === $host) {
213
-				// Error condition for gethostbyname()
214
-				$ip = false;
215
-			}
216
-			if ($records = dns_get_record($host)) {
217
-				foreach ($records as $record) {
218
-					// il faut que le TTL soit suffisant afin d'etre certain que le copie_locale eventuel qui suit
219
-					// se fasse sur la meme IP
220
-					if ($record['ttl'] < 10) {
221
-						$ip = false;
222
-						break;
223
-					}
224
-				}
225
-			}
226
-			else {
227
-				$ip = false;
228
-			}
229
-		}
230
-		if ($ip) {
231
-			if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
232
-				return false;
233
-			}
234
-		}
235
-	}
236
-
237
-	if (empty($parsed_url['port'])) {
238
-		return $url;
239
-	}
240
-
241
-	$port = $parsed_url['port'];
242
-	if ($port === 80  or $port === 443  or $port === 8080) {
243
-		return $url;
244
-	}
245
-
246
-	if ($is_known_host) {
247
-		foreach ($known_hosts as $known_host) {
248
-			$parse_known = parse_url($known_host);
249
-			if (
250
-				$parse_known
251
-				and !empty($parse_known['port'])
252
-				and strtolower($parse_known['host']) === strtolower($parsed_url['host'])
253
-				and $parse_known['port'] == $port
254
-			) {
255
-				return $url;
256
-			}
257
-		}
258
-	}
259
-
260
-	return false;
168
+    if (!function_exists('protocole_verifier')) {
169
+        include_spip('inc/filtres_mini');
170
+    }
171
+
172
+    if (!protocole_verifier($url, ['http', 'https'])) {
173
+        return false;
174
+    }
175
+
176
+    $parsed_url = parse_url($url);
177
+    if (!$parsed_url or empty($parsed_url['host'])) {
178
+        return false;
179
+    }
180
+
181
+    if (isset($parsed_url['user']) or isset($parsed_url['pass'])) {
182
+        return false;
183
+    }
184
+
185
+    if (false !== strpbrk($parsed_url['host'], ':#?[]')) {
186
+        return false;
187
+    }
188
+
189
+    if (!is_array($known_hosts)) {
190
+        $known_hosts = [$known_hosts];
191
+    }
192
+    $known_hosts[] = $GLOBALS['meta']['adresse_site'];
193
+    $known_hosts[] = url_de_base();
194
+    $known_hosts = pipeline('declarer_hosts_distants', $known_hosts);
195
+
196
+    $is_known_host = false;
197
+    foreach ($known_hosts as $known_host) {
198
+        $parse_known = parse_url($known_host);
199
+        if (
200
+            $parse_known
201
+            and strtolower($parse_known['host']) === strtolower($parsed_url['host'])
202
+        ) {
203
+            $is_known_host = true;
204
+            break;
205
+        }
206
+    }
207
+
208
+    if (!$is_known_host) {
209
+        $host = trim($parsed_url['host'], '.');
210
+        if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) {
211
+            $ip = gethostbyname($host);
212
+            if ($ip === $host) {
213
+                // Error condition for gethostbyname()
214
+                $ip = false;
215
+            }
216
+            if ($records = dns_get_record($host)) {
217
+                foreach ($records as $record) {
218
+                    // il faut que le TTL soit suffisant afin d'etre certain que le copie_locale eventuel qui suit
219
+                    // se fasse sur la meme IP
220
+                    if ($record['ttl'] < 10) {
221
+                        $ip = false;
222
+                        break;
223
+                    }
224
+                }
225
+            }
226
+            else {
227
+                $ip = false;
228
+            }
229
+        }
230
+        if ($ip) {
231
+            if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
232
+                return false;
233
+            }
234
+        }
235
+    }
236
+
237
+    if (empty($parsed_url['port'])) {
238
+        return $url;
239
+    }
240
+
241
+    $port = $parsed_url['port'];
242
+    if ($port === 80  or $port === 443  or $port === 8080) {
243
+        return $url;
244
+    }
245
+
246
+    if ($is_known_host) {
247
+        foreach ($known_hosts as $known_host) {
248
+            $parse_known = parse_url($known_host);
249
+            if (
250
+                $parse_known
251
+                and !empty($parse_known['port'])
252
+                and strtolower($parse_known['host']) === strtolower($parsed_url['host'])
253
+                and $parse_known['port'] == $port
254
+            ) {
255
+                return $url;
256
+            }
257
+        }
258
+    }
259
+
260
+    return false;
261 261
 }
262 262
 
263 263
 /**
@@ -277,86 +277,86 @@  discard block
 block discarded – undo
277 277
  */
278 278
 function prepare_donnees_post($donnees, $boundary = '') {
279 279
 
280
-	// permettre a la fonction qui a demande le post de formater elle meme ses donnees
281
-	// pour un appel soap par exemple
282
-	// l'entete est separe des donnees par un double retour a la ligne
283
-	// on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n
284
-	if (is_string($donnees) && strlen($donnees)) {
285
-		$entete = '';
286
-		// on repasse tous les \r\n et \r en simples \n
287
-		$donnees = str_replace("\r\n", "\n", $donnees);
288
-		$donnees = str_replace("\r", "\n", $donnees);
289
-		// un double retour a la ligne signifie la fin de l'entete et le debut des donnees
290
-		$p = strpos($donnees, "\n\n");
291
-		if ($p !== false) {
292
-			$entete = str_replace("\n", "\r\n", substr($donnees, 0, $p + 1));
293
-			$donnees = substr($donnees, $p + 2);
294
-		}
295
-		$chaine = str_replace("\n", "\r\n", $donnees);
296
-	} else {
297
-		/* boundary automatique */
298
-		// Si on a plus de 500 octects de donnees, on "boundarise"
299
-		if ($boundary === '') {
300
-			$taille = 0;
301
-			foreach ($donnees as $cle => $valeur) {
302
-				if (is_array($valeur)) {
303
-					foreach ($valeur as $val2) {
304
-						$taille += strlen($val2);
305
-					}
306
-				} else {
307
-					// faut-il utiliser spip_strlen() dans inc/charsets ?
308
-					$taille += strlen($valeur);
309
-				}
310
-			}
311
-			if ($taille > 500) {
312
-				$boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8);
313
-			}
314
-		}
315
-
316
-		if (is_string($boundary) and strlen($boundary)) {
317
-			// fabrique une chaine HTTP pour un POST avec boundary
318
-			$entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n";
319
-			$chaine = '';
320
-			if (is_array($donnees)) {
321
-				foreach ($donnees as $cle => $valeur) {
322
-					if (is_array($valeur)) {
323
-						foreach ($valeur as $val2) {
324
-							$chaine .= "\r\n--$boundary\r\n";
325
-							$chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n";
326
-							$chaine .= "\r\n";
327
-							$chaine .= $val2;
328
-						}
329
-					} else {
330
-						$chaine .= "\r\n--$boundary\r\n";
331
-						$chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n";
332
-						$chaine .= "\r\n";
333
-						$chaine .= $valeur;
334
-					}
335
-				}
336
-				$chaine .= "\r\n--$boundary\r\n";
337
-			}
338
-		} else {
339
-			// fabrique une chaine HTTP simple pour un POST
340
-			$entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n";
341
-			$chaine = [];
342
-			if (is_array($donnees)) {
343
-				foreach ($donnees as $cle => $valeur) {
344
-					if (is_array($valeur)) {
345
-						foreach ($valeur as $val2) {
346
-							$chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2);
347
-						}
348
-					} else {
349
-						$chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur);
350
-					}
351
-				}
352
-				$chaine = implode('&', $chaine);
353
-			} else {
354
-				$chaine = $donnees;
355
-			}
356
-		}
357
-	}
358
-
359
-	return [$entete, $chaine];
280
+    // permettre a la fonction qui a demande le post de formater elle meme ses donnees
281
+    // pour un appel soap par exemple
282
+    // l'entete est separe des donnees par un double retour a la ligne
283
+    // on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n
284
+    if (is_string($donnees) && strlen($donnees)) {
285
+        $entete = '';
286
+        // on repasse tous les \r\n et \r en simples \n
287
+        $donnees = str_replace("\r\n", "\n", $donnees);
288
+        $donnees = str_replace("\r", "\n", $donnees);
289
+        // un double retour a la ligne signifie la fin de l'entete et le debut des donnees
290
+        $p = strpos($donnees, "\n\n");
291
+        if ($p !== false) {
292
+            $entete = str_replace("\n", "\r\n", substr($donnees, 0, $p + 1));
293
+            $donnees = substr($donnees, $p + 2);
294
+        }
295
+        $chaine = str_replace("\n", "\r\n", $donnees);
296
+    } else {
297
+        /* boundary automatique */
298
+        // Si on a plus de 500 octects de donnees, on "boundarise"
299
+        if ($boundary === '') {
300
+            $taille = 0;
301
+            foreach ($donnees as $cle => $valeur) {
302
+                if (is_array($valeur)) {
303
+                    foreach ($valeur as $val2) {
304
+                        $taille += strlen($val2);
305
+                    }
306
+                } else {
307
+                    // faut-il utiliser spip_strlen() dans inc/charsets ?
308
+                    $taille += strlen($valeur);
309
+                }
310
+            }
311
+            if ($taille > 500) {
312
+                $boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8);
313
+            }
314
+        }
315
+
316
+        if (is_string($boundary) and strlen($boundary)) {
317
+            // fabrique une chaine HTTP pour un POST avec boundary
318
+            $entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n";
319
+            $chaine = '';
320
+            if (is_array($donnees)) {
321
+                foreach ($donnees as $cle => $valeur) {
322
+                    if (is_array($valeur)) {
323
+                        foreach ($valeur as $val2) {
324
+                            $chaine .= "\r\n--$boundary\r\n";
325
+                            $chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n";
326
+                            $chaine .= "\r\n";
327
+                            $chaine .= $val2;
328
+                        }
329
+                    } else {
330
+                        $chaine .= "\r\n--$boundary\r\n";
331
+                        $chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n";
332
+                        $chaine .= "\r\n";
333
+                        $chaine .= $valeur;
334
+                    }
335
+                }
336
+                $chaine .= "\r\n--$boundary\r\n";
337
+            }
338
+        } else {
339
+            // fabrique une chaine HTTP simple pour un POST
340
+            $entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n";
341
+            $chaine = [];
342
+            if (is_array($donnees)) {
343
+                foreach ($donnees as $cle => $valeur) {
344
+                    if (is_array($valeur)) {
345
+                        foreach ($valeur as $val2) {
346
+                            $chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2);
347
+                        }
348
+                    } else {
349
+                        $chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur);
350
+                    }
351
+                }
352
+                $chaine = implode('&', $chaine);
353
+            } else {
354
+                $chaine = $donnees;
355
+            }
356
+        }
357
+    }
358
+
359
+    return [$entete, $chaine];
360 360
 }
361 361
 
362 362
 /**
@@ -370,20 +370,20 @@  discard block
 block discarded – undo
370 370
  */
371 371
 function url_to_ascii($url_idn) {
372 372
 
373
-	if ($parts = parse_url($url_idn)) {
374
-		$host = $parts['host'];
375
-		if (!preg_match(',^[a-z0-9_\.\-]+$,i', $host)) {
376
-			include_spip('inc/idna_convert.class');
377
-			$IDN = new idna_convert();
378
-			$host_ascii = $IDN->encode($host);
379
-			$url_idn = explode($host, $url_idn, 2);
380
-			$url_idn = implode($host_ascii, $url_idn);
381
-		}
382
-		// et on urlencode les char utf si besoin dans le path
383
-		$url_idn = preg_replace_callback('/[^\x20-\x7f]/', fn($match) => urlencode($match[0]), $url_idn);
384
-	}
385
-
386
-	return $url_idn;
373
+    if ($parts = parse_url($url_idn)) {
374
+        $host = $parts['host'];
375
+        if (!preg_match(',^[a-z0-9_\.\-]+$,i', $host)) {
376
+            include_spip('inc/idna_convert.class');
377
+            $IDN = new idna_convert();
378
+            $host_ascii = $IDN->encode($host);
379
+            $url_idn = explode($host, $url_idn, 2);
380
+            $url_idn = implode($host_ascii, $url_idn);
381
+        }
382
+        // et on urlencode les char utf si besoin dans le path
383
+        $url_idn = preg_replace_callback('/[^\x20-\x7f]/', fn($match) => urlencode($match[0]), $url_idn);
384
+    }
385
+
386
+    return $url_idn;
387 387
 }
388 388
 
389 389
 /**
@@ -424,209 +424,209 @@  discard block
 block discarded – undo
424 424
  *     string file : nom du fichier si enregistre dans un fichier
425 425
  */
426 426
 function recuperer_url($url, $options = []) {
427
-	// Conserve la mémoire de la méthode fournit éventuellement
428
-	$methode_demandee = $options['methode'] ?? '';
429
-	$default = [
430
-		'transcoder' => false,
431
-		'methode' => 'GET',
432
-		'taille_max' => null,
433
-		'headers' => [],
434
-		'datas' => '',
435
-		'boundary' => '',
436
-		'refuser_gz' => false,
437
-		'if_modified_since' => '',
438
-		'uri_referer' => '',
439
-		'file' => '',
440
-		'follow_location' => 10,
441
-		'version_http' => _INC_DISTANT_VERSION_HTTP,
442
-	];
443
-	$options = array_merge($default, $options);
444
-	// copier directement dans un fichier ?
445
-	$copy = $options['file'];
446
-
447
-	if ($options['methode'] == 'HEAD') {
448
-		$options['taille_max'] = 0;
449
-	}
450
-	if (is_null($options['taille_max'])) {
451
-		$options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE;
452
-	}
453
-
454
-	spip_log("recuperer_url " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
455
-
456
-	// Ajout des en-têtes spécifiques si besoin
457
-	$formatted_data = '';
458
-	if (!empty($options['headers'])) {
459
-		foreach ($options['headers'] as $champ => $valeur) {
460
-			$formatted_data .= $champ . ': ' . $valeur . "\r\n";
461
-		}
462
-	}
463
-
464
-	if (!empty($options['datas'])) {
465
-		[$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']);
466
-		$head .= $formatted_data;
467
-		if (stripos($head, 'Content-Length:') === false) {
468
-			$head .= 'Content-Length: ' . strlen($postdata) . "\r\n";
469
-		}
470
-		$formatted_data = $head . "\r\n" . $postdata;
471
-		if (
472
-			strlen($postdata)
473
-			and !$methode_demandee
474
-		) {
475
-			$options['methode'] = 'POST';
476
-		}
477
-	} elseif ($formatted_data) {
478
-		$formatted_data .= "\r\n";
479
-	}
480
-
481
-	// Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole
482
-	$url = preg_replace(',^feed://,i', 'http://', $url);
483
-	if (!tester_url_absolue($url)) {
484
-		$url = 'http://' . $url;
485
-	} elseif (strncmp($url, '//', 2) == 0) {
486
-		$url = 'http:' . $url;
487
-	}
488
-
489
-	$url = url_to_ascii($url);
490
-
491
-	$result = [
492
-		'status' => 0,
493
-		'headers' => '',
494
-		'page' => '',
495
-		'length' => 0,
496
-		'last_modified' => '',
497
-		'location' => '',
498
-		'url' => $url
499
-	];
500
-
501
-	// si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz
502
-	$refuser_gz = (($options['refuser_gz'] or $copy) ? true : false);
503
-
504
-	// ouvrir la connexion et envoyer la requete et ses en-tetes
505
-	[$handle, $fopen] = init_http(
506
-		$options['methode'],
507
-		$url,
508
-		$refuser_gz,
509
-		$options['uri_referer'],
510
-		$formatted_data,
511
-		$options['version_http'],
512
-		$options['if_modified_since']
513
-	);
514
-	if (!$handle) {
515
-		spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR);
516
-
517
-		return false;
518
-	}
519
-
520
-	// Sauf en fopen, envoyer le flux d'entree
521
-	// et recuperer les en-tetes de reponses
522
-	if (!$fopen) {
523
-		$res = recuperer_entetes_complets($handle, $options['if_modified_since']);
524
-		if (!$res) {
525
-			fclose($handle);
526
-			$t = @parse_url($url);
527
-			$host = $t['host'];
528
-			// Chinoisierie inexplicable pour contrer
529
-			// les actions liberticides de l'empire du milieu
530
-			if (
531
-				!need_proxy($host)
532
-				and $res = @file_get_contents($url)
533
-			) {
534
-				$result['length'] = strlen($res);
535
-				if ($copy) {
536
-					ecrire_fichier($copy, $res);
537
-					$result['file'] = $copy;
538
-				} else {
539
-					$result['page'] = $res;
540
-				}
541
-				$res = [
542
-					'status' => 200,
543
-				];
544
-			} else {
545
-				spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR);
546
-				return false;
547
-			}
548
-		} elseif ($res['location'] and $options['follow_location']) {
549
-			$options['follow_location']--;
550
-			fclose($handle);
551
-			include_spip('inc/filtres');
552
-			$url = suivre_lien($url, $res['location']);
553
-
554
-			// une redirection doit se faire en GET, sauf status explicite 307 ou 308 qui indique de garder la meme methode
555
-			if ($options['methode'] !== 'GET') {
556
-				if (empty($res['status']) or !in_array($res['status'], [307, 308])) {
557
-					$options['methode'] = 'GET';
558
-					$options['datas'] = '';
559
-				}
560
-			}
561
-			spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
562
-
563
-			return recuperer_url($url, $options);
564
-		} elseif ($res['status'] !== 200) {
565
-			spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant');
566
-		}
567
-		$result['status'] = $res['status'];
568
-		if (isset($res['headers'])) {
569
-			$result['headers'] = $res['headers'];
570
-		}
571
-		if (isset($res['last_modified'])) {
572
-			$result['last_modified'] = $res['last_modified'];
573
-		}
574
-		if (isset($res['location'])) {
575
-			$result['location'] = $res['location'];
576
-		}
577
-	}
578
-
579
-	// on ne veut que les entetes
580
-	if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') {
581
-		spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG);
582
-		return $result;
583
-	}
584
-
585
-
586
-	// s'il faut deballer, le faire via un fichier temporaire
587
-	// sinon la memoire explose pour les gros flux
588
-
589
-	$gz = false;
590
-	if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) {
591
-		$gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz');
592
-	}
593
-
594
-	// si on a pas deja recuperer le contenu par une methode detournee
595
-	if (!$result['length']) {
596
-		$res = recuperer_body($handle, $options['taille_max'], $gz ?: $copy);
597
-		fclose($handle);
598
-		if ($copy) {
599
-			$result['length'] = $res;
600
-			$result['file'] = $copy;
601
-		} elseif ($res) {
602
-			$result['page'] = &$res;
603
-			$result['length'] = strlen($result['page']);
604
-		}
605
-		if (!$result['status']) {
606
-			$result['status'] = 200; // on a reussi, donc !
607
-		}
608
-	}
609
-	if (!$result['page']) {
610
-		return $result;
611
-	}
612
-
613
-	// Decompresser au besoin
614
-	if ($gz) {
615
-		$result['page'] = implode('', gzfile($gz));
616
-		supprimer_fichier($gz);
617
-	}
618
-
619
-	// Faut-il l'importer dans notre charset local ?
620
-	if ($options['transcoder']) {
621
-		include_spip('inc/charsets');
622
-		$result['page'] = transcoder_page($result['page'], $result['headers']);
623
-	}
624
-
625
-	$trace = json_decode(json_encode($result), true);
626
-	$trace['page'] = '...';
627
-	spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG);
628
-
629
-	return $result;
427
+    // Conserve la mémoire de la méthode fournit éventuellement
428
+    $methode_demandee = $options['methode'] ?? '';
429
+    $default = [
430
+        'transcoder' => false,
431
+        'methode' => 'GET',
432
+        'taille_max' => null,
433
+        'headers' => [],
434
+        'datas' => '',
435
+        'boundary' => '',
436
+        'refuser_gz' => false,
437
+        'if_modified_since' => '',
438
+        'uri_referer' => '',
439
+        'file' => '',
440
+        'follow_location' => 10,
441
+        'version_http' => _INC_DISTANT_VERSION_HTTP,
442
+    ];
443
+    $options = array_merge($default, $options);
444
+    // copier directement dans un fichier ?
445
+    $copy = $options['file'];
446
+
447
+    if ($options['methode'] == 'HEAD') {
448
+        $options['taille_max'] = 0;
449
+    }
450
+    if (is_null($options['taille_max'])) {
451
+        $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE;
452
+    }
453
+
454
+    spip_log("recuperer_url " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
455
+
456
+    // Ajout des en-têtes spécifiques si besoin
457
+    $formatted_data = '';
458
+    if (!empty($options['headers'])) {
459
+        foreach ($options['headers'] as $champ => $valeur) {
460
+            $formatted_data .= $champ . ': ' . $valeur . "\r\n";
461
+        }
462
+    }
463
+
464
+    if (!empty($options['datas'])) {
465
+        [$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']);
466
+        $head .= $formatted_data;
467
+        if (stripos($head, 'Content-Length:') === false) {
468
+            $head .= 'Content-Length: ' . strlen($postdata) . "\r\n";
469
+        }
470
+        $formatted_data = $head . "\r\n" . $postdata;
471
+        if (
472
+            strlen($postdata)
473
+            and !$methode_demandee
474
+        ) {
475
+            $options['methode'] = 'POST';
476
+        }
477
+    } elseif ($formatted_data) {
478
+        $formatted_data .= "\r\n";
479
+    }
480
+
481
+    // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole
482
+    $url = preg_replace(',^feed://,i', 'http://', $url);
483
+    if (!tester_url_absolue($url)) {
484
+        $url = 'http://' . $url;
485
+    } elseif (strncmp($url, '//', 2) == 0) {
486
+        $url = 'http:' . $url;
487
+    }
488
+
489
+    $url = url_to_ascii($url);
490
+
491
+    $result = [
492
+        'status' => 0,
493
+        'headers' => '',
494
+        'page' => '',
495
+        'length' => 0,
496
+        'last_modified' => '',
497
+        'location' => '',
498
+        'url' => $url
499
+    ];
500
+
501
+    // si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz
502
+    $refuser_gz = (($options['refuser_gz'] or $copy) ? true : false);
503
+
504
+    // ouvrir la connexion et envoyer la requete et ses en-tetes
505
+    [$handle, $fopen] = init_http(
506
+        $options['methode'],
507
+        $url,
508
+        $refuser_gz,
509
+        $options['uri_referer'],
510
+        $formatted_data,
511
+        $options['version_http'],
512
+        $options['if_modified_since']
513
+    );
514
+    if (!$handle) {
515
+        spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR);
516
+
517
+        return false;
518
+    }
519
+
520
+    // Sauf en fopen, envoyer le flux d'entree
521
+    // et recuperer les en-tetes de reponses
522
+    if (!$fopen) {
523
+        $res = recuperer_entetes_complets($handle, $options['if_modified_since']);
524
+        if (!$res) {
525
+            fclose($handle);
526
+            $t = @parse_url($url);
527
+            $host = $t['host'];
528
+            // Chinoisierie inexplicable pour contrer
529
+            // les actions liberticides de l'empire du milieu
530
+            if (
531
+                !need_proxy($host)
532
+                and $res = @file_get_contents($url)
533
+            ) {
534
+                $result['length'] = strlen($res);
535
+                if ($copy) {
536
+                    ecrire_fichier($copy, $res);
537
+                    $result['file'] = $copy;
538
+                } else {
539
+                    $result['page'] = $res;
540
+                }
541
+                $res = [
542
+                    'status' => 200,
543
+                ];
544
+            } else {
545
+                spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR);
546
+                return false;
547
+            }
548
+        } elseif ($res['location'] and $options['follow_location']) {
549
+            $options['follow_location']--;
550
+            fclose($handle);
551
+            include_spip('inc/filtres');
552
+            $url = suivre_lien($url, $res['location']);
553
+
554
+            // une redirection doit se faire en GET, sauf status explicite 307 ou 308 qui indique de garder la meme methode
555
+            if ($options['methode'] !== 'GET') {
556
+                if (empty($res['status']) or !in_array($res['status'], [307, 308])) {
557
+                    $options['methode'] = 'GET';
558
+                    $options['datas'] = '';
559
+                }
560
+            }
561
+            spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
562
+
563
+            return recuperer_url($url, $options);
564
+        } elseif ($res['status'] !== 200) {
565
+            spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant');
566
+        }
567
+        $result['status'] = $res['status'];
568
+        if (isset($res['headers'])) {
569
+            $result['headers'] = $res['headers'];
570
+        }
571
+        if (isset($res['last_modified'])) {
572
+            $result['last_modified'] = $res['last_modified'];
573
+        }
574
+        if (isset($res['location'])) {
575
+            $result['location'] = $res['location'];
576
+        }
577
+    }
578
+
579
+    // on ne veut que les entetes
580
+    if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') {
581
+        spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG);
582
+        return $result;
583
+    }
584
+
585
+
586
+    // s'il faut deballer, le faire via un fichier temporaire
587
+    // sinon la memoire explose pour les gros flux
588
+
589
+    $gz = false;
590
+    if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) {
591
+        $gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz');
592
+    }
593
+
594
+    // si on a pas deja recuperer le contenu par une methode detournee
595
+    if (!$result['length']) {
596
+        $res = recuperer_body($handle, $options['taille_max'], $gz ?: $copy);
597
+        fclose($handle);
598
+        if ($copy) {
599
+            $result['length'] = $res;
600
+            $result['file'] = $copy;
601
+        } elseif ($res) {
602
+            $result['page'] = &$res;
603
+            $result['length'] = strlen($result['page']);
604
+        }
605
+        if (!$result['status']) {
606
+            $result['status'] = 200; // on a reussi, donc !
607
+        }
608
+    }
609
+    if (!$result['page']) {
610
+        return $result;
611
+    }
612
+
613
+    // Decompresser au besoin
614
+    if ($gz) {
615
+        $result['page'] = implode('', gzfile($gz));
616
+        supprimer_fichier($gz);
617
+    }
618
+
619
+    // Faut-il l'importer dans notre charset local ?
620
+    if ($options['transcoder']) {
621
+        include_spip('inc/charsets');
622
+        $result['page'] = transcoder_page($result['page'], $result['headers']);
623
+    }
624
+
625
+    $trace = json_decode(json_encode($result), true);
626
+    $trace['page'] = '...';
627
+    spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG);
628
+
629
+    return $result;
630 630
 }
631 631
 
632 632
 /**
@@ -642,73 +642,73 @@  discard block
 block discarded – undo
642 642
  * @return array|bool|mixed
643 643
  */
644 644
 function recuperer_url_cache($url, $options = []) {
645
-	if (!defined('_DELAI_RECUPERER_URL_CACHE')) {
646
-		define('_DELAI_RECUPERER_URL_CACHE', 3600);
647
-	}
648
-	$default = [
649
-		'transcoder' => false,
650
-		'methode' => 'GET',
651
-		'taille_max' => null,
652
-		'datas' => '',
653
-		'boundary' => '',
654
-		'refuser_gz' => false,
655
-		'if_modified_since' => '',
656
-		'uri_referer' => '',
657
-		'file' => '',
658
-		'follow_location' => 10,
659
-		'version_http' => _INC_DISTANT_VERSION_HTTP,
660
-		'delai_cache' => in_array(_VAR_MODE, ['preview', 'recalcul']) ? 0 : _DELAI_RECUPERER_URL_CACHE,
661
-	];
662
-	$options = array_merge($default, $options);
663
-
664
-	// cas ou il n'est pas possible de cacher
665
-	if (!empty($options['data']) or $options['methode'] == 'POST') {
666
-		return recuperer_url($url, $options);
667
-	}
668
-
669
-	// ne pas tenter plusieurs fois la meme url en erreur (non cachee donc)
670
-	static $errors = [];
671
-	if (isset($errors[$url])) {
672
-		return $errors[$url];
673
-	}
674
-
675
-	$sig = $options;
676
-	unset($sig['if_modified_since']);
677
-	unset($sig['delai_cache']);
678
-	$sig['url'] = $url;
679
-
680
-	$dir = sous_repertoire(_DIR_CACHE, 'curl');
681
-	$cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80);
682
-	$sub = sous_repertoire($dir, substr($cache, 0, 2));
683
-	$cache = "$sub$cache";
684
-
685
-	$res = false;
686
-	$is_cached = file_exists($cache);
687
-	if (
688
-		$is_cached
689
-		and (filemtime($cache) > $_SERVER['REQUEST_TIME'] - $options['delai_cache'])
690
-	) {
691
-		lire_fichier($cache, $res);
692
-		if ($res = unserialize($res)) {
693
-			// mettre le last_modified et le status=304 ?
694
-		}
695
-	}
696
-	if (!$res) {
697
-		$res = recuperer_url($url, $options);
698
-		// ne pas recharger cette url non cachee dans le meme hit puisque non disponible
699
-		if (!$res) {
700
-			if ($is_cached) {
701
-				// on a pas reussi a recuperer mais on avait un cache : l'utiliser
702
-				lire_fichier($cache, $res);
703
-				$res = unserialize($res);
704
-			}
705
-
706
-			return $errors[$url] = $res;
707
-		}
708
-		ecrire_fichier($cache, serialize($res));
709
-	}
710
-
711
-	return $res;
645
+    if (!defined('_DELAI_RECUPERER_URL_CACHE')) {
646
+        define('_DELAI_RECUPERER_URL_CACHE', 3600);
647
+    }
648
+    $default = [
649
+        'transcoder' => false,
650
+        'methode' => 'GET',
651
+        'taille_max' => null,
652
+        'datas' => '',
653
+        'boundary' => '',
654
+        'refuser_gz' => false,
655
+        'if_modified_since' => '',
656
+        'uri_referer' => '',
657
+        'file' => '',
658
+        'follow_location' => 10,
659
+        'version_http' => _INC_DISTANT_VERSION_HTTP,
660
+        'delai_cache' => in_array(_VAR_MODE, ['preview', 'recalcul']) ? 0 : _DELAI_RECUPERER_URL_CACHE,
661
+    ];
662
+    $options = array_merge($default, $options);
663
+
664
+    // cas ou il n'est pas possible de cacher
665
+    if (!empty($options['data']) or $options['methode'] == 'POST') {
666
+        return recuperer_url($url, $options);
667
+    }
668
+
669
+    // ne pas tenter plusieurs fois la meme url en erreur (non cachee donc)
670
+    static $errors = [];
671
+    if (isset($errors[$url])) {
672
+        return $errors[$url];
673
+    }
674
+
675
+    $sig = $options;
676
+    unset($sig['if_modified_since']);
677
+    unset($sig['delai_cache']);
678
+    $sig['url'] = $url;
679
+
680
+    $dir = sous_repertoire(_DIR_CACHE, 'curl');
681
+    $cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80);
682
+    $sub = sous_repertoire($dir, substr($cache, 0, 2));
683
+    $cache = "$sub$cache";
684
+
685
+    $res = false;
686
+    $is_cached = file_exists($cache);
687
+    if (
688
+        $is_cached
689
+        and (filemtime($cache) > $_SERVER['REQUEST_TIME'] - $options['delai_cache'])
690
+    ) {
691
+        lire_fichier($cache, $res);
692
+        if ($res = unserialize($res)) {
693
+            // mettre le last_modified et le status=304 ?
694
+        }
695
+    }
696
+    if (!$res) {
697
+        $res = recuperer_url($url, $options);
698
+        // ne pas recharger cette url non cachee dans le meme hit puisque non disponible
699
+        if (!$res) {
700
+            if ($is_cached) {
701
+                // on a pas reussi a recuperer mais on avait un cache : l'utiliser
702
+                lire_fichier($cache, $res);
703
+                $res = unserialize($res);
704
+            }
705
+
706
+            return $errors[$url] = $res;
707
+        }
708
+        ecrire_fichier($cache, serialize($res));
709
+    }
710
+
711
+    return $res;
712 712
 }
713 713
 
714 714
 /**
@@ -726,42 +726,42 @@  discard block
 block discarded – undo
726 726
  *   string contenu de la resource
727 727
  */
728 728
 function recuperer_body($handle, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = '') {
729
-	$tmpfile = null;
730
-	$taille = 0;
731
-	$result = '';
732
-	$fp = false;
733
-	if ($fichier) {
734
-		include_spip('inc/acces');
735
-		$tmpfile = "$fichier." . creer_uniqid() . '.tmp';
736
-		$fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX);
737
-		if (!$fp and file_exists($fichier)) {
738
-			return filesize($fichier);
739
-		}
740
-		if (!$fp) {
741
-			return false;
742
-		}
743
-		$result = 0; // on renvoie la taille du fichier
744
-	}
745
-	while (!feof($handle) and $taille < $taille_max) {
746
-		$res = fread($handle, 16384);
747
-		$taille += strlen($res);
748
-		if ($fp) {
749
-			fwrite($fp, $res);
750
-			$result = $taille;
751
-		} else {
752
-			$result .= $res;
753
-		}
754
-	}
755
-	if ($fp) {
756
-		spip_fclose_unlock($fp);
757
-		spip_unlink($fichier);
758
-		@rename($tmpfile, $fichier);
759
-		if (!file_exists($fichier)) {
760
-			return false;
761
-		}
762
-	}
763
-
764
-	return $result;
729
+    $tmpfile = null;
730
+    $taille = 0;
731
+    $result = '';
732
+    $fp = false;
733
+    if ($fichier) {
734
+        include_spip('inc/acces');
735
+        $tmpfile = "$fichier." . creer_uniqid() . '.tmp';
736
+        $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX);
737
+        if (!$fp and file_exists($fichier)) {
738
+            return filesize($fichier);
739
+        }
740
+        if (!$fp) {
741
+            return false;
742
+        }
743
+        $result = 0; // on renvoie la taille du fichier
744
+    }
745
+    while (!feof($handle) and $taille < $taille_max) {
746
+        $res = fread($handle, 16384);
747
+        $taille += strlen($res);
748
+        if ($fp) {
749
+            fwrite($fp, $res);
750
+            $result = $taille;
751
+        } else {
752
+            $result .= $res;
753
+        }
754
+    }
755
+    if ($fp) {
756
+        spip_fclose_unlock($fp);
757
+        spip_unlink($fichier);
758
+        @rename($tmpfile, $fichier);
759
+        if (!file_exists($fichier)) {
760
+            return false;
761
+        }
762
+    }
763
+
764
+    return $result;
765 765
 }
766 766
 
767 767
 /**
@@ -783,35 +783,35 @@  discard block
 block discarded – undo
783 783
  *   string location
784 784
  */
785 785
 function recuperer_entetes_complets($handle, $if_modified_since = false) {
786
-	$result = ['status' => 0, 'headers' => [], 'last_modified' => 0, 'location' => ''];
787
-
788
-	$s = @trim(fgets($handle, 16384));
789
-	if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) {
790
-		return false;
791
-	}
792
-	$result['status'] = intval($r[1]);
793
-	while ($s = trim(fgets($handle, 16384))) {
794
-		$result['headers'][] = $s . "\n";
795
-		preg_match(',^([^:]*): *(.*)$,i', $s, $r);
796
-		[, $d, $v] = $r;
797
-		if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) {
798
-			$result['location'] = $v;
799
-		} elseif ($d == 'Last-Modified') {
800
-			$result['last_modified'] = strtotime($v);
801
-		}
802
-	}
803
-	if (
804
-		$if_modified_since
805
-		and $result['last_modified']
806
-		and $if_modified_since > $result['last_modified']
807
-		and $result['status'] == 200
808
-	) {
809
-		$result['status'] = 304;
810
-	}
811
-
812
-	$result['headers'] = implode('', $result['headers']);
813
-
814
-	return $result;
786
+    $result = ['status' => 0, 'headers' => [], 'last_modified' => 0, 'location' => ''];
787
+
788
+    $s = @trim(fgets($handle, 16384));
789
+    if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) {
790
+        return false;
791
+    }
792
+    $result['status'] = intval($r[1]);
793
+    while ($s = trim(fgets($handle, 16384))) {
794
+        $result['headers'][] = $s . "\n";
795
+        preg_match(',^([^:]*): *(.*)$,i', $s, $r);
796
+        [, $d, $v] = $r;
797
+        if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) {
798
+            $result['location'] = $v;
799
+        } elseif ($d == 'Last-Modified') {
800
+            $result['last_modified'] = strtotime($v);
801
+        }
802
+    }
803
+    if (
804
+        $if_modified_since
805
+        and $result['last_modified']
806
+        and $if_modified_since > $result['last_modified']
807
+        and $result['status'] == 200
808
+    ) {
809
+        $result['status'] = 304;
810
+    }
811
+
812
+    $result['headers'] = implode('', $result['headers']);
813
+
814
+    return $result;
815 815
 }
816 816
 
817 817
 /**
@@ -833,22 +833,22 @@  discard block
 block discarded – undo
833 833
  *     Nom du fichier pour copie locale
834 834
  **/
835 835
 function nom_fichier_copie_locale($source, $extension) {
836
-	include_spip('inc/documents');
836
+    include_spip('inc/documents');
837 837
 
838
-	$d = creer_repertoire_documents('distant'); # IMG/distant/
839
-	$d = sous_repertoire($d, $extension); # IMG/distant/pdf/
838
+    $d = creer_repertoire_documents('distant'); # IMG/distant/
839
+    $d = sous_repertoire($d, $extension); # IMG/distant/pdf/
840 840
 
841
-	// on se place tout le temps comme si on etait a la racine
842
-	if (_DIR_RACINE) {
843
-		$d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d);
844
-	}
841
+    // on se place tout le temps comme si on etait a la racine
842
+    if (_DIR_RACINE) {
843
+        $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d);
844
+    }
845 845
 
846
-	$m = md5($source);
846
+    $m = md5($source);
847 847
 
848
-	return $d
849
-	. substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12)
850
-	. substr($m, 0, 4)
851
-	. ".$extension";
848
+    return $d
849
+    . substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12)
850
+    . substr($m, 0, 4)
851
+    . ".$extension";
852 852
 }
853 853
 
854 854
 /**
@@ -866,70 +866,70 @@  discard block
 block discarded – undo
866 866
  *      Nom du fichier calculé
867 867
  **/
868 868
 function fichier_copie_locale($source) {
869
-	// Si c'est deja local pas de souci
870
-	if (!tester_url_absolue($source)) {
871
-		if (_DIR_RACINE) {
872
-			$source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source);
873
-		}
874
-
875
-		return $source;
876
-	}
877
-
878
-	// optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier
879
-	// a deja ete copie en local avec cette extension
880
-	// dans ce cas elle est fiable, pas la peine de requeter en base
881
-	$path_parts = pathinfo($source);
882
-	if (!isset($path_parts['extension'])) {
883
-		$path_parts['extension'] = '';
884
-	}
885
-	$ext = $path_parts ? $path_parts['extension'] : '';
886
-	if (
887
-		$ext
888
-		and preg_match(',^\w+$,', $ext) // pas de php?truc=1&...
889
-		and $f = nom_fichier_copie_locale($source, $ext)
890
-		and file_exists(_DIR_RACINE . $f)
891
-	) {
892
-		return $f;
893
-	}
894
-
895
-
896
-	// Si c'est deja dans la table des documents,
897
-	// ramener le nom de sa copie potentielle
898
-	$ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''");
899
-
900
-	if ($ext) {
901
-		return nom_fichier_copie_locale($source, $ext);
902
-	}
903
-
904
-	// voir si l'extension indiquee dans le nom du fichier est ok
905
-	// et si il n'aurait pas deja ete rapatrie
906
-
907
-	$ext = $path_parts ? $path_parts['extension'] : '';
908
-
909
-	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
910
-		$f = nom_fichier_copie_locale($source, $ext);
911
-		if (file_exists(_DIR_RACINE . $f)) {
912
-			return $f;
913
-		}
914
-	}
915
-
916
-	// Ping  pour voir si son extension est connue et autorisee
917
-	// avec mise en cache du resultat du ping
918
-
919
-	$cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source);
920
-	if (
921
-		!@file_exists($cache)
922
-		or !$path_parts = @unserialize(spip_file_get_contents($cache))
923
-		or _request('var_mode') === 'recalcul'
924
-	) {
925
-		$path_parts = recuperer_infos_distantes($source, 0, false);
926
-		ecrire_fichier($cache, serialize($path_parts));
927
-	}
928
-	$ext = !empty($path_parts['extension']) ? $path_parts['extension'] : '';
929
-	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
930
-		return nom_fichier_copie_locale($source, $ext);
931
-	}
932
-	spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR);
869
+    // Si c'est deja local pas de souci
870
+    if (!tester_url_absolue($source)) {
871
+        if (_DIR_RACINE) {
872
+            $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source);
873
+        }
874
+
875
+        return $source;
876
+    }
877
+
878
+    // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier
879
+    // a deja ete copie en local avec cette extension
880
+    // dans ce cas elle est fiable, pas la peine de requeter en base
881
+    $path_parts = pathinfo($source);
882
+    if (!isset($path_parts['extension'])) {
883
+        $path_parts['extension'] = '';
884
+    }
885
+    $ext = $path_parts ? $path_parts['extension'] : '';
886
+    if (
887
+        $ext
888
+        and preg_match(',^\w+$,', $ext) // pas de php?truc=1&...
889
+        and $f = nom_fichier_copie_locale($source, $ext)
890
+        and file_exists(_DIR_RACINE . $f)
891
+    ) {
892
+        return $f;
893
+    }
894
+
895
+
896
+    // Si c'est deja dans la table des documents,
897
+    // ramener le nom de sa copie potentielle
898
+    $ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''");
899
+
900
+    if ($ext) {
901
+        return nom_fichier_copie_locale($source, $ext);
902
+    }
903
+
904
+    // voir si l'extension indiquee dans le nom du fichier est ok
905
+    // et si il n'aurait pas deja ete rapatrie
906
+
907
+    $ext = $path_parts ? $path_parts['extension'] : '';
908
+
909
+    if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
910
+        $f = nom_fichier_copie_locale($source, $ext);
911
+        if (file_exists(_DIR_RACINE . $f)) {
912
+            return $f;
913
+        }
914
+    }
915
+
916
+    // Ping  pour voir si son extension est connue et autorisee
917
+    // avec mise en cache du resultat du ping
918
+
919
+    $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source);
920
+    if (
921
+        !@file_exists($cache)
922
+        or !$path_parts = @unserialize(spip_file_get_contents($cache))
923
+        or _request('var_mode') === 'recalcul'
924
+    ) {
925
+        $path_parts = recuperer_infos_distantes($source, 0, false);
926
+        ecrire_fichier($cache, serialize($path_parts));
927
+    }
928
+    $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : '';
929
+    if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
930
+        return nom_fichier_copie_locale($source, $ext);
931
+    }
932
+    spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR);
933 933
 }
934 934
 
935 935
 
@@ -957,97 +957,97 @@  discard block
 block discarded – undo
957 957
  **/
958 958
 function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true) {
959 959
 
960
-	// pas la peine de perdre son temps
961
-	if (!tester_url_absolue($source)) {
962
-		return false;
963
-	}
964
-
965
-	# charger les alias des types mime
966
-	include_spip('base/typedoc');
967
-
968
-	$a = [];
969
-	$mime_type = '';
970
-	// On va directement charger le debut des images et des fichiers html,
971
-	// de maniere a attrapper le maximum d'infos (titre, taille, etc). Si
972
-	// ca echoue l'utilisateur devra les entrer...
973
-	$reponse = recuperer_url($source, ['taille_max' => $max, 'refuser_gz' => true]);
974
-	$headers = $reponse['headers'] ?? '';
975
-	$a['body'] = $reponse['page'] ?? '';
976
-	if ($headers) {
977
-		if (!$extension = distant_trouver_extension_selon_headers($source, $headers)) {
978
-			return false;
979
-		}
980
-
981
-		$a['extension'] = $extension;
982
-
983
-		if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n$headers", $regs)) {
984
-			$a['taille'] = intval($regs[1]);
985
-		}
986
-	}
987
-
988
-	// Echec avec HEAD, on tente avec GET
989
-	if (!$a and !$max) {
990
-		spip_log("tenter GET $source", 'distant');
991
-		$a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
992
-	}
993
-
994
-	// si on a rien trouve pas la peine d'insister
995
-	if (!$a) {
996
-		return false;
997
-	}
998
-
999
-	// S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller
1000
-	// recharger le document en GET et recuperer des donnees supplementaires...
1001
-	include_spip('inc/filtres_images_lib_mini');
1002
-	if (
1003
-		strpos($mime_type, 'image/') === 0
1004
-		and $extension = _image_trouver_extension_depuis_mime($mime_type)
1005
-	) {
1006
-		if (
1007
-			$max == 0
1008
-			and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE)
1009
-			and in_array($extension, formats_image_acceptables())
1010
-			and $charger_si_petite_image
1011
-		) {
1012
-			$a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
1013
-		} else {
1014
-			if ($a['body']) {
1015
-				$a['extension'] = $extension;
1016
-				$a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension);
1017
-				ecrire_fichier($a['fichier'], $a['body']);
1018
-				$size_image = @spip_getimagesize($a['fichier']);
1019
-				$a['largeur'] = intval($size_image[0]);
1020
-				$a['hauteur'] = intval($size_image[1]);
1021
-				$a['type_image'] = true;
1022
-			}
1023
-		}
1024
-	}
1025
-
1026
-	// Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut
1027
-	// ce sera mieux que 0x0
1028
-	// Flash is dead!
1029
-	if (
1030
-		$a and isset($a['extension']) and $a['extension'] == 'swf'
1031
-		and empty($a['largeur'])
1032
-	) {
1033
-		$a['largeur'] = 425;
1034
-		$a['hauteur'] = 350;
1035
-	}
1036
-
1037
-	if ($mime_type == 'text/html') {
1038
-		include_spip('inc/filtres');
1039
-		$page = recuperer_url($source, ['transcoder' => true, 'taille_max' => _INC_DISTANT_MAX_SIZE]);
1040
-		$page = $page['page'] ?? '';
1041
-		if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) {
1042
-			$a['titre'] = corriger_caracteres(trim($regs[1]));
1043
-		}
1044
-		if (!isset($a['taille']) or !$a['taille']) {
1045
-			$a['taille'] = strlen($page); # a peu pres
1046
-		}
1047
-	}
1048
-	$a['mime_type'] = $mime_type;
1049
-
1050
-	return $a;
960
+    // pas la peine de perdre son temps
961
+    if (!tester_url_absolue($source)) {
962
+        return false;
963
+    }
964
+
965
+    # charger les alias des types mime
966
+    include_spip('base/typedoc');
967
+
968
+    $a = [];
969
+    $mime_type = '';
970
+    // On va directement charger le debut des images et des fichiers html,
971
+    // de maniere a attrapper le maximum d'infos (titre, taille, etc). Si
972
+    // ca echoue l'utilisateur devra les entrer...
973
+    $reponse = recuperer_url($source, ['taille_max' => $max, 'refuser_gz' => true]);
974
+    $headers = $reponse['headers'] ?? '';
975
+    $a['body'] = $reponse['page'] ?? '';
976
+    if ($headers) {
977
+        if (!$extension = distant_trouver_extension_selon_headers($source, $headers)) {
978
+            return false;
979
+        }
980
+
981
+        $a['extension'] = $extension;
982
+
983
+        if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n$headers", $regs)) {
984
+            $a['taille'] = intval($regs[1]);
985
+        }
986
+    }
987
+
988
+    // Echec avec HEAD, on tente avec GET
989
+    if (!$a and !$max) {
990
+        spip_log("tenter GET $source", 'distant');
991
+        $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
992
+    }
993
+
994
+    // si on a rien trouve pas la peine d'insister
995
+    if (!$a) {
996
+        return false;
997
+    }
998
+
999
+    // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller
1000
+    // recharger le document en GET et recuperer des donnees supplementaires...
1001
+    include_spip('inc/filtres_images_lib_mini');
1002
+    if (
1003
+        strpos($mime_type, 'image/') === 0
1004
+        and $extension = _image_trouver_extension_depuis_mime($mime_type)
1005
+    ) {
1006
+        if (
1007
+            $max == 0
1008
+            and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE)
1009
+            and in_array($extension, formats_image_acceptables())
1010
+            and $charger_si_petite_image
1011
+        ) {
1012
+            $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
1013
+        } else {
1014
+            if ($a['body']) {
1015
+                $a['extension'] = $extension;
1016
+                $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension);
1017
+                ecrire_fichier($a['fichier'], $a['body']);
1018
+                $size_image = @spip_getimagesize($a['fichier']);
1019
+                $a['largeur'] = intval($size_image[0]);
1020
+                $a['hauteur'] = intval($size_image[1]);
1021
+                $a['type_image'] = true;
1022
+            }
1023
+        }
1024
+    }
1025
+
1026
+    // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut
1027
+    // ce sera mieux que 0x0
1028
+    // Flash is dead!
1029
+    if (
1030
+        $a and isset($a['extension']) and $a['extension'] == 'swf'
1031
+        and empty($a['largeur'])
1032
+    ) {
1033
+        $a['largeur'] = 425;
1034
+        $a['hauteur'] = 350;
1035
+    }
1036
+
1037
+    if ($mime_type == 'text/html') {
1038
+        include_spip('inc/filtres');
1039
+        $page = recuperer_url($source, ['transcoder' => true, 'taille_max' => _INC_DISTANT_MAX_SIZE]);
1040
+        $page = $page['page'] ?? '';
1041
+        if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) {
1042
+            $a['titre'] = corriger_caracteres(trim($regs[1]));
1043
+        }
1044
+        if (!isset($a['taille']) or !$a['taille']) {
1045
+            $a['taille'] = strlen($page); # a peu pres
1046
+        }
1047
+    }
1048
+    $a['mime_type'] = $mime_type;
1049
+
1050
+    return $a;
1051 1051
 }
1052 1052
 
1053 1053
 /**
@@ -1056,70 +1056,70 @@  discard block
 block discarded – undo
1056 1056
  * @return false|mixed
1057 1057
  */
1058 1058
 function distant_trouver_extension_selon_headers($source, $headers) {
1059
-	if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) {
1060
-		$mime_type = (trim($regs[1]));
1061
-	} else {
1062
-		$mime_type = '';
1063
-	} // inconnu
1064
-
1065
-	// Appliquer les alias
1066
-	while (isset($GLOBALS['mime_alias'][$mime_type])) {
1067
-		$mime_type = $GLOBALS['mime_alias'][$mime_type];
1068
-	}
1069
-
1070
-	// pour corriger_extension()
1071
-	include_spip('inc/documents');
1072
-
1073
-	// Si on a un mime-type insignifiant
1074
-	// text/plain,application/octet-stream ou vide
1075
-	// c'est peut-etre que le serveur ne sait pas
1076
-	// ce qu'il sert ; on va tenter de detecter via l'extension de l'url
1077
-	// ou le Content-Disposition: attachment; filename=...
1078
-	$t = null;
1079
-	if (in_array($mime_type, ['text/plain', '', 'application/octet-stream'])) {
1080
-		if (
1081
-			!$t
1082
-			and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1083
-		) {
1084
-			$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1085
-		}
1086
-		if (
1087
-			!$t
1088
-			and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m)
1089
-			and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext)
1090
-		) {
1091
-			$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1092
-		}
1093
-	}
1094
-
1095
-	// Autre mime/type (ou text/plain avec fichier d'extension inconnue)
1096
-	if (!$t) {
1097
-		$t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type));
1098
-	}
1099
-
1100
-	// Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
1101
-	// On essaie de nouveau avec l'extension
1102
-	if (
1103
-		!$t
1104
-		and $mime_type != 'text/plain'
1105
-		and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1106
-	) {
1107
-		# eviter xxx.3 => 3gp (> SPIP 3)
1108
-		$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1109
-	}
1110
-
1111
-	if ($t) {
1112
-		spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant');
1113
-		return $t['extension'];
1114
-	} else {
1115
-		# par defaut on retombe sur '.bin' si c'est autorise
1116
-		spip_log("mime-type $mime_type inconnu", 'distant');
1117
-		$t = sql_fetsel('extension', 'spip_types_documents', "extension='bin'");
1118
-		if (!$t) {
1119
-			return false;
1120
-		}
1121
-		return $t['extension'];
1122
-	}
1059
+    if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) {
1060
+        $mime_type = (trim($regs[1]));
1061
+    } else {
1062
+        $mime_type = '';
1063
+    } // inconnu
1064
+
1065
+    // Appliquer les alias
1066
+    while (isset($GLOBALS['mime_alias'][$mime_type])) {
1067
+        $mime_type = $GLOBALS['mime_alias'][$mime_type];
1068
+    }
1069
+
1070
+    // pour corriger_extension()
1071
+    include_spip('inc/documents');
1072
+
1073
+    // Si on a un mime-type insignifiant
1074
+    // text/plain,application/octet-stream ou vide
1075
+    // c'est peut-etre que le serveur ne sait pas
1076
+    // ce qu'il sert ; on va tenter de detecter via l'extension de l'url
1077
+    // ou le Content-Disposition: attachment; filename=...
1078
+    $t = null;
1079
+    if (in_array($mime_type, ['text/plain', '', 'application/octet-stream'])) {
1080
+        if (
1081
+            !$t
1082
+            and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1083
+        ) {
1084
+            $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1085
+        }
1086
+        if (
1087
+            !$t
1088
+            and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m)
1089
+            and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext)
1090
+        ) {
1091
+            $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1092
+        }
1093
+    }
1094
+
1095
+    // Autre mime/type (ou text/plain avec fichier d'extension inconnue)
1096
+    if (!$t) {
1097
+        $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type));
1098
+    }
1099
+
1100
+    // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
1101
+    // On essaie de nouveau avec l'extension
1102
+    if (
1103
+        !$t
1104
+        and $mime_type != 'text/plain'
1105
+        and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1106
+    ) {
1107
+        # eviter xxx.3 => 3gp (> SPIP 3)
1108
+        $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1109
+    }
1110
+
1111
+    if ($t) {
1112
+        spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant');
1113
+        return $t['extension'];
1114
+    } else {
1115
+        # par defaut on retombe sur '.bin' si c'est autorise
1116
+        spip_log("mime-type $mime_type inconnu", 'distant');
1117
+        $t = sql_fetsel('extension', 'spip_types_documents', "extension='bin'");
1118
+        if (!$t) {
1119
+            return false;
1120
+        }
1121
+        return $t['extension'];
1122
+    }
1123 1123
 }
1124 1124
 
1125 1125
 /**
@@ -1135,45 +1135,45 @@  discard block
 block discarded – undo
1135 1135
  */
1136 1136
 function need_proxy($host, $http_proxy = null, $http_noproxy = null) {
1137 1137
 
1138
-	$http_proxy ??= $GLOBALS['meta']['http_proxy'] ?? null;
1138
+    $http_proxy ??= $GLOBALS['meta']['http_proxy'] ?? null;
1139 1139
 	
1140
-	// rien a faire si pas de proxy :)
1141
-	if (is_null($http_proxy) or !$http_proxy = trim($http_proxy)) {
1142
-		return '';
1143
-	}
1144
-
1145
-	if (is_null($http_noproxy)) {
1146
-		$http_noproxy = $GLOBALS['meta']['http_noproxy'] ?? null;
1147
-	}
1148
-	// si pas d'exception, on retourne le proxy
1149
-	if (is_null($http_noproxy) or !$http_noproxy = trim($http_noproxy)) {
1150
-		return $http_proxy;
1151
-	}
1152
-
1153
-	// si le host ou l'un des domaines parents est dans $http_noproxy on fait exception
1154
-	// $http_noproxy peut contenir plusieurs domaines separes par des espaces ou retour ligne
1155
-	$http_noproxy = str_replace("\n", ' ', $http_noproxy);
1156
-	$http_noproxy = str_replace("\r", ' ', $http_noproxy);
1157
-	$http_noproxy = " $http_noproxy ";
1158
-	$domain = $host;
1159
-	// si le domaine exact www.example.org est dans les exceptions
1160
-	if (strpos($http_noproxy, (string) " $domain ") !== false) {
1161
-		return '';
1162
-	}
1163
-
1164
-	while (strpos($domain, '.') !== false) {
1165
-		$domain = explode('.', $domain);
1166
-		array_shift($domain);
1167
-		$domain = implode('.', $domain);
1168
-
1169
-		// ou si un domaine parent commencant par un . est dans les exceptions (indiquant qu'il couvre tous les sous-domaines)
1170
-		if (strpos($http_noproxy, (string) " .$domain ") !== false) {
1171
-			return '';
1172
-		}
1173
-	}
1174
-
1175
-	// ok c'est pas une exception
1176
-	return $http_proxy;
1140
+    // rien a faire si pas de proxy :)
1141
+    if (is_null($http_proxy) or !$http_proxy = trim($http_proxy)) {
1142
+        return '';
1143
+    }
1144
+
1145
+    if (is_null($http_noproxy)) {
1146
+        $http_noproxy = $GLOBALS['meta']['http_noproxy'] ?? null;
1147
+    }
1148
+    // si pas d'exception, on retourne le proxy
1149
+    if (is_null($http_noproxy) or !$http_noproxy = trim($http_noproxy)) {
1150
+        return $http_proxy;
1151
+    }
1152
+
1153
+    // si le host ou l'un des domaines parents est dans $http_noproxy on fait exception
1154
+    // $http_noproxy peut contenir plusieurs domaines separes par des espaces ou retour ligne
1155
+    $http_noproxy = str_replace("\n", ' ', $http_noproxy);
1156
+    $http_noproxy = str_replace("\r", ' ', $http_noproxy);
1157
+    $http_noproxy = " $http_noproxy ";
1158
+    $domain = $host;
1159
+    // si le domaine exact www.example.org est dans les exceptions
1160
+    if (strpos($http_noproxy, (string) " $domain ") !== false) {
1161
+        return '';
1162
+    }
1163
+
1164
+    while (strpos($domain, '.') !== false) {
1165
+        $domain = explode('.', $domain);
1166
+        array_shift($domain);
1167
+        $domain = implode('.', $domain);
1168
+
1169
+        // ou si un domaine parent commencant par un . est dans les exceptions (indiquant qu'il couvre tous les sous-domaines)
1170
+        if (strpos($http_noproxy, (string) " .$domain ") !== false) {
1171
+            return '';
1172
+        }
1173
+    }
1174
+
1175
+    // ok c'est pas une exception
1176
+    return $http_proxy;
1177 1177
 }
1178 1178
 
1179 1179
 
@@ -1196,59 +1196,59 @@  discard block
 block discarded – undo
1196 1196
  * @return array
1197 1197
  */
1198 1198
 function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = '', $vers = 'HTTP/1.0', $date = '') {
1199
-	$user = $via_proxy = $proxy_user = '';
1200
-	$fopen = false;
1201
-
1202
-	$t = @parse_url($url);
1203
-	$host = $t['host'];
1204
-	if ($t['scheme'] == 'http') {
1205
-		$scheme = 'http';
1206
-		$noproxy = '';
1207
-	} elseif ($t['scheme'] == 'https') {
1208
-		$scheme = 'ssl';
1209
-		$noproxy = 'ssl://';
1210
-		if (!isset($t['port']) || !($port = $t['port'])) {
1211
-			$t['port'] = 443;
1212
-		}
1213
-	} else {
1214
-		$scheme = $t['scheme'];
1215
-		$noproxy = $scheme . '://';
1216
-	}
1217
-	if (isset($t['user'])) {
1218
-		$user = [$t['user'], $t['pass']];
1219
-	}
1220
-
1221
-	if (!isset($t['port']) || !($port = $t['port'])) {
1222
-		$port = 80;
1223
-	}
1224
-	if (!isset($t['path']) || !($path = $t['path'])) {
1225
-		$path = '/';
1226
-	}
1227
-
1228
-	if (!empty($t['query'])) {
1229
-		$path .= '?' . $t['query'];
1230
-	}
1231
-
1232
-	$f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date);
1233
-	if (!$f or !is_resource($f)) {
1234
-		// fallback : fopen si on a pas fait timeout dans lance_requete
1235
-		// ce qui correspond a $f===110
1236
-		if (
1237
-			$f !== 110
1238
-			and !need_proxy($host)
1239
-			and !_request('tester_proxy')
1240
-			and (!isset($GLOBALS['inc_distant_allow_fopen']) or $GLOBALS['inc_distant_allow_fopen'])
1241
-		) {
1242
-			$f = @fopen($url, 'rb');
1243
-			spip_log("connexion vers $url par simple fopen", 'distant');
1244
-			$fopen = true;
1245
-		} else {
1246
-			// echec total
1247
-			$f = false;
1248
-		}
1249
-	}
1250
-
1251
-	return [$f, $fopen];
1199
+    $user = $via_proxy = $proxy_user = '';
1200
+    $fopen = false;
1201
+
1202
+    $t = @parse_url($url);
1203
+    $host = $t['host'];
1204
+    if ($t['scheme'] == 'http') {
1205
+        $scheme = 'http';
1206
+        $noproxy = '';
1207
+    } elseif ($t['scheme'] == 'https') {
1208
+        $scheme = 'ssl';
1209
+        $noproxy = 'ssl://';
1210
+        if (!isset($t['port']) || !($port = $t['port'])) {
1211
+            $t['port'] = 443;
1212
+        }
1213
+    } else {
1214
+        $scheme = $t['scheme'];
1215
+        $noproxy = $scheme . '://';
1216
+    }
1217
+    if (isset($t['user'])) {
1218
+        $user = [$t['user'], $t['pass']];
1219
+    }
1220
+
1221
+    if (!isset($t['port']) || !($port = $t['port'])) {
1222
+        $port = 80;
1223
+    }
1224
+    if (!isset($t['path']) || !($path = $t['path'])) {
1225
+        $path = '/';
1226
+    }
1227
+
1228
+    if (!empty($t['query'])) {
1229
+        $path .= '?' . $t['query'];
1230
+    }
1231
+
1232
+    $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date);
1233
+    if (!$f or !is_resource($f)) {
1234
+        // fallback : fopen si on a pas fait timeout dans lance_requete
1235
+        // ce qui correspond a $f===110
1236
+        if (
1237
+            $f !== 110
1238
+            and !need_proxy($host)
1239
+            and !_request('tester_proxy')
1240
+            and (!isset($GLOBALS['inc_distant_allow_fopen']) or $GLOBALS['inc_distant_allow_fopen'])
1241
+        ) {
1242
+            $f = @fopen($url, 'rb');
1243
+            spip_log("connexion vers $url par simple fopen", 'distant');
1244
+            $fopen = true;
1245
+        } else {
1246
+            // echec total
1247
+            $f = false;
1248
+        }
1249
+    }
1250
+
1251
+    return [$f, $fopen];
1252 1252
 }
1253 1253
 
1254 1254
 /**
@@ -1283,125 +1283,125 @@  discard block
 block discarded – undo
1283 1283
  *   resource socket vers l'url demandee
1284 1284
  */
1285 1285
 function lance_requete(
1286
-	$method,
1287
-	$scheme,
1288
-	$user,
1289
-	$host,
1290
-	$path,
1291
-	$port,
1292
-	$noproxy,
1293
-	$refuse_gz = false,
1294
-	$referer = '',
1295
-	$datas = '',
1296
-	$vers = 'HTTP/1.0',
1297
-	$date = ''
1286
+    $method,
1287
+    $scheme,
1288
+    $user,
1289
+    $host,
1290
+    $path,
1291
+    $port,
1292
+    $noproxy,
1293
+    $refuse_gz = false,
1294
+    $referer = '',
1295
+    $datas = '',
1296
+    $vers = 'HTTP/1.0',
1297
+    $date = ''
1298 1298
 ) {
1299 1299
 
1300
-	$proxy_user = '';
1301
-	$http_proxy = need_proxy($host);
1302
-	if ($user) {
1303
-		$user = urlencode($user[0]) . ':' . urlencode($user[1]);
1304
-	}
1305
-
1306
-	$connect = '';
1307
-	if ($http_proxy) {
1308
-		if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) {
1309
-			$path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : '');
1310
-			$connect = 'CONNECT ' . $path_host . " $vers\r\n"
1311
-				. "Host: $path_host\r\n"
1312
-				. "Proxy-Connection: Keep-Alive\r\n";
1313
-		} else {
1314
-			$path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://")
1315
-				. (!$user ? '' : "$user@")
1316
-				. "$host" . (($port != 80) ? ":$port" : '') . $path;
1317
-		}
1318
-		$t2 = @parse_url($http_proxy);
1319
-		$first_host = $t2['host'];
1320
-		if (!($port = $t2['port'])) {
1321
-			$port = 80;
1322
-		}
1323
-		if ($t2['user']) {
1324
-			$proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']);
1325
-		}
1326
-	} else {
1327
-		$first_host = $noproxy . $host;
1328
-	}
1329
-
1330
-	if ($connect) {
1331
-		$streamContext = stream_context_create([
1332
-			'ssl' => [
1333
-				'verify_peer' => false,
1334
-				'allow_self_signed' => true,
1335
-				'SNI_enabled' => true,
1336
-				'peer_name' => $host,
1337
-			]
1338
-		]);
1339
-		$f = @stream_socket_client(
1340
-			"tcp://$first_host:$port",
1341
-			$errno,
1342
-			$errstr,
1343
-			_INC_DISTANT_CONNECT_TIMEOUT,
1344
-			STREAM_CLIENT_CONNECT,
1345
-			$streamContext
1346
-		);
1347
-		spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", 'connect');
1348
-		if (!$f) {
1349
-			spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1350
-			return $errno;
1351
-		}
1352
-		stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
1353
-
1354
-		fputs($f, $connect);
1355
-		fputs($f, "\r\n");
1356
-		$res = fread($f, 1024);
1357
-		if (
1358
-			!$res
1359
-			or !count($res = explode(' ', $res))
1360
-			or $res[1] !== '200'
1361
-		) {
1362
-			spip_log("Echec CONNECT sur $first_host:$port", 'connect' . _LOG_INFO_IMPORTANTE);
1363
-			fclose($f);
1364
-
1365
-			return false;
1366
-		}
1367
-		// important, car sinon on lit trop vite et les donnees ne sont pas encore dispo
1368
-		stream_set_blocking($f, true);
1369
-		// envoyer le handshake
1370
-		stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
1371
-		spip_log("OK CONNECT sur $first_host:$port", 'connect');
1372
-	} else {
1373
-		$ntry = 3;
1374
-		do {
1375
-			$f = @fsockopen($first_host, $port, $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT);
1376
-		} while (!$f and $ntry-- and $errno !== 110 and sleep(1));
1377
-		spip_log("Recuperer $path sur $first_host:$port par $f");
1378
-		if (!$f) {
1379
-			spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1380
-
1381
-			return $errno;
1382
-		}
1383
-		stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
1384
-	}
1385
-
1386
-	$site = $GLOBALS['meta']['adresse_site'] ?? '';
1387
-
1388
-	$host_port = $host;
1389
-	if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) {
1390
-		$host_port .= ":$port";
1391
-	}
1392
-	$req = "$method $path $vers\r\n"
1393
-		. "Host: $host_port\r\n"
1394
-		. 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n"
1395
-		. ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n"))
1396
-		. (!$site ? '' : "Referer: $site/$referer\r\n")
1397
-		. (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n"))
1398
-		. (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n"))
1399
-		. (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n")
1400
-		. (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n");
1300
+    $proxy_user = '';
1301
+    $http_proxy = need_proxy($host);
1302
+    if ($user) {
1303
+        $user = urlencode($user[0]) . ':' . urlencode($user[1]);
1304
+    }
1305
+
1306
+    $connect = '';
1307
+    if ($http_proxy) {
1308
+        if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) {
1309
+            $path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : '');
1310
+            $connect = 'CONNECT ' . $path_host . " $vers\r\n"
1311
+                . "Host: $path_host\r\n"
1312
+                . "Proxy-Connection: Keep-Alive\r\n";
1313
+        } else {
1314
+            $path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://")
1315
+                . (!$user ? '' : "$user@")
1316
+                . "$host" . (($port != 80) ? ":$port" : '') . $path;
1317
+        }
1318
+        $t2 = @parse_url($http_proxy);
1319
+        $first_host = $t2['host'];
1320
+        if (!($port = $t2['port'])) {
1321
+            $port = 80;
1322
+        }
1323
+        if ($t2['user']) {
1324
+            $proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']);
1325
+        }
1326
+    } else {
1327
+        $first_host = $noproxy . $host;
1328
+    }
1329
+
1330
+    if ($connect) {
1331
+        $streamContext = stream_context_create([
1332
+            'ssl' => [
1333
+                'verify_peer' => false,
1334
+                'allow_self_signed' => true,
1335
+                'SNI_enabled' => true,
1336
+                'peer_name' => $host,
1337
+            ]
1338
+        ]);
1339
+        $f = @stream_socket_client(
1340
+            "tcp://$first_host:$port",
1341
+            $errno,
1342
+            $errstr,
1343
+            _INC_DISTANT_CONNECT_TIMEOUT,
1344
+            STREAM_CLIENT_CONNECT,
1345
+            $streamContext
1346
+        );
1347
+        spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", 'connect');
1348
+        if (!$f) {
1349
+            spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1350
+            return $errno;
1351
+        }
1352
+        stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
1353
+
1354
+        fputs($f, $connect);
1355
+        fputs($f, "\r\n");
1356
+        $res = fread($f, 1024);
1357
+        if (
1358
+            !$res
1359
+            or !count($res = explode(' ', $res))
1360
+            or $res[1] !== '200'
1361
+        ) {
1362
+            spip_log("Echec CONNECT sur $first_host:$port", 'connect' . _LOG_INFO_IMPORTANTE);
1363
+            fclose($f);
1364
+
1365
+            return false;
1366
+        }
1367
+        // important, car sinon on lit trop vite et les donnees ne sont pas encore dispo
1368
+        stream_set_blocking($f, true);
1369
+        // envoyer le handshake
1370
+        stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
1371
+        spip_log("OK CONNECT sur $first_host:$port", 'connect');
1372
+    } else {
1373
+        $ntry = 3;
1374
+        do {
1375
+            $f = @fsockopen($first_host, $port, $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT);
1376
+        } while (!$f and $ntry-- and $errno !== 110 and sleep(1));
1377
+        spip_log("Recuperer $path sur $first_host:$port par $f");
1378
+        if (!$f) {
1379
+            spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1380
+
1381
+            return $errno;
1382
+        }
1383
+        stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
1384
+    }
1385
+
1386
+    $site = $GLOBALS['meta']['adresse_site'] ?? '';
1387
+
1388
+    $host_port = $host;
1389
+    if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) {
1390
+        $host_port .= ":$port";
1391
+    }
1392
+    $req = "$method $path $vers\r\n"
1393
+        . "Host: $host_port\r\n"
1394
+        . 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n"
1395
+        . ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n"))
1396
+        . (!$site ? '' : "Referer: $site/$referer\r\n")
1397
+        . (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n"))
1398
+        . (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n"))
1399
+        . (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n")
1400
+        . (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n");
1401 1401
 
1402 1402
 #	spip_log("Requete\n$req", 'distant');
1403
-	fputs($f, $req);
1404
-	fputs($f, $datas ?: "\r\n");
1403
+    fputs($f, $req);
1404
+    fputs($f, $datas ?: "\r\n");
1405 1405
 
1406
-	return $f;
1406
+    return $f;
1407 1407
 }
Please login to merge, or discard this patch.
Spacing   +63 added lines, -63 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
 	define('_INC_DISTANT_CONTENT_ENCODING', 'gzip');
27 27
 }
28 28
 if (!defined('_INC_DISTANT_USER_AGENT')) {
29
-	define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')');
29
+	define('_INC_DISTANT_USER_AGENT', 'SPIP-'.$GLOBALS['spip_version_affichee'].' ('.$GLOBALS['home_server'].')');
30 30
 }
31 31
 if (!defined('_INC_DISTANT_MAX_SIZE')) {
32 32
 	define('_INC_DISTANT_MAX_SIZE', 2_097_152);
@@ -35,7 +35,7 @@  discard block
 block discarded – undo
35 35
 	define('_INC_DISTANT_CONNECT_TIMEOUT', 10);
36 36
 }
37 37
 
38
-define('_REGEXP_COPIE_LOCALE', ',' 	.
38
+define('_REGEXP_COPIE_LOCALE', ','.
39 39
 	preg_replace(
40 40
 		'@^https?:@',
41 41
 		'https?:',
@@ -70,7 +70,7 @@  discard block
 block discarded – undo
70 70
 
71 71
 	// si c'est la protection de soi-meme, retourner le path
72 72
 	if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) {
73
-		$source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]);
73
+		$source = substr(_DIR_IMG, strlen(_DIR_RACINE)).urldecode($match[1]);
74 74
 
75 75
 		return @file_exists($source) ? $source : false;
76 76
 	}
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 		return false;
91 91
 	}
92 92
 
93
-	$localrac = _DIR_RACINE . $local;
93
+	$localrac = _DIR_RACINE.$local;
94 94
 	$t = ($mode === 'force') ? false : @file_exists($localrac);
95 95
 
96 96
 	// test d'existence du fichier
@@ -115,10 +115,10 @@  discard block
 block discarded – undo
115 115
 			['file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : '']
116 116
 		);
117 117
 		if (!$res or (!$res['length'] and $res['status'] != 304)) {
118
-			spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE);
118
+			spip_log("copie_locale : Echec recuperation $source sur $localrac status : ".($res ? $res['status'] : '-'), 'distant'._LOG_INFO_IMPORTANTE);
119 119
 		}
120 120
 		else {
121
-			spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant');
121
+			spip_log("copie_locale : recuperation $source sur $localrac OK | taille ".$res['length'].' status '.$res['status'], 'distant');
122 122
 		}
123 123
 		if (!$res or !$res['length']) {
124 124
 			// si $t c'est sans doute juste un not-modified-since
@@ -207,7 +207,7 @@  discard block
 block discarded – undo
207 207
 
208 208
 	if (!$is_known_host) {
209 209
 		$host = trim($parsed_url['host'], '.');
210
-		if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) {
210
+		if (!$ip = filter_var($host, FILTER_VALIDATE_IP)) {
211 211
 			$ip = gethostbyname($host);
212 212
 			if ($ip === $host) {
213 213
 				// Error condition for gethostbyname()
@@ -228,7 +228,7 @@  discard block
 block discarded – undo
228 228
 			}
229 229
 		}
230 230
 		if ($ip) {
231
-			if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
231
+			if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
232 232
 				return false;
233 233
 			}
234 234
 		}
@@ -239,7 +239,7 @@  discard block
 block discarded – undo
239 239
 	}
240 240
 
241 241
 	$port = $parsed_url['port'];
242
-	if ($port === 80  or $port === 443  or $port === 8080) {
242
+	if ($port === 80 or $port === 443 or $port === 8080) {
243 243
 		return $url;
244 244
 	}
245 245
 
@@ -309,7 +309,7 @@  discard block
 block discarded – undo
309 309
 				}
310 310
 			}
311 311
 			if ($taille > 500) {
312
-				$boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8);
312
+				$boundary = substr(md5(random_int(0, mt_getrandmax()).'spip'), 0, 8);
313 313
 			}
314 314
 		}
315 315
 
@@ -337,16 +337,16 @@  discard block
 block discarded – undo
337 337
 			}
338 338
 		} else {
339 339
 			// fabrique une chaine HTTP simple pour un POST
340
-			$entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n";
340
+			$entete = 'Content-Type: application/x-www-form-urlencoded'."\r\n";
341 341
 			$chaine = [];
342 342
 			if (is_array($donnees)) {
343 343
 				foreach ($donnees as $cle => $valeur) {
344 344
 					if (is_array($valeur)) {
345 345
 						foreach ($valeur as $val2) {
346
-							$chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2);
346
+							$chaine[] = rawurlencode($cle).'[]='.rawurlencode($val2);
347 347
 						}
348 348
 					} else {
349
-						$chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur);
349
+						$chaine[] = rawurlencode($cle).'='.rawurlencode($valeur);
350 350
 					}
351 351
 				}
352 352
 				$chaine = implode('&', $chaine);
@@ -451,13 +451,13 @@  discard block
 block discarded – undo
451 451
 		$options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE;
452 452
 	}
453 453
 
454
-	spip_log("recuperer_url " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
454
+	spip_log("recuperer_url ".$options['methode']." sur $url", 'distant'._LOG_DEBUG);
455 455
 
456 456
 	// Ajout des en-têtes spécifiques si besoin
457 457
 	$formatted_data = '';
458 458
 	if (!empty($options['headers'])) {
459 459
 		foreach ($options['headers'] as $champ => $valeur) {
460
-			$formatted_data .= $champ . ': ' . $valeur . "\r\n";
460
+			$formatted_data .= $champ.': '.$valeur."\r\n";
461 461
 		}
462 462
 	}
463 463
 
@@ -465,9 +465,9 @@  discard block
 block discarded – undo
465 465
 		[$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']);
466 466
 		$head .= $formatted_data;
467 467
 		if (stripos($head, 'Content-Length:') === false) {
468
-			$head .= 'Content-Length: ' . strlen($postdata) . "\r\n";
468
+			$head .= 'Content-Length: '.strlen($postdata)."\r\n";
469 469
 		}
470
-		$formatted_data = $head . "\r\n" . $postdata;
470
+		$formatted_data = $head."\r\n".$postdata;
471 471
 		if (
472 472
 			strlen($postdata)
473 473
 			and !$methode_demandee
@@ -481,9 +481,9 @@  discard block
 block discarded – undo
481 481
 	// Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole
482 482
 	$url = preg_replace(',^feed://,i', 'http://', $url);
483 483
 	if (!tester_url_absolue($url)) {
484
-		$url = 'http://' . $url;
484
+		$url = 'http://'.$url;
485 485
 	} elseif (strncmp($url, '//', 2) == 0) {
486
-		$url = 'http:' . $url;
486
+		$url = 'http:'.$url;
487 487
 	}
488 488
 
489 489
 	$url = url_to_ascii($url);
@@ -512,7 +512,7 @@  discard block
 block discarded – undo
512 512
 		$options['if_modified_since']
513 513
 	);
514 514
 	if (!$handle) {
515
-		spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR);
515
+		spip_log("ECHEC init_http $url", 'distant'._LOG_ERREUR);
516 516
 
517 517
 		return false;
518 518
 	}
@@ -542,7 +542,7 @@  discard block
 block discarded – undo
542 542
 					'status' => 200,
543 543
 				];
544 544
 			} else {
545
-				spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR);
545
+				spip_log("ECHEC chinoiserie $url", 'distant'._LOG_ERREUR);
546 546
 				return false;
547 547
 			}
548 548
 		} elseif ($res['location'] and $options['follow_location']) {
@@ -558,11 +558,11 @@  discard block
 block discarded – undo
558 558
 					$options['datas'] = '';
559 559
 				}
560 560
 			}
561
-			spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
561
+			spip_log("recuperer_url recommence ".$options['methode']." sur $url", 'distant'._LOG_DEBUG);
562 562
 
563 563
 			return recuperer_url($url, $options);
564 564
 		} elseif ($res['status'] !== 200) {
565
-			spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant');
565
+			spip_log('HTTP status '.$res['status']." pour $url", 'distant');
566 566
 		}
567 567
 		$result['status'] = $res['status'];
568 568
 		if (isset($res['headers'])) {
@@ -578,7 +578,7 @@  discard block
 block discarded – undo
578 578
 
579 579
 	// on ne veut que les entetes
580 580
 	if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') {
581
-		spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG);
581
+		spip_log("RESULTAT recuperer_url ".$options['methode']." sur $url : ".json_encode($result), 'distant'._LOG_DEBUG);
582 582
 		return $result;
583 583
 	}
584 584
 
@@ -588,7 +588,7 @@  discard block
 block discarded – undo
588 588
 
589 589
 	$gz = false;
590 590
 	if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) {
591
-		$gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz');
591
+		$gz = (_DIR_TMP.md5(uniqid(random_int(0, mt_getrandmax()))).'.tmp.gz');
592 592
 	}
593 593
 
594 594
 	// si on a pas deja recuperer le contenu par une methode detournee
@@ -624,7 +624,7 @@  discard block
 block discarded – undo
624 624
 
625 625
 	$trace = json_decode(json_encode($result), true);
626 626
 	$trace['page'] = '...';
627
-	spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG);
627
+	spip_log("RESULTAT recuperer_url ".$options['methode']." sur $url : ".json_encode($trace), 'distant'._LOG_DEBUG);
628 628
 
629 629
 	return $result;
630 630
 }
@@ -678,7 +678,7 @@  discard block
 block discarded – undo
678 678
 	$sig['url'] = $url;
679 679
 
680 680
 	$dir = sous_repertoire(_DIR_CACHE, 'curl');
681
-	$cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80);
681
+	$cache = md5(serialize($sig)).'-'.substr(preg_replace(',\W+,', '_', $url), 0, 80);
682 682
 	$sub = sous_repertoire($dir, substr($cache, 0, 2));
683 683
 	$cache = "$sub$cache";
684 684
 
@@ -732,7 +732,7 @@  discard block
 block discarded – undo
732 732
 	$fp = false;
733 733
 	if ($fichier) {
734 734
 		include_spip('inc/acces');
735
-		$tmpfile = "$fichier." . creer_uniqid() . '.tmp';
735
+		$tmpfile = "$fichier.".creer_uniqid().'.tmp';
736 736
 		$fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX);
737 737
 		if (!$fp and file_exists($fichier)) {
738 738
 			return filesize($fichier);
@@ -791,7 +791,7 @@  discard block
 block discarded – undo
791 791
 	}
792 792
 	$result['status'] = intval($r[1]);
793 793
 	while ($s = trim(fgets($handle, 16384))) {
794
-		$result['headers'][] = $s . "\n";
794
+		$result['headers'][] = $s."\n";
795 795
 		preg_match(',^([^:]*): *(.*)$,i', $s, $r);
796 796
 		[, $d, $v] = $r;
797 797
 		if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) {
@@ -840,13 +840,13 @@  discard block
 block discarded – undo
840 840
 
841 841
 	// on se place tout le temps comme si on etait a la racine
842 842
 	if (_DIR_RACINE) {
843
-		$d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d);
843
+		$d = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $d);
844 844
 	}
845 845
 
846 846
 	$m = md5($source);
847 847
 
848 848
 	return $d
849
-	. substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12)
849
+	. substr(preg_replace(',[^\w-],', '', basename($source)).'-'.$m, 0, 12)
850 850
 	. substr($m, 0, 4)
851 851
 	. ".$extension";
852 852
 }
@@ -869,7 +869,7 @@  discard block
 block discarded – undo
869 869
 	// Si c'est deja local pas de souci
870 870
 	if (!tester_url_absolue($source)) {
871 871
 		if (_DIR_RACINE) {
872
-			$source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source);
872
+			$source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source);
873 873
 		}
874 874
 
875 875
 		return $source;
@@ -887,7 +887,7 @@  discard block
 block discarded – undo
887 887
 		$ext
888 888
 		and preg_match(',^\w+$,', $ext) // pas de php?truc=1&...
889 889
 		and $f = nom_fichier_copie_locale($source, $ext)
890
-		and file_exists(_DIR_RACINE . $f)
890
+		and file_exists(_DIR_RACINE.$f)
891 891
 	) {
892 892
 		return $f;
893 893
 	}
@@ -895,7 +895,7 @@  discard block
 block discarded – undo
895 895
 
896 896
 	// Si c'est deja dans la table des documents,
897 897
 	// ramener le nom de sa copie potentielle
898
-	$ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''");
898
+	$ext = sql_getfetsel('extension', 'spip_documents', 'fichier='.sql_quote($source)." AND distant='oui' AND extension <> ''");
899 899
 
900 900
 	if ($ext) {
901 901
 		return nom_fichier_copie_locale($source, $ext);
@@ -906,9 +906,9 @@  discard block
 block discarded – undo
906 906
 
907 907
 	$ext = $path_parts ? $path_parts['extension'] : '';
908 908
 
909
-	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
909
+	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension='.sql_quote($ext))) {
910 910
 		$f = nom_fichier_copie_locale($source, $ext);
911
-		if (file_exists(_DIR_RACINE . $f)) {
911
+		if (file_exists(_DIR_RACINE.$f)) {
912 912
 			return $f;
913 913
 		}
914 914
 	}
@@ -916,7 +916,7 @@  discard block
 block discarded – undo
916 916
 	// Ping  pour voir si son extension est connue et autorisee
917 917
 	// avec mise en cache du resultat du ping
918 918
 
919
-	$cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source);
919
+	$cache = sous_repertoire(_DIR_CACHE, 'rid').md5($source);
920 920
 	if (
921 921
 		!@file_exists($cache)
922 922
 		or !$path_parts = @unserialize(spip_file_get_contents($cache))
@@ -926,10 +926,10 @@  discard block
 block discarded – undo
926 926
 		ecrire_fichier($cache, serialize($path_parts));
927 927
 	}
928 928
 	$ext = !empty($path_parts['extension']) ? $path_parts['extension'] : '';
929
-	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
929
+	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension='.sql_quote($ext))) {
930 930
 		return nom_fichier_copie_locale($source, $ext);
931 931
 	}
932
-	spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR);
932
+	spip_log("pas de copie locale pour $source", 'distant'._LOG_ERREUR);
933 933
 }
934 934
 
935 935
 
@@ -1013,7 +1013,7 @@  discard block
 block discarded – undo
1013 1013
 		} else {
1014 1014
 			if ($a['body']) {
1015 1015
 				$a['extension'] = $extension;
1016
-				$a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension);
1016
+				$a['fichier'] = _DIR_RACINE.nom_fichier_copie_locale($source, $extension);
1017 1017
 				ecrire_fichier($a['fichier'], $a['body']);
1018 1018
 				$size_image = @spip_getimagesize($a['fichier']);
1019 1019
 				$a['largeur'] = intval($size_image[0]);
@@ -1081,20 +1081,20 @@  discard block
 block discarded – undo
1081 1081
 			!$t
1082 1082
 			and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1083 1083
 		) {
1084
-			$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1084
+			$t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text'));
1085 1085
 		}
1086 1086
 		if (
1087 1087
 			!$t
1088 1088
 			and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m)
1089 1089
 			and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext)
1090 1090
 		) {
1091
-			$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1091
+			$t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text'));
1092 1092
 		}
1093 1093
 	}
1094 1094
 
1095 1095
 	// Autre mime/type (ou text/plain avec fichier d'extension inconnue)
1096 1096
 	if (!$t) {
1097
-		$t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type));
1097
+		$t = sql_fetsel('extension', 'spip_types_documents', 'mime_type='.sql_quote($mime_type));
1098 1098
 	}
1099 1099
 
1100 1100
 	// Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
@@ -1105,11 +1105,11 @@  discard block
 block discarded – undo
1105 1105
 		and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1106 1106
 	) {
1107 1107
 		# eviter xxx.3 => 3gp (> SPIP 3)
1108
-		$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1108
+		$t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text'));
1109 1109
 	}
1110 1110
 
1111 1111
 	if ($t) {
1112
-		spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant');
1112
+		spip_log("mime-type $mime_type ok, extension ".$t['extension'], 'distant');
1113 1113
 		return $t['extension'];
1114 1114
 	} else {
1115 1115
 		# par defaut on retombe sur '.bin' si c'est autorise
@@ -1212,7 +1212,7 @@  discard block
 block discarded – undo
1212 1212
 		}
1213 1213
 	} else {
1214 1214
 		$scheme = $t['scheme'];
1215
-		$noproxy = $scheme . '://';
1215
+		$noproxy = $scheme.'://';
1216 1216
 	}
1217 1217
 	if (isset($t['user'])) {
1218 1218
 		$user = [$t['user'], $t['pass']];
@@ -1226,7 +1226,7 @@  discard block
 block discarded – undo
1226 1226
 	}
1227 1227
 
1228 1228
 	if (!empty($t['query'])) {
1229
-		$path .= '?' . $t['query'];
1229
+		$path .= '?'.$t['query'];
1230 1230
 	}
1231 1231
 
1232 1232
 	$f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date);
@@ -1300,20 +1300,20 @@  discard block
 block discarded – undo
1300 1300
 	$proxy_user = '';
1301 1301
 	$http_proxy = need_proxy($host);
1302 1302
 	if ($user) {
1303
-		$user = urlencode($user[0]) . ':' . urlencode($user[1]);
1303
+		$user = urlencode($user[0]).':'.urlencode($user[1]);
1304 1304
 	}
1305 1305
 
1306 1306
 	$connect = '';
1307 1307
 	if ($http_proxy) {
1308
-		if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) {
1309
-			$path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : '');
1310
-			$connect = 'CONNECT ' . $path_host . " $vers\r\n"
1308
+		if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls', 'ssl'])) {
1309
+			$path_host = (!$user ? '' : "$user@").$host.(($port != 80) ? ":$port" : '');
1310
+			$connect = 'CONNECT '.$path_host." $vers\r\n"
1311 1311
 				. "Host: $path_host\r\n"
1312 1312
 				. "Proxy-Connection: Keep-Alive\r\n";
1313 1313
 		} else {
1314
-			$path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://")
1314
+			$path = (in_array($scheme, ['tls', 'ssl']) ? 'https://' : "$scheme://")
1315 1315
 				. (!$user ? '' : "$user@")
1316
-				. "$host" . (($port != 80) ? ":$port" : '') . $path;
1316
+				. "$host".(($port != 80) ? ":$port" : '').$path;
1317 1317
 		}
1318 1318
 		$t2 = @parse_url($http_proxy);
1319 1319
 		$first_host = $t2['host'];
@@ -1321,10 +1321,10 @@  discard block
 block discarded – undo
1321 1321
 			$port = 80;
1322 1322
 		}
1323 1323
 		if ($t2['user']) {
1324
-			$proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']);
1324
+			$proxy_user = base64_encode($t2['user'].':'.$t2['pass']);
1325 1325
 		}
1326 1326
 	} else {
1327
-		$first_host = $noproxy . $host;
1327
+		$first_host = $noproxy.$host;
1328 1328
 	}
1329 1329
 
1330 1330
 	if ($connect) {
@@ -1346,7 +1346,7 @@  discard block
 block discarded – undo
1346 1346
 		);
1347 1347
 		spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", 'connect');
1348 1348
 		if (!$f) {
1349
-			spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1349
+			spip_log("Erreur connexion $errno $errstr", 'distant'._LOG_ERREUR);
1350 1350
 			return $errno;
1351 1351
 		}
1352 1352
 		stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
@@ -1359,7 +1359,7 @@  discard block
 block discarded – undo
1359 1359
 			or !count($res = explode(' ', $res))
1360 1360
 			or $res[1] !== '200'
1361 1361
 		) {
1362
-			spip_log("Echec CONNECT sur $first_host:$port", 'connect' . _LOG_INFO_IMPORTANTE);
1362
+			spip_log("Echec CONNECT sur $first_host:$port", 'connect'._LOG_INFO_IMPORTANTE);
1363 1363
 			fclose($f);
1364 1364
 
1365 1365
 			return false;
@@ -1376,7 +1376,7 @@  discard block
 block discarded – undo
1376 1376
 		} while (!$f and $ntry-- and $errno !== 110 and sleep(1));
1377 1377
 		spip_log("Recuperer $path sur $first_host:$port par $f");
1378 1378
 		if (!$f) {
1379
-			spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1379
+			spip_log("Erreur connexion $errno $errstr", 'distant'._LOG_ERREUR);
1380 1380
 
1381 1381
 			return $errno;
1382 1382
 		}
@@ -1386,16 +1386,16 @@  discard block
 block discarded – undo
1386 1386
 	$site = $GLOBALS['meta']['adresse_site'] ?? '';
1387 1387
 
1388 1388
 	$host_port = $host;
1389
-	if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) {
1389
+	if ($port != (in_array($scheme, ['tls', 'ssl']) ? 443 : 80)) {
1390 1390
 		$host_port .= ":$port";
1391 1391
 	}
1392 1392
 	$req = "$method $path $vers\r\n"
1393 1393
 		. "Host: $host_port\r\n"
1394
-		. 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n"
1395
-		. ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n"))
1394
+		. 'User-Agent: '._INC_DISTANT_USER_AGENT."\r\n"
1395
+		. ($refuse_gz ? '' : ('Accept-Encoding: '._INC_DISTANT_CONTENT_ENCODING."\r\n"))
1396 1396
 		. (!$site ? '' : "Referer: $site/$referer\r\n")
1397
-		. (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n"))
1398
-		. (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n"))
1397
+		. (!$date ? '' : 'If-Modified-Since: '.(gmdate('D, d M Y H:i:s', $date)." GMT\r\n"))
1398
+		. (!$user ? '' : ('Authorization: Basic '.base64_encode($user)."\r\n"))
1399 1399
 		. (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n")
1400 1400
 		. (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n");
1401 1401
 
Please login to merge, or discard this patch.
ecrire/balise/formulaire_.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
 		// donc si on est dans le public avec un cache on va perdre le dynamisme
148 148
 		// et on risque de mettre en cache les valeurs pre-remplies du formulaire
149 149
 		// on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
150
-		$p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
150
+		$p->code = "'<'.'?php echo (".texte_script($p->code)."); ?'.'>'";
151 151
 		// dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
152 152
 	}
153 153
 	return $p;
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
 			foreach ($erreurs as $k => $v) {
328 328
 				if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
329 329
 					// on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
330
-					$valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
330
+					$valeurs['erreurs'][$k] = "<span role='alert'>".$erreurs[$k].'</span>';
331 331
 				}
332 332
 			}
333 333
 		}
Please login to merge, or discard this patch.
Indentation   +266 added lines, -266 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Formulaires
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('inc/filtres');
@@ -35,22 +35,22 @@  discard block
 block discarded – undo
35 35
  *     Saisie protégée
36 36
  **/
37 37
 function protege_champ($texte) {
38
-	if (is_array($texte)) {
39
-		return array_map('protege_champ', $texte);
40
-	} elseif ($texte === null) {
41
-		return $texte;
42
-	} elseif (is_bool($texte)) {
43
-		return $texte ? '1' : '';
44
-	} elseif (is_string($texte) and $texte) {
45
-		if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
-			// ne pas corrompre une valeur serialize
47
-			return $texte;
48
-		} elseif (strpbrk($texte, "&\"'<>") !== false) {
49
-			return spip_htmlspecialchars($texte, ENT_QUOTES);
50
-		}
51
-	}
52
-
53
-	return $texte;
38
+    if (is_array($texte)) {
39
+        return array_map('protege_champ', $texte);
40
+    } elseif ($texte === null) {
41
+        return $texte;
42
+    } elseif (is_bool($texte)) {
43
+        return $texte ? '1' : '';
44
+    } elseif (is_string($texte) and $texte) {
45
+        if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
+            // ne pas corrompre une valeur serialize
47
+            return $texte;
48
+        } elseif (strpbrk($texte, "&\"'<>") !== false) {
49
+            return spip_htmlspecialchars($texte, ENT_QUOTES);
50
+        }
51
+    }
52
+
53
+    return $texte;
54 54
 }
55 55
 
56 56
 /**
@@ -64,17 +64,17 @@  discard block
 block discarded – undo
64 64
  *     - false : pas de squelette trouvé
65 65
  **/
66 66
 function existe_formulaire($form) {
67
-	if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
-		$form = strtolower(substr($form, 11));
69
-	} else {
70
-		$form = strtolower($form);
71
-	}
67
+    if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
+        $form = strtolower(substr($form, 11));
69
+    } else {
70
+        $form = strtolower($form);
71
+    }
72 72
 
73
-	if (!$form) {
74
-		return '';
75
-	} // on ne sait pas, le nom du formulaire n'est pas fourni ici
73
+    if (!$form) {
74
+        return '';
75
+    } // on ne sait pas, le nom du formulaire n'est pas fourni ici
76 76
 
77
-	return trouver_fond($form, 'formulaires/') ? $form : false;
77
+    return trouver_fond($form, 'formulaires/') ? $form : false;
78 78
 }
79 79
 
80 80
 /**
@@ -83,31 +83,31 @@  discard block
 block discarded – undo
83 83
  * @return false|array
84 84
  */
85 85
 function test_formulaire_inclus_par_modele() {
86
-	$trace = debug_backtrace(null, 20);
87
-	$trace_fonctions = array_column($trace, 'function');
88
-	$trace_fonctions = array_map('strtolower', $trace_fonctions);
89
-
90
-	// regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
-	if (
92
-		function_exists('arguments_balise_dyn_depuis_modele')
93
-		and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
-	) {
95
-		if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
-			$k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
-			if ($trace[$k]['args'][0] === $form) {
98
-				return $trace[$k]['args'];
99
-			}
100
-		}
101
-	}
102
-
103
-	// fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
-	// mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
-	if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
-		$k = array_search('inclure_modele', $trace_fonctions);
107
-		// les arguments de recuperer_fond() passes par inclure_modele()
108
-		return $trace[$k - 1]['args'][1]['args'];
109
-	}
110
-	return false;
86
+    $trace = debug_backtrace(null, 20);
87
+    $trace_fonctions = array_column($trace, 'function');
88
+    $trace_fonctions = array_map('strtolower', $trace_fonctions);
89
+
90
+    // regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
+    if (
92
+        function_exists('arguments_balise_dyn_depuis_modele')
93
+        and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
+    ) {
95
+        if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
+            $k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
+            if ($trace[$k]['args'][0] === $form) {
98
+                return $trace[$k]['args'];
99
+            }
100
+        }
101
+    }
102
+
103
+    // fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
+    // mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
+    if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
+        $k = array_search('inclure_modele', $trace_fonctions);
107
+        // les arguments de recuperer_fond() passes par inclure_modele()
108
+        return $trace[$k - 1]['args'][1]['args'];
109
+    }
110
+    return false;
111 111
 }
112 112
 
113 113
 /**
@@ -122,32 +122,32 @@  discard block
 block discarded – undo
122 122
  **/
123 123
 function balise_FORMULAIRE__dist($p) {
124 124
 
125
-	// Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
-	// mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
-	if (existe_formulaire($p->nom_champ) === false) {
128
-		$p->code = "''";
129
-		$p->interdire_scripts = false;
130
-
131
-		return $p;
132
-	}
133
-
134
-	// sinon renvoyer un code php dynamique
135
-	$p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
-
137
-	if (
138
-		!test_espace_prive()
139
-		and !empty($p->descr['sourcefile'])
140
-		and $f = $p->descr['sourcefile']
141
-		and basename(dirname($f)) === 'modeles'
142
-	) {
143
-		// un modele est toujours inséré en texte dans son contenant
144
-		// donc si on est dans le public avec un cache on va perdre le dynamisme
145
-		// et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
-		// on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
-		$p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
-		// dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
-	}
150
-	return $p;
125
+    // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
+    // mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
+    if (existe_formulaire($p->nom_champ) === false) {
128
+        $p->code = "''";
129
+        $p->interdire_scripts = false;
130
+
131
+        return $p;
132
+    }
133
+
134
+    // sinon renvoyer un code php dynamique
135
+    $p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
+
137
+    if (
138
+        !test_espace_prive()
139
+        and !empty($p->descr['sourcefile'])
140
+        and $f = $p->descr['sourcefile']
141
+        and basename(dirname($f)) === 'modeles'
142
+    ) {
143
+        // un modele est toujours inséré en texte dans son contenant
144
+        // donc si on est dans le public avec un cache on va perdre le dynamisme
145
+        // et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
+        // on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
+        $p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
+        // dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
+    }
150
+    return $p;
151 151
 }
152 152
 
153 153
 /**
@@ -167,17 +167,17 @@  discard block
 block discarded – undo
167 167
  *     - string : texte à afficher directement
168 168
  */
169 169
 function balise_FORMULAIRE__dyn($form, ...$args) {
170
-	$form = existe_formulaire($form);
171
-	if (!$form) {
172
-		return '';
173
-	}
170
+    $form = existe_formulaire($form);
171
+    if (!$form) {
172
+        return '';
173
+    }
174 174
 
175
-	$contexte = balise_FORMULAIRE__contexte($form, $args);
176
-	if (!is_array($contexte)) {
177
-		return $contexte;
178
-	}
175
+    $contexte = balise_FORMULAIRE__contexte($form, $args);
176
+    if (!is_array($contexte)) {
177
+        return $contexte;
178
+    }
179 179
 
180
-	return ["formulaires/$form", 3600, $contexte];
180
+    return ["formulaires/$form", 3600, $contexte];
181 181
 }
182 182
 
183 183
 /**
@@ -191,84 +191,84 @@  discard block
 block discarded – undo
191 191
  *     Contexte d'environnement à envoyer au squelette
192 192
  **/
193 193
 function balise_FORMULAIRE__contexte($form, $args) {
194
-	// tester si ce formulaire vient d'etre poste (memes arguments)
195
-	// pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
196
-	// si poste, on recupere les erreurs
197
-
198
-	$je_suis_poste = false;
199
-	if (
200
-		$post_form = _request('formulaire_action')
201
-		and $post_form == $form
202
-		and $p = _request('formulaire_action_args')
203
-		and is_array($p = decoder_contexte_ajax($p, $post_form))
204
-	) {
205
-		// enlever le faux attribut de langue masque
206
-		array_shift($p);
207
-		if (formulaire__identifier($form, $args, $p)) {
208
-			$je_suis_poste = true;
209
-		}
210
-	}
211
-
212
-	$editable = true;
213
-	$erreurs = $post = [];
214
-	if ($je_suis_poste) {
215
-		$post = traiter_formulaires_dynamiques(true);
216
-		$e = "erreurs_$form";
217
-		$erreurs = $post[$e] ?? [];
218
-		$editable = "editable_$form";
219
-		$editable = (!isset($post[$e]))
220
-			|| (is_countable($erreurs) ? count($erreurs) : 0)
221
-			|| (isset($post[$editable]) && $post[$editable]);
222
-	}
223
-
224
-	$valeurs = formulaire__charger($form, $args, $je_suis_poste);
225
-
226
-	// si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
227
-	// C'est plus fort qu'editable qui est gere par le squelette
228
-	// Idealement $valeur doit etre alors un message explicatif.
229
-	if (!is_array($valeurs)) {
230
-		return is_string($valeurs) ? $valeurs : '';
231
-	}
232
-
233
-	// charger peut passer une action si le formulaire ne tourne pas sur self()
234
-	// ou une action vide si elle ne sert pas
235
-	$action = $valeurs['action'] ?? self('&amp;', true);
236
-	// bug IEx : si action finit par /
237
-	// IE croit que le <form ... action=../ > est autoferme
238
-	if (substr($action, -1) == '/') {
239
-		// on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
240
-		$action .= '#';
241
-	}
242
-
243
-	// recuperer la saisie en cours si erreurs
244
-	// seulement si c'est ce formulaire qui est poste
245
-	// ou si on le demande explicitement par le parametre _forcer_request = true
246
-	$dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
247
-	foreach (array_keys($valeurs) as $champ) {
248
-		if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
249
-			if ($dispo and (($v = _request($champ)) !== null)) {
250
-				$valeurs[$champ] = $v;
251
-			}
252
-			// nettoyer l'url des champs qui vont etre saisis
253
-			if ($action) {
254
-				$action = parametre_url($action, $champ, '');
255
-			}
256
-			// proteger les ' et les " dans les champs que l'on va injecter
257
-			$valeurs[$champ] = protege_champ($valeurs[$champ]);
258
-		}
259
-	}
260
-
261
-	if ($action) {
262
-		// nettoyer l'url
263
-		$action = parametre_url($action, 'formulaire_action', '');
264
-		$action = parametre_url($action, 'formulaire_action_args', '');
265
-	}
266
-
267
-	/**
268
-	 * @deprecated 4.0
269
-	 * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
270
-	 */
271
-	/*
194
+    // tester si ce formulaire vient d'etre poste (memes arguments)
195
+    // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
196
+    // si poste, on recupere les erreurs
197
+
198
+    $je_suis_poste = false;
199
+    if (
200
+        $post_form = _request('formulaire_action')
201
+        and $post_form == $form
202
+        and $p = _request('formulaire_action_args')
203
+        and is_array($p = decoder_contexte_ajax($p, $post_form))
204
+    ) {
205
+        // enlever le faux attribut de langue masque
206
+        array_shift($p);
207
+        if (formulaire__identifier($form, $args, $p)) {
208
+            $je_suis_poste = true;
209
+        }
210
+    }
211
+
212
+    $editable = true;
213
+    $erreurs = $post = [];
214
+    if ($je_suis_poste) {
215
+        $post = traiter_formulaires_dynamiques(true);
216
+        $e = "erreurs_$form";
217
+        $erreurs = $post[$e] ?? [];
218
+        $editable = "editable_$form";
219
+        $editable = (!isset($post[$e]))
220
+            || (is_countable($erreurs) ? count($erreurs) : 0)
221
+            || (isset($post[$editable]) && $post[$editable]);
222
+    }
223
+
224
+    $valeurs = formulaire__charger($form, $args, $je_suis_poste);
225
+
226
+    // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
227
+    // C'est plus fort qu'editable qui est gere par le squelette
228
+    // Idealement $valeur doit etre alors un message explicatif.
229
+    if (!is_array($valeurs)) {
230
+        return is_string($valeurs) ? $valeurs : '';
231
+    }
232
+
233
+    // charger peut passer une action si le formulaire ne tourne pas sur self()
234
+    // ou une action vide si elle ne sert pas
235
+    $action = $valeurs['action'] ?? self('&amp;', true);
236
+    // bug IEx : si action finit par /
237
+    // IE croit que le <form ... action=../ > est autoferme
238
+    if (substr($action, -1) == '/') {
239
+        // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
240
+        $action .= '#';
241
+    }
242
+
243
+    // recuperer la saisie en cours si erreurs
244
+    // seulement si c'est ce formulaire qui est poste
245
+    // ou si on le demande explicitement par le parametre _forcer_request = true
246
+    $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
247
+    foreach (array_keys($valeurs) as $champ) {
248
+        if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
249
+            if ($dispo and (($v = _request($champ)) !== null)) {
250
+                $valeurs[$champ] = $v;
251
+            }
252
+            // nettoyer l'url des champs qui vont etre saisis
253
+            if ($action) {
254
+                $action = parametre_url($action, $champ, '');
255
+            }
256
+            // proteger les ' et les " dans les champs que l'on va injecter
257
+            $valeurs[$champ] = protege_champ($valeurs[$champ]);
258
+        }
259
+    }
260
+
261
+    if ($action) {
262
+        // nettoyer l'url
263
+        $action = parametre_url($action, 'formulaire_action', '');
264
+        $action = parametre_url($action, 'formulaire_action_args', '');
265
+    }
266
+
267
+    /**
268
+     * @deprecated 4.0
269
+     * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
270
+     */
271
+    /*
272 272
 	if (isset($valeurs['_action'])) {
273 273
 		$securiser_action = charger_fonction('securiser_action', 'inc');
274 274
 		$secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1);
@@ -278,59 +278,59 @@  discard block
 block discarded – undo
278 278
 	}
279 279
 	*/
280 280
 
281
-	// empiler la lang en tant que premier argument implicite du CVT
282
-	// pour permettre de la restaurer au moment du Verifier et du Traiter
283
-	array_unshift($args, $GLOBALS['spip_lang']);
284
-
285
-	$valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
286
-	$valeurs['erreurs'] = $erreurs;
287
-	$valeurs['action'] = $action;
288
-	$valeurs['form'] = $form;
289
-
290
-	$valeurs['formulaire_sign'] = '';
291
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
292
-		$securiser_action = charger_fonction('securiser_action', 'inc');
293
-		$secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
294
-		$valeurs['formulaire_sign'] = $secu['hash'];
295
-	}
296
-
297
-	if (!isset($valeurs['id'])) {
298
-		$valeurs['id'] = 'new';
299
-	}
300
-	// editable peut venir de charger() ou de traiter() sinon
301
-	if (!isset($valeurs['editable'])) {
302
-		$valeurs['editable'] = $editable;
303
-	}
304
-	// dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
305
-	$valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
306
-
307
-	if ($je_suis_poste) {
308
-		$valeurs['message_erreur'] = '';
309
-		if (isset($erreurs['message_erreur'])) {
310
-			$valeurs['message_erreur'] = $erreurs['message_erreur'];
311
-		}
312
-
313
-		$valeurs['message_ok'] = '';
314
-		if (isset($post["message_ok_$form"])) {
315
-			$valeurs['message_ok'] = $post["message_ok_$form"];
316
-		} elseif (isset($erreurs['message_ok'])) {
317
-			$valeurs['message_ok'] = $erreurs['message_ok'];
318
-		}
319
-
320
-		// accessibilite : encapsuler toutes les erreurs dans un role='alert'
321
-		// uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
322
-		// et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
323
-		if (html5_permis()) {
324
-			foreach ($erreurs as $k => $v) {
325
-				if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
326
-					// on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
327
-					$valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
328
-				}
329
-			}
330
-		}
331
-	}
332
-
333
-	return $valeurs;
281
+    // empiler la lang en tant que premier argument implicite du CVT
282
+    // pour permettre de la restaurer au moment du Verifier et du Traiter
283
+    array_unshift($args, $GLOBALS['spip_lang']);
284
+
285
+    $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
286
+    $valeurs['erreurs'] = $erreurs;
287
+    $valeurs['action'] = $action;
288
+    $valeurs['form'] = $form;
289
+
290
+    $valeurs['formulaire_sign'] = '';
291
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
292
+        $securiser_action = charger_fonction('securiser_action', 'inc');
293
+        $secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
294
+        $valeurs['formulaire_sign'] = $secu['hash'];
295
+    }
296
+
297
+    if (!isset($valeurs['id'])) {
298
+        $valeurs['id'] = 'new';
299
+    }
300
+    // editable peut venir de charger() ou de traiter() sinon
301
+    if (!isset($valeurs['editable'])) {
302
+        $valeurs['editable'] = $editable;
303
+    }
304
+    // dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
305
+    $valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
306
+
307
+    if ($je_suis_poste) {
308
+        $valeurs['message_erreur'] = '';
309
+        if (isset($erreurs['message_erreur'])) {
310
+            $valeurs['message_erreur'] = $erreurs['message_erreur'];
311
+        }
312
+
313
+        $valeurs['message_ok'] = '';
314
+        if (isset($post["message_ok_$form"])) {
315
+            $valeurs['message_ok'] = $post["message_ok_$form"];
316
+        } elseif (isset($erreurs['message_ok'])) {
317
+            $valeurs['message_ok'] = $erreurs['message_ok'];
318
+        }
319
+
320
+        // accessibilite : encapsuler toutes les erreurs dans un role='alert'
321
+        // uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
322
+        // et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
323
+        if (html5_permis()) {
324
+            foreach ($erreurs as $k => $v) {
325
+                if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
326
+                    // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
327
+                    $valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
328
+                }
329
+            }
330
+        }
331
+    }
332
+
333
+    return $valeurs;
334 334
 }
335 335
 
336 336
 /**
@@ -342,51 +342,51 @@  discard block
 block discarded – undo
342 342
  * @return array
343 343
  */
344 344
 function formulaire__charger($form, $args, $poste) {
345
-	if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
346
-		$valeurs = call_user_func_array($charger_valeurs, $args);
347
-	} else {
348
-		$valeurs = [];
349
-	}
350
-
351
-	$valeurs = pipeline(
352
-		'formulaire_charger',
353
-		[
354
-			'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
355
-			'data' => $valeurs
356
-		]
357
-	);
358
-
359
-	// prise en charge CVT multi etape
360
-	if (is_array($valeurs) and isset($valeurs['_etapes'])) {
361
-		include_spip('inc/cvt_multietapes');
362
-		$valeurs = cvtmulti_formulaire_charger_etapes(
363
-			['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
364
-			$valeurs
365
-		);
366
-	}
367
-
368
-	// si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
369
-	if (is_array($valeurs)) {
370
-		if (!isset($valeurs['_pipelines'])) {
371
-			$valeurs['_pipelines'] = [];
372
-		}
373
-		// l'ancien argument _pipeline devient maintenant _pipelines
374
-		// reinjectons le vieux _pipeline au debut de _pipelines
375
-		if (isset($valeurs['_pipeline'])) {
376
-			$pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
377
-			$args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
378
-
379
-			$pipelines = [$pipe => $args];
380
-			$valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
381
-		}
382
-
383
-		// et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
384
-		// qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
385
-		// (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
386
-		$valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
387
-	}
388
-
389
-	return $valeurs;
345
+    if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
346
+        $valeurs = call_user_func_array($charger_valeurs, $args);
347
+    } else {
348
+        $valeurs = [];
349
+    }
350
+
351
+    $valeurs = pipeline(
352
+        'formulaire_charger',
353
+        [
354
+            'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
355
+            'data' => $valeurs
356
+        ]
357
+    );
358
+
359
+    // prise en charge CVT multi etape
360
+    if (is_array($valeurs) and isset($valeurs['_etapes'])) {
361
+        include_spip('inc/cvt_multietapes');
362
+        $valeurs = cvtmulti_formulaire_charger_etapes(
363
+            ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
364
+            $valeurs
365
+        );
366
+    }
367
+
368
+    // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
369
+    if (is_array($valeurs)) {
370
+        if (!isset($valeurs['_pipelines'])) {
371
+            $valeurs['_pipelines'] = [];
372
+        }
373
+        // l'ancien argument _pipeline devient maintenant _pipelines
374
+        // reinjectons le vieux _pipeline au debut de _pipelines
375
+        if (isset($valeurs['_pipeline'])) {
376
+            $pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
377
+            $args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
378
+
379
+            $pipelines = [$pipe => $args];
380
+            $valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
381
+        }
382
+
383
+        // et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
384
+        // qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
385
+        // (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
386
+        $valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
387
+    }
388
+
389
+    return $valeurs;
390 390
 }
391 391
 
392 392
 /**
@@ -405,9 +405,9 @@  discard block
 block discarded – undo
405 405
  * @return bool
406 406
  */
407 407
 function formulaire__identifier($form, $args, $p) {
408
-	if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
409
-		return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
410
-	}
408
+    if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
409
+        return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
410
+    }
411 411
 
412
-	return $args === $p;
412
+    return $args === $p;
413 413
 }
Please login to merge, or discard this patch.
ecrire/public/interfaces.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -975,9 +975,9 @@
 block discarded – undo
975 975
 	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976 976
 		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977 977
 	}
978
-	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
978
+	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml('._TRAITEMENT_RACCOURCIS.')';
979 979
 	$GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
-	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
980
+	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml('._TRAITEMENT_TYPO_SANS_NUMERO.')';
981 981
 	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982 982
 	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983 983
 	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
Please login to merge, or discard this patch.
Indentation   +916 added lines, -916 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
 
@@ -34,53 +34,53 @@  discard block
 block discarded – undo
34 34
  * @package SPIP\Core\Compilateur\AST
35 35
  */
36 36
 class Contexte {
37
-	/**
38
-	 * Description du squelette
39
-	 *
40
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
-	 *
42
-	 * Peut contenir les index :
43
-	 *
44
-	 * - nom : Nom du fichier de cache
45
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
-	 * - sourcefile : Chemin du squelette
47
-	 * - squelette : Code du squelette
48
-	 * - id_mere : Identifiant de la boucle parente
49
-	 * - documents : Pour embed et img dans les textes
50
-	 * - session : Pour un cache sessionné par auteur
51
-	 * - niv : Niveau de tabulation
52
-	 *
53
-	 * @var array
54
-	 */
55
-	public $descr = [];
56
-
57
-	/**
58
-	 * Identifiant de la boucle
59
-	 *
60
-	 * @var string
61
-	 */
62
-	public $id_boucle = '';
63
-
64
-	/**
65
-	 * Numéro de ligne dans le code source du squelette
66
-	 *
67
-	 * @var int
68
-	 */
69
-	public $ligne = 0;
70
-
71
-	/**
72
-	 * Langue d'exécution
73
-	 *
74
-	 * @var string
75
-	 */
76
-	public $lang = '';
77
-
78
-	/**
79
-	 * Résultat de la compilation: toujours une expression PHP
80
-	 *
81
-	 * @var string
82
-	 */
83
-	public $code = '';
37
+    /**
38
+     * Description du squelette
39
+     *
40
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
+     *
42
+     * Peut contenir les index :
43
+     *
44
+     * - nom : Nom du fichier de cache
45
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
+     * - sourcefile : Chemin du squelette
47
+     * - squelette : Code du squelette
48
+     * - id_mere : Identifiant de la boucle parente
49
+     * - documents : Pour embed et img dans les textes
50
+     * - session : Pour un cache sessionné par auteur
51
+     * - niv : Niveau de tabulation
52
+     *
53
+     * @var array
54
+     */
55
+    public $descr = [];
56
+
57
+    /**
58
+     * Identifiant de la boucle
59
+     *
60
+     * @var string
61
+     */
62
+    public $id_boucle = '';
63
+
64
+    /**
65
+     * Numéro de ligne dans le code source du squelette
66
+     *
67
+     * @var int
68
+     */
69
+    public $ligne = 0;
70
+
71
+    /**
72
+     * Langue d'exécution
73
+     *
74
+     * @var string
75
+     */
76
+    public $lang = '';
77
+
78
+    /**
79
+     * Résultat de la compilation: toujours une expression PHP
80
+     *
81
+     * @var string
82
+     */
83
+    public $code = '';
84 84
 }
85 85
 
86 86
 
@@ -90,44 +90,44 @@  discard block
 block discarded – undo
90 90
  * @package SPIP\Core\Compilateur\AST
91 91
  **/
92 92
 class Texte {
93
-	/**
94
-	 * Type de noeud
95
-	 *
96
-	 * @var string
97
-	 */
98
-	public $type = 'texte';
99
-
100
-	/**
101
-	 * Le texte
102
-	 *
103
-	 * @var string
104
-	 */
105
-	public $texte;
106
-
107
-	/**
108
-	 * Contenu avant le texte.
109
-	 *
110
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
111
-	 *
112
-	 * @var string|array
113
-	 */
114
-	public $avant = '';
115
-
116
-	/**
117
-	 * Contenu après le texte.
118
-	 *
119
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
120
-	 *
121
-	 * @var string|array
122
-	 */
123
-	public $apres = '';
124
-
125
-	/**
126
-	 * Numéro de ligne dans le code source du squelette
127
-	 *
128
-	 * @var int
129
-	 */
130
-	public $ligne = 0;
93
+    /**
94
+     * Type de noeud
95
+     *
96
+     * @var string
97
+     */
98
+    public $type = 'texte';
99
+
100
+    /**
101
+     * Le texte
102
+     *
103
+     * @var string
104
+     */
105
+    public $texte;
106
+
107
+    /**
108
+     * Contenu avant le texte.
109
+     *
110
+     * Vide ou apostrophe simple ou double si le texte en était entouré
111
+     *
112
+     * @var string|array
113
+     */
114
+    public $avant = '';
115
+
116
+    /**
117
+     * Contenu après le texte.
118
+     *
119
+     * Vide ou apostrophe simple ou double si le texte en était entouré
120
+     *
121
+     * @var string|array
122
+     */
123
+    public $apres = '';
124
+
125
+    /**
126
+     * Numéro de ligne dans le code source du squelette
127
+     *
128
+     * @var int
129
+     */
130
+    public $ligne = 0;
131 131
 }
132 132
 
133 133
 /**
@@ -136,50 +136,50 @@  discard block
 block discarded – undo
136 136
  * @package SPIP\Core\Compilateur\AST
137 137
  **/
138 138
 class Inclure {
139
-	/**
140
-	 * Type de noeud
141
-	 *
142
-	 * @var string
143
-	 */
144
-	public $type = 'include';
145
-
146
-	/**
147
-	 * Nom d'un fichier inclu
148
-	 *
149
-	 * - Objet Texte si inclusion d'un autre squelette
150
-	 * - chaîne si inclusion d'un fichier PHP directement
151
-	 *
152
-	 * @var string|Texte
153
-	 */
154
-	public $texte;
155
-
156
-	/**
157
-	 * Inutilisé, propriété générique de l'AST
158
-	 *
159
-	 * @var string|array
160
-	 */
161
-	public $avant = '';
162
-
163
-	/**
164
-	 * Inutilisé, propriété générique de l'AST
165
-	 *
166
-	 * @var string|array
167
-	 */
168
-	public $apres = '';
169
-
170
-	/**
171
-	 * Numéro de ligne dans le code source du squelette
172
-	 *
173
-	 * @var int
174
-	 */
175
-	public $ligne = 0;
176
-
177
-	/**
178
-	 * Valeurs des paramètres
179
-	 *
180
-	 * @var array
181
-	 */
182
-	public $param = [];
139
+    /**
140
+     * Type de noeud
141
+     *
142
+     * @var string
143
+     */
144
+    public $type = 'include';
145
+
146
+    /**
147
+     * Nom d'un fichier inclu
148
+     *
149
+     * - Objet Texte si inclusion d'un autre squelette
150
+     * - chaîne si inclusion d'un fichier PHP directement
151
+     *
152
+     * @var string|Texte
153
+     */
154
+    public $texte;
155
+
156
+    /**
157
+     * Inutilisé, propriété générique de l'AST
158
+     *
159
+     * @var string|array
160
+     */
161
+    public $avant = '';
162
+
163
+    /**
164
+     * Inutilisé, propriété générique de l'AST
165
+     *
166
+     * @var string|array
167
+     */
168
+    public $apres = '';
169
+
170
+    /**
171
+     * Numéro de ligne dans le code source du squelette
172
+     *
173
+     * @var int
174
+     */
175
+    public $ligne = 0;
176
+
177
+    /**
178
+     * Valeurs des paramètres
179
+     *
180
+     * @var array
181
+     */
182
+    public $param = [];
183 183
 }
184 184
 
185 185
 
@@ -189,386 +189,386 @@  discard block
 block discarded – undo
189 189
  * @package SPIP\Core\Compilateur\AST
190 190
  **/
191 191
 class Boucle {
192
-	/**
193
-	 * Type de noeud
194
-	 *
195
-	 * @var string
196
-	 */
197
-	public $type = 'boucle';
198
-
199
-	/**
200
-	 * Identifiant de la boucle
201
-	 *
202
-	 * @var string
203
-	 */
204
-	public $id_boucle;
205
-
206
-	/**
207
-	 * Identifiant de la boucle parente
208
-	 *
209
-	 * @var string
210
-	 */
211
-	public $id_parent = '';
212
-
213
-	/**
214
-	 * Partie avant toujours affichee
215
-	 *
216
-	 * @var string|array
217
-	 */
218
-	public $preaff = '';
219
-
220
-	/**
221
-	 * Partie optionnelle avant
222
-	 *
223
-	 * @var string|array
224
-	 */
225
-	public $avant = '';
226
-
227
-	/**
228
-	 * Pour chaque élément
229
-	 *
230
-	 * @var string|array
231
-	 */
232
-	public $milieu = '';
233
-
234
-	/**
235
-	 * Partie optionnelle après
236
-	 *
237
-	 * @var string|array
238
-	 */
239
-	public $apres = '';
240
-
241
-	/**
242
-	 * Partie alternative, si pas de résultat dans la boucle
243
-	 *
244
-	 * @var string|array
245
-	 */
246
-	public $altern = '';
247
-
248
-	/**
249
-	 * Partie apres toujours affichee
250
-	 *
251
-	 * @var string|array
252
-	 */
253
-	public $postaff = '';
254
-
255
-
256
-	/**
257
-	 * La boucle doit-elle sélectionner la langue ?
258
-	 *
259
-	 * @var string|null
260
-	 */
261
-	public $lang_select;
262
-
263
-	/**
264
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
265
-	 *
266
-	 * @var string|null
267
-	 */
268
-	public $type_requete;
269
-
270
-	/**
271
-	 * La table est elle optionnelle ?
272
-	 *
273
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
-	 *
275
-	 * @var bool
276
-	 */
277
-	public $table_optionnelle = false;
278
-
279
-	/**
280
-	 * Nom du fichier de connexion
281
-	 *
282
-	 * @var string
283
-	 */
284
-	public $sql_serveur = '';
285
-
286
-	/**
287
-	 * Paramètres de la boucle
288
-	 *
289
-	 * Description des paramètres passés à la boucle, qui servent ensuite
290
-	 * au calcul des critères
291
-	 *
292
-	 * @var array
293
-	 */
294
-	public $param = [];
295
-
296
-	/**
297
-	 * Critères de la boucle
298
-	 *
299
-	 * @var Critere[]
300
-	 */
301
-	public $criteres = [];
302
-
303
-	/**
304
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
305
-	 *
306
-	 * @var string[]
307
-	 */
308
-	public $separateur = [];
309
-
310
-	/**
311
-	 * Liste des jointures possibles avec cette table
312
-	 *
313
-	 * Les jointures par défaut de la table sont complétées en priorité
314
-	 * des jointures déclarées explicitement sur la boucle
315
-	 *
316
-	 * @see base_trouver_table_dist()
317
-	 * @var array
318
-	 */
319
-	public $jointures = [];
320
-
321
-	/**
322
-	 * Jointures explicites avec cette table
323
-	 *
324
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
325
-	 * normales possibles pour retrouver les colonnes demandées extérieures
326
-	 * à la boucle.
327
-	 *
328
-	 * @var string|bool
329
-	 */
330
-	public $jointures_explicites = false;
331
-
332
-	/**
333
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
-	 *
335
-	 * @var string|null
336
-	 */
337
-	public $doublons;
338
-
339
-	/**
340
-	 * Code PHP ajouté au début de chaque itération de boucle.
341
-	 *
342
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
-	 *
344
-	 * @var string
345
-	 */
346
-	public $partie = '';
347
-
348
-	/**
349
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
350
-	 * ou de soustractions d'éléments à faire
351
-	 *
352
-	 * Dans les critères limitant le nombre d'éléments affichés
353
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
-	 *
355
-	 * @var string
356
-	 */
357
-	public $total_parties = '';
358
-
359
-	/**
360
-	 * Code PHP ajouté avant l'itération de boucle.
361
-	 *
362
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
-	 * pour initialiser les variables de début et de fin d'itération.
364
-	 *
365
-	 * @var string
366
-	 */
367
-	public $mode_partie = '';
368
-
369
-	/**
370
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
-	 *
372
-	 * Si une boucle est appelée de manière récursive quelque part par
373
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
-	 * de l'appelant (rec)
376
-	 *
377
-	 * @var string
378
-	 */
379
-	public $externe = '';
380
-
381
-	// champs pour la construction de la requete SQL
382
-
383
-	/**
384
-	 * Liste des champs à récupérer par la boucle
385
-	 *
386
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
-	 *
388
-	 * @var string[]
389
-	 */
390
-	public $select = [];
391
-
392
-	/**
393
-	 * Liste des alias / tables SQL utilisées dans la boucle
394
-	 *
395
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
-	 *
398
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
-	 *
400
-	 * @var string[]
401
-	 */
402
-	public $from = [];
403
-
404
-	/**
405
-	 * Liste des alias / type de jointures utilisées dans la boucle
406
-	 *
407
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
-	 *
410
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
-	 *
413
-	 * @var string[]
414
-	 */
415
-	public $from_type = [];
416
-
417
-	/**
418
-	 * Liste des conditions WHERE de la boucle
419
-	 *
420
-	 * Permet de restreindre les éléments retournés par une boucle
421
-	 * en fonctions des conditions transmises dans ce tableau.
422
-	 *
423
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
-	 *
425
-	 * Les éléments du premier niveau sont reliés par des AND, donc
426
-	 * chaque élément ajouté directement au where par
427
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
-	 * est une condition AND en plus.
429
-	 *
430
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
-	 * $expr = array(operateur, val1, val2)
433
-	 *
434
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
-	 * à réaliser tel que :
436
-	 *
437
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
-	 *    suivant cet ordre : "val1 operateur val2".
440
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
-	 * - "'AND'", "'OR'", "'NOT'" :
442
-	 *    dans ce cas val1 et val2 sont également des expressions
443
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
-	 *    Exemples :
445
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
-	 *
448
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
-	 *
452
-	 * @var array
453
-	 */
454
-	public $where = [];
455
-
456
-	public $join = [];
457
-	public $having = [];
458
-	public $limit = '';
459
-	public $group = [];
460
-	public $order = [];
461
-	public $default_order = [];
462
-	public $date = 'date';
463
-	public $hash = '';
464
-	public $in = '';
465
-	public $sous_requete = false;
466
-
467
-	/**
468
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
-	 *
470
-	 * Il sert à insérer le code calculant une hierarchie
471
-	 *
472
-	 * @var string
473
-	 */
474
-	public $hierarchie = '';
475
-
476
-	// champs pour la construction du corps PHP
477
-
478
-	/**
479
-	 * Description des sources de données de la boucle
480
-	 *
481
-	 * Description des données de la boucle issu de trouver_table
482
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
-	 *
484
-	 * @see base_trouver_table_dist()
485
-	 * @var array
486
-	 */
487
-	public $show = [];
488
-
489
-	/**
490
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
491
-	 *
492
-	 * @var string
493
-	 */
494
-	public $id_table;
495
-
496
-	/**
497
-	 * Nom de la clé primaire de la table SQL principale de la boucle
498
-	 *
499
-	 * @var string
500
-	 */
501
-	public $primary;
502
-
503
-	/**
504
-	 * Code PHP compilé de la boucle
505
-	 *
506
-	 * @var string
507
-	 */
508
-	public $return;
509
-
510
-	public $numrows = false;
511
-	public $cptrows = false;
512
-
513
-	/**
514
-	 * Description du squelette
515
-	 *
516
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
-	 *
518
-	 * Peut contenir les index :
519
-	 *
520
-	 * - nom : Nom du fichier de cache
521
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
-	 * - sourcefile : Chemin du squelette
523
-	 * - squelette : Code du squelette
524
-	 * - id_mere : Identifiant de la boucle parente
525
-	 * - documents : Pour embed et img dans les textes
526
-	 * - session : Pour un cache sessionné par auteur
527
-	 * - niv : Niveau de tabulation
528
-	 *
529
-	 * @var array
530
-	 */
531
-	public $descr = [];
532
-
533
-	/**
534
-	 * Numéro de ligne dans le code source du squelette
535
-	 *
536
-	 * @var int
537
-	 */
538
-	public $ligne = 0;
539
-
540
-
541
-	public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
-
543
-	/**
544
-	 * Type d'itérateur utilisé pour cette boucle
545
-	 *
546
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
-	 * - 'DATA' pour l'itérateur DATA, ...
548
-	 *
549
-	 * @var string
550
-	 */
551
-	public $iterateur = ''; // type d'iterateur
552
-
553
-	/**
554
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
-	 */
556
-	public $debug = [];
557
-
558
-	/**
559
-	 * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
-	 * notamment si le champ a été trouve dans une boucle parente
561
-	 *
562
-	 * Tableau nom du champ => index de boucle
563
-	 *
564
-	 * @var array $index_champ
565
-	*/
566
-	public $index_champ = [];
567
-
568
-	// obsoletes, conserves provisoirement pour compatibilite
569
-	public $tout = false;
570
-	public $plat = false;
571
-	public $lien = false;
192
+    /**
193
+     * Type de noeud
194
+     *
195
+     * @var string
196
+     */
197
+    public $type = 'boucle';
198
+
199
+    /**
200
+     * Identifiant de la boucle
201
+     *
202
+     * @var string
203
+     */
204
+    public $id_boucle;
205
+
206
+    /**
207
+     * Identifiant de la boucle parente
208
+     *
209
+     * @var string
210
+     */
211
+    public $id_parent = '';
212
+
213
+    /**
214
+     * Partie avant toujours affichee
215
+     *
216
+     * @var string|array
217
+     */
218
+    public $preaff = '';
219
+
220
+    /**
221
+     * Partie optionnelle avant
222
+     *
223
+     * @var string|array
224
+     */
225
+    public $avant = '';
226
+
227
+    /**
228
+     * Pour chaque élément
229
+     *
230
+     * @var string|array
231
+     */
232
+    public $milieu = '';
233
+
234
+    /**
235
+     * Partie optionnelle après
236
+     *
237
+     * @var string|array
238
+     */
239
+    public $apres = '';
240
+
241
+    /**
242
+     * Partie alternative, si pas de résultat dans la boucle
243
+     *
244
+     * @var string|array
245
+     */
246
+    public $altern = '';
247
+
248
+    /**
249
+     * Partie apres toujours affichee
250
+     *
251
+     * @var string|array
252
+     */
253
+    public $postaff = '';
254
+
255
+
256
+    /**
257
+     * La boucle doit-elle sélectionner la langue ?
258
+     *
259
+     * @var string|null
260
+     */
261
+    public $lang_select;
262
+
263
+    /**
264
+     * Alias de table d'application de la requête ou nom complet de la table SQL
265
+     *
266
+     * @var string|null
267
+     */
268
+    public $type_requete;
269
+
270
+    /**
271
+     * La table est elle optionnelle ?
272
+     *
273
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
+     *
275
+     * @var bool
276
+     */
277
+    public $table_optionnelle = false;
278
+
279
+    /**
280
+     * Nom du fichier de connexion
281
+     *
282
+     * @var string
283
+     */
284
+    public $sql_serveur = '';
285
+
286
+    /**
287
+     * Paramètres de la boucle
288
+     *
289
+     * Description des paramètres passés à la boucle, qui servent ensuite
290
+     * au calcul des critères
291
+     *
292
+     * @var array
293
+     */
294
+    public $param = [];
295
+
296
+    /**
297
+     * Critères de la boucle
298
+     *
299
+     * @var Critere[]
300
+     */
301
+    public $criteres = [];
302
+
303
+    /**
304
+     * Textes insérés entre 2 éléments de boucle (critère inter)
305
+     *
306
+     * @var string[]
307
+     */
308
+    public $separateur = [];
309
+
310
+    /**
311
+     * Liste des jointures possibles avec cette table
312
+     *
313
+     * Les jointures par défaut de la table sont complétées en priorité
314
+     * des jointures déclarées explicitement sur la boucle
315
+     *
316
+     * @see base_trouver_table_dist()
317
+     * @var array
318
+     */
319
+    public $jointures = [];
320
+
321
+    /**
322
+     * Jointures explicites avec cette table
323
+     *
324
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
325
+     * normales possibles pour retrouver les colonnes demandées extérieures
326
+     * à la boucle.
327
+     *
328
+     * @var string|bool
329
+     */
330
+    public $jointures_explicites = false;
331
+
332
+    /**
333
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
+     *
335
+     * @var string|null
336
+     */
337
+    public $doublons;
338
+
339
+    /**
340
+     * Code PHP ajouté au début de chaque itération de boucle.
341
+     *
342
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
+     *
344
+     * @var string
345
+     */
346
+    public $partie = '';
347
+
348
+    /**
349
+     * Nombre de divisions de la boucle, d'éléments à afficher,
350
+     * ou de soustractions d'éléments à faire
351
+     *
352
+     * Dans les critères limitant le nombre d'éléments affichés
353
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
+     *
355
+     * @var string
356
+     */
357
+    public $total_parties = '';
358
+
359
+    /**
360
+     * Code PHP ajouté avant l'itération de boucle.
361
+     *
362
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
+     * pour initialiser les variables de début et de fin d'itération.
364
+     *
365
+     * @var string
366
+     */
367
+    public $mode_partie = '';
368
+
369
+    /**
370
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
+     *
372
+     * Si une boucle est appelée de manière récursive quelque part par
373
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
+     * de l'appelant (rec)
376
+     *
377
+     * @var string
378
+     */
379
+    public $externe = '';
380
+
381
+    // champs pour la construction de la requete SQL
382
+
383
+    /**
384
+     * Liste des champs à récupérer par la boucle
385
+     *
386
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
+     *
388
+     * @var string[]
389
+     */
390
+    public $select = [];
391
+
392
+    /**
393
+     * Liste des alias / tables SQL utilisées dans la boucle
394
+     *
395
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
+     *
398
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
+     *
400
+     * @var string[]
401
+     */
402
+    public $from = [];
403
+
404
+    /**
405
+     * Liste des alias / type de jointures utilisées dans la boucle
406
+     *
407
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
+     *
410
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
+     *
413
+     * @var string[]
414
+     */
415
+    public $from_type = [];
416
+
417
+    /**
418
+     * Liste des conditions WHERE de la boucle
419
+     *
420
+     * Permet de restreindre les éléments retournés par une boucle
421
+     * en fonctions des conditions transmises dans ce tableau.
422
+     *
423
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
+     *
425
+     * Les éléments du premier niveau sont reliés par des AND, donc
426
+     * chaque élément ajouté directement au where par
427
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
+     * est une condition AND en plus.
429
+     *
430
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
+     * $expr = array(operateur, val1, val2)
433
+     *
434
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
+     * à réaliser tel que :
436
+     *
437
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
+     *    suivant cet ordre : "val1 operateur val2".
440
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
+     * - "'AND'", "'OR'", "'NOT'" :
442
+     *    dans ce cas val1 et val2 sont également des expressions
443
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
+     *    Exemples :
445
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
+     *
448
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
+     *
452
+     * @var array
453
+     */
454
+    public $where = [];
455
+
456
+    public $join = [];
457
+    public $having = [];
458
+    public $limit = '';
459
+    public $group = [];
460
+    public $order = [];
461
+    public $default_order = [];
462
+    public $date = 'date';
463
+    public $hash = '';
464
+    public $in = '';
465
+    public $sous_requete = false;
466
+
467
+    /**
468
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
+     *
470
+     * Il sert à insérer le code calculant une hierarchie
471
+     *
472
+     * @var string
473
+     */
474
+    public $hierarchie = '';
475
+
476
+    // champs pour la construction du corps PHP
477
+
478
+    /**
479
+     * Description des sources de données de la boucle
480
+     *
481
+     * Description des données de la boucle issu de trouver_table
482
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
+     *
484
+     * @see base_trouver_table_dist()
485
+     * @var array
486
+     */
487
+    public $show = [];
488
+
489
+    /**
490
+     * Nom de la table SQL principale de la boucle, sans son préfixe
491
+     *
492
+     * @var string
493
+     */
494
+    public $id_table;
495
+
496
+    /**
497
+     * Nom de la clé primaire de la table SQL principale de la boucle
498
+     *
499
+     * @var string
500
+     */
501
+    public $primary;
502
+
503
+    /**
504
+     * Code PHP compilé de la boucle
505
+     *
506
+     * @var string
507
+     */
508
+    public $return;
509
+
510
+    public $numrows = false;
511
+    public $cptrows = false;
512
+
513
+    /**
514
+     * Description du squelette
515
+     *
516
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
+     *
518
+     * Peut contenir les index :
519
+     *
520
+     * - nom : Nom du fichier de cache
521
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
+     * - sourcefile : Chemin du squelette
523
+     * - squelette : Code du squelette
524
+     * - id_mere : Identifiant de la boucle parente
525
+     * - documents : Pour embed et img dans les textes
526
+     * - session : Pour un cache sessionné par auteur
527
+     * - niv : Niveau de tabulation
528
+     *
529
+     * @var array
530
+     */
531
+    public $descr = [];
532
+
533
+    /**
534
+     * Numéro de ligne dans le code source du squelette
535
+     *
536
+     * @var int
537
+     */
538
+    public $ligne = 0;
539
+
540
+
541
+    public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
+
543
+    /**
544
+     * Type d'itérateur utilisé pour cette boucle
545
+     *
546
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
+     * - 'DATA' pour l'itérateur DATA, ...
548
+     *
549
+     * @var string
550
+     */
551
+    public $iterateur = ''; // type d'iterateur
552
+
553
+    /**
554
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
+     */
556
+    public $debug = [];
557
+
558
+    /**
559
+     * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
+     * notamment si le champ a été trouve dans une boucle parente
561
+     *
562
+     * Tableau nom du champ => index de boucle
563
+     *
564
+     * @var array $index_champ
565
+     */
566
+    public $index_champ = [];
567
+
568
+    // obsoletes, conserves provisoirement pour compatibilite
569
+    public $tout = false;
570
+    public $plat = false;
571
+    public $lien = false;
572 572
 }
573 573
 
574 574
 /**
@@ -579,56 +579,56 @@  discard block
 block discarded – undo
579 579
  * @package SPIP\Core\Compilateur\AST
580 580
  **/
581 581
 class Critere {
582
-	/**
583
-	 * Type de noeud
584
-	 *
585
-	 * @var string
586
-	 */
587
-	public $type = 'critere';
588
-
589
-	/**
590
-	 * Opérateur (>, <, >=, IN, ...)
591
-	 *
592
-	 * @var null|string
593
-	 */
594
-	public $op;
595
-
596
-	/**
597
-	 * Présence d'une négation (truc !op valeur)
598
-	 *
599
-	 * @var null|string
600
-	 */
601
-	public $not;
602
-
603
-	/**
604
-	 * Présence d'une exclusion (!truc op valeur)
605
-	 *
606
-	 * @var null|string
607
-	 */
608
-	public $exclus;
609
-
610
-	/**
611
-	 * Présence d'une condition dans le critère (truc ?)
612
-	 *
613
-	 * @var bool
614
-	 */
615
-	public $cond = false;
616
-
617
-	/**
618
-	 * Paramètres du critère
619
-	 * - $param[0] : élément avant l'opérateur
620
-	 * - $param[1..n] : éléments après l'opérateur
621
-	 *
622
-	 * @var array
623
-	 */
624
-	public $param = [];
625
-
626
-	/**
627
-	 * Numéro de ligne dans le code source du squelette
628
-	 *
629
-	 * @var int
630
-	 */
631
-	public $ligne = 0;
582
+    /**
583
+     * Type de noeud
584
+     *
585
+     * @var string
586
+     */
587
+    public $type = 'critere';
588
+
589
+    /**
590
+     * Opérateur (>, <, >=, IN, ...)
591
+     *
592
+     * @var null|string
593
+     */
594
+    public $op;
595
+
596
+    /**
597
+     * Présence d'une négation (truc !op valeur)
598
+     *
599
+     * @var null|string
600
+     */
601
+    public $not;
602
+
603
+    /**
604
+     * Présence d'une exclusion (!truc op valeur)
605
+     *
606
+     * @var null|string
607
+     */
608
+    public $exclus;
609
+
610
+    /**
611
+     * Présence d'une condition dans le critère (truc ?)
612
+     *
613
+     * @var bool
614
+     */
615
+    public $cond = false;
616
+
617
+    /**
618
+     * Paramètres du critère
619
+     * - $param[0] : élément avant l'opérateur
620
+     * - $param[1..n] : éléments après l'opérateur
621
+     *
622
+     * @var array
623
+     */
624
+    public $param = [];
625
+
626
+    /**
627
+     * Numéro de ligne dans le code source du squelette
628
+     *
629
+     * @var int
630
+     */
631
+    public $ligne = 0;
632 632
 }
633 633
 
634 634
 /**
@@ -637,139 +637,139 @@  discard block
 block discarded – undo
637 637
  * @package SPIP\Core\Compilateur\AST
638 638
  **/
639 639
 class Champ {
640
-	/**
641
-	 * Type de noeud
642
-	 *
643
-	 * @var string
644
-	 */
645
-	public $type = 'champ';
646
-
647
-	/**
648
-	 * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
-	 *
650
-	 * @var string|null
651
-	 */
652
-	public $nom_champ;
653
-
654
-	/**
655
-	 * Identifiant de la boucle parente si explicité
656
-	 *
657
-	 * @var string|null
658
-	 */
659
-	public $nom_boucle = '';
660
-
661
-	/**
662
-	 * Partie optionnelle avant
663
-	 *
664
-	 * @var null|string|array
665
-	 */
666
-	public $avant;
667
-
668
-	/**
669
-	 * Partie optionnelle après
670
-	 *
671
-	 * @var null|string|array
672
-	 */
673
-	public $apres;
674
-
675
-	/**
676
-	 * Étoiles : annuler des automatismes
677
-	 *
678
-	 * - '*' annule les filtres automatiques
679
-	 * - '**' annule en plus les protections de scripts
680
-	 *
681
-	 * @var null|string
682
-	 */
683
-	public $etoile;
684
-
685
-	/**
686
-	 * Arguments et filtres explicites sur la balise
687
-	 *
688
-	 * - $param[0] contient les arguments de la balise
689
-	 * - $param[1..n] contient les filtres à appliquer à la balise
690
-	 *
691
-	 * @var array
692
-	 */
693
-	public $param = [];
694
-
695
-	/**
696
-	 * Source des filtres  (compatibilité) (?)
697
-	 *
698
-	 * @var array|null
699
-	 */
700
-	public $fonctions = [];
701
-
702
-	/**
703
-	 * Identifiant de la boucle
704
-	 *
705
-	 * @var string
706
-	 */
707
-	public $id_boucle = '';
708
-
709
-	/**
710
-	 * AST du squelette, liste de toutes les boucles
711
-	 *
712
-	 * @var Boucles[]
713
-	 */
714
-	public $boucles;
715
-
716
-	/**
717
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
718
-	 *
719
-	 * @var string|null
720
-	 */
721
-	public $type_requete;
722
-
723
-	/**
724
-	 * Résultat de la compilation: toujours une expression PHP
725
-	 *
726
-	 * @var string
727
-	 */
728
-	public $code = '';
729
-
730
-	/**
731
-	 * Interdire les scripts
732
-	 *
733
-	 * false si on est sûr de cette balise
734
-	 *
735
-	 * @see interdire_scripts()
736
-	 * @var bool
737
-	 */
738
-	public $interdire_scripts = true;
739
-
740
-	/**
741
-	 * Description du squelette
742
-	 *
743
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
-	 *
745
-	 * Peut contenir les index :
746
-	 *
747
-	 * - nom : Nom du fichier de cache
748
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
-	 * - sourcefile : Chemin du squelette
750
-	 * - squelette : Code du squelette
751
-	 * - id_mere : Identifiant de la boucle parente
752
-	 * - documents : Pour embed et img dans les textes
753
-	 * - session : Pour un cache sessionné par auteur
754
-	 * - niv : Niveau de tabulation
755
-	 *
756
-	 * @var array
757
-	 */
758
-	public $descr = [];
759
-
760
-	/**
761
-	 * Numéro de ligne dans le code source du squelette
762
-	 *
763
-	 * @var int
764
-	 */
765
-	public $ligne = 0;
766
-
767
-	/**
768
-	 * Drapeau pour reperer les balises calculées par une fonction explicite
769
-	 *
770
-	 * @var bool
771
-	 */
772
-	public $balise_calculee = false;
640
+    /**
641
+     * Type de noeud
642
+     *
643
+     * @var string
644
+     */
645
+    public $type = 'champ';
646
+
647
+    /**
648
+     * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
+     *
650
+     * @var string|null
651
+     */
652
+    public $nom_champ;
653
+
654
+    /**
655
+     * Identifiant de la boucle parente si explicité
656
+     *
657
+     * @var string|null
658
+     */
659
+    public $nom_boucle = '';
660
+
661
+    /**
662
+     * Partie optionnelle avant
663
+     *
664
+     * @var null|string|array
665
+     */
666
+    public $avant;
667
+
668
+    /**
669
+     * Partie optionnelle après
670
+     *
671
+     * @var null|string|array
672
+     */
673
+    public $apres;
674
+
675
+    /**
676
+     * Étoiles : annuler des automatismes
677
+     *
678
+     * - '*' annule les filtres automatiques
679
+     * - '**' annule en plus les protections de scripts
680
+     *
681
+     * @var null|string
682
+     */
683
+    public $etoile;
684
+
685
+    /**
686
+     * Arguments et filtres explicites sur la balise
687
+     *
688
+     * - $param[0] contient les arguments de la balise
689
+     * - $param[1..n] contient les filtres à appliquer à la balise
690
+     *
691
+     * @var array
692
+     */
693
+    public $param = [];
694
+
695
+    /**
696
+     * Source des filtres  (compatibilité) (?)
697
+     *
698
+     * @var array|null
699
+     */
700
+    public $fonctions = [];
701
+
702
+    /**
703
+     * Identifiant de la boucle
704
+     *
705
+     * @var string
706
+     */
707
+    public $id_boucle = '';
708
+
709
+    /**
710
+     * AST du squelette, liste de toutes les boucles
711
+     *
712
+     * @var Boucles[]
713
+     */
714
+    public $boucles;
715
+
716
+    /**
717
+     * Alias de table d'application de la requête ou nom complet de la table SQL
718
+     *
719
+     * @var string|null
720
+     */
721
+    public $type_requete;
722
+
723
+    /**
724
+     * Résultat de la compilation: toujours une expression PHP
725
+     *
726
+     * @var string
727
+     */
728
+    public $code = '';
729
+
730
+    /**
731
+     * Interdire les scripts
732
+     *
733
+     * false si on est sûr de cette balise
734
+     *
735
+     * @see interdire_scripts()
736
+     * @var bool
737
+     */
738
+    public $interdire_scripts = true;
739
+
740
+    /**
741
+     * Description du squelette
742
+     *
743
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
+     *
745
+     * Peut contenir les index :
746
+     *
747
+     * - nom : Nom du fichier de cache
748
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
+     * - sourcefile : Chemin du squelette
750
+     * - squelette : Code du squelette
751
+     * - id_mere : Identifiant de la boucle parente
752
+     * - documents : Pour embed et img dans les textes
753
+     * - session : Pour un cache sessionné par auteur
754
+     * - niv : Niveau de tabulation
755
+     *
756
+     * @var array
757
+     */
758
+    public $descr = [];
759
+
760
+    /**
761
+     * Numéro de ligne dans le code source du squelette
762
+     *
763
+     * @var int
764
+     */
765
+    public $ligne = 0;
766
+
767
+    /**
768
+     * Drapeau pour reperer les balises calculées par une fonction explicite
769
+     *
770
+     * @var bool
771
+     */
772
+    public $balise_calculee = false;
773 773
 }
774 774
 
775 775
 
@@ -777,123 +777,123 @@  discard block
 block discarded – undo
777 777
  * Description d'une chaîne de langue
778 778
  **/
779 779
 class Idiome {
780
-	/**
781
-	 * Type de noeud
782
-	 *
783
-	 * @var string
784
-	 */
785
-	public $type = 'idiome';
786
-
787
-	/**
788
-	 * Clé de traduction demandée. Exemple 'item_oui'
789
-	 *
790
-	 * @var string
791
-	 */
792
-	public $nom_champ = '';
793
-
794
-	/**
795
-	 * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
-	 *
797
-	 * @var string
798
-	 */
799
-	public $module = '';
800
-
801
-	/**
802
-	 * Arguments à passer à la chaîne
803
-	 *
804
-	 * @var array
805
-	 */
806
-	public $arg = [];
807
-
808
-	/**
809
-	 * Filtres à appliquer au résultat
810
-	 *
811
-	 * @var array
812
-	 */
813
-	public $param = [];
814
-
815
-	/**
816
-	 * Source des filtres  (compatibilité) (?)
817
-	 *
818
-	 * @var array|null
819
-	 */
820
-	public $fonctions = [];
821
-
822
-	/**
823
-	 * Inutilisé, propriété générique de l'AST
824
-	 *
825
-	 * @var string|array
826
-	 */
827
-	public $avant = '';
828
-
829
-	/**
830
-	 * Inutilisé, propriété générique de l'AST
831
-	 *
832
-	 * @var string|array
833
-	 */
834
-	public $apres = '';
835
-
836
-	/**
837
-	 * Identifiant de la boucle
838
-	 *
839
-	 * @var string
840
-	 */
841
-	public $id_boucle = '';
842
-
843
-	/**
844
-	 * AST du squelette, liste de toutes les boucles
845
-	 *
846
-	 * @var Boucles[]
847
-	 */
848
-	public $boucles;
849
-
850
-	/**
851
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
852
-	 *
853
-	 * @var string|null
854
-	 */
855
-	public $type_requete;
856
-
857
-	/**
858
-	 * Résultat de la compilation: toujours une expression PHP
859
-	 *
860
-	 * @var string
861
-	 */
862
-	public $code = '';
863
-
864
-	/**
865
-	 * Interdire les scripts
866
-	 *
867
-	 * @see interdire_scripts()
868
-	 * @var bool
869
-	 */
870
-	public $interdire_scripts = false;
871
-
872
-	/**
873
-	 * Description du squelette
874
-	 *
875
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
-	 *
877
-	 * Peut contenir les index :
878
-	 * - nom : Nom du fichier de cache
879
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
-	 * - sourcefile : Chemin du squelette
881
-	 * - squelette : Code du squelette
882
-	 * - id_mere : Identifiant de la boucle parente
883
-	 * - documents : Pour embed et img dans les textes
884
-	 * - session : Pour un cache sessionné par auteur
885
-	 * - niv : Niveau de tabulation
886
-	 *
887
-	 * @var array
888
-	 */
889
-	public $descr = [];
890
-
891
-	/**
892
-	 * Numéro de ligne dans le code source du squelette
893
-	 *
894
-	 * @var int
895
-	 */
896
-	public $ligne = 0;
780
+    /**
781
+     * Type de noeud
782
+     *
783
+     * @var string
784
+     */
785
+    public $type = 'idiome';
786
+
787
+    /**
788
+     * Clé de traduction demandée. Exemple 'item_oui'
789
+     *
790
+     * @var string
791
+     */
792
+    public $nom_champ = '';
793
+
794
+    /**
795
+     * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
+     *
797
+     * @var string
798
+     */
799
+    public $module = '';
800
+
801
+    /**
802
+     * Arguments à passer à la chaîne
803
+     *
804
+     * @var array
805
+     */
806
+    public $arg = [];
807
+
808
+    /**
809
+     * Filtres à appliquer au résultat
810
+     *
811
+     * @var array
812
+     */
813
+    public $param = [];
814
+
815
+    /**
816
+     * Source des filtres  (compatibilité) (?)
817
+     *
818
+     * @var array|null
819
+     */
820
+    public $fonctions = [];
821
+
822
+    /**
823
+     * Inutilisé, propriété générique de l'AST
824
+     *
825
+     * @var string|array
826
+     */
827
+    public $avant = '';
828
+
829
+    /**
830
+     * Inutilisé, propriété générique de l'AST
831
+     *
832
+     * @var string|array
833
+     */
834
+    public $apres = '';
835
+
836
+    /**
837
+     * Identifiant de la boucle
838
+     *
839
+     * @var string
840
+     */
841
+    public $id_boucle = '';
842
+
843
+    /**
844
+     * AST du squelette, liste de toutes les boucles
845
+     *
846
+     * @var Boucles[]
847
+     */
848
+    public $boucles;
849
+
850
+    /**
851
+     * Alias de table d'application de la requête ou nom complet de la table SQL
852
+     *
853
+     * @var string|null
854
+     */
855
+    public $type_requete;
856
+
857
+    /**
858
+     * Résultat de la compilation: toujours une expression PHP
859
+     *
860
+     * @var string
861
+     */
862
+    public $code = '';
863
+
864
+    /**
865
+     * Interdire les scripts
866
+     *
867
+     * @see interdire_scripts()
868
+     * @var bool
869
+     */
870
+    public $interdire_scripts = false;
871
+
872
+    /**
873
+     * Description du squelette
874
+     *
875
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
+     *
877
+     * Peut contenir les index :
878
+     * - nom : Nom du fichier de cache
879
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
+     * - sourcefile : Chemin du squelette
881
+     * - squelette : Code du squelette
882
+     * - id_mere : Identifiant de la boucle parente
883
+     * - documents : Pour embed et img dans les textes
884
+     * - session : Pour un cache sessionné par auteur
885
+     * - niv : Niveau de tabulation
886
+     *
887
+     * @var array
888
+     */
889
+    public $descr = [];
890
+
891
+    /**
892
+     * Numéro de ligne dans le code source du squelette
893
+     *
894
+     * @var int
895
+     */
896
+    public $ligne = 0;
897 897
 }
898 898
 
899 899
 /**
@@ -902,28 +902,28 @@  discard block
 block discarded – undo
902 902
  * @package SPIP\Core\Compilateur\AST
903 903
  **/
904 904
 class Polyglotte {
905
-	/**
906
-	 * Type de noeud
907
-	 *
908
-	 * @var string
909
-	 */
910
-	public $type = 'polyglotte';
911
-
912
-	/**
913
-	 * Tableau des traductions possibles classées par langue
914
-	 *
915
-	 * Tableau code de langue => texte
916
-	 *
917
-	 * @var array
918
-	 */
919
-	public $traductions = [];
920
-
921
-	/**
922
-	 * Numéro de ligne dans le code source du squelette
923
-	 *
924
-	 * @var int
925
-	 */
926
-	public $ligne = 0;
905
+    /**
906
+     * Type de noeud
907
+     *
908
+     * @var string
909
+     */
910
+    public $type = 'polyglotte';
911
+
912
+    /**
913
+     * Tableau des traductions possibles classées par langue
914
+     *
915
+     * Tableau code de langue => texte
916
+     *
917
+     * @var array
918
+     */
919
+    public $traductions = [];
920
+
921
+    /**
922
+     * Numéro de ligne dans le code source du squelette
923
+     *
924
+     * @var int
925
+     */
926
+    public $ligne = 0;
927 927
 }
928 928
 
929 929
 
@@ -948,90 +948,90 @@  discard block
 block discarded – undo
948 948
  */
949 949
 function declarer_interfaces() {
950 950
 
951
-	$GLOBALS['table_des_tables']['articles'] = 'articles';
952
-	$GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
-	$GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
-	$GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
-
956
-	// definition des statuts de publication
957
-	$GLOBALS['table_statut'] = [];
958
-
959
-	//
960
-	// tableau des tables de jointures
961
-	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
-	$GLOBALS['tables_jointures'] = [];
963
-	$GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
-
965
-	// $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
-	$GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
-
968
-
969
-	if (!defined('_TRAITEMENT_TYPO')) {
970
-		define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
-	}
972
-	if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
-		define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
-	}
975
-	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
-		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
-	}
978
-	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
979
-	$GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
-	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
981
-	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982
-	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983
-	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
984
-	$GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
985
-	$GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
986
-	$GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
987
-	$GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
988
-	$GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
-	$GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
990
-	$GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
991
-	$GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
992
-	$GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
993
-	$GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
994
-	$GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
995
-	$GLOBALS['table_des_traitements']['TAGS'][] = '%s';
996
-	$GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
997
-	$GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
998
-	$GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
999
-	$GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
1000
-	$GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
1001
-	$GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1002
-
1003
-	// valeur par defaut pour les balises non listees ci-dessus
1004
-	$GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1005
-	// toujours securiser les DATA
1006
-	$GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1007
-	// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1008
-	$GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1009
-
1010
-
1011
-	// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1012
-	$interfaces = pipeline(
1013
-		'declarer_tables_interfaces',
1014
-		[
1015
-			'table_des_tables' => $GLOBALS['table_des_tables'],
1016
-			'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1017
-			'table_date' => $GLOBALS['table_date'],
1018
-			'table_titre' => $GLOBALS['table_titre'],
1019
-			'tables_jointures' => $GLOBALS['tables_jointures'],
1020
-			'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1021
-			'table_des_traitements' => $GLOBALS['table_des_traitements'],
1022
-			'table_statut' => $GLOBALS['table_statut'],
1023
-		]
1024
-	);
1025
-	if ($interfaces) {
1026
-		$GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1027
-		$GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1028
-		$GLOBALS['table_date'] = $interfaces['table_date'];
1029
-		$GLOBALS['table_titre'] = $interfaces['table_titre'];
1030
-		$GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1031
-		$GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1032
-		$GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1033
-		$GLOBALS['table_statut'] = $interfaces['table_statut'];
1034
-	}
951
+    $GLOBALS['table_des_tables']['articles'] = 'articles';
952
+    $GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
+    $GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
+    $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
+
956
+    // definition des statuts de publication
957
+    $GLOBALS['table_statut'] = [];
958
+
959
+    //
960
+    // tableau des tables de jointures
961
+    // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
+    $GLOBALS['tables_jointures'] = [];
963
+    $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
+
965
+    // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
+    $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
+
968
+
969
+    if (!defined('_TRAITEMENT_TYPO')) {
970
+        define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
+    }
972
+    if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
+        define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
+    }
975
+    if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
+        define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
+    }
978
+    $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
979
+    $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
+    $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
981
+    $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982
+    $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983
+    $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
984
+    $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
985
+    $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
986
+    $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
987
+    $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
988
+    $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
+    $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
990
+    $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
991
+    $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
992
+    $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
993
+    $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
994
+    $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
995
+    $GLOBALS['table_des_traitements']['TAGS'][] = '%s';
996
+    $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
997
+    $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
998
+    $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
999
+    $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
1000
+    $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
1001
+    $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1002
+
1003
+    // valeur par defaut pour les balises non listees ci-dessus
1004
+    $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1005
+    // toujours securiser les DATA
1006
+    $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1007
+    // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1008
+    $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1009
+
1010
+
1011
+    // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1012
+    $interfaces = pipeline(
1013
+        'declarer_tables_interfaces',
1014
+        [
1015
+            'table_des_tables' => $GLOBALS['table_des_tables'],
1016
+            'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1017
+            'table_date' => $GLOBALS['table_date'],
1018
+            'table_titre' => $GLOBALS['table_titre'],
1019
+            'tables_jointures' => $GLOBALS['tables_jointures'],
1020
+            'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1021
+            'table_des_traitements' => $GLOBALS['table_des_traitements'],
1022
+            'table_statut' => $GLOBALS['table_statut'],
1023
+        ]
1024
+    );
1025
+    if ($interfaces) {
1026
+        $GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1027
+        $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1028
+        $GLOBALS['table_date'] = $interfaces['table_date'];
1029
+        $GLOBALS['table_titre'] = $interfaces['table_titre'];
1030
+        $GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1031
+        $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1032
+        $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1033
+        $GLOBALS['table_statut'] = $interfaces['table_statut'];
1034
+    }
1035 1035
 }
1036 1036
 
1037 1037
 declarer_interfaces();
Please login to merge, or discard this patch.
ecrire/action/editer_article.php 2 patches
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -106,7 +106,7 @@  discard block
 block discarded – undo
106 106
 	);
107 107
 
108 108
 	// Si l'article est publie, invalider les caches et demander sa reindexation
109
-	$t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article));
109
+	$t = sql_getfetsel('statut', 'spip_articles', 'id_article='.intval($id_article));
110 110
 	$invalideur = $indexation = false;
111 111
 	if ($t == 'publie') {
112 112
 		$invalideur = "id='article/$id_article'";
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
 			$id_article,
120 120
 			[
121 121
 			'data' => $set,
122
-			'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
122
+			'nonvide' => ['titre' => _T('info_nouvel_article').' '._T('info_numero_abbreviation').$id_article],
123 123
 			'invalideur' => $invalideur,
124 124
 			'indexation' => $indexation,
125 125
 			'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
@@ -309,7 +309,7 @@  discard block
 block discarded – undo
309 309
 		} elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
310 310
 			$statut = $champs['statut'] = $s;
311 311
 		} else {
312
-			spip_log("editer_article $id_article refus " . join(' ', $c));
312
+			spip_log("editer_article $id_article refus ".join(' ', $c));
313 313
 		}
314 314
 
315 315
 		// En cas de publication, fixer la date a "maintenant"
@@ -334,7 +334,7 @@  discard block
 block discarded – undo
334 334
 		isset($c['id_parent'])
335 335
 		and $id_parent = $c['id_parent']
336 336
 		and $id_parent != $id_rubrique
337
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
337
+		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique='.intval($id_parent)))
338 338
 	) {
339 339
 		$champs['id_rubrique'] = $id_parent;
340 340
 
@@ -435,7 +435,7 @@  discard block
 block discarded – undo
435 435
 	// Si on deplace l'article
436 436
 	//  changer aussi son secteur et sa langue (si heritee)
437 437
 	if (isset($champs['id_rubrique'])) {
438
-		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
438
+		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique='.sql_quote($champs['id_rubrique']));
439 439
 
440 440
 		$langue = $row_rub['lang'];
441 441
 		$champs['id_secteur'] = $row_rub['id_secteur'];
@@ -443,7 +443,7 @@  discard block
 block discarded – undo
443 443
 			sql_fetsel(
444 444
 				'1',
445 445
 				'spip_articles',
446
-				'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
446
+				'id_article='.intval($id_article)." AND langue_choisie<>'oui' AND lang<>".sql_quote($langue)
447 447
 			)
448 448
 		) {
449 449
 			$champs['lang'] = $langue;
@@ -454,7 +454,7 @@  discard block
 block discarded – undo
454 454
 		return;
455 455
 	}
456 456
 
457
-	sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article));
457
+	sql_updateq('spip_articles', $champs, 'id_article='.intval($id_article));
458 458
 
459 459
 	// Changer le statut des rubriques concernees
460 460
 
@@ -475,6 +475,6 @@  discard block
 block discarded – undo
475 475
 		foreach ($plus as $n => $t) {
476 476
 			$plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t);
477 477
 		}
478
-		set_request('texte', join('', $plus) . _request('texte'));
478
+		set_request('texte', join('', $plus)._request('texte'));
479 479
 	}
480 480
 }
Please login to merge, or discard this patch.
Indentation   +323 added lines, -323 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
 /**
@@ -40,36 +40,36 @@  discard block
 block discarded – undo
40 40
  *     Liste (identifiant de l'article, Texte d'erreur éventuel)
41 41
  */
42 42
 function action_editer_article_dist($arg = null) {
43
-	include_spip('inc/autoriser');
44
-	$err = '';
45
-	if (is_null($arg)) {
46
-		$securiser_action = charger_fonction('securiser_action', 'inc');
47
-		$arg = $securiser_action();
48
-	}
49
-
50
-	// si id_article n'est pas un nombre, c'est une creation
51
-	// mais on verifie qu'on a toutes les donnees qu'il faut.
52
-	if (!$id_article = intval($arg)) {
53
-		$id_parent = _request('id_parent');
54
-		if (!$id_parent) {
55
-			$err = _L("creation interdite d'un article sans rubrique");
56
-		} elseif (!autoriser('creerarticledans', 'rubrique', $id_parent)) {
57
-			$err = _T('info_creerdansrubrique_non_autorise');
58
-		} else {
59
-			$id_article = article_inserer($id_parent);
60
-		}
61
-	}
62
-
63
-	// Enregistre l'envoi dans la BD
64
-	if ($id_article > 0) {
65
-		$err = article_modifier($id_article);
66
-	}
67
-
68
-	if ($err) {
69
-		spip_log("echec editeur article: $err", _LOG_ERREUR);
70
-	}
71
-
72
-	return [$id_article, $err];
43
+    include_spip('inc/autoriser');
44
+    $err = '';
45
+    if (is_null($arg)) {
46
+        $securiser_action = charger_fonction('securiser_action', 'inc');
47
+        $arg = $securiser_action();
48
+    }
49
+
50
+    // si id_article n'est pas un nombre, c'est une creation
51
+    // mais on verifie qu'on a toutes les donnees qu'il faut.
52
+    if (!$id_article = intval($arg)) {
53
+        $id_parent = _request('id_parent');
54
+        if (!$id_parent) {
55
+            $err = _L("creation interdite d'un article sans rubrique");
56
+        } elseif (!autoriser('creerarticledans', 'rubrique', $id_parent)) {
57
+            $err = _T('info_creerdansrubrique_non_autorise');
58
+        } else {
59
+            $id_article = article_inserer($id_parent);
60
+        }
61
+    }
62
+
63
+    // Enregistre l'envoi dans la BD
64
+    if ($id_article > 0) {
65
+        $err = article_modifier($id_article);
66
+    }
67
+
68
+    if ($err) {
69
+        spip_log("echec editeur article: $err", _LOG_ERREUR);
70
+    }
71
+
72
+    return [$id_article, $err];
73 73
 }
74 74
 
75 75
 /**
@@ -91,50 +91,50 @@  discard block
 block discarded – undo
91 91
  */
92 92
 function article_modifier($id_article, $set = null) {
93 93
 
94
-	// unifier $texte en cas de texte trop long
95
-	trop_longs_articles();
96
-
97
-	include_spip('inc/modifier');
98
-	include_spip('inc/filtres');
99
-	$c = collecter_requests(
100
-	// white list
101
-		objet_info('article', 'champs_editables'),
102
-		// black list
103
-		['date', 'statut', 'id_parent'],
104
-		// donnees eventuellement fournies
105
-		$set
106
-	);
107
-
108
-	// Si l'article est publie, invalider les caches et demander sa reindexation
109
-	$t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article));
110
-	$invalideur = $indexation = false;
111
-	if ($t == 'publie') {
112
-		$invalideur = "id='article/$id_article'";
113
-		$indexation = true;
114
-	}
115
-
116
-	if (
117
-		$err = objet_modifier_champs(
118
-			'article',
119
-			$id_article,
120
-			[
121
-			'data' => $set,
122
-			'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
123
-			'invalideur' => $invalideur,
124
-			'indexation' => $indexation,
125
-			'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
126
-			],
127
-			$c
128
-		)
129
-	) {
130
-		return $err;
131
-	}
132
-
133
-	// Modification de statut, changement de rubrique ?
134
-	$c = collecter_requests(['date', 'statut', 'id_parent'], [], $set);
135
-	$err = article_instituer($id_article, $c);
136
-
137
-	return $err;
94
+    // unifier $texte en cas de texte trop long
95
+    trop_longs_articles();
96
+
97
+    include_spip('inc/modifier');
98
+    include_spip('inc/filtres');
99
+    $c = collecter_requests(
100
+    // white list
101
+        objet_info('article', 'champs_editables'),
102
+        // black list
103
+        ['date', 'statut', 'id_parent'],
104
+        // donnees eventuellement fournies
105
+        $set
106
+    );
107
+
108
+    // Si l'article est publie, invalider les caches et demander sa reindexation
109
+    $t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article));
110
+    $invalideur = $indexation = false;
111
+    if ($t == 'publie') {
112
+        $invalideur = "id='article/$id_article'";
113
+        $indexation = true;
114
+    }
115
+
116
+    if (
117
+        $err = objet_modifier_champs(
118
+            'article',
119
+            $id_article,
120
+            [
121
+            'data' => $set,
122
+            'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
123
+            'invalideur' => $invalideur,
124
+            'indexation' => $indexation,
125
+            'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
126
+            ],
127
+            $c
128
+        )
129
+    ) {
130
+        return $err;
131
+    }
132
+
133
+    // Modification de statut, changement de rubrique ?
134
+    $c = collecter_requests(['date', 'statut', 'id_parent'], [], $set);
135
+    $err = article_instituer($id_article, $c);
136
+
137
+    return $err;
138 138
 }
139 139
 
140 140
 /**
@@ -170,98 +170,98 @@  discard block
 block discarded – undo
170 170
  */
171 171
 function article_inserer($id_rubrique, $set = null) {
172 172
 
173
-	// Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
174
-	// dans la premiere rubrique racine
175
-	if (!$id_rubrique = intval($id_rubrique)) {
176
-		$row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
177
-		$id_rubrique = $row['id_rubrique'];
178
-	} else {
179
-		$row = sql_fetsel('lang, id_secteur', 'spip_rubriques', "id_rubrique=$id_rubrique");
180
-	}
181
-
182
-	// eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue
183
-	// cas de id_rubrique = -1 par exemple avec plugin "pages"
184
-	$id_secteur = $row['id_secteur'] ?? 0;
185
-	$lang_rub = $row['lang'] ?? '';
186
-
187
-	$lang = '';
188
-	$choisie = 'non';
189
-	// La langue a la creation : si les liens de traduction sont autorises
190
-	// dans les rubriques, on essaie avec la langue de l'auteur,
191
-	// ou a defaut celle de la rubrique
192
-	// Sinon c'est la langue de la rubrique qui est choisie + heritee
193
-	if (
194
-		!empty($GLOBALS['meta']['multi_objets']) and in_array(
195
-			'spip_articles',
196
-			explode(',', $GLOBALS['meta']['multi_objets'])
197
-		)
198
-	) {
199
-		lang_select($GLOBALS['visiteur_session']['lang']);
200
-		if (
201
-			in_array(
202
-				$GLOBALS['spip_lang'],
203
-				explode(',', $GLOBALS['meta']['langues_multilingue'])
204
-			)
205
-		) {
206
-			$lang = $GLOBALS['spip_lang'];
207
-			$choisie = 'oui';
208
-		}
209
-	}
210
-
211
-	if (!$lang) {
212
-		$choisie = 'non';
213
-		$lang = $lang_rub ?: $GLOBALS['meta']['langue_site'];
214
-	}
215
-
216
-	$champs = [
217
-		'id_rubrique' => $id_rubrique,
218
-		'id_secteur' => $id_secteur,
219
-		'statut' => 'prepa',
220
-		'date' => date('Y-m-d H:i:s'),
221
-		'lang' => $lang,
222
-		'langue_choisie' => $choisie
223
-	];
224
-
225
-	if ($set) {
226
-		$champs = array_merge($champs, $set);
227
-	}
228
-
229
-	// Envoyer aux plugins
230
-	$champs = pipeline(
231
-		'pre_insertion',
232
-		[
233
-			'args' => [
234
-				'table' => 'spip_articles',
235
-			],
236
-			'data' => $champs
237
-		]
238
-	);
239
-
240
-	$id_article = sql_insertq('spip_articles', $champs);
241
-
242
-	// controler si le serveur n'a pas renvoye une erreur
243
-	if ($id_article > 0) {
244
-		$id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
245
-			$GLOBALS['visiteur_session']['id_auteur']
246
-			: _request('id_auteur'));
247
-		if ($id_auteur) {
248
-			include_spip('action/editer_auteur');
249
-			auteur_associer($id_auteur, ['article' => $id_article]);
250
-		}
251
-	}
252
-
253
-	pipeline(
254
-		'post_insertion',
255
-		[
256
-			'args' => [
257
-				'table' => 'spip_articles',
258
-				'id_objet' => $id_article
259
-			],
260
-			'data' => $champs
261
-		]
262
-	);
263
-
264
-	return $id_article;
173
+    // Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
174
+    // dans la premiere rubrique racine
175
+    if (!$id_rubrique = intval($id_rubrique)) {
176
+        $row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
177
+        $id_rubrique = $row['id_rubrique'];
178
+    } else {
179
+        $row = sql_fetsel('lang, id_secteur', 'spip_rubriques', "id_rubrique=$id_rubrique");
180
+    }
181
+
182
+    // eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue
183
+    // cas de id_rubrique = -1 par exemple avec plugin "pages"
184
+    $id_secteur = $row['id_secteur'] ?? 0;
185
+    $lang_rub = $row['lang'] ?? '';
186
+
187
+    $lang = '';
188
+    $choisie = 'non';
189
+    // La langue a la creation : si les liens de traduction sont autorises
190
+    // dans les rubriques, on essaie avec la langue de l'auteur,
191
+    // ou a defaut celle de la rubrique
192
+    // Sinon c'est la langue de la rubrique qui est choisie + heritee
193
+    if (
194
+        !empty($GLOBALS['meta']['multi_objets']) and in_array(
195
+            'spip_articles',
196
+            explode(',', $GLOBALS['meta']['multi_objets'])
197
+        )
198
+    ) {
199
+        lang_select($GLOBALS['visiteur_session']['lang']);
200
+        if (
201
+            in_array(
202
+                $GLOBALS['spip_lang'],
203
+                explode(',', $GLOBALS['meta']['langues_multilingue'])
204
+            )
205
+        ) {
206
+            $lang = $GLOBALS['spip_lang'];
207
+            $choisie = 'oui';
208
+        }
209
+    }
210
+
211
+    if (!$lang) {
212
+        $choisie = 'non';
213
+        $lang = $lang_rub ?: $GLOBALS['meta']['langue_site'];
214
+    }
215
+
216
+    $champs = [
217
+        'id_rubrique' => $id_rubrique,
218
+        'id_secteur' => $id_secteur,
219
+        'statut' => 'prepa',
220
+        'date' => date('Y-m-d H:i:s'),
221
+        'lang' => $lang,
222
+        'langue_choisie' => $choisie
223
+    ];
224
+
225
+    if ($set) {
226
+        $champs = array_merge($champs, $set);
227
+    }
228
+
229
+    // Envoyer aux plugins
230
+    $champs = pipeline(
231
+        'pre_insertion',
232
+        [
233
+            'args' => [
234
+                'table' => 'spip_articles',
235
+            ],
236
+            'data' => $champs
237
+        ]
238
+    );
239
+
240
+    $id_article = sql_insertq('spip_articles', $champs);
241
+
242
+    // controler si le serveur n'a pas renvoye une erreur
243
+    if ($id_article > 0) {
244
+        $id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
245
+            $GLOBALS['visiteur_session']['id_auteur']
246
+            : _request('id_auteur'));
247
+        if ($id_auteur) {
248
+            include_spip('action/editer_auteur');
249
+            auteur_associer($id_auteur, ['article' => $id_article]);
250
+        }
251
+    }
252
+
253
+    pipeline(
254
+        'post_insertion',
255
+        [
256
+            'args' => [
257
+                'table' => 'spip_articles',
258
+                'id_objet' => $id_article
259
+            ],
260
+            'data' => $champs
261
+        ]
262
+    );
263
+
264
+    return $id_article;
265 265
 }
266 266
 
267 267
 
@@ -289,125 +289,125 @@  discard block
 block discarded – undo
289 289
  */
290 290
 function article_instituer($id_article, $c, $calcul_rub = true) {
291 291
 
292
-	include_spip('inc/autoriser');
293
-	include_spip('inc/rubriques');
294
-	include_spip('inc/modifier');
295
-
296
-	$row = sql_fetsel('statut, date, id_rubrique', 'spip_articles', "id_article=$id_article");
297
-	$id_rubrique = $row['id_rubrique'];
298
-	$statut_ancien = $statut = $row['statut'];
299
-	$date_ancienne = $date = $row['date'];
300
-	$champs = [];
301
-
302
-	$d = $c['date'] ?? null;
303
-	$s = $c['statut'] ?? $statut;
304
-
305
-	// cf autorisations dans inc/instituer_article
306
-	if ($s != $statut or ($d and $d != $date)) {
307
-		if (autoriser('publierdans', 'rubrique', $id_rubrique)) {
308
-			$statut = $champs['statut'] = $s;
309
-		} elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
310
-			$statut = $champs['statut'] = $s;
311
-		} else {
312
-			spip_log("editer_article $id_article refus " . join(' ', $c));
313
-		}
314
-
315
-		// En cas de publication, fixer la date a "maintenant"
316
-		// sauf si $c commande autre chose
317
-		// ou si l'article est deja date dans le futur
318
-		// En cas de proposition d'un article (mais pas depublication), idem
319
-		if (
320
-			$champs['statut'] == 'publie'
321
-			or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, ['publie', 'prop'])))
322
-		) {
323
-			if ($d or strtotime($d = $date) > time()) {
324
-				$champs['date'] = $date = $d;
325
-			} else {
326
-				$champs['date'] = $date = date('Y-m-d H:i:s');
327
-			}
328
-		}
329
-	}
330
-
331
-	// Verifier que la rubrique demandee existe et est differente
332
-	// de la rubrique actuelle
333
-	if (
334
-		isset($c['id_parent'])
335
-		and $id_parent = $c['id_parent']
336
-		and $id_parent != $id_rubrique
337
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
338
-	) {
339
-		$champs['id_rubrique'] = $id_parent;
340
-
341
-		// si l'article etait publie
342
-		// et que le demandeur n'est pas admin de la rubrique de destination
343
-		// repasser l'article en statut 'propose'.
344
-		if (
345
-			$statut == 'publie'
346
-			and !autoriser('publierdans', 'rubrique', $id_parent)
347
-		) {
348
-			$champs['statut'] = 'prop';
349
-		}
350
-	}
351
-
352
-	// Envoyer aux plugins
353
-	$champs = pipeline(
354
-		'pre_edition',
355
-		[
356
-			'args' => [
357
-				'table' => 'spip_articles',
358
-				'id_objet' => $id_article,
359
-				'action' => 'instituer',
360
-				'statut_ancien' => $statut_ancien,
361
-				'date_ancienne' => $date_ancienne,
362
-			],
363
-			'data' => $champs
364
-		]
365
-	);
366
-
367
-	if (!(is_countable($champs) ? count($champs) : 0)) {
368
-		return '';
369
-	}
370
-
371
-	// Envoyer les modifs.
372
-	editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
373
-
374
-	// Invalider les caches
375
-	include_spip('inc/invalideur');
376
-	suivre_invalideur("id='article/$id_article'");
377
-
378
-	if ($date) {
379
-		$t = strtotime($date);
380
-		$p = @$GLOBALS['meta']['date_prochain_postdate'];
381
-		if ($t > time() and (!$p or ($t < $p))) {
382
-			ecrire_meta('date_prochain_postdate', $t);
383
-		}
384
-	}
385
-
386
-	// Pipeline
387
-	pipeline(
388
-		'post_edition',
389
-		[
390
-			'args' => [
391
-				'table' => 'spip_articles',
392
-				'id_objet' => $id_article,
393
-				'action' => 'instituer',
394
-				'statut_ancien' => $statut_ancien,
395
-				'date_ancienne' => $date_ancienne,
396
-			],
397
-			'data' => $champs
398
-		]
399
-	);
400
-
401
-	// Notifications
402
-	if ($notifications = charger_fonction('notifications', 'inc')) {
403
-		$notifications(
404
-			'instituerarticle',
405
-			$id_article,
406
-			['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne]
407
-		);
408
-	}
409
-
410
-	return ''; // pas d'erreur
292
+    include_spip('inc/autoriser');
293
+    include_spip('inc/rubriques');
294
+    include_spip('inc/modifier');
295
+
296
+    $row = sql_fetsel('statut, date, id_rubrique', 'spip_articles', "id_article=$id_article");
297
+    $id_rubrique = $row['id_rubrique'];
298
+    $statut_ancien = $statut = $row['statut'];
299
+    $date_ancienne = $date = $row['date'];
300
+    $champs = [];
301
+
302
+    $d = $c['date'] ?? null;
303
+    $s = $c['statut'] ?? $statut;
304
+
305
+    // cf autorisations dans inc/instituer_article
306
+    if ($s != $statut or ($d and $d != $date)) {
307
+        if (autoriser('publierdans', 'rubrique', $id_rubrique)) {
308
+            $statut = $champs['statut'] = $s;
309
+        } elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
310
+            $statut = $champs['statut'] = $s;
311
+        } else {
312
+            spip_log("editer_article $id_article refus " . join(' ', $c));
313
+        }
314
+
315
+        // En cas de publication, fixer la date a "maintenant"
316
+        // sauf si $c commande autre chose
317
+        // ou si l'article est deja date dans le futur
318
+        // En cas de proposition d'un article (mais pas depublication), idem
319
+        if (
320
+            $champs['statut'] == 'publie'
321
+            or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, ['publie', 'prop'])))
322
+        ) {
323
+            if ($d or strtotime($d = $date) > time()) {
324
+                $champs['date'] = $date = $d;
325
+            } else {
326
+                $champs['date'] = $date = date('Y-m-d H:i:s');
327
+            }
328
+        }
329
+    }
330
+
331
+    // Verifier que la rubrique demandee existe et est differente
332
+    // de la rubrique actuelle
333
+    if (
334
+        isset($c['id_parent'])
335
+        and $id_parent = $c['id_parent']
336
+        and $id_parent != $id_rubrique
337
+        and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
338
+    ) {
339
+        $champs['id_rubrique'] = $id_parent;
340
+
341
+        // si l'article etait publie
342
+        // et que le demandeur n'est pas admin de la rubrique de destination
343
+        // repasser l'article en statut 'propose'.
344
+        if (
345
+            $statut == 'publie'
346
+            and !autoriser('publierdans', 'rubrique', $id_parent)
347
+        ) {
348
+            $champs['statut'] = 'prop';
349
+        }
350
+    }
351
+
352
+    // Envoyer aux plugins
353
+    $champs = pipeline(
354
+        'pre_edition',
355
+        [
356
+            'args' => [
357
+                'table' => 'spip_articles',
358
+                'id_objet' => $id_article,
359
+                'action' => 'instituer',
360
+                'statut_ancien' => $statut_ancien,
361
+                'date_ancienne' => $date_ancienne,
362
+            ],
363
+            'data' => $champs
364
+        ]
365
+    );
366
+
367
+    if (!(is_countable($champs) ? count($champs) : 0)) {
368
+        return '';
369
+    }
370
+
371
+    // Envoyer les modifs.
372
+    editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
373
+
374
+    // Invalider les caches
375
+    include_spip('inc/invalideur');
376
+    suivre_invalideur("id='article/$id_article'");
377
+
378
+    if ($date) {
379
+        $t = strtotime($date);
380
+        $p = @$GLOBALS['meta']['date_prochain_postdate'];
381
+        if ($t > time() and (!$p or ($t < $p))) {
382
+            ecrire_meta('date_prochain_postdate', $t);
383
+        }
384
+    }
385
+
386
+    // Pipeline
387
+    pipeline(
388
+        'post_edition',
389
+        [
390
+            'args' => [
391
+                'table' => 'spip_articles',
392
+                'id_objet' => $id_article,
393
+                'action' => 'instituer',
394
+                'statut_ancien' => $statut_ancien,
395
+                'date_ancienne' => $date_ancienne,
396
+            ],
397
+            'data' => $champs
398
+        ]
399
+    );
400
+
401
+    // Notifications
402
+    if ($notifications = charger_fonction('notifications', 'inc')) {
403
+        $notifications(
404
+            'instituerarticle',
405
+            $id_article,
406
+            ['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne]
407
+        );
408
+    }
409
+
410
+    return ''; // pas d'erreur
411 411
 }
412 412
 
413 413
 /**
@@ -432,37 +432,37 @@  discard block
 block discarded – undo
432 432
  */
433 433
 function editer_article_heritage($id_article, $id_rubrique, $statut, $champs, $cond = true) {
434 434
 
435
-	// Si on deplace l'article
436
-	//  changer aussi son secteur et sa langue (si heritee)
437
-	if (isset($champs['id_rubrique'])) {
438
-		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
439
-
440
-		$langue = $row_rub['lang'];
441
-		$champs['id_secteur'] = $row_rub['id_secteur'];
442
-		if (
443
-			sql_fetsel(
444
-				'1',
445
-				'spip_articles',
446
-				'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
447
-			)
448
-		) {
449
-			$champs['lang'] = $langue;
450
-		}
451
-	}
452
-
453
-	if (!$champs) {
454
-		return;
455
-	}
456
-
457
-	sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article));
458
-
459
-	// Changer le statut des rubriques concernees
460
-
461
-	if ($cond) {
462
-		include_spip('inc/rubriques');
463
-		$postdate = ($GLOBALS['meta']['post_dates'] == 'non' and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false;
464
-		calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate);
465
-	}
435
+    // Si on deplace l'article
436
+    //  changer aussi son secteur et sa langue (si heritee)
437
+    if (isset($champs['id_rubrique'])) {
438
+        $row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
439
+
440
+        $langue = $row_rub['lang'];
441
+        $champs['id_secteur'] = $row_rub['id_secteur'];
442
+        if (
443
+            sql_fetsel(
444
+                '1',
445
+                'spip_articles',
446
+                'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
447
+            )
448
+        ) {
449
+            $champs['lang'] = $langue;
450
+        }
451
+    }
452
+
453
+    if (!$champs) {
454
+        return;
455
+    }
456
+
457
+    sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article));
458
+
459
+    // Changer le statut des rubriques concernees
460
+
461
+    if ($cond) {
462
+        include_spip('inc/rubriques');
463
+        $postdate = ($GLOBALS['meta']['post_dates'] == 'non' and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false;
464
+        calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate);
465
+    }
466 466
 }
467 467
 
468 468
 /**
@@ -471,10 +471,10 @@  discard block
 block discarded – undo
471 471
  * @return void
472 472
  */
473 473
 function trop_longs_articles() {
474
-	if (is_array($plus = _request('texte_plus'))) {
475
-		foreach ($plus as $n => $t) {
476
-			$plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t);
477
-		}
478
-		set_request('texte', join('', $plus) . _request('texte'));
479
-	}
474
+    if (is_array($plus = _request('texte_plus'))) {
475
+        foreach ($plus as $n => $t) {
476
+            $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t);
477
+        }
478
+        set_request('texte', join('', $plus) . _request('texte'));
479
+    }
480 480
 }
Please login to merge, or discard this patch.
ecrire/iterateur/sql.php 1 patch
Indentation   +204 added lines, -204 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
 
@@ -28,210 +28,210 @@  discard block
 block discarded – undo
28 28
  */
29 29
 class IterateurSQL implements Iterator {
30 30
 
31
-	/**
32
-	 * ressource sql
33
-	 *
34
-	 * @var resource|bool
35
-	 */
36
-	protected $sqlresult = false;
37
-
38
-	/**
39
-	 * row sql courante
40
-	 *
41
-	 * @var array|null
42
-	 */
43
-	protected $row = null;
44
-
45
-	protected $firstseek = false;
46
-
47
-	/**
48
-	 * Erreur presente ?
49
-	 *
50
-	 * @var bool
51
-	 **/
52
-	public $err = false;
53
-
54
-	/**
55
-	 * Calcul du total des elements
56
-	 *
57
-	 * @var int|null
58
-	 **/
59
-	public $total = null;
60
-
61
-	/**
62
-	 * selectionner les donnees, ie faire la requete SQL
63
-	 *
64
-	 * @return void
65
-	 */
66
-	protected function select() {
67
-		$this->row = null;
68
-		$v = &$this->command;
69
-		$this->sqlresult = calculer_select(
70
-			$v['select'],
71
-			$v['from'],
72
-			$v['type'],
73
-			$v['where'],
74
-			$v['join'],
75
-			$v['groupby'],
76
-			$v['orderby'],
77
-			$v['limit'],
78
-			$v['having'],
79
-			$v['table'],
80
-			$v['id'],
81
-			$v['connect'],
82
-			$this->info
83
-		);
84
-		$this->err = !$this->sqlresult;
85
-		$this->firstseek = false;
86
-		$this->pos = -1;
87
-
88
-		// pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite)
89
-		//$this->total = $this->count();
90
-	}
91
-
92
-	/*
31
+    /**
32
+     * ressource sql
33
+     *
34
+     * @var resource|bool
35
+     */
36
+    protected $sqlresult = false;
37
+
38
+    /**
39
+     * row sql courante
40
+     *
41
+     * @var array|null
42
+     */
43
+    protected $row = null;
44
+
45
+    protected $firstseek = false;
46
+
47
+    /**
48
+     * Erreur presente ?
49
+     *
50
+     * @var bool
51
+     **/
52
+    public $err = false;
53
+
54
+    /**
55
+     * Calcul du total des elements
56
+     *
57
+     * @var int|null
58
+     **/
59
+    public $total = null;
60
+
61
+    /**
62
+     * selectionner les donnees, ie faire la requete SQL
63
+     *
64
+     * @return void
65
+     */
66
+    protected function select() {
67
+        $this->row = null;
68
+        $v = &$this->command;
69
+        $this->sqlresult = calculer_select(
70
+            $v['select'],
71
+            $v['from'],
72
+            $v['type'],
73
+            $v['where'],
74
+            $v['join'],
75
+            $v['groupby'],
76
+            $v['orderby'],
77
+            $v['limit'],
78
+            $v['having'],
79
+            $v['table'],
80
+            $v['id'],
81
+            $v['connect'],
82
+            $this->info
83
+        );
84
+        $this->err = !$this->sqlresult;
85
+        $this->firstseek = false;
86
+        $this->pos = -1;
87
+
88
+        // pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite)
89
+        //$this->total = $this->count();
90
+    }
91
+
92
+    /*
93 93
 	 * array command: les commandes d'initialisation
94 94
 	 * array info: les infos sur le squelette
95 95
 	 */
96
-	public function __construct($command, $info = []) {
97
-		$this->type = 'SQL';
98
-		$this->command = $command;
99
-		$this->info = $info;
100
-		$this->select();
101
-	}
102
-
103
-	/**
104
-	 * Rembobiner
105
-	 *
106
-	 * @return bool
107
-	 */
108
-	public function rewind() : void {
109
-		if ($this->pos > 0) {
110
-			$this->seek(0);
111
-		}
112
-	}
113
-
114
-	/**
115
-	 * Verifier l'etat de l'iterateur
116
-	 *
117
-	 * @return bool
118
-	 */
119
-	public function valid(): bool {
120
-		if ($this->err) {
121
-			return false;
122
-		}
123
-		if (!$this->firstseek) {
124
-			$this->next();
125
-		}
126
-
127
-		return is_array($this->row);
128
-	}
129
-
130
-	/**
131
-	 * Valeurs sur la position courante
132
-	 *
133
-	 * @return array
134
-	 */
135
-	#[\ReturnTypeWillChange]
136
-	public function current() {
137
-		return $this->row;
138
-	}
139
-
140
-	#[\ReturnTypeWillChange]
141
-	public function key() {
142
-		return $this->pos;
143
-	}
144
-
145
-	/**
146
-	 * Sauter a une position absolue
147
-	 *
148
-	 * @param int $n
149
-	 * @param null|string $continue
150
-	 * @return bool
151
-	 */
152
-	public function seek($n = 0, $continue = null) {
153
-		if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) {
154
-			// SQLite ne sait pas seek(), il faut relancer la query
155
-			// si la position courante est apres la position visee
156
-			// il faut relancer la requete
157
-			if ($this->pos > $n) {
158
-				$this->free();
159
-				$this->select();
160
-				$this->valid();
161
-			}
162
-			// et utiliser la methode par defaut pour se deplacer au bon endroit
163
-			// (sera fait en cas d'echec de cette fonction)
164
-			return false;
165
-		}
166
-		$this->row = sql_fetch($this->sqlresult, $this->command['connect']);
167
-		$this->pos = min($n, $this->count());
168
-
169
-		return true;
170
-	}
171
-
172
-	/**
173
-	 * Avancer d'un cran
174
-	 *
175
-	 * @return void
176
-	 */
177
-	public function next() : void {
178
-		$this->row = sql_fetch($this->sqlresult, $this->command['connect']);
179
-		$this->pos++;
180
-		$this->firstseek |= true;
181
-	}
182
-
183
-	/**
184
-	 * Avancer et retourner les donnees pour le nouvel element
185
-	 *
186
-	 * @return array|bool|null
187
-	 */
188
-	public function fetch() {
189
-		if ($this->valid()) {
190
-			$r = $this->current();
191
-			$this->next();
192
-		} else {
193
-			$r = false;
194
-		}
195
-
196
-		return $r;
197
-	}
198
-
199
-	/**
200
-	 * liberer les ressources
201
-	 *
202
-	 * @return bool
203
-	 */
204
-	public function free() {
205
-		if (!$this->sqlresult) {
206
-			return true;
207
-		}
208
-		$a = sql_free($this->sqlresult, $this->command['connect']);
209
-		$this->sqlresult = null;
210
-
211
-		return $a;
212
-	}
213
-
214
-	/**
215
-	 * Compter le nombre de resultats
216
-	 *
217
-	 * @return int
218
-	 */
219
-	public function count() {
220
-		if (is_null($this->total)) {
221
-			if (!$this->sqlresult) {
222
-				$this->total = 0;
223
-			} else {
224
-				# cas count(*)
225
-				if (in_array('count(*)', $this->command['select'])) {
226
-					$this->valid();
227
-					$s = $this->current();
228
-					$this->total = $s['count(*)'];
229
-				} else {
230
-					$this->total = sql_count($this->sqlresult, $this->command['connect']);
231
-				}
232
-			}
233
-		}
234
-
235
-		return $this->total;
236
-	}
96
+    public function __construct($command, $info = []) {
97
+        $this->type = 'SQL';
98
+        $this->command = $command;
99
+        $this->info = $info;
100
+        $this->select();
101
+    }
102
+
103
+    /**
104
+     * Rembobiner
105
+     *
106
+     * @return bool
107
+     */
108
+    public function rewind() : void {
109
+        if ($this->pos > 0) {
110
+            $this->seek(0);
111
+        }
112
+    }
113
+
114
+    /**
115
+     * Verifier l'etat de l'iterateur
116
+     *
117
+     * @return bool
118
+     */
119
+    public function valid(): bool {
120
+        if ($this->err) {
121
+            return false;
122
+        }
123
+        if (!$this->firstseek) {
124
+            $this->next();
125
+        }
126
+
127
+        return is_array($this->row);
128
+    }
129
+
130
+    /**
131
+     * Valeurs sur la position courante
132
+     *
133
+     * @return array
134
+     */
135
+    #[\ReturnTypeWillChange]
136
+    public function current() {
137
+        return $this->row;
138
+    }
139
+
140
+    #[\ReturnTypeWillChange]
141
+    public function key() {
142
+        return $this->pos;
143
+    }
144
+
145
+    /**
146
+     * Sauter a une position absolue
147
+     *
148
+     * @param int $n
149
+     * @param null|string $continue
150
+     * @return bool
151
+     */
152
+    public function seek($n = 0, $continue = null) {
153
+        if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) {
154
+            // SQLite ne sait pas seek(), il faut relancer la query
155
+            // si la position courante est apres la position visee
156
+            // il faut relancer la requete
157
+            if ($this->pos > $n) {
158
+                $this->free();
159
+                $this->select();
160
+                $this->valid();
161
+            }
162
+            // et utiliser la methode par defaut pour se deplacer au bon endroit
163
+            // (sera fait en cas d'echec de cette fonction)
164
+            return false;
165
+        }
166
+        $this->row = sql_fetch($this->sqlresult, $this->command['connect']);
167
+        $this->pos = min($n, $this->count());
168
+
169
+        return true;
170
+    }
171
+
172
+    /**
173
+     * Avancer d'un cran
174
+     *
175
+     * @return void
176
+     */
177
+    public function next() : void {
178
+        $this->row = sql_fetch($this->sqlresult, $this->command['connect']);
179
+        $this->pos++;
180
+        $this->firstseek |= true;
181
+    }
182
+
183
+    /**
184
+     * Avancer et retourner les donnees pour le nouvel element
185
+     *
186
+     * @return array|bool|null
187
+     */
188
+    public function fetch() {
189
+        if ($this->valid()) {
190
+            $r = $this->current();
191
+            $this->next();
192
+        } else {
193
+            $r = false;
194
+        }
195
+
196
+        return $r;
197
+    }
198
+
199
+    /**
200
+     * liberer les ressources
201
+     *
202
+     * @return bool
203
+     */
204
+    public function free() {
205
+        if (!$this->sqlresult) {
206
+            return true;
207
+        }
208
+        $a = sql_free($this->sqlresult, $this->command['connect']);
209
+        $this->sqlresult = null;
210
+
211
+        return $a;
212
+    }
213
+
214
+    /**
215
+     * Compter le nombre de resultats
216
+     *
217
+     * @return int
218
+     */
219
+    public function count() {
220
+        if (is_null($this->total)) {
221
+            if (!$this->sqlresult) {
222
+                $this->total = 0;
223
+            } else {
224
+                # cas count(*)
225
+                if (in_array('count(*)', $this->command['select'])) {
226
+                    $this->valid();
227
+                    $s = $this->current();
228
+                    $this->total = $s['count(*)'];
229
+                } else {
230
+                    $this->total = sql_count($this->sqlresult, $this->command['connect']);
231
+                }
232
+            }
233
+        }
234
+
235
+        return $this->total;
236
+    }
237 237
 }
Please login to merge, or discard this patch.