{"id":13,"date":"2015-01-22T18:02:27","date_gmt":"2015-01-22T18:02:27","guid":{"rendered":"http:\/\/habett.fr\/wordpress\/?p=13"},"modified":"2015-01-22T18:02:27","modified_gmt":"2015-01-22T18:02:27","slug":"gm-fight","status":"publish","type":"post","link":"https:\/\/habett.fr\/blog\/2015\/01\/gm-fight\/","title":{"rendered":"GM Fight"},"content":{"rendered":"<p>Un peu de fun avec mon ami <a class=\"zem_slink\" title=\"Greasemonkey\" href=\"http:\/\/www.greasespot.net\/\" rel=\"homepage\">Greasemonkey<\/a>, pour rebondir sur le code de Guillaume Adreani (http:\/\/userscripts.org\/scripts\/show\/156097) qui a beaucoup de qualit\u00e9s, notamment conceptuelle mais qui risque de casser le <span class=\"caps\">DOM <\/span>et de faire quirker.<\/p>\n<div>A d\u00e9faut de getTextNodes, un peu d&rsquo;xPath, et \u00e0 d\u00e9faut de liste des .rcv, un scrap \u00e0 la vol\u00e9e et des <a class=\"zem_slink\" title=\"Regular expression\" href=\"http:\/\/en.wikipedia.org\/wiki\/Regular_expression\" rel=\"wikipedia\">regexps<\/a>.<\/div>\n<div><\/div>\n<div><\/div>\n<p>&nbsp;<\/p>\n<pre>\/\/ ==UserScript==\r\n\/\/ @name        Habett Codlink\r\n\/\/ @namespace   le\r\n\/\/ @include     http:\/\/*\r\n\/\/ @include     https:\/\/*\r\n\/\/ @version     1.3\r\n\/\/ @grant       GM_xmlhttpRequest\r\n\/\/ @grant       GM_getValue\t\r\n\/\/ @grant       GM_setValue\t\r\n\/\/ ==\/UserScript==\r\n \r\nvar noxx = document.evaluate('\/\/body\/descendant::*[contains(text(),\"code\") or contains(text(),\"Code\")]'<\/pre>\n<pre>  ,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);<\/pre>\n<pre>var nodds = new Array();\r\nfor (i=0; i&lt;noxx.snapshotLength; i++) {\r\n  na = noxx.snapshotItem(i).nodeName.toLowerCase();\r\n  if ((na != 'script') &amp;&amp; (na != 'a')) {\r\n    nodds.push(noxx.snapshotItem(i));\r\n  }\r\n}\r\nvar safr = new RegExp('\\\\W','g');\r\nvar kh = new Object();\r\nif (GM_getValue('cli')) {\r\n  kh = JSON.parse(GM_getValue('cli'));\r\n  rere();\r\n} else {\r\n  GM_xmlhttpRequest({\r\n    method: \"GET\",\r\n    url: \"http:\/\/www.legifrance.gouv.fr\/initRechCodeArticle.do\",\r\n    onload: function(response) {\r\n      var cl = new DOMParser().parseFromString(response.responseText, \"text\/html\");\r\n      var options = cl.getElementsByTagName('select')[0].getElementsByTagName('option');\r\n      for (var i=1; i&lt;options.length; i++) {\r\n        var cod = options[i].getAttribute('title').replace(safr,'.');\r\n        kh[cod]=options[i].getAttribute('value');\r\n      }\r\n      GM_setValue('cli',JSON.stringify(kh));\r\n      rere();\r\n    }\r\n  });\r\n}\r\nfunction rere() {\r\n  for (var k in kh) {\r\n    var re = new RegExp('((\\\\d[\\\\d\\\\.\\\\-]{0,9})[^&lt;&gt;]*? du '+k+')','gi');\r\n    var rf = new RegExp('((([LRD]+)\\\\W*?(\\\\d[0-9\\\\.\\\\-]{0,9}))[^&lt;&gt;]*? du '+k+')','gi');\r\n    for (var j=0; j&lt;nodds.length; j++) {\r\n      nodds[j].innerHTML = nodds[j].innerHTML.replace(\r\n        rf,'&lt;a style=\"color: red\" href=\"http:\/\/www.legifrance.gouv.fr\/rechCodeArticle.do?champCode='<\/pre>\n<pre>        +kh[k]+'&amp;champNumArticle=\\$3$4\"&gt;\\$1&lt;\/a&gt;'\r\n      );\r\n      nodds[j].innerHTML = nodds[j].innerHTML.replace(\r\n        re,'&lt;a style=\"color: red\" href=\"http:\/\/www.legifrance.gouv.fr\/rechCodeArticle.do?champCode='<\/pre>\n<pre>        +kh[k]+'&amp;champNumArticle=\\$2\"&gt;\\$1&lt;\/a&gt;'\r\n      );  \r\n    }\r\n  }\r\n}<\/pre>\n<pre>&lt;noxx.snapshotlength; i++)=\"\" {&lt;br=\"\"&gt;&lt;options.length; i++)=\"\" {&lt;br=\"\"&gt;&lt;nodds.length; j++)=\"\" {&lt;br=\"\"&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<div class=\"zemanta-pixie\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>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\u00e9s, notamment conceptuelle mais qui risque de casser le DOM et de faire quirker. A d\u00e9faut de getTextNodes, un peu d&rsquo;xPath, et \u00e0 d\u00e9faut de liste des .rcv, un scrap \u00e0 la vol\u00e9e et &hellip; <a href=\"https:\/\/habett.fr\/blog\/2015\/01\/gm-fight\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">GM Fight<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-13","post","type-post","status-publish","format-standard","hentry","category-archives"],"_links":{"self":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/comments?post=13"}],"version-history":[{"count":1,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/13\/revisions"}],"predecessor-version":[{"id":14,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/13\/revisions\/14"}],"wp:attachment":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/media?parent=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/categories?post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/tags?post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}