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

Last change on this file since 107728 was 107728, checked in by booz@…, 3 years ago

conserver les id_article avec l'option -c oui

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