Changeset 84509 in spip-zone


Ignore:
Timestamp:
Sep 7, 2014, 3:02:35 PM (5 years ago)
Author:
toutati@…
Message:

Modification du xpath pour inclure les noeuds ayant une ou plusieurs class ou une id donnée (tout tag HTML est accepté d'office)
Dans la configuration, on peut donc mettre plusieurs class d'exclusion séparées par un pipe
Ajout d'Exemples et explications sur l'inclusion et l'exclusion des motifs pour l'aspiration du contenu

Location:
_plugins_/aspirateur
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/aspirateur/formulaires/aspirateur.php

    r84297 r84509  
    4242        $page_referente = lire_config('aspirateur/page_referente');
    4343        $suivre_liens = lire_config('aspirateur/suivre_liens');
    44         $div_id_contenu = lire_config('aspirateur/div_id_contenu');
     44        $contenu_inclure_tag_attribut = lire_config('aspirateur/contenu_inclure_tag_attribut');
    4545        $motif_contenu_regex = lire_config('aspirateur/motif_contenu_regex');
    4646        $motif_chemin_documents_exclure = lire_config('aspirateur/motif_chemin_documents_exclure');
  • _plugins_/aspirateur/formulaires/aspirateur_rss.php

    r84297 r84509  
    4343        $page_referente = lire_config('aspirateur/page_referente');
    4444        $suivre_liens = lire_config('aspirateur/suivre_liens');
    45         $div_id_contenu = lire_config('aspirateur/div_id_contenu');
     45        $contenu_inclure_tag_attribut = lire_config('aspirateur/contenu_inclure_tag_attribut');
    4646        $motif_contenu_regex = lire_config('aspirateur/motif_contenu_regex');
    4747        $motif_chemin_documents_exclure = lire_config('aspirateur/motif_chemin_documents_exclure');
  • _plugins_/aspirateur/formulaires/configurer_aspirateur.html

    r84301 r84509  
    4949                                <li class="fieldset">
    5050                                        <fieldset>
    51                                                 <legend><:configureraspirateur:legend_motifs_regex_aspirateur:></legend>
     51                                                <legend><:configureraspirateur:legend_motifs_aspirateur:></legend>
    5252                                                <ul>
    53                                                         [(#REM) content]
    54                                                         #SET{name,div_id_contenu}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
     53                                                       
     54                                                        #SET{name,contenu_inclure_tag_attribut}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    5555                                                        <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     56                                                                <p class="explication">[(#GET{fl}|concat{':explication_',#GET{name}}|_T)]</p>
    5657                                                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    5758                                                                <span class='erreur_message'>(#GET{erreurs})</span>
     
    6162                                                        #SET{name,motif_debut_contenu_regex}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    6263                                                        <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     64                                                                <p class="explication">[(#GET{fl}|concat{':explication_',#GET{name}}|_T)]</p>
    6365                                                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    6466                                                                <span class='erreur_message'>(#GET{erreurs})</span>
     
    6870                                                        #SET{name,motif_fin_contenu_regex}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    6971                                                        <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     72                                                                <p class="explication">[(#GET{fl}|concat{':explication_',#GET{name}}|_T)]</p>
    7073                                                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    7174                                                                <span class='erreur_message'>(#GET{erreurs})</span>
    7275                                                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    7376                                                        </li>
    74                                                         [(#REM) socialtags ]
    75                                                         #SET{name,div_class_contenu_exclure}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
     77                                                       
     78                                                        [(#REM) upload/]
     79                                                        #SET{name,motif_chemin_documents}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    7680                                                        <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     81                                                                <p class="explication">[(#GET{fl}|concat{':explication_',#GET{name}}|_T)]</p>
    7782                                                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    7883                                                                <span class='erreur_message'>(#GET{erreurs})</span>
    7984                                                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    8085                                                        </li>
    81                                                         [(#REM) upload/]
    82                                                         #SET{name,motif_chemin_documents}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
     86                                                       
     87                                                </ul>
     88                                        </fieldset>
     89                                </li>
     90                                <li class="fieldset">
     91                                        <fieldset>
     92                                                <legend><:configureraspirateur:legend_motifs_exclusion:></legend>
     93                                                <ul>
     94                                                        #SET{name,contenu_exclure_tag_attribut}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    8395                                                        <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     96                                                                <p class="explication">[(#GET{fl}|concat{':explication_',#GET{name}}|_T)]</p>
    8497                                                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    8598                                                                <span class='erreur_message'>(#GET{erreurs})</span>
    8699                                                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    87100                                                        </li>
    88                                                         [(#REM) design/]
     101                                                       
    89102                                                        #SET{name,motif_chemin_documents_exclure}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    90103                                                        <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     104                                                                <p class="explication">[(#GET{fl}|concat{':explication_',#GET{name}}|_T)]</p>
    91105                                                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    92106                                                                <span class='erreur_message'>(#GET{erreurs})</span>
    93107                                                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    94108                                                        </li>
    95                                                         [(#REM) recommander.asp|faq.asp]
     109                                                       
    96110                                                        #SET{name,motif_chemin_pages_exclure}#SET{obli,''}[(#SET{defaut,''})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    97111                                                        <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     112                                                                <p class="explication">[(#GET{fl}|concat{':explication_',#GET{name}}|_T)]</p>
    98113                                                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    99114                                                                <span class='erreur_message'>(#GET{erreurs})</span>
  • _plugins_/aspirateur/inc/aspirer_curl.php

    r84327 r84509  
    6363**/
    6464function isoler_contenu($chaine){
    65         //Identifiant donné pour isoler le contenu via xpath (tout tag accepté) (option*)
    66         $div_id_contenu = trim(lire_config('aspirateur/div_id_contenu'));
    67         $div_class_contenu_exclure = trim(lire_config('aspirateur/div_class_contenu_exclure'));
    68 
    69         if($div_id_contenu OR $div_class_contenu_exclure){
     65        //isoler le contenu via xpath (tout tag accepté) (option*)
     66        $contenu_inclure_tag_attribut = trim(lire_config('aspirateur/contenu_inclure_tag_attribut'));
     67        $contenu_exclure_tag_attribut = trim(lire_config('aspirateur/contenu_exclure_tag_attribut'));
     68
     69        if($contenu_inclure_tag_attribut OR $contenu_exclure_tag_attribut){
    7070                @$doc = new DOMDocument();
    7171                $doc->preserveWhiteSpace = false;
     
    7373                $xpath = new DOMXpath($doc);
    7474               
    75                 if($div_id_contenu)
    76                 $tags = $xpath->query("//*[@id='$div_id_contenu']");
     75                //inclure les noeuds ayant une class ou id donnée (tout tag accepté) (option*)
     76                if($contenu_inclure_tag_attribut){
     77                        $class_ou_id_inclure=class_ou_id($contenu_inclure_tag_attribut);
     78                        $selecteur_inclure=$class_ou_id_inclure['selecteur'];
     79                        $nom_atttribut_inclure=$class_ou_id_inclure['nom_attribut'];
     80                        spip_log("aspirer_curl inclure $selecteur_inclure / $nom_atttribut_inclure","aspirateur");
     81                        //on prend le noeud d'un element même ayant plusieurs class
     82                        $tags = $xpath->query(".//*[contains(concat(' ', normalize-space(@$selecteur_inclure), ' '), ' $nom_atttribut_inclure ')]");
     83                }
    7784                //sinon on prend large soit le noeud body de la page
    7885                if (is_null($tags)){
     
    8087                }
    8188               
    82                 //on exclut les noeuds ayant une class donnée (tout tag accepté) (option*)
    83                 if($div_class_contenu_exclure){
    84                         foreach($xpath->query(".//*[@class='$div_class_contenu_exclure']") as $node) {
    85                           $node->parentNode->removeChild($node);
    86                         }
     89                //exclure les noeuds ayant une class ou id donnée (tout tag accepté) (option*)
     90                if($contenu_exclure_tag_attribut){
     91                        //explode sur .sociable|.navigation| etc
     92                        $explode_exclure_tag_attribut=explode('|',$contenu_exclure_tag_attribut);
     93                       
     94                        foreach($explode_exclure_tag_attribut as $exclure_tag_attribut){
     95                               
     96                                $class_ou_id_exclure=class_ou_id($exclure_tag_attribut);
     97                                $selecteur_exclure=$class_ou_id_exclure['selecteur'];
     98                                $nom_atttribut_exclure=$class_ou_id_exclure['nom_attribut'];
     99                                spip_log("aspirer_curl exclure $selecteur_exclure / $nom_atttribut_exclure","aspirateur");
     100                                //on prend le noeud d'un element même ayant plusieurs class
     101                                foreach($xpath->query(".//*[contains(concat(' ', normalize-space(@$selecteur_exclure), ' '), ' $nom_atttribut_exclure ')]")as $node) {
     102                                  $node->parentNode->removeChild($node);
     103                                }
     104                        }       
    87105                }
    88106                        if (!is_null($tags)) {
     
    103121        }else{
    104122        $chaine = $contenu;
    105         //2em méthode Sinon ereg sur variables de début et de fin pour isoler le contenu
     123        //2em méthode Sinon regex sur variables de début et de fin pour isoler le contenu
    106124        $motif_debut_contenu_regex = trim(lire_config('aspirateur/motif_debut_contenu_regex'));
    107125        $motif_fin_contenu_regex = trim(lire_config('aspirateur/motif_fin_contenu_regex'));
     
    111129       
    112130        return $chaine;   
     131}
     132
     133/**
     134 *
     135 * Distinguer class ou id à partir du premier caractère
     136 *
     137 * @param string $attribut
     138 *      .une_class / #une_id
     139 *
     140 * @return array
     141 *      ['selecteur'] class ou id, ['nom_attribut'] attribut sans son premier caractère
     142 *
     143**/
     144function class_ou_id($attribut){
     145        $n=substr($attribut,0,1);
     146        $nom_attribut= str_replace($n, '', $attribut);
     147        if($n==".") return array('selecteur'=>'class','nom_attribut'=>$nom_attribut);
     148        elseif($n=="#") return array('selecteur'=>'id','nom_attribut'=>$nom_attribut);
    113149}
    114150
     
    203239       
    204240                $motif_chemin_documents = lire_config('aspirateur/motif_chemin_documents');
    205                 //si SPIP demandé faire un str_replace dans le texte pour les documents rapatriés dans  SPIP
     241                //si SPIP demandé faire un str_replace dans le texte pour les documents rapatriés dans SPIP
    206242                $activer_spip = lire_config('aspirateur/activer_spip');
    207243       
  • _plugins_/aspirateur/lang/configureraspirateur_fr.php

    r84301 r84509  
    66       
    77        //E
     8       
    89        'explications_aspirateur'=>'Configurez puis lancez l\'aspiration. Vous pouvez aussi entrer en \'Page référente\' une page HTML listant des liens.',
     10        'explication_contenu_inclure_tag_attribut'=>'Exemple : <code>#content</code>', 
     11        'explication_contenu_exclure_tag_attribut'=>'Exemple avec séparateur | : <code>.sociable|.navigation</code>',
     12        'explication_motif_chemin_pages_exclure'=>'Exemple : <code>recommander.asp|faq.asp</code>',
     13       
     14        'explication_motif_chemin_documents_exclure'=>'Exemple : <code>design/</code>',
     15        'explication_motif_chemin_documents'=>'Exemple : <code>upload/</code>',
     16
     17        'explication_motif_debut_contenu_regex'=>'Exemple avec : <code>'.htmlentities("<!-- debut contenu -->").'</code>',
     18        'explication_motif_fin_contenu_regex'=>'Exemple avec : <code>'.htmlentities("<!-- fin du contenu -->").'</code>',
     19       
    920       
    1021        // L
     
    1728        'label_page_referente' => 'Page référente',
    1829       
    19         'legend_motifs_regex_aspirateur'=>'Motifs des regex',
     30        'legend_motifs_aspirateur'=>'Motifs d\'extraction',
    2031        'legend_type_traitements'=>'Type de traitements',
     32       
     33        'legend_motifs_exclusion' =>'Motifs d\'exclusion',
    2134       
    2235        'label_activer_rss_1'=>'Activer la fabrication d\'un flux RSS',
    2336        'label_activer_spip_1'=>'Réécrire le chemin des documents pour SPIP',
    2437       
    25         'label_div_id_contenu'=>'Identifiant du div pour isoler le contenu',
    26         'label_div_class_contenu_exclure'=>'Exclure tous les divs avec cette class',
    27         'label_motif_debut_contenu_regex'=>'Sinon motif Regex pour le debut du contenu',       
    28         'label_motif_fin_contenu_regex'=>'Sinon motif Regex pour la fin du contenu',
    29         'label_motif_chemin_documents'=>'Motif nécessaire dans le chemin des documents',
    30         'label_motif_chemin_documents_exclure'=>'Motif d\'exclusion dans le chemin des documents',
     38        'label_contenu_inclure_tag_attribut'=>'Aspirer le contenu d\'un tag HTML ayant la class ou l\'id suivante (xpath)',
     39        'label_contenu_exclure_tag_attribut'=>'Exclure le contenu d\'un tag HTML ayant la class ou l\'id suivante (xpath)',
     40        'label_motif_debut_contenu_regex'=>'Sinon motif pour le debut du contenu (Regex)',     
     41        'label_motif_fin_contenu_regex'=>'Sinon motif pour la fin du contenu (Regex)',
     42        'label_motif_chemin_documents'=>'Motif nécessaire dans le chemin des documents (Regex)',
     43        'label_motif_chemin_documents_exclure'=>'Motif d\'exclusion dans le chemin des documents (Regex)',
    3144        'label_motif_chemin_pages_exclure'=>'Motif d\'exclusion dans le chemin des pages',
    3245        'label_nettoyer_contenu_1'=>'Nettoyer le HTML',
  • _plugins_/aspirateur/notes-aspirateur.txt

    r84297 r84509  
    2020D1/ Activer le plugin Docker dès l'import du plugin RSS2articles ! On importe les articles en site syndiqué avec RSS2articles en activant la syntaxe SPIP -> ça doit conserver les <a> sans balise fermante…
    2121D4/ On télécharge ensuite les documents distants avec Docker les liens, en local, + réécrit en minuscules + en titrant les documents
    22 D5/ Il suffit de repasser les liens dans la base de type http://local/IMG/ en http://production/IMG/  ou même en ../IMG/ peut-être?
     22D5/ Il suffit de replacer les liens dans la base de type http://local/IMG/ en http://production/IMG/  ou même en ../IMG/
     23UPDATE spip_articles
     24SET `texte` = REPLACE(`texte`,'http://localhost/site_local/', 'http://site_production/')
     25WHERE `texte` LIKE '%http://localhost/site_local/%'
    2326D6/ utiliser le plugin ressources pour afficher les liens images dans le texte
    2427
Note: See TracChangeset for help on using the changeset viewer.