Changeset 46197 in spip-zone


Ignore:
Timestamp:
Mar 31, 2011, 8:43:47 AM (9 years ago)
Author:
cedric@…
Message:

Integration de TextWheel? dans SPIP, avec report des modifs inc/lien et inc/texte propres a la branche 2.3
Il reste a nettoyer le code en double entre l'extension et le core,
en laissant dans l'extension ce qui est purement de la typo
et en injectant dans le core une version minmaliste pour que cela fonctionne sans l'extension.

Location:
_core_/plugins/textwheel
Files:
3 edited
1 copied

Legend:

Unmodified
Added
Removed
  • _core_/plugins/textwheel/inc/lien.php

    r41210 r46197  
    44 *  SPIP, Systeme de publication pour l'internet                           *
    55 *                                                                         *
    6  *  Copyright (c) 2001-2010                                                *
     6 *  Copyright (c) 2001-2011                                                *
    77 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
    88 *                                                                         *
     
    1111\***************************************************************************/
    1212
    13 if (!defined("_ECRIRE_INC_VERSION")) return;
     13if (!defined('_ECRIRE_INC_VERSION')) return;
    1414
    1515include_spip('base/abstract_sql');
     
    3030        // - [{en}->art2] => traduction anglaise de l'article 2, sinon art 2
    3131        // - [{}->art2] => traduction en langue courante de l'art 2, sinon art 2
     32        // s'applique a tout objet traduit
    3233        if ($hlang
    3334        AND $match = typer_raccourci($lien)) {
    34                 @list($type,,$id,,$args,,$ancre) = $match;
    35                 if ($id_trad = sql_getfetsel('id_trad', 'spip_articles', "id_article=$id")
    36                 AND $id_dest = sql_getfetsel('id_article', 'spip_articles',
    37                         "id_trad=$id_trad AND lang=" . sql_quote($hlang))
     35                @list($type,,$id,,$args,,$ancre) = $match;
     36                $table_objet_sql = table_objet_sql($type);
     37                $id_table_objet = id_table_objet($type);
     38                if ($row=sql_fetsel('*', $table_objet_sql, "$id_table_objet=".intval($id))
     39                        AND isset($row['id_trad'])
     40                        AND isset($row['lang'])
     41                        AND $id_dest = sql_getfetsel($id_table_objet, $table_objet_sql,"id_trad=".intval($row['id_trad'])." AND lang=" . sql_quote($hlang))
     42                        AND objet_test_si_publie($type,$id_dest)
    3843                )
    3944                        $lien = "$type$id_dest";
     
    283288}
    284289
    285 // Fonction pour les champs chapo commencant par =,  redirection qui peut etre:
    286 // 1. un raccourci Spip habituel (premier If) [texte->TYPEnnn]
    287 // 2. un ultra raccourci TYPEnnn voire nnn (article) (deuxieme If)
    288 // 3. une URL std
    289 // renvoie une tableau structure comme ci-dessus mais sans calcul d'URL
    290 // (cf fusion de sauvegardes)
    291290
    292291define('_RACCOURCI_CHAPO', '/^(\W*)(\W*)(\w*\d+([?#].*)?)$/');
    293 
    294 // http://doc.spip.org/@chapo_redirige
    295 function chapo_redirige($chapo, $url=false)
    296 {
    297         if (!preg_match(_RACCOURCI_LIEN, $chapo, $m))
    298                 if (!preg_match(_RACCOURCI_CHAPO, $chapo, $m))
    299                         return $chapo;
     292/**
     293 * Fonction pour les champs virtuels de redirection qui peut etre:
     294 * 1. un raccourci Spip habituel (premier If) [texte->TYPEnnn]
     295 * 2. un ultra raccourci TYPEnnn voire nnn (article) (deuxieme If)
     296 * 3. une URL std
     297 *
     298 * renvoie l'url reelle de redirection si le $url=true,
     299 * l'url brute contenue dans le chapo sinon
     300 *
     301 * http://doc.spip.org/@chapo_redirige
     302 *
     303 * @param string $virtuel
     304 * @param bool $url
     305 * @return string
     306 */
     307function virtuel_redirige($virtuel, $url=false){
     308        if (!strlen($virtuel)) return '';
     309        if (!preg_match(_RACCOURCI_LIEN, $virtuel, $m))
     310                if (!preg_match(_RACCOURCI_CHAPO, $virtuel, $m))
     311                        return $virtuel;
    300312
    301313        return !$url ? $m[3] : traiter_lien_implicite($m[3]);
    302314}
    303315
    304 // Ne pas afficher le chapo si article virtuel
    305 // http://doc.spip.org/@nettoyer_chapo
    306 function nettoyer_chapo($chapo){
    307         return (substr($chapo,0,1) == "=") ? '' : $chapo;
    308 }
    309 
    310 // http://doc.spip.org/@chapo_redirigetil
    311 function chapo_redirigetil($chapo) { return $chapo && $chapo[0] == '=';}
    312316
    313317// Cherche un lien du type [->raccourci 123]
     
    340344                $texte = str_replace('"', '', $lien);
    341345                // evite l'affichage de trops longues urls.
    342                 // personnalisation possible dans mes_options
    343                 $long_url = defined('_MAX_LONG_URL') ? _MAX_LONG_URL : 40;
    344                 $coupe_url = defined('_MAX_COUPE_URL') ? _MAX_COUPE_URL : 35;
    345                 if (strlen($texte)>$long_url) {
    346                         $texte = substr($texte,0,$coupe_url).'...';
    347                 }
     346                $lien_court = charger_fonction('lien_court', 'inc');
     347                $texte = $lien_court($texte);
    348348                $texte = "<html>".quote_amp($texte)."</html>";
    349349        }
     
    371371        return $url;
    372372}
    373 
    374 
    375 /* fonction valable pour SPIP 2.1 seulement [ en 2.3 elle est definie dans l'extension "Sites" ] // */
    376 function liens_implicite_site_dist($texte,$id,$type,$args,$ancre,$connect=''){
    377         if (!$id = intval($id))
    378                 return false;
    379         $url = sql_getfetsel('url_site', 'spip_syndic', "id_syndic=".intval($id),'','','','',$connect);
    380         return $url;
    381 }
    382 /* fin exception spip 2.1 */
    383 
    384373
    385374// http://doc.spip.org/@traiter_lien_implicite
     
    506495
    507496                        // calculer le modele
    508                         # hack articles_edit, breves_edit, indexation
     497                        # hack indexation
    509498                        if ($doublons)
    510499                                $texte .= preg_replace(',[|][^|=]*,s',' ',$params);
  • _core_/plugins/textwheel/inc/texte.php

    r44464 r46197  
    44 *  SPIP, Systeme de publication pour l'internet                           *
    55 *                                                                         *
    6  *  Copyright (c) 2001-2010                                                *
     6 *  Copyright (c) 2001-2011                                                *
    77 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
    88 *                                                                         *
     
    1111\***************************************************************************/
    1212
    13 if (!defined("_ECRIRE_INC_VERSION")) return;
     13if (!defined('_ECRIRE_INC_VERSION')) return;
    1414
    1515include_spip('inc/filtres');
     
    7171// XHTML - Preserver les balises-bloc : on liste ici tous les elements
    7272// dont on souhaite qu'ils provoquent un saut de paragraphe
    73 define('_BALISES_BLOCS',
    74         'div|pre|ul|ol|li|blockquote|h[1-6r]|'
    75         .'t(able|[rdh]|body|foot|extarea)|'
     73
     74if (!defined('_BALISES_BLOCS')) define('_BALISES_BLOCS',
     75        'p|div|pre|ul|ol|li|blockquote|h[1-6r]|'
     76        .'t(able|[rdh]|head|body|foot|extarea)|'
    7677        .'form|object|center|marquee|address|'
     78        .'applet|iframe|'
    7779        .'d[ltd]|script|noscript|map|button|fieldset|style');
     80
     81if (!defined('_BALISES_BLOCS_REGEXP'))
     82        define('_BALISES_BLOCS_REGEXP',',</?('._BALISES_BLOCS.')[>[:space:]],iS');
    7883
    7984//
     
    8590// echappe est un div ou un span
    8691// http://doc.spip.org/@code_echappement
    87 function code_echappement($rempl, $source='', $no_transform=false) {
     92function code_echappement($rempl, $source='', $no_transform=false, $mode=NULL) {
    8893        if (!strlen($rempl)) return '';
    8994
    9095        // Tester si on echappe en span ou en div
    91         $mode = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $rempl) ?
    92                 'div' : 'span';
    93         $return = '';
     96        if (is_null($mode) OR !in_array($mode,array('div','span')))
     97                $mode = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $rempl) ? 'div' : 'span';
    9498
    9599        // Decouper en morceaux, base64 a des probleme selon la taille de la pile
     
    120124function traiter_echap_code_dist($regs) {
    121125        list(,,$att,$corps) = $regs;
    122         $echap = htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
     126        $echap = htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code ! 
    123127
    124128        // ne pas mettre le <div...> s'il n'y a qu'une ligne
     
    178182                return $letexte;
    179183
    180         if (($preg OR strpos($letexte,"<")!==false) 
     184        if (($preg OR strpos($letexte,"<")!==false)
    181185          AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER))
    182186                foreach ($matches as $regs) {
     
    253257
    254258// http://doc.spip.org/@echappe_retour_modeles
    255 function echappe_retour_modeles($letexte, $interdire_scripts=false){
     259function echappe_retour_modeles($letexte, $interdire_scripts=false)
     260{
    256261        $letexte = echappe_retour($letexte);
    257262
    258263        // Dans les appels directs hors squelette, securiser aussi ici
    259264        if ($interdire_scripts)
    260                 $letexte = interdire_scripts($letexte,true);
     265                $letexte = interdire_scripts($letexte);
    261266
    262267        return trim($letexte);
    263268}
     269
    264270
    265271// http://doc.spip.org/@couper
     
    298304        $texte = nettoyer_raccourcis_typo($texte);
    299305
    300         // corriger la longueur de coupe
     306        // corriger la longueur de coupe 
    301307        // en fonction de la presence de caracteres utf
    302308        if ($GLOBALS['meta']['charset']=='utf-8'){
     
    382388// http://doc.spip.org/@interdire_scripts
    383389function interdire_scripts($arg) {
     390        // on memorise le resultat sur les arguments non triviaux
    384391        static $dejavu = array();
    385392        static $wheel = null;
    386393
    387394        // Attention, si ce n'est pas une chaine, laisser intact
    388         if (!$arg OR !is_string($arg) OR !strstr($arg, '<')) return $arg;
     395        if (!$arg OR !is_string($arg) OR !strstr($arg, '<')) return $arg;
     396
    389397        if (isset($dejavu[$GLOBALS['filtrer_javascript']][$arg])) return $dejavu[$GLOBALS['filtrer_javascript']][$arg];
    390398
     
    418426        static $safehtml;
    419427
     428        if (!$t OR !is_string($t))
     429                return $t;
    420430        # attention safehtml nettoie deux ou trois caracteres de plus. A voir
    421431        if (strpos($t,'<')===false)
     
    462472        // NOTE : propre() ne passe pas par ici mais directement par corriger_typo
    463473        // cf. inc/lien
     474
    464475        $letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '', $connect);
    465476        if ($letexte != $mem) $echapper = true;
     
    535546//
    536547
    537 define('_RACCOURCI_TH_SPAN', '\s*(?:{{[^{}]+}}\s*)?|<');
     548define('_RACCOURCI_TH_SPAN', '\s*(:?{{[^{}]+}}\s*)?|<');
    538549
    539550// http://doc.spip.org/@traiter_tableau
    540551function traiter_tableau($bloc) {
     552        // id "unique" pour les id du tableau
     553        $tabid = substr(md5($bloc),0,4);
    541554
    542555        // Decouper le tableau en lignes
     
    549562        // Traiter chaque ligne
    550563        $reg_line1 = ',^(\|(' . _RACCOURCI_TH_SPAN . '))+$,sS';
    551         $reg_line_all = ',^'  . _RACCOURCI_TH_SPAN . '$,sS';
     564        $reg_line_all = ',^('  . _RACCOURCI_TH_SPAN . ')$,sS';
     565        $hc = $hl = array();
    552566        foreach ($regs[1] as $ligne) {
    553567                $l ++;
     
    565579                // - <thead> sous la forme |{{titre}}|{{titre}}|
    566580                //   Attention thead oblige a avoir tbody
    567                         else if (preg_match($reg_line1, $ligne)) {
     581                        else if (preg_match($reg_line1, $ligne, $thead)) {
    568582                                preg_match_all('/\|([^|]*)/S', $ligne, $cols);
    569583                                $ligne='';$cols= $cols[1];
     
    580594                                          // inutile de garder le strong qui n'a servi que de marqueur
    581595                                          $cols[$c] = str_replace(array('{','}'), '', $cols[$c]);
    582                                           $ligne= "<th scope='col'$attr>$cols[$c]</th>$ligne";
     596                                          $ligne= "<th id='id{$tabid}_c$c' $attr>$cols[$c]</th>$ligne";
     597                                                $hc[$c] = "id{$tabid}_c$c"; // pour mettre dans les headers des td
    583598                                        }
    584599                                }
     
    612627        $n = count($lignes[0]);
    613628        $k = count($lignes);
     629        // distinguer les colonnes numeriques a point ou a virgule,
     630        // pour les alignements eventuels sur "," ou "."
     631        $numeric_class = array('.'=>'point',','=>'virgule');
    614632        for($i=0;$i<$n;$i++) {
    615633          $align = true;
    616           for ($j=0;$j<$k;$j++) $rowspans[$j][$i] = 1;
    617634          for ($j=0;$j<$k;$j++) {
    618             $cell = trim($lignes[$j][$i]);
    619             if (preg_match($reg_line_all, $cell)) {
    620                 if (!preg_match('/^\d+([.,]?)\d*$/', $cell, $r))
    621                   { $align = ''; break;}
    622                 else if ($r[1]) $align = $r[1];
    623               }
     635                  $rowspans[$j][$i] = 1;
     636                        if ($align AND preg_match('/^\d+([.,]?)\d*$/', trim($lignes[$j][$i]), $r)){
     637                                if ($r[1])
     638                                        $align = $r[1];
     639                        }
     640                        else
     641                                $align = '';
    624642          }
    625           $numeric[$i] = !$align ? '' :
    626             (" style='text-align: " .
    627              // http://www.w3.org/TR/REC-CSS2/tables.html#column-alignment
    628              // specifie text-align: "," pour cadrer le long de la virgule
    629              // mais les navigateurs ne l'implementent pas ou mal
    630              (/* $align !== true ?"\"$align\"" : */ 'right') .
    631              "'");
    632         }
     643          $numeric[$i] = $align ? (" class='numeric ".$numeric_class[$align]."'") : '';
     644        }
     645        for ($j=0;$j<$k;$j++) {
     646                if (preg_match($reg_line_all, $lignes[$j][0])) {
     647                        $hl[$j] = "id{$tabid}_l$j"; // pour mettre dans les headers des td
     648                }
     649                else
     650                        unset($hl[0]);
     651        }
     652        if (!isset($hl[0]))
     653                $hl = array(); // toute la colonne ou rien
    633654
    634655        // et on parcourt le tableau a l'envers pour ramasser les
     
    642663
    643664                for($c=count($cols)-1; $c>=0; $c--) {
    644                         $attr= $numeric[$c];
     665                        $attr= $numeric[$c]; 
    645666                        $cell = trim($cols[$c]);
    646667                        if($cell=='<') {
     
    658679                                $attr.= " rowspan='$x'";
    659680                          }
    660                           $ligne= "\n<td".$attr.'>'.$cols[$c].'</td>'.$ligne;
     681                                $h = (isset($hc[$c])?$hc[$c]:'').' '.(isset($hl[$l])?$hl[$l]:'');
     682                                if ($h=trim($h))
     683                                        $attr.=" headers='$h'";
     684                                $b = ($c==0 AND isset($hl[$l]))?'th':'td';
     685                                // inutile de garder le strong qui n'a servi que de marqueur
     686                                if ($b=='th')
     687                                        $cols[$c] = str_replace(array('{','}'), '', $cols[$c]);
     688                          $ligne= "\n<$b".$attr.'>'.$cols[$c]."</$b>".$ligne;
    661689                        }
    662690                }
     
    793821        strstr($letexte,'<') AND preg_match(',<p\b,iS',$letexte)
    794822        )) {
     823                // toujours ouvrir un parapgraphe derriere une balise bloc fermante
     824                // Fermer les paragraphes (y compris sur "STOP P")
     825                $letexte = preg_replace(',</('._BALISES_BLOCS.')[^>]*>\s*?,UimsS',"\\0<p>", $letexte);
    795826
    796827                // Ajouter un espace aux <p> et un "STOP P"
     
    801832                // Fermer les paragraphes (y compris sur "STOP P")
    802833                $letexte = preg_replace(',(<p\s.*)(</?(STOP P|'._BALISES_BLOCS.')[>[:space:]]),UimsS',
    803                         "\n\\1</p>\n\\2", $letexte);
     834                        "\\1</p>\n\\2", $letexte);
    804835
    805836                // Supprimer les marqueurs "STOP P"
     
    816847
    817848                // Renommer les paragraphes normaux
    818                 $letexte = str_replace('<p >', "<p$class_spip>",
     849                $letexte = str_replace('<p >', "\n<p$class_spip>",
    819850                        $letexte);
    820 
    821851        }
    822852
     
    846876function traiter_retours_chariots($letexte) {
    847877        $letexte = preg_replace(",\r\n?,S", "\n", $letexte);
    848         $letexte = preg_replace(",<p[>[:space:]],iS", "\n\n$0", $letexte);
    849         $letexte = preg_replace(",</p[>[:space:]],iS", "$0\n\n", $letexte);
     878        $letexte = preg_replace(",<p[>[:space:]],iS", "\n\n\\0", $letexte);
     879        $letexte = preg_replace(",</p[>[:space:]],iS", "\\0\n\n", $letexte);
    850880        return $letexte;
    851881}
  • _core_/plugins/textwheel/plugin.xml

    r44630 r46197  
    11<plugin>
    22        <nom>TextWheel pour SPIP</nom>
    3         <auteur>Fil &amp; Cerdic</auteur>
     3        <auteur>Collectif SPIP</auteur>
    44        <icon>textwheel-64.png</icon>
    55        <licence>GNU/GPL</licence>
     
    99        <prefix>tw</prefix>
    1010        <categorie>outil</categorie>
    11         <necessite id="SPIP" version="[2.1.0;]" />
     11        <necessite id="SPIP" version="[2.3.0-dev;]" />
    1212        <utilise id="yaml" version="[1.3;]" />
    1313        <utilise id="memoization" version="[0.9;]" />
Note: See TracChangeset for help on using the changeset viewer.