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

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

traiter les documents en urls absolus aussi

Version 1.4.0

File size: 5.4 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                        spip_log($mauvaise_url_reelle, 'test.'._LOG_ERREUR);
95                        spip_log($objet, $id_objet,$ancre, 'test.'._LOG_ERREUR);
96                }
97                if (!$objet && !$id_objet && strpos($mauvaise_url_reelle, str_replace(_DIR_RACINE, '', _DIR_IMG)) != false) {
98                        $url_doc = str_replace(array(url_de_base(), str_replace(_DIR_RACINE, '', _DIR_IMG)), '', $mauvaise_url_reelle);
99                        $id_objet = sql_getfetsel('id_document', 'spip_documents', 'fichier='.sql_quote($url_doc));
100                        $objet = 'document';
101                }
102                if($objet && $id_objet){
103                        if(isset($racc[$objet])){
104                                $objet = $racc[$objet];
105                        }
106                        $bonne_url  = $objet . $id_objet . $ancre;
107                        $bon_raccourci = str_replace($mauvaise_url, $bonne_url, $mauvais_raccourci);
108                        $texte = str_replace($mauvais_raccourci, $bon_raccourci, $texte);
109                        spip_log(self() . (_request('self')?' / '._request('self'):'')  //pour crayons notamment...
110                                                        . " : $mauvais_raccourci => $bon_raccourci", 'liens_internes.' . _LOG_AVERTISSEMENT);
111                }
112        }
113        return $texte;
114}
115
116function correction_liens_internes_autres_domaines() {
117        // si la constante est définie, prendre en compte les domaines déclarés
118        $autres_domaines = defined('CORRECTION_LIENS_INTERNES_AUTRES_DOMAINES')
119        ? preg_split('#([\s,|])+#i', CORRECTION_LIENS_INTERNES_AUTRES_DOMAINES) : array();
120
121        // si le plugin multidomaine est actif, prendre en compte tous les domaines déclarés
122        if (test_plugin_actif('multidomaines')) {
123                $config_multi = lire_config('multidomaines');
124                foreach($config_multi as $key => $value) {
125                        if(preg_match('#editer_url#', $key) && $value) {
126                                $autres_domaines[] = $value;
127                        }
128                }
129        }
130        // mettre en forme les domaines
131        foreach($autres_domaines as $i => $v) {
132                // ajouter un slash final si nécessaire
133                if(substr($v, -1) != '/') {
134                        $autres_domaines[$i] = $v . '/';
135                }
136                // ajouter http:// par défaut si pas de scheme
137                $infos = parse_url($v);
138                if(!$infos['scheme']) {
139                        $autres_domaines[$i] = 'http://'  .$v;
140                }
141        }
142        return $autres_domaines;
143}
Note: See TracBrowser for help on using the repository browser.