source: spip-zone/_plugins_/convertisseur/trunk/inc/convertisseur.php @ 104327

Last change on this file since 104327 was 104327, checked in by spip.franck@…, 4 years ago

code.spip est maintenant en https, donc, j'ajoute le "s" à http

File size: 22.4 KB
Line 
1<?php
2
3/*
4 * Fonctions de conversion de format
5 */
6
7
8
9function nettoyer_format($t) {
10
11        // Lettrine avec ital ex : //«~J{e ne suis pas // «C{’est comme la     
12        $t = preg_replace("/^([« ~]*\w)\{/Um","{\\1", $t);
13
14        // supprimer les insecables sauf dans les nombres,
15        // parce que ca prend le chou (?)
16        $t = preg_replace(",(\D)~(\D),", '\1 \2', $t);
17
18        // resserrer les {}
19        $t = preg_replace('/{([.,]+)/', '\1{', $t);
20        $t = preg_replace('/}([.,]+)/', '\1}', $t);
21        $t = preg_replace(',([^{]){ ,', '\1 {', $t);
22        $t = preg_replace(', }([^}]),', '} \1', $t);
23        $t = preg_replace(',} {,', ' ', $t);
24        // }.}
25        $t = preg_replace(',}\.},', '}}.', $t);
26       
27        $t = preg_replace(", +~,", '~', $t);
28        $t = preg_replace(",~ +,", '~', $t);
29        $t = preg_replace("/{([?!., ]?)}/", '\1', $t);
30
31        $t = preg_replace(",^ +,m", '', $t);
32
33#$a = '«';
34#for($i=0;$i<strlen($a); $i++)
35#       echo ord($a[$i]).'-';exit;
36
37        // espaces dans les guillemets
38        ## attention ici c'est de l'utf8
39        $t = str_replace("~\xc2\xbb", " \xc2\xbb", $t);  # guillemet >>
40        $t = str_replace("\xc2\xab~", "\xc2\xab ", $t);  # <<
41        $t = str_replace ("\xe2\x80\x93", '--', $t); # tiret long
42       
43        # Mollo sur les sauts de lignes
44        $t = preg_replace("/\R{3,}/", "\n\n", $t);
45
46        return $t;
47}
48
49
50        // -----------------------------------------------------------------------
51        // Definition des regex pour les Conversions
52        // -----------------------------------------------------------------------
53        global $conv_formats;       // les regex à appliquer
54        global $conv_functions_pre; // les functions à appliquer avant les regex
55
56        $conv_formats = $conv_functions_pre = array();
57
58        // syntaxe SPIP
59        // https://contrib.spip.net/IMG/html/antiseche_spip-3.html
60       
61       
62        //
63  //  Les conversions qqchose .... vers SPIP
64  //
65       
66        // Conversion MediaWiki -> SPIP
67  // ref. syntaxe: http://www.mediawiki.org/wiki/Help:Formatting
68  $conv_functions_pre['MediaWiki_SPIP'] = array("convertisseur_add_ln","mediawiki_doQuotes");
69  $conv_formats['MediaWiki_SPIP'] = array(
70      "pattern" => array( 
71        'model'  => "%\{\{([^\}\}]*)\}\}%",   // FIXME si template ds template       
72         // applies anywhere       
73        'ib' => "%<i><b>([^<]*)</b></i>%",           
74        'b' => "%<b>([^<]*)</b>%", 
75        'i'   => "%<i>([^<]*)</i>%", 
76        'ib_post' => "%<ib>([^<]*)</ib>%",       
77        // only at the beginning of the line         
78        'h4'     => "%\n=====([^=]*)=====%", 
79        'h3'     => "%\n====([^=]*)====%",
80        'h2'     => "%\n===([^=]*)===%",
81        'h1'     => "%\n==([^=]*)==%",
82        'ul_3'     => "%\n\*\*\*#%", 
83        'ul_2'     => "%\n\*\*#%", 
84        'ul_1'     => "%\n\*#%", 
85        'ol_3'     => "%\n\#\#\#%", 
86        'ol_2'     => "%\n\#\#%", 
87        'ol_1'     => "%\n\#%", 
88        'dt'     => "%\n\;([^\r]*)%", 
89        'dd'     => "%\n\:([^\r]*)%", 
90        // TODO: Preformatted text
91       
92        // links - http://www.mediawiki.org/wiki/Help:Links
93        'comment' => "%<!--([^\-]*)-->%",
94        'link_img'  => "%\[\[(Image|Media):([^\[\[]*)\]\]%", 
95        'link_cat'  => "%\[\[(Category|Catégorie|:Category):([^\[\[]*)\]\]%",
96        'link_user'  => "%\[\[(Utilisateur|User):([^|\[]*)\|([^\[]*)\]\]%",  // avec pipe
97        'link_user2'  => "%\[\[(Utilisateur|User):([^\[]*)\]\]%", 
98        'link_lang'  => "%\[\[([^\:\[]*):([^\[]*)\]\]%", 
99        'link_int'  => "%\[\[([^|\[]*)\|([^\[]*)\]\]%",                     // avec pipe
100        'link_int2'  => "%\[\[([^\[\[]*)\]\]%", 
101        'link_ext0'  => "%\nhttp([^ \r]*)%", 
102        'link_ext1'  => "% http([^ \r]*)%", 
103        'link_ext2'  => "%\\[([^\\[ ]*) ([^(\\[|)]*)\\]%",                  // support ext., supporte plusieurs blancs
104        'ref' => "%<ref>%", 
105        'ref2' => "%</ref>%",
106         
107        // TODO: Table (http://www.mediawiki.org/wiki/Help:Tables)
108        ),
109      "replacement" => array(
110        'model'  => "<MODELE_WIKI:\\1>",
111        'ib' => "<ib>\\1</ib>", 
112        'b' => "{{\\1}}",   
113        'i' => "{\\1}", 
114        'ib_post' => "{{<i>\\1</i>}}",
115        'h4'     => "{{{\\1}}}",
116        'h3'     => "{{{\\1}}}", 
117        'h2'     => "{{{\\1}}}", 
118        'h1'     => "{{{\\1}}}", 
119        'ul_3'     => "-*** ", 
120        'ul_2'     => "-** ", 
121        'ul_1'     => "-* ", 
122        'ol_3'     => "-### ", 
123        'ol_2'     => "-## ", 
124        'ol_1'     => "-# ",
125        'dt'     => "<dt>\\1</dt>", 
126        'dd'     => "<dd>\\1</dd>",
127        'comment' => "",
128        'link_img' => "",
129        'link_cat' => "",
130        'link_user' => "\\3",
131        'link_user2' => "\\2",
132        'link_lang' => "",
133        'link_int'  => "\\2", 
134        'link_int2'  => "\\1", 
135        'link_ext0'  => "[->http\\1]", 
136        'link_ext1'  => " [->http\\1]",   
137        'link_ext2'  => "[\\2->\\1]",
138        'ref'  => "[[ ",
139        'ref2'  => " ]]",           
140        )
141  );
142       
143 
144  // Conversion MoinWiki -> SPIP
145  // ref. syntaxe: http://trac.edgewall.org/wiki/WikiFormatting
146  // ref. syntaxe: http://moinmo.in/HelpOnFormatting?highlight=%28formatting%29
147  $conv_formats['MoinWiki_SPIP'] = array(
148      "pattern" => array(
149        'code'   => "%{{{([^}]*)}}}%", // FIXME si } dans {{{ }}}               
150        'bold3'  => "%'''''([^']*)'''''%",
151        'bold2'  => "%''''([^']*)''''%",
152        'bold'   => "%'''([^']*)'''%", 
153        'i'      => "%''([^']*)''%",     
154        'under'  => "%__([^\_]*)__%", 
155        'del'    => "%~~([^\~]*)~~%",
156        'h4'     => "%==== ([^ ====]*) ====%",
157        'h3'     => "%=== ([^ ===]*) ===%",
158        'h2'     => "%== ([^ ==]*) ==%",
159        'h'      => "%= ([^ =]*) =%", 
160        'link2'  => "%\\[([^\\[]*) ([^(\\[| )]*)\\]%", // FIXME si plusieurs espaces blanc
161        'cell'   => "%\|\|([^\|]*)\|\|%",
162        'ul'     => "%([^ ]*)\*([^ \*]*)%", 
163        'ul_pas2'=> "% -\*%", 
164        'ul2'    => "%  -\*%", 
165        'ul3'    => "%  -\**%",       
166        'ol2'    => "%   ([^ ]*)1.([^ 1.]*)%",
167        'ol'     => "% 1\.([^ 1\.]*)%",
168       
169        ),
170      "replacement" => array(
171        'code'   => "<code>\\1</code>",             
172        'bold3'   => "{{\\1}}",
173        'bold2'   => "{{\\1}}", 
174        'bold'   => "{{\\1}}", 
175        'i'      => "{\\1}",       
176        'under'  => "<span class='underline'>\\1</span",
177        'del'    => '<del>\\1</del>',
178        'h4'     => "{{{\\1}}}", 
179        'h3'     => "{{{\\1}}}", 
180        'h2'     => "{{{\\1}}}", 
181        'h'      => "{{{\\1}}}",               
182        'link2'  => "[\\2->\\1]",
183        'cell'   => "|\\1|",       
184        'ul'     => "-*\\2", 
185        'ul_pas2'=> "-*", 
186        'ul2'    => "-**",
187        'ul3'    => "-***",             
188        'ol2'    => "1.#\\2",
189        'ol'     => "-#\\1", 
190        )
191  );
192 
193  // Conversion BBcode -> SPIP
194  // ref. syntaxe: http://en.wikipedia.org/wiki/BBCode
195  // voir aussi la version filtre: https://contrib.spip.net/Du-BBcode-dans-SPIP 
196  // question: detecter si barre enrichie pour adopter la syntaxte etendue ?
197  $conv_formats['BBcode_SPIP'] = array(
198      "pattern" => array(
199        'url'   => "%\\[url]([^\\[]*)\\[/url\\]%",
200        'url2'  => "%\\[url=([^\\[]*)\\]([^\\[]*)\\[/url\\]%",
201        'email' => "%\\[email\\]([^\\[]*)\\[/email\\]%",
202        'email2'=> "%\\[email=([^\\[]*)\\]([^\\[]*)\\[/email\\]%",
203        'color' => "%\\[color=([^\\[]*)\\]([^\\[]*)\\[/color\\]%",
204        'size'  => "%\\[size=([^\\[]*)\\]([^\\[]*)\\[/size\\]%",
205        //'list'  => "!\[list\](.+)\[/list\]!Umi",
206        //'list2' => "!\[\*\](.+)(?=(\[\*\]|</ul>))!Umi",
207        'code'  => "%\\[code]([^\\[]*)\\[/code\\]%",
208        'quote' => "%\\[quote]([^\\[]*)\\[/quote\\]%",
209        'b'     => "%\\[b]([^\\[]*)\\[/b\\]%",
210        'i'     => "%\\[i]([^\\[]*)\\[/i\\]%",
211        'center'=> "%\\[center]([^\\[]*)\\[/center\\]%",
212        'img'   => "%\\[img]([^\\[]*)\\[/img\\]%",
213      ),
214      "replacement" => array(
215        'url'   => "[\\1->\\1]",
216        'url2'  => "[\\2->\\1]",
217        'email' => "[\\1->mailto:\\1]",
218        'email2'=> "[\\2->mailto:\\1]",
219        'color' => "<span style=\"color:\\1\">\\2</span>",
220        'size'  => "<span style=\"font-size:\\1px\">\\2</span>",
221        //'list'  => "<ul> $1 </ul>",
222        //'list2' => "<li>$1</li>",
223        'code'   => "<code>\\1</code>",
224        'quote'  => "<quote>\\1</quote>",
225        'b'      => "{{\\1}}",
226        'i'      => "{\\1}",
227        'center' => "<div style=\"text-align:center:\\1\">\\2</div>",
228        'img'    => "<img src=\"\\1\" alt='' />",
229      )     
230  );
231 
232 
233  // Conversion DotClear -> SPIP
234  // http://doc.dotclear.net/1.2/usage/syntaxes
235  $conv_formats['DotClear_SPIP'] = array(
236      "pattern" => array(
237        // faux amis
238        'q3' => '%{{([^{]*)\|([^\{]*)\|([^\{]*)}}%',       
239        'q2' => '%{{([^{]*)\|([^\{]*)}}%',
240        'q' => '%{{([^{]*)}}%',
241       
242        // type bloc
243        'h3'  => "%\n\!\!\!([^\r]*)%",
244        'h4'  => "%\n\!\!([^\r]*)%",
245        'h5'   => "%\n\!([^\r]*)%", 
246        'ul'   => "%\n\* ([^\r]*)%",
247        'ol'   => "%\n# ([^\r]*)%",     // FIXME gerer les ss listes
248       
249        // en ligne
250        'br'   => "#%%%#", 
251        'em' => '%\'\'([^\']*)\'\'%',
252        'strong' => '%__([^\_]*)__%',
253        'ins' => '%\+\+([^\+]*)\+\+%',
254        'del' => '%--([^\+]*)--%',
255        'code'=> '%@@([^\@]*)@@%',
256        'img' => '%\(\(([^\)]*)\)\)%',
257        'href_0' => '%\[([^\|[]*)\]%',                                  // 0 pipe
258        'href_3' => '%\[([^\[]*)\|([^\[]*)\|([^\[]*)\|([^\[\|]*)\]%',   // 3 pipes
259        'href_2' => '%\[([^\[]*)\|([^\[]*)\|([^\[\|]*)\]%',             // 2 pipes
260        'href_1' => '%\[([^\[]*)\|([^\[\|]*)\]%',                       // 1 pipe
261        'a' => '%~([^~]*)~%',
262        'acronym' => '%\?\?([^\?]*)\|([^\?]*)\?\?%',
263        'note' => '%\$\$([^\$]*)\$\$%',
264       
265       
266      ),
267      "replacement" => array(
268        // faux amis
269        'q3' => '<quote>\\1</quote>',       
270        'q2' => '<quote>\\1</quote>',
271        'q' => '<quote>\\1</quote>',
272       
273        // type bloc
274        'h3'   => "{{{\\1}}}",
275        'h4'   => "{{{\\1}}}", 
276        'h5'   => "{{{\\1}}}", 
277        'ul'   => "\n-* \\1",
278        'ol'   => "\n-# \\1",       
279       
280        // en ligne
281        'br'   => "\n_ ",
282        'em'   => "{{\\1}}",
283        'strong'   => "{{\\1}}",
284        'ins'   => "<ins>\\1</ins>",
285        'del'   => "<del>\\1</del>",
286        'code'   => "<code>\\1</code>",
287        'img'   => "",
288        'href_0'   => "[->\\1]",
289        'href_3' => '[\\2->\\1]',
290        'href_2' => '[\\2->\\1]',
291        'href_1' => '[\\2->\\1]',
292        'a' => '[\\1<-]',
293        'acronym'   => "<acronym  title=\"\\2\">>\\1</acronym>",
294        'note' => '[[\\1]]',
295      )     
296  );
297 
298  // conversion DOCX
299  $conv_formats['DOCX_SPIP'] = 'docx';  // function extract/
300
301
302  // Conversion SLA (Scribus) -> SPIP
303  // SLA 1.2 http://docs.scribus.net/index.php?lang=en&sm=scribusfileformat&page=scribusfileformat
304  // SLA 1.3 http://wiki.scribus.net/index.php/File_Format_for_Scribus_1.3.x
305  $conv_formats['SLA_SPIP'] = array(
306      "pattern" => array(
307        'ch'    => "% CH=\"([^\"]*)\" %",  // "CH=\"<([^>]*)\""
308        'br'    => "%&#x5;%",
309        'sp'    => "%&#x1d;%",       
310        'tag'   => "%<([^\>]*)>%", 
311
312      ),
313      "replacement" => array(
314        'ch'   => ">\\1<",
315        'br'   => "\n\n\n",
316        'sp'   => " ",
317        'tag'   => "",
318      )     
319  );
320
321
322  // Conversion XTG -> SPIP
323  // format demandé par Jean Luc Girard
324  // http://195.13.83.33/twiki/bin/view/FipDoc/QuarkTagsList
325  // http://www.macworld.com/downloads/magazine/XPressTagsList.pdf   
326  // cf. extract/quark.php
327  $conv_formats['XTG_SPIP'] = 'quark'; // function extract/
328 
329  $conv_formats['html_SPIP'] = 'html'; // function sale ou HTML2SPIP
330  $conv_formats['Quark_SPIP'] = 'quark_xml'; // function extract/
331  $conv_formats['Indesign_SPIP'] = 'indesign_xml'; // function extract/
332  $conv_formats['XMLOCR_SPIP'] = 'xml_ocr'; // function extract/
333  $conv_formats['XMLDE_SPIP'] = 'xml_de'; // function extract/
334
335  //
336  //  Les conversions SPIP vers qqchose ....
337  //
338 
339  // Conversion SPIP -> txt
340  $conv_formats['SPIP_txt'] = array(
341      "pattern" => array(
342        'h'     => "%{{{([^}}}]*)}}}%",
343        'b'     => "%{{([^}}]*)}}%",
344        'i'     => "%{([^}]*)}%",
345        'url'   => "%\\[([^\\[]*)->([^(\\[| )]*)\\]%",         
346      ),
347      "replacement" => array(
348        'h'   => "\\1\n",
349        'b'   => "* \\1 *",
350        'i'   => "\\1",
351        'url' => "\\1 (\\2)",       
352      )     
353  );
354 
355  // Conversion SPIP -> mediawiki
356  // http://www.mediawiki.org/wiki/Help:Formatting
357  $conv_formats['SPIP_mediawiki'] = array(
358      "pattern" => array(
359        'h'     => "%{{{([^}]*)}}}%",
360        'b'     => "%{{([^}]*)}}%",
361        'i'     => "%{([^}]*)}%",
362        'ul'    => "%\n-\*%",
363        'ol'    => "%\n-\\#%",
364        'ul2'    => "%\n-%",       // liste "sale"  de spip
365        'br'    => "%\n_ %",
366        'poesie' => "%<poesie>%",
367        'poesie2' => "%</poesie>%",
368        'cadre' => "%<cadre>%",
369        'cadre2' => "%</cadre>%",
370        'pipe_tag_exception' => '%<([^\\|]*)\\|([^>]*)>%', // sortir les pipelines modele <xxx|www> et lien  avt traitemnt table
371        'url_email1' =>  "%\\[([^\\[]*)->mailto:([^(\\[| )]*)@([^(\\[| )]*)\\]%", 
372        'url_email2' =>  "%\\[([^\\[]*)->([^(\\[| )]*)@([^(\\[| )]*)\\]%",                                 // lien email
373        'url_externe'   => "%\\[([^\\[]*)->http([^(\\[| )]*)\\]%",  // tant pis on gere pas autres protocoloe irc, ftp, mailto       
374        'url_interne_anchor'   => "%\\[([^\\[]*)->\\#([^(\\[| )]*)\\]%",
375        'url_interne'   => "%\\[([^\\[]*)->([^(\\[| )]*)\\]%",
376        'url_wiki' => "%\\[\\?([^\\[]*)]%",
377        'anchor' => '%\\[([^\\[]*)<-\\]%',         
378        'img' => '%<(img|emb|doc)([0-9]*)([^>]*)>%',
379        'table_pipe_fin' => '%\\|\r\n\\|%',       
380        'table_pipe' => '%\\|%',
381        'table_start' => '%([^\\|]*)\n([^\\|]*)\n\\|%',
382        'table_fin' => '%\\|([^\\|]*)\n([^\\|]*)\n%',
383        'pipe_tag_exception2' => '%_______%',    //on reinjecte ls pipelines des modeles
384      ),
385      "replacement" => array(
386        'h'   => "\n===\\1===\n",   // on force le retour ligne
387        'b'   => "'''\\1'''",
388        'i'   => "''\\1''",
389        'ul'  => "*\\1",
390        'ol'  => "#\\1",
391        'ul2'  => "*\\1",
392        'br'  => "<br />",
393        'poesie' => "<pre>",
394        'poesie2' => "</pre>",
395        'cadre' => "<pre>",
396        'cadre2' => "</pre>",
397        'pipe_tag_exception' => "<\\1_______\\2>",
398        'url_email1' => "[mailto:\\2@\\3 \\1]",
399        'url_email2' => "[mailto:\\2@\\3 \\1]",
400        'url_externe' => "[http\\2 \\1]",
401        'url_interne_anchor' => "[[#\\2]]", 
402        'url_interne' => "[[\\2 \\1]]", 
403        'url_wiki' => "[http://fr.wikipedia.org/\\1 \\1]", 
404        'anchor' => "<div id='\\1'></div>", 
405        'img' => "[[File:\\1\\2\\3]]",       
406        'table_pipe_fin' => "|-\r|",               
407        'table_pipe' => "\n|", 
408        'table_start' => "\\1{|", 
409        'table_fin' => "|}\\1", 
410        'pipe_tag_exception2' => "|",
411      )     
412  );
413 
414
415 
416
417
418        // FIN INITIALISATION
419
420
421
422
423
424function conversion_format($conv_in, $format) {
425        global $log;
426
427        global $conv_formats;
428        global $conv_functions_pre;
429
430        $conv_out = $conv_in;
431
432        // S'agit-il d'un tableau de conversion ?
433        // si non, ca peut etre une fonction, par exemple un extracteur
434        if (is_array($conv_formats[$format])) {
435
436                // fonctions pre traitement ?
437                if (is_array($conv_functions_pre[$format])) {
438                        include_spip("inc/fonction_convertisseur");
439                        foreach($conv_functions_pre[$format] as $key=>$pattern)
440                                $conv_out = $pattern($conv_out);
441                }
442
443
444                // on convertit (en avant les regex!)
445                foreach($conv_formats[$format]['pattern'] as $key=>$pattern) {
446                        $replacement = $conv_formats[$format]['replacement'][$key];
447                        $conv_out = preg_replace($pattern, $replacement, $conv_out);
448                }
449        }
450
451        // fonction HTML2SPIP - http://ftp.espci.fr/pub/html2spip/
452        else if ($format=="html_SPIP") {       
453          if (file_exists(find_in_path('lib/html2spip-0.6/misc_tools.php'))) {                 
454                require_once(find_in_path('lib/html2spip-0.6/misc_tools.php'));
455                require_once(find_in_path('lib/html2spip-0.6/HTMLEngine.class'));
456                require_once(find_in_path('lib/html2spip-0.6/HTML2SPIPEngine.class'));
457                //define('_HTML2SPIP_PRESERVE_DISTANT',false);
458                $parser = new HTML2SPIPEngine('', _DIR_IMG);    // Quels sont les bons parametres ?
459                $parser->loggingEnable();
460                $output = $parser->translate($conv_out);
461                $conv_out = $output['default']; 
462           } else {
463                  // utilisation de sale
464                  // limitation: echoue sur les pages completes ou trop complexes
465                  include_spip("inc/sale");
466                  $conv_out = sale($conv_out); 
467           }
468               
469  }
470
471        // c'est un nom de fonction : 'quark' par exemple
472        else {
473                if (is_string($conv_formats[$format])) {
474                        $cv = $conv_formats[$format];
475                        include_spip("extract/$cv");
476                        if ($cv = $GLOBALS['extracteur'][$cv]) {
477                                ecrire_fichier(_DIR_TMP.'convertisseur.tmp', $conv_in);
478                                $conv_out = $cv(_DIR_TMP.'convertisseur.tmp', $charset);
479                                supprimer_fichier(_DIR_TMP.'convertisseur.tmp');
480                                #include_spip('inc/charsets');
481                                #$conv_out = importer_charset($conv_out, $charset);
482                        }
483
484                        if ($cv AND !$conv_out)
485                                $log = "<span style='color:red'>"
486                                        ._T("convertisseur:erreur_extracteur")
487                                        ." $cv</span>";
488                        }
489                        if (!$cv)
490                                $log = "<span style='color:red'>"
491                                        ._T("convertisseur:unknown_format")
492                                        ."</span>";
493                }
494
495        return $conv_out;
496}
497
498# callback pour le deballage d'un zip telecharge
499# http://www.phpconcept.net/pclzip/man/en/?options-pclzip_cb_pre_extractfunction
500// cf. https://code.spip.net/@callback_deballe_fichier
501function callback_admissibles($p_event, &$p_header) {
502        if (accepte_fichier_upload2($p_header['filename'])) {
503                $p_header['filename'] = _tmp_dir
504                        . preg_replace(',\W,', '-', basename($p_header['filename']));
505                return 1;
506        } else {
507                return 0;
508        }
509}
510
511function accepte_fichier_upload2($f) {
512        if (!preg_match(",.*__MACOSX/,", $f)
513        AND !preg_match(",^\.,", basename($f)))
514                return true;
515}
516
517function inserer_conversion($texte, $id_rubrique, $f=null) {
518        global $log;
519        global $spip_version_branche ;
520
521        $id_rubrique = intval($id_rubrique);
522        $id_auteur = $GLOBALS['auteur_session']['id_auteur'];
523
524        // Verifier que la rubrique existe et qu'on a le droit d'y ecrire
525        if (!$t = sql_fetsel('id_rubrique', 'spip_rubriques', 'id_rubrique='.$id_rubrique)) {
526                $log = "erreur la rubrique n'existe pas";
527                return false;
528        }
529
530        // Champs d'un article
531        include_spip("base/abstract_sql");
532        $show = sql_showtable("spip_articles");
533        $champs_article = array_keys($show['field']);
534
535        // Si $f (chargement zip), on cherche un article du meme $f
536        // (valeur stockée dans un champ fichier_source ou à défaut dans le PS)
537        // dans la meme rubrique,
538        // avec le statut prepa, qui nous appartient, et... on l'ecrase
539
540        $champ_source = (in_array("fichier_source", $champs_article)) ? "fichier_source" : "ps" ;
541        $source = 'Conversion depuis '.basename($f) ;
542
543        // spip 3
544        if($spip_version_branche > "3")
545                $s = spip_query("SELECT a.id_article
546                        FROM spip_articles AS a,
547                        spip_auteurs_liens AS aut
548                        WHERE id_rubrique=$id_rubrique
549                        AND $champ_source=".sql_quote($source)."
550                        AND aut.id_objet=a.id_article
551                        AND aut.objet = 'article'
552                        AND aut.id_auteur=".$id_auteur
553                        );
554        // spip 2
555        else
556                $s = spip_query("SELECT a.id_article
557                        FROM spip_articles AS a,
558                        spip_auteurs_articles AS aut
559                        WHERE id_rubrique=$id_rubrique
560                        AND $champ_source=".sql_quote($source)."
561                        AND aut.id_article=a.id_article
562                        AND aut.id_auteur=".$id_auteur
563                        );
564       
565        if ($t = spip_fetch_array($s)) {
566                $id_article = $t['id_article'];
567        } else {
568                // regler lang + id_secteur
569                $q = sql_fetsel('id_secteur,lang', 'spip_rubriques',
570                        'id_rubrique='.intval($id_rubrique)
571                );
572
573                $champs = array(
574                        'titre' => $source,
575                        'statut' => 'prepa',
576                        'id_rubrique' => $id_rubrique,
577                        'id_secteur' => $q['id_secteur'],
578                        'lang' => $q['lang'],
579                        $champ_source => $source
580                        );
581
582                // Envoyer aux plugins
583                $champs = pipeline('pre_insertion',
584                        array(
585                                'args' => array(
586                                        'table' => 'spip_articles',
587                                ),
588                                'data' => $champs
589                        )
590                );
591
592                $id_article = sql_insertq('spip_articles', $champs);
593
594                pipeline('post_insertion',
595                        array(
596                                'args' => array(
597                                        'table' => 'spip_articles',
598                                        'id_objet' => $id_article
599                                ),
600                                'data' => $champs
601                        )
602                );
603
604               
605                if ($id_article>0
606                AND $id_auteur>0) {
607
608                        // s'ajouter en auteur en spip 2 ou 3
609                        if($spip_version_branche > "3")
610                                sql_insertq('spip_auteurs_liens',
611                                        array(
612                                        'id_objet' => $id_article,
613                                        'objet' => 'article',
614                                        'id_auteur' => $id_auteur
615                                        )
616                                );
617                        else   
618                                sql_insertq('spip_auteurs_articles',
619                                        array(
620                                        'id_article' => $id_article,
621                                        'id_auteur' => $id_auteur
622                                        )
623                                );
624                }
625        }
626
627        // En cas d'echec de l'insertion
628       
629        if (!$id_article) {
630                $log = "erreur insertion d'article";
631                return;
632        }
633
634        // Si on a repere des <ins class='titre'> etc, les inserer
635        // dans les bons champs ; note : on choisi <ins> pour eviter les erreurs
636        // avec <div> qui est plus courant
637       
638        $c = array('texte' => $texte);
639       
640        foreach ($champs_article as $champ) {
641                if (preg_match(",<ins class='$champ'[^>]*?>(.*?)</ins>\n*,ims", $texte, $r)
642                AND strlen($x = trim($r[1]))
643                AND $champ != "texte"
644                ) {
645                        if($champ != $champ_source)
646                                $c[$champ] = $x;
647                        $c['texte'] = substr_replace($c['texte'], '', strpos($c['texte'], $r[0]), strlen($r[0]));
648                }
649        }
650
651        // stocker l'id_article en id_source pour permettre le ré-examen des liens [->123]
652        $id_source = $c["id_article"] ;
653
654        // attention les conflits               
655        unset($c["id_article"]);
656        unset($c["id_secteur"]);
657        unset($c["id_rubrique"]);
658
659        // Si des <ins> qui ne correspondent pas à des champs connus sont toujours là on les ajoute dans le champs metadonnees ou a défaut ostensiblement en haut du texte.
660        if (preg_match_all(",<ins[^>]+class='(.*?)'>(.*?)</ins>,ims", $c['texte'], $z, PREG_SET_ORDER)){
661                foreach($z as $d){
662                        if(!in_array("metadonnees", $champs_article)){
663                                $c['texte'] = "@@" . strtoupper($d[1]) . "\n" . $d[2] . "\n\n" . $c['texte'] ;
664                                $c['texte'] = substr_replace($c['texte'], '', strpos($c['texte'], $d[0]), strlen($d[0]));
665                        }else{
666                                $c['metadonnees'] = $d[0] . "\n" . $c['metadonnees'] ;
667                                $c['texte'] = substr_replace($c['texte'], '', strpos($c['texte'], $d[0]), strlen($d[0]));
668                        }
669                }
670        }
671       
672        $c['texte'] = preg_replace("/\n\n+/m", "\n\n", $c['texte']);
673       
674        if(in_array("id_source", $champs_article))
675                $c['id_source'] = $id_source ;
676
677        $r = array();
678        foreach ($c as $var => $val)
679                $r[$var] = trim($val);
680
681        //var_dump($r,$id_article);
682        //exit ;
683
684        sql_updateq("spip_articles", $r, "id_article=" . $id_article);
685       
686        return $id_article;
687}
688
689
690?>
Note: See TracBrowser for help on using the repository browser.