Changeset 5415 in spip-zone


Ignore:
Timestamp:
Sep 16, 2006, 7:33:19 PM (15 years ago)
Author:
real3t@…
Message:

Suivre la SVN sur SPIP (http://trac.rezo.net/trac/spip/changeset/7413) et sur la Zone (http://zone.spip.org/trac/spip-zone/changeset/5412)

Remarque : ce inc/texte.php n'aura plus de raison d'être dans ce squelette dès que la version stable de SPIP sera celle d'où ce inc/texte.php est extrait *à l'identique*.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _squelettes_/soyezcreateurs_net/squelettes/inc/texte.php

    r5402 r5415  
    8484// http://doc.spip.org/@nettoyer_chapo
    8585function nettoyer_chapo($chapo){
    86         if (substr($chapo,0,1) == "="){
    87                 $chapo = "";
    88         }
    89         return $chapo;
     86        return (substr($chapo,0,1) == "=") ? '' : $chapo;
    9087}
    9188
     
    10097// http://doc.spip.org/@code_echappement
    10198function code_echappement($rempl, $source='') {
     99        if (!strlen($rempl)) return '';
     100
    102101        // Convertir en base64
    103102        $base64 = base64_encode($rempl);
     
    117116// http://doc.spip.org/@echappe_html
    118117function echappe_html($letexte, $source='', $no_transform=false,
    119 $preg=',<(html|code|cadre|frame)>(.*)</\1>,UimsS') {
     118$preg='') {
     119        if (!strlen($letexte)) return '';
     120
     121        if (!$preg) $preg = ',<(html|code|cadre|frame|script)'
     122                        .'(\s[^>]*)?'
     123                        .'>(.*)</\1>,UimsS';
    120124        if (preg_match_all(
    121125        $preg,
    122126        $letexte, $matches, PREG_SET_ORDER))
    123127        foreach ($matches as $regs) {
    124 
    125128                // mode d'echappement :
    126129                //    <span class='base64'> . base64_encode(contenu) . </span>
     
    138141                        // Echapper les <html>...</ html>
    139142                        case 'html':
    140                                 $echap = $regs[2];
     143                                $echap = $regs[3];
    141144                                break;
    142145
    143146                        // Echapper les <code>...</ code>
    144147                        case 'code':
    145                                 $echap = entites_html($regs[2]);
     148                                $echap = entites_html($regs[3]);
    146149                                // supprimer les sauts de ligne debut/fin
    147150                                // (mais pas les espaces => ascii art).
     
    166169                        case 'cadre':
    167170                        case 'frame':
    168                                 $echap = trim(entites_html($regs[2]));
     171                                $echap = trim(entites_html($regs[3]));
    169172                                $total_lignes = substr_count($echap, "\n") + 1;
    170173                                $echap = "<form action=\"/\" method=\"get\"><div>"
     
    175178                                break;
    176179
     180                        case 'script':
     181                                $echap = $regs[0];
     182                                break;
     183
    177184                }
    178185
     
    186193                include_spip('inc/math');
    187194                $letexte = traiter_math($letexte, $source);
     195        }
     196
     197        // Echapper le php pour faire joli (ici, c'est pas pour la securite)
     198        if (preg_match_all(
     199        ',<[?].*($|[?]>),UisS',
     200        $letexte, $matches, PREG_SET_ORDER))
     201        foreach ($matches as $regs) {
     202                $letexte = str_replace($regs[0],
     203                        code_echappement(highlight_string($regs[0],true), $source),
     204                        $letexte);
    188205        }
    189206
     
    219236        if (preg_match_all(',[[]([^][]*)->(>?)([^][]*)[]],S', $texte, $regs, PREG_SET_ORDER))
    220237                foreach ($regs as $reg) {
    221                         if (strlen($reg[1]))
    222                                 $titre = $reg[1];
    223                         else
    224                                 $titre= calculer_url($reg[3], $reg[1], 'titre');
     238                        $titre = supprimer_tags(traiter_raccourci_lien($reg));
    225239                        $texte = str_replace($reg[0], $titre, $texte);
    226240                }
    227241
    228242        // supprimer les notes
    229         $texte = ereg_replace("\[\[([^]]|\][^]])*\]\]", "", $texte);
     243        $texte = preg_replace(",\[\[([^]]|\][^]])*\]\],sS", "", $texte);
    230244
    231245        // supprimer les codes typos
    232         $texte = ereg_replace("[}{]", "", $texte);
     246        $texte = str_replace(array('}','{'), '', $texte);
    233247
    234248        // supprimer les tableaux
    235         $texte = ereg_replace("(^|\r)\|.*\|\r", "\r", $texte); 
     249        $texte = preg_replace(",(^|\r)\|.*\|\r,s", "\r", $texte);
    236250        return $texte;
    237251}
     
    335349//
    336350
     351/*
    337352// Securite : empecher l'execution de code PHP ou javascript ou autre malice
    338353// http://doc.spip.org/@interdire_scripts
     
    341356        return $source;
    342357}
     358*/
     359
     360// afficher joliment les <script>
     361function echappe_js($t,$class='') {
     362        if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER))
     363        foreach ($r as $regs)
     364                $t = str_replace($regs[0],
     365                        "<code$class>".nl2br(htmlspecialchars($regs[0])).'</code>',
     366                        $t);
     367        return $t;
     368}
     369
     370// Securite : empecher l'execution de code PHP, en le transformant en joli code
     371// http://doc.spip.org/@interdire_scripts
     372function interdire_scripts($t) {
     373
     374        // rien ?
     375        if (!$t OR !strstr($t, '<')) return $t;
     376
     377        // echapper les tags asp
     378        $t = str_replace('<'.'%', '&lt;%', $t);
     379
     380        // echapper le php
     381        $t = str_replace('<'.'?', '&lt;?', $t);
     382
     383        // Pour le js, trois modes : parano (-1), prive (0), ok (1)
     384        switch($GLOBALS['filtrer_javascript']) {
     385                case 0:
     386                        if (!_DIR_RESTREINT)
     387                                $t = echappe_js($t,' style="color:red"');
     388                        break;
     389                case -1:
     390                        $t = echappe_js($t);
     391                        break;
     392        }
     393
     394        // pas de <base href /> svp !
     395        $t = preg_replace(',<(base\s),iS', '&lt;\1', $t);
     396
     397        return $t;
     398}
    343399
    344400// Securite : utiliser SafeHTML s'il est present dans ecrire/safehtml/
     
    350406        if (strpos($t,'<')===false)
    351407                return str_replace("\x00", '', $t);
     408
     409        $t = interdire_scripts($t);
     410        $t = echappe_js($t);
    352411
    353412        if (!$test) {
     
    474533
    475534        // Plus vite !
    476         if (!strlen($letexte)) return '';
     535        if (!$letexte) return $letexte;
    477536
    478537        // Echapper les codes <html> etc
     
    608667
    609668                        $res = $f($id, $texte, $ancre);
    610                         $res[2] = supprimer_numero($res[2]);
     669                        $res[2] = $res[2];
    611670                        if ($pour == 'titre')
    612671                                return $res[2];
     
    649708                $class = 'spip_ancre';
    650709
    651         return ($pour == 'url') ? $lien : array($lien, $class, $texte);
     710        return ($pour == 'url') ? $lien : array($lien, $class, $texte, $lang);
    652711}
    653712
     
    655714function calculer_url_article($id, $texte='') {
    656715        $lien = generer_url_article($id);
    657         if (!$texte) {
    658                 $row = @spip_fetch_array(spip_query("SELECT titre FROM spip_articles WHERE id_article=$id"));
    659                 $texte = $row['titre'];
    660         }
    661         return array($lien, 'spip_in', $texte);
     716        $row = @spip_fetch_array(spip_query("SELECT titre,lang FROM spip_articles WHERE id_article=$id"));
     717        if ($texte=='')
     718                $texte = supprimer_numero($row['titre']);
     719        return array($lien, 'spip_in', $texte, $row['lang']);
    662720}
    663721
     
    666724{
    667725        $lien = generer_url_rubrique($id);
    668         if (!$texte) {
    669                 $row = @spip_fetch_array(spip_query("SELECT titre FROM spip_rubriques WHERE id_rubrique=$id"));
    670                 $texte = $row['titre'];
    671         }
    672         return array($lien, 'spip_in', $texte);
     726        $row = @spip_fetch_array(spip_query("SELECT titre,lang FROM spip_rubriques WHERE id_rubrique=$id"));
     727        if ($texte=='')
     728                $texte = supprimer_numero($row['titre']);
     729        return array($lien, 'spip_in', $texte, $row['lang']);
    673730}
    674731
     
    677734{
    678735        $lien = generer_url_mot($id);
    679         if (!$texte) {
    680                 $row = @spip_fetch_array(spip_query("SELECT titre FROM spip_mots WHERE id_mot=$id"));
    681                 $texte = $row['titre'];
    682         }
    683         return array($lien, 'spip_in', $texte);
     736        $row = @spip_fetch_array(spip_query("SELECT titre,lang FROM spip_mots WHERE id_mot=$id"));
     737        if ($texte=='')
     738                $texte = supprimer_numero($row['titre']);
     739        return array($lien, 'spip_in', $texte, $row['lang']);
    684740}
    685741
     
    688744{
    689745        $lien = generer_url_breve($id);
    690         if (!$texte) {
    691                 $row = @spip_fetch_array(spip_query("SELECT titre FROM spip_breves WHERE id_breve=$id"));
    692                 $texte = $row['titre'];
    693         }
    694         return array($lien, 'spip_in', $texte);
     746        $row = @spip_fetch_array(spip_query("SELECT titre,lang FROM spip_breves WHERE id_breve=$id"));
     747        if ($texte=='')
     748                $texte = supprimer_numero($row['titre']);
     749        return array($lien, 'spip_in', $texte, $row['lang']);
    695750}
    696751
     
    699754{
    700755        $lien = generer_url_auteur($id);
    701         if (!$texte) {
     756        if ($texte=='') {
    702757                $row = @spip_fetch_array(spip_query("SELECT nom FROM spip_auteurs WHERE id_auteur=$id"));
    703758                $texte = $row['nom'];
    704759        }
    705         return array($lien, 'spip_in', $texte);
     760        return array($lien, 'spip_in', $texte); # pas de hreflang
    706761}
    707762
     
    710765{
    711766        $lien = generer_url_document($id);
    712         if (!$texte) {
     767        if ($texte=='') {
    713768                $row = @spip_fetch_array(spip_query("SELECT titre,fichier FROM spip_documents WHERE id_document=$id"));
    714769                $texte = $row['titre'];
    715                 if (!$texte)
    716                         $texte = ereg_replace("^.*/","",$row['fichier']);
    717         }
    718         return array($lien, 'spip_in', $texte);
     770                if ($texte=='')
     771                        $texte = preg_replace(",^.*/,","",$row['fichier']);
     772        }
     773        return array($lien, 'spip_in', $texte); # pas de hreflang
    719774}
    720775
     
    724779        # attention dans le cas des sites le lien pointe non pas sur
    725780        # la page locale du site, mais directement sur le site lui-meme
    726         $row = @spip_fetch_array(spip_query("SELECT nom_site,url_site FROM spip_syndic WHERE id_syndic=$id"));
     781        $row = @spip_fetch_array(spip_query("SELECT nom_site,url_site,lang FROM spip_syndic WHERE id_syndic=$id"));
    727782        if ($row) {
    728783                $lien = $row['url_site'];
    729                 if (!$texte)
    730                         $texte = $row['nom_site'];
    731         }
    732         return array($lien, 'spip_out', $texte);
     784                if ($texte=='')
     785                        $texte = supprimer_numero($row['nom_site']);
     786        }
     787        return array($lien, 'spip_out', $texte, $row['lang']);
    733788}
    734789
     
    10141069// http://doc.spip.org/@paragrapher
    10151070function paragrapher($letexte) {
     1071        if (!$letexte OR !strstr($letexte,'<')) return $letexte;
    10161072
    10171073        if (preg_match(',<p[>[:space:]],iS',$letexte)) {
     
    10521108// $regs:
    10531109// 0=>tout le raccourci
    1054 // 1=>texte
     1110// 1=>texte (ou texte|hreflang ou texte|bulle ou texte|bulle{hreflang})
    10551111// 2=>double fleche (historiquement, liens ouvrants)
    10561112// 3=>url
    10571113//
    10581114function traiter_raccourci_lien($regs) {
    1059         list($lien, $class, $texte) = calculer_url($regs[3], $regs[1], 'tout');
     1115
     1116        // title et hreflang donnes par le raccourci ?
     1117        if (preg_match(',^(.*?)([|](.*?))?([{]([a-z_]+)[}])?$,', $regs[1], $m)) {
     1118                // |infobulle ?
     1119                if ($m[2])
     1120                        $bulle = ' title="'.texte_backend($m[3]).'"';
     1121                // {hreflang} ?
     1122                if ($m[4])
     1123                        $hlang = $m[5];
     1124                // S'il n'y a pas de hreflang sous la forme {}, ce qui suit le |
     1125                // est peut-etre une langue
     1126                else if (preg_match(',^[a-z_]+$,', $m[3])) {
     1127                        // si c'est un code de langue connu, on met un hreflang
     1128                        include_spip('inc/lang');
     1129                        if (traduire_nom_langue($m[3]) <> $m[3]) {
     1130                                $hlang = $m[3];
     1131                        }
     1132                }
     1133                $regs[1] = $m[1];
     1134        }
     1135
     1136        list ($lien, $class, $texte, $lang) = calculer_url($regs[3], $regs[1], 'tout');
     1137
     1138        // Si l'objet n'est pas de la langue courante, on ajoute hreflang
     1139        if (!$hlang AND $lang AND ($lang!=$GLOBALS['spip_lang'])) $hlang=$lang;
     1140        $hreflang = $hlang ? ' hreflang="'.$hlang.'"' : '';
     1141
    10601142        # ici bien passer le lien pour traiter [<doc3>->url]
    1061         return typo("<a href=\"$lien\" class=\"$class\">"
     1143        return typo("<a href=\"$lien\" class=\"$class\"$hreflang$bulle>"
    10621144                . $texte
    10631145                . "</a>");
     
    12321314                $i = 0;
    12331315                foreach ($matches as $regs) {
    1234                         $insert = traiter_raccourci_lien($regs);
    1235                         $inserts[++$i] = pipeline('traiter_raccourci_lien',
    1236                                 array('data'=>$insert, 'args'=>$regs));
     1316                        $inserts[++$i] = traiter_raccourci_lien($regs);
    12371317                        $letexte = str_replace($regs[0], "@@SPIP_ECHAPPE_LIEN_$i@@",
    12381318                                $letexte);
     
    13611441// http://doc.spip.org/@propre
    13621442function propre($letexte) {
     1443        if (!$letexte) return $letexte;
    13631444
    13641445        // Echapper les <a href>, <html>...< /html>, <code>...< /code>
Note: See TracChangeset for help on using the changeset viewer.