Changeset 9594 in spip-zone


Ignore:
Timestamp:
Feb 11, 2007, 10:23:03 PM (13 years ago)
Author:
cedric@…
Message:

"traitement des spip_documents_left/right/center
prise en compte des spip_doc_titre et descriptif
generation du meta.xml
attention aux text-box lors du reparagraphage
reorganisation en cours"

Location:
_plugins_/_dev_/export_odt
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/_dev_/export_odt/export_odf.html

    r9486 r9594  
    1 <?php
    2 spipodf_envoyer("[(#ENV*|spip2odt)]");
     1#SET{res,(#ENV*|spip2odt)}<?php
     2spipodf_envoyer("[(#GET{res}|reset)]","[(#GET{res}|end)]");
    33?>
  • _plugins_/_dev_/export_odt/exportodf_fonctions.php

    r9486 r9594  
    1 <?
    2 
     1<?php
     2include_spip('inc/odt_api');
     3$GLOBALS['debug_oasis']=true;
    34function env2url($env){
    45        if (is_string($env)) $env = unserialize($env);
     
    1112
    1213function spip2odt($env){
    13         include_spip('inc/odt_api');
    1414        if (is_string($env)) $env = unserialize($env);
    1515        if (isset($env['fond'])) unset($env['fond']);
     
    2727                unset($env['nom_fichier']);
    2828        }
    29         include_spip("inc/charsets");
    30         $nom_fichier = preg_replace(",[^\w],","_",translitteration($nom_fichier)).".odt";
    31         $nom_fichier = preg_replace(",_[_]+,","_",$nom_fichier).".odt";
    32        
    33         $template = find_in_path("templates/$template");
    34         if (!strlen($template))
    35                 return;
    36         $unzip = spipodf_unzip($template);
    37         // styliser
    38         spip2odt_styliser_contenu($unzip,$env);
    39        
    40        
    41         $odt = spipodf_zip($unzip,_DIR_TMP . $nom_fichier);
    42         return $odt;
     29        return spipodf_recuperer_fond($template,$env,$nom_fichier);
    4330}
    4431
     32$GLOBALS['spip_matrice']['image_resolution'] = '';
     33function image_resolution($img,$dpi){
     34        list($hauteur,$largeur) = taille_image($img);
     35        $largeur = round($largeur*72/$dpi);
     36        $hauteur = round($hauteur*72/$dpi);
     37        return image_tag_changer_taille($img,$largeur,$hauteur);
     38}
    4539?>
  • _plugins_/_dev_/export_odt/inc/odf_api.php

    r9469 r9594  
    44function spipodf_unzip($fichier){
    55        include_spip('inc/pclzip');
    6         $repodf = sous_repertoire(_DIR_TMP,'odf');
     6        $repodf = sous_repertoire(_DIR_TMP,'oasis');
    77        $sous_rep = basename($fichier)."/";
    88
     
    3232}
    3333
    34 function spipodf_envoyer($fichier){
     34// ecrire le meta.xml a partir du template meta.xml.html
     35function spipodf_ecrire_meta($odf_dir,$contexte){
     36        // calculer le fond
     37        include_spip('inc/assembler');
     38        $texte = recuperer_fond("templates/meta.xml",$contexte);
     39        ecrire_fichier($odf_dir."meta.xml",$texte,true);
     40}
     41
     42function spipodf_recuperer_fond($template,$contexte,$nom_fichier){
     43        if (!preg_match(",[.](od[tpgbf])$,i",$template,$regs))
     44                return false;
     45        $extension = strtolower($regs[1]);
     46        include_spip("inc/charsets");
     47        $nom_fichier = preg_replace(",[^\w],","_",translitteration($nom_fichier));
     48        $nom_fichier = preg_replace(",_[_]+,","_",$nom_fichier);
     49       
     50        $contexte['fond']=$template;
     51       
     52        $nom_cache = $nom_fichier."-".substr(md5(serialize($contexte)),0,16).".$extension";
     53        $nom_fichier .= ".$extension";
     54        $repcache = sous_repertoire(_DIR_CACHE,'oasis');
     55        $cache = $repcache.$nom_cache;
     56        $template = find_in_path("templates/$template");
     57        if (!file_exists($cache)
     58                OR ($fmt=filemtime($cache))<time()-24*3600
     59                OR $fmt<filemtime($template)
     60                OR $GLOBALS['debug_oasis']
     61                ){
     62                if (!strlen($template))
     63                        return;
     64                $styliser = charger_fonction("spip2{$extension}_styliser",'inc');
     65                $unzip = spipodf_unzip($template);
     66                // styliser un odf
     67                $styliser($unzip,$contexte);
     68                $cache = spipodf_zip($unzip,$cache);
     69        }
     70        return array($cache,$nom_fichier);
     71}
     72
     73function spipodf_envoyer($fichier, $alias = NULL){
     74        if ($alias==NULL) $alias=basename($fichier);
    3575        if (!preg_match(",[.](od[tpgbf])$,i",$fichier,$regs))
    3676                return false;
     
    4484        header('Cache-Control: max-age=36000');
    4585        header('Pragma: public');
    46         header('Content-Disposition: attachment; filename=' . basename($fichier));
     86        header('Content-Disposition: attachment; filename=' . $alias);
    4787        readfile($fichier);
    4888        exit;
  • _plugins_/_dev_/export_odt/inc/odt_api.php

    r9542 r9594  
    1313
    1414// retablir les boucles et autres tags du squelette
    15 function spip2odt_styliser_contenu($odf_dir, $contexte){
     15function inc_spip2odt_styliser($odf_dir, $contexte){
    1616        // lire le content
    1717        lire_fichier($odf_dir."content.xml",$texte);
     
    5050
    5151        ecrire_fichier($odf_dir."content.xml",$texte);
     52       
     53        spipodf_ecrire_meta($odf_dir,$contexte);
    5254}
    5355
     
    219221}
    220222
     223function spip2odt_imagedraw($dir,$img,$align='left',$titre="",$descriptif="",$href="",$title=""){
     224        static $image_nb = 0;
     225        $insert = "";
     226        $src = extraire_attribut($img,'src');
     227        $alt = extraire_attribut($img,'alt');
     228        list($height,$width)=taille_image($img);
     229        $height = round(intval($height)/38.3378,2);
     230        $width = round(intval($width)/38.3378,2);
     231        $fichier = copie_locale($src);
     232        if (!$ok = @copy($fichier, $dir.basename($fichier))){
     233                $fichier = copie_locale(url_absolue($src)); // essayer en http
     234                $ok = @copy($fichier, $dir.basename($fichier));
     235        }
     236        if ($ok){
     237                $image_nb++;
     238                $src = basename($dir)."/".basename($fichier);
     239                $insert = '<draw:frame draw:style-name="spip_documents_'.$align.'" draw:name="Image'
     240                  .$image_nb.'" text:anchor-type="paragraph" svg:width="'
     241                  .$width.'cm" svg:height="'.$height.'cm" draw:z-index="0"><draw:image xlink:href="'
     242                  .$src.'" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/>'
     243                  . ($alt?"<svg:desc>$alt</svg:desc>":'')
     244                  . '</draw:frame>';
     245                 
     246                if ($href){
     247                        $insert = '<draw:a xlink:type="simple" xlink:href="'.$href.'" office:name="'.$title.'">'
     248                         . $insert
     249                         . '</draw:a>';
     250                }
     251                // un caption ?
     252                if ($titre OR $descriptif){
     253                        $insert = '<draw:frame draw:style-name="spip_documents_'.$align.'" '
     254                        . 'draw:name="Frame1" text:anchor-type="paragraph" svg:x="0cm" svg:y="0cm" svg:width="'
     255                        . max($width,5).'cm" svg:height="'
     256                        . $height.'cm" style:rel-height="scale-min" draw:z-index="0"><draw:text-box>'
     257                        . '<text:p text:style-name="'.($titre?'spip_doc_titre':'spip_doc_descriptif').'">'
     258                        . $insert
     259                        . ($titre?($titre.($descriptif?'</text:p><text:p text:style-name="spip_doc_descriptif">':'')):'')
     260                        . $descriptif
     261                        . '</text:p></draw:text-box></draw:frame>';
     262                }
     263        }
     264        else spip_log("erreur copy $fichier vers ".$dir.basename($fichier));
     265        return $insert;
     266}
     267
    221268function spip2odt_convertir_images($texte,$dossier){
     269        //$puce = str_replace("toto","",propre("\n- toto"));
    222270        $dir = sous_repertoire($dossier,'Pictures');
    223271        include_spip('inc/distant');
    224         static $image_nb = 0;
    225272        $split = preg_split(',(<[a-z]+\s[^<>]*spip_documents[^<>]*>),Uims',$texte,null,PREG_SPLIT_DELIM_CAPTURE);
    226         $texte = array_shift($split);
     273        $class = "";
     274        $texte = "";
    227275        while (count($split)){
    228                 $texte .= $tag=array_shift($split);
    229276                $frag = array_shift($split);
    230                 $class = extraire_attribut($tag, 'class');
    231                 if (preg_match_all(',((<a [^<>]*>)?\s*(<img\s.*>)),UimsS', $frag, $regs,PREG_SET_ORDER)!==FALSE) {
     277                if (preg_match_all(
     278                  ','
     279                  .'(<([b-z][a-z]*)[^<>]*>)?'
     280                  .'(<a [^<>]*>)?\s*(<img\s[^<>]*>)(\s*</a>)?'
     281                  .'(\s*</\\2>)?'
     282                  .'(\s*<([a-z]+)[^<>]*spip_doc_titre[^<>]*>(.*?)</\\8>)?'
     283                  .'(\s*<([a-z]+)[^<>]*spip_doc_descriptif[^<>]*>(.*?)</\\11>)?'
     284                  .',imsS',
     285                   $frag, $regs,PREG_SET_ORDER)!==FALSE) {
     286                        //if ($class && count($regs) && !count($split)) {var_dump($frag);var_dump($regs);die;}
    232287                        foreach($regs as $reg){
    233288                                // En cas de span spip_documents_xx recuperer la class
    234                                 $src = extraire_attribut($reg[3],'src');
    235                                 $height = round(intval(extraire_attribut($reg[3],'height'))/28.3378,2);
    236                                 $width = round(intval(extraire_attribut($reg[3],'width'))/28.3378,2);
    237                                 $fichier = copie_locale($src);
    238                                 if (!$ok = @copy($fichier, $dir.basename($fichier))){
    239                                         $fichier = copie_locale(url_absolue($src)); // essayer en http
    240                                         $ok = @copy($fichier, $dir.basename($fichier));
     289                                $align = 'left'; // comme ca c'est bon pour les puces :)
     290                                $href = "";
     291                                $title = "";
     292                                if ($class AND preg_match(',spip_documents_(left|right|center),i',$class,$match))
     293                                        $align = $match[1];
     294                                if ($reg[3]){
     295                                        $href = extraire_attribut($reg[3],'href');
     296                                        $title = extraire_attribut($reg[3],'title');
    241297                                }
    242                                 if ($ok){
    243                                         $align = 'left';
    244                                         if (preg_match(',spip_documents_(left|right|center),i',$class,$match))
    245                                                 $align = $match[1];
    246                                         $image_nb++;
    247                                         $src = "Pictures/".basename($fichier);
    248                                         $insert = '<draw:frame draw:style-name="spip_documents_'.$align.'" draw:name="Image'
    249                                           .$image_nb.'" text:anchor-type="paragraph" svg:width="'
    250                                           .$width.'cm" svg:height="'.$height.'cm" draw:z-index="0"><draw:image xlink:href="'
    251                                           .$src.'" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/></draw:frame>';
    252                                         if ($reg[2]){
    253                                                 $href = extraire_attribut($reg[2],'href');
    254                                                 if ($href) $insert .= $reg[2]. $href;
    255                                         }
    256                                         $frag = str_replace($reg[0], $insert, $frag);
    257                                 }
    258                                 else spip_log("erreur copy $fichier vers ".$dir.basename($fichier));
     298                                $insert = spip2odt_imagedraw($dir,$reg[4],$align,isset($reg[9])?$reg[9]:"",isset($reg[12])?$reg[12]:"",$href,$title);
     299                                $frag = str_replace($reg[0], $insert, $frag);
    259300                                $class="";
    260301                        }
    261302                }
    262303                $texte .= $frag;
     304                $texte .= $tag=array_shift($split);
     305                $class = extraire_attribut($tag, 'class');
    263306        }
    264307        return $texte;
     
    287330
    288331function spip2odt_reparagrapher($texte){
     332        // avant de reparagrapher, echappons les paragraphes dans les <draw:text-box><text:p>
     333        $split = preg_split(',(<draw:text-box[^<>]*>.*</draw:text-box>),Uims',$texte,null,PREG_SPLIT_DELIM_CAPTURE);
     334        //var_dump($split);die();
     335        $texte = array_shift($split);
     336        $texte_boxes=array();
     337        while (count($split)){
     338                $i = "@T@E@X@T@B@O@X@".count($texte_boxes)."@";
     339                $texte_boxes[$i] = array_shift($split);
     340                $texte .= $i . array_shift($split);
     341        }
    289342
    290343        // Ajouter un espace aux <p> et un "STOP P"
     
    321374        $texte = preg_replace(',<text:span\s*>(.*)</text:span>,UiS', '\\1',
    322375                $texte);
     376               
     377        // remettre les text-boxes
     378        $texte = str_replace(array_keys($texte_boxes),array_values($texte_boxes),$texte);
    323379        return $texte;
    324380}
  • _plugins_/_dev_/export_odt/templates/styles.xml

    r9542 r9594  
    6464<style:style style:name="spip_code" style:display-name="Code" style:family="text"><style:text-properties style:font-name="Courier" fo:font-size="11pt"/></style:style>
    6565
     66<style:style style:name="spip_doc_titre" style:display-name="spip_doc_titre" style:family="paragraph" style:parent-style-name="Caption">
     67<style:paragraph-properties fo:margin-top="0.21cm" fo:margin-bottom="0.0cm" fo:text-align="center" style:justify-single-word="false"/>
     68</style:style>
     69<style:style style:name="spip_doc_descriptif" style:display-name="spip_doc_descriptif" style:family="paragraph" style:parent-style-name="Caption" style:master-page-name="">
     70<style:paragraph-properties fo:margin-top="0.0cm" fo:margin-bottom="0.21cm" fo:text-align="center" style:justify-single-word="false" style:shadow="none"/>
     71<style:text-properties fo:font-weight="normal" style:font-weight-asian="normal" style:font-weight-complex="normal"/>
     72</style:style>
     73
    6674<text:list-style style:name="spip_ol" style:display-name="Listes numerotees">
    6775<text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" style:num-suffix="." style:num-format="1">
Note: See TracChangeset for help on using the changeset viewer.