source: spip-zone/_plugins_/correction_liens_internes/trunk/correction_liens_internes_pipelines.php @ 106289

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

Avec les logs en moins, c'est mieux

File size: 5.3 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5# Constante surchargeable à placer dans config/mes_options.php en cas de multidomaines
6# Liste de domaines supplémentaires considérés comme locaux :
7# define('CORRECTION_LIENS_INTERNES_AUTRES_DOMAINES', 'http://domaine2.tld/, http://domaine3.tld');
8
9function correction_liens_internes_pre_edition($flux){
10        if ($flux['args']['action'] == 'modifier') {
11                foreach ($flux['data'] as $champ => $valeur) {
12                        $flux['data'][$champ] = correction_liens_internes_correction($valeur);
13                }
14        }
15        return $flux;
16}
17function correction_liens_internes_correction_url_prive($mauvaise_url,$composants_url){
18        // Pour le cas où on a copié-collé une URL depuis espace public.
19        if (array_key_exists('fragment',$composants_url)){
20                $ancre = $composants_url["fragment"];
21        } else {
22                $ancre = '';
23        }
24        $args =array();
25        parse_str($composants_url["query"],$args);
26        $exec = str_replace("_edit","",$args["exec"]); #prendre en compte les _edit
27        if (array_key_exists("id_".$exec,$args)){
28                $objet=$exec;
29                $id_objet = $args["id_".$objet];
30        }
31        return array($objet,$id_objet,$ancre);
32}
33
34function correction_liens_internes_correction_url_public($mauvaise_url, $composants_url) {
35        // Pour le cas où on a copié-collé une URL depuis espace public.
36        $ancre = isset($composants_url['fragment']) ? '#' . $composants_url['fragment'] : '';
37
38        list($fond, $contexte) = urls_decoder_url($mauvaise_url);
39
40        if(
41                        ($objet = isset($contexte['type']) ? $contexte['type'] : $fond) &&
42                        ($id_objet = $contexte[id_table_objet($objet)])
43                        );
44        else {
45                // on tente de reconnaitre les formats simples...
46                parse_str($composants_url["query"], $composants_url);
47                if (($objet = $composants_url[_SPIP_PAGE]) && ($id_objet = $composants_url[id_table_objet($objet)]));
48                else {
49                        list($composants_url, $objet) = nettoyer_url_page(str_replace(url_de_base(), '', $mauvaise_url), $composants_url);
50                        $id_objet = $composants_url[id_table_objet($objet)];
51                }
52        }
53        return array($objet,$id_objet,$ancre);
54}
55function correction_liens_internes_correction($texte){
56        // pas de liens, on s'en va...
57        if (!is_string($texte) || strpos($texte, '->') === false) {
58                return $texte;
59        }
60
61        // alias historiques
62        static $racc = array('article' => '', 'auteur' => 'aut', 'rubrique' => 'rub', 'breve' => 'br');
63
64        // traiter d'autre domaines ?
65        if ($domaines = correction_liens_internes_autres_domaines()) {
66                $domaines_origine = $domaines;
67                $domaines = array_unique(array_merge(array(url_de_base()), $domaines));
68                // array_walk($domaines, function(&$v) { $v = preg_quote($v); });
69                array_walk($domaines, create_function('&$v', '$v = preg_quote($v, "#");'));
70                $url_site = '(?:' . join('|',$domaines) . ')';
71        } else {
72                $domaines_origine = array(url_de_base());
73                $url_site = preg_quote(url_de_base());
74        }
75
76        // on repère les mauvaises URLs
77        $match = array();
78        $objet = '';
79        $id_objet = 0;
80        preg_match_all("#\[.*->($url_site.*)\]#U", $texte, $match, PREG_SET_ORDER);
81        include_spip("inc/urls");
82
83        foreach($match as $lien) {
84                $mauvais_raccourci = $lien[0];
85                $mauvaise_url = $lien[1];
86                $mauvaise_url_reelle = str_replace($domaines_origine, url_de_base(), $mauvaise_url);
87                $composants_url = parse_url($mauvaise_url_reelle);
88                // Url copiée depuis le privé ou depuis le public?
89                if (strrpos($composants_url['path'],_DIR_RESTREINT_ABS)!=False){
90                        list ($objet, $id_objet,$ancre) = correction_liens_internes_correction_url_prive($mauvaise_url,$composants_url);
91                }
92                else{
93                        list ($objet, $id_objet,$ancre) = correction_liens_internes_correction_url_public($mauvaise_url_reelle,$composants_url);
94                }
95                if (!$objet && !$id_objet && strpos($mauvaise_url_reelle, str_replace(_DIR_RACINE, '', _DIR_IMG)) != false) {
96                        $url_doc = str_replace(array(url_de_base(), str_replace(_DIR_RACINE, '', _DIR_IMG)), '', $mauvaise_url_reelle);
97                        $id_objet = sql_getfetsel('id_document', 'spip_documents', 'fichier='.sql_quote($url_doc));
98                        $objet = 'document';
99                }
100                if($objet && $id_objet){
101                        if(isset($racc[$objet])){
102                                $objet = $racc[$objet];
103                        }
104                        $bonne_url  = $objet . $id_objet . $ancre;
105                        $bon_raccourci = str_replace($mauvaise_url, $bonne_url, $mauvais_raccourci);
106                        $texte = str_replace($mauvais_raccourci, $bon_raccourci, $texte);
107                        spip_log(self() . (_request('self')?' / '._request('self'):'')  //pour crayons notamment...
108                                                        . " : $mauvais_raccourci => $bon_raccourci", 'liens_internes.' . _LOG_AVERTISSEMENT);
109                }
110        }
111        return $texte;
112}
113
114function correction_liens_internes_autres_domaines() {
115        // si la constante est définie, prendre en compte les domaines déclarés
116        $autres_domaines = defined('CORRECTION_LIENS_INTERNES_AUTRES_DOMAINES')
117        ? preg_split('#([\s,|])+#i', CORRECTION_LIENS_INTERNES_AUTRES_DOMAINES) : array();
118
119        // si le plugin multidomaine est actif, prendre en compte tous les domaines déclarés
120        if (test_plugin_actif('multidomaines')) {
121                $config_multi = lire_config('multidomaines');
122                foreach($config_multi as $key => $value) {
123                        if(preg_match('#editer_url#', $key) && $value) {
124                                $autres_domaines[] = $value;
125                        }
126                }
127        }
128        // mettre en forme les domaines
129        foreach($autres_domaines as $i => $v) {
130                // ajouter un slash final si nécessaire
131                if(substr($v, -1) != '/') {
132                        $autres_domaines[$i] = $v . '/';
133                }
134                // ajouter http:// par défaut si pas de scheme
135                $infos = parse_url($v);
136                if(!$infos['scheme']) {
137                        $autres_domaines[$i] = 'http://'  .$v;
138                }
139        }
140        return $autres_domaines;
141}
Note: See TracBrowser for help on using the repository browser.