GM Fight

Un peu de fun avec mon ami Greasemonkey, pour rebondir sur le code de Guillaume Adreani (http://userscripts.org/scripts/show/156097) qui a beaucoup de qualités, notamment conceptuelle mais qui risque de casser le DOM et de faire quirker.

A défaut de getTextNodes, un peu d’xPath, et à défaut de liste des .rcv, un scrap à la volée et des regexps.

 

// ==UserScript==
// @name        Habett Codlink
// @namespace   le
// @include     http://*
// @include     https://*
// @version     1.3
// @grant       GM_xmlhttpRequest
// @grant       GM_getValue	
// @grant       GM_setValue	
// ==/UserScript==
 
var noxx = document.evaluate('//body/descendant::*[contains(text(),"code") or contains(text(),"Code")]'
  ,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
var nodds = new Array();
for (i=0; i<noxx.snapshotLength; i++) {
  na = noxx.snapshotItem(i).nodeName.toLowerCase();
  if ((na != 'script') && (na != 'a')) {
    nodds.push(noxx.snapshotItem(i));
  }
}
var safr = new RegExp('\\W','g');
var kh = new Object();
if (GM_getValue('cli')) {
  kh = JSON.parse(GM_getValue('cli'));
  rere();
} else {
  GM_xmlhttpRequest({
    method: "GET",
    url: "http://www.legifrance.gouv.fr/initRechCodeArticle.do",
    onload: function(response) {
      var cl = new DOMParser().parseFromString(response.responseText, "text/html");
      var options = cl.getElementsByTagName('select')[0].getElementsByTagName('option');
      for (var i=1; i<options.length; i++) {
        var cod = options[i].getAttribute('title').replace(safr,'.');
        kh[cod]=options[i].getAttribute('value');
      }
      GM_setValue('cli',JSON.stringify(kh));
      rere();
    }
  });
}
function rere() {
  for (var k in kh) {
    var re = new RegExp('((\\d[\\d\\.\\-]{0,9})[^<>]*? du '+k+')','gi');
    var rf = new RegExp('((([LRD]+)\\W*?(\\d[0-9\\.\\-]{0,9}))[^<>]*? du '+k+')','gi');
    for (var j=0; j<nodds.length; j++) {
      nodds[j].innerHTML = nodds[j].innerHTML.replace(
        rf,'<a style="color: red" href="http://www.legifrance.gouv.fr/rechCodeArticle.do?champCode='
        +kh[k]+'&champNumArticle=\$3$4">\$1</a>'
      );
      nodds[j].innerHTML = nodds[j].innerHTML.replace(
        re,'<a style="color: red" href="http://www.legifrance.gouv.fr/rechCodeArticle.do?champCode='
        +kh[k]+'&champNumArticle=\$2">\$1</a>'
      );  
    }
  }
}
<noxx.snapshotlength; i++)="" {<br=""><options.length; i++)="" {<br=""><nodds.length; j++)="" {<br="">

 


GM Fight

c.cgi

Vu qu’il y a de la demande pour ça, voici la source.

#!/usr/bin/perl
use CGI;
use WWW::Mechanize;
use Encode;
$q = new CGI;
$c = $q->param(‘code’);
$a = $q->param(‘article’);
print « Content-type: text/html\n\n »;
$www = new WWW::Mechanize(agent => $ENV{‘HTTP_USER_AGENT’});
$www->get(‘http://www.legifrance.gouv.fr/initRechCodeArticle.do’);
$www->form_number(2);
($opt) = grep { $_ =~ /$c/i } $www->content =~ /(<option value=.*?<\/option>)/g;
unless ($opt) {
  $c = decode(‘utf-8’,$c);
  ($opt) = grep { $_ =~ /$c/i } $www->content =~ /(<option value=.*?<\/option>)/g;
}
$opt =~ /value= »(.*?) »/;
$www->field(‘champCode’,$1);
$www->field(‘champNumArticle’,$a);
$www->submit();
$url = $www->uri();
if ($www->title() =~ /Article/) {
  $url =~ s/^\.\/\./http:\/\/legifrance.gouv.fr/;
  print « Content-type: text/html\n\n<meta http-equiv=\ »Refresh\ » content=\ »0;url=$url\ » /> »;
} else {
  print « Content-type: text/plain\n\nNo Result »;
}

c.cgi

Regexp so legit

Remue méninge sur un extracteur générateur de liens pour des Codes en code.

Voilà donc un petit chunck de mon affreux linker par regex:
foreach $natty (‘décret’,’loi’,’ordonnance’) {
     (@possibles) = $text =~ /($natty[^<>]{1,21}\d\d\-\d+)/g;
     foreach $possible (@possibles) {
        $text =~ s/([^=>])$possible([^<« ])/$1<a href= »http:\/\/perlpot.net\/cgi-bin\/r.cgi\?what=$possible » shape= »exxo$natty »>$possible<\/a>$2/;
     }
}
 
Reste donc à écrire le r.cgi qui répond.
#!/usr/bin/perl
use CGI;
use WWW::Mechanize;
$q = new CGI;
($natty,$numb) = $q->param(‘what’) =~ /(.*?)\s.*?(\d\d\-\d+)/;
$natty =~ s/\W/./g;
$www = new WWW::Mechanize;
$www->get(‘http://www.legifrance.gouv.fr/initRechTexte.do’);
$www->form_number(1);
($opt) = grep { $_ =~ /$natty/i } $www->content =~ /<option value= »(.*?) »/g;
$www->field(‘champNatureTexte’,$opt);
$www->field(‘champNumTexte’,$numb);
$www->submit();
($url) = $www->content =~ /<li class= »resultat1″>.*?href= »(.*?) »/s;
$url =~ s/^\.\/\./http:\/\/legifrance.gouv.fr/;
print « Location: $url\n\n »;
OK ?

Regexp so legit

Propédeutique

Résolution de l’été, ouvrir un blog pro histoire d’avoir une stack où poster mon code réutilisable.

Installation donc de Movable Type sous Ubuntu linux, histoire de ne pas,contribuer à la néfaste propagation du PHP mais continuer la valorisation du gospel perl.
Reste que je concentre mes lectures actuelles sur Pro jQuery chez Apress meme si le code n’y est pas très beau, surtout dans le dernier chapitre que j’ai lu hier soir sur le templating,, avec l’excuse au demeurant que le plugin en question est du à un vendeur d’OS qui a plus d’avocats que de programmeurs.
Je suis un peu en panne au milieu de Higher Order Perl de Mark Jason Dominus chez Elsevier mais c’est dans l’ardeur de ce genre de concepts que l’on forge les déploiements à venir.
L’un dans l’autre, je cherche.
Enfin, dans le domaine du scrap, fil rouge de ce blog, à noter le tracing des requêtes XHR de HuDoc pour la CEDH, sous FireBug, afin de comprendre le mode de fonctionnement de leur webservices, afin d’obtenir une récupération correcte en l’absence de documentation utilisable. Bref, use JSON; avec mes réserves habituellement quand au défaut de mention explicite d’encodage de ce format de datas.
It’s more fun to compute.

Propédeutique