Linkify commit comments (perl5.git.perl.org)

turn bug references into clickable links

  1. // ==UserScript==
  2. // @name Linkify commit comments (perl5.git.perl.org)
  3. // @namespace [mauke]/perl5.git.perl.org
  4. // @description turn bug references into clickable links
  5. // @match http://perl5.git.perl.org/perl.git/commit/*
  6. // @match https://perl5.git.perl.org/perl.git/commit/*
  7. // @match http://perl5.git.perl.org/perl.git/commitdiff/*
  8. // @match https://perl5.git.perl.org/perl.git/commitdiff/*
  9. // @grant none
  10. // @version 1.0.0
  11. // ==/UserScript==
  12.  
  13. 'use strict';
  14.  
  15. function xpath(expr, doc) {
  16. doc = doc || document;
  17. return doc.evaluate(expr, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  18. }
  19.  
  20. let ts = xpath('//*[name()="div" and (@class="page_body" or @class="header")]//text()');
  21.  
  22. for (let i = 0; i < ts.snapshotLength; ++i) {
  23. let t = ts.snapshotItem(i);
  24. let text = t.nodeValue;
  25. let prev = 0;
  26. let frag = document.createDocumentFragment();
  27. let re = /(?:#|(?:bug|perl)\s+(?:#|(?=\d{2})))(\d+)/ig;
  28. let m;
  29. while ((m = re.exec(text))) {
  30. let pre = text.slice(prev, m.index);
  31. if (pre !== '') {
  32. frag.appendChild(document.createTextNode(pre));
  33. }
  34.  
  35. let a = document.createElement('a');
  36. a.href = 'http://rt.perl.org/rt3/Public/Bug/Display.html?id=' + m[1];
  37. a.appendChild(document.createTextNode(m[0]));
  38. frag.appendChild(a);
  39.  
  40. prev = re.lastIndex;
  41. }
  42. if (!frag.hasChildNodes()) {
  43. continue;
  44. }
  45. let fin = text.slice(prev);
  46. if (fin !== '') {
  47. frag.appendChild(document.createTextNode(fin));
  48. }
  49.  
  50. let p = t.parentNode;
  51. //p.insertBefore(frag, t.nextSibling);
  52. //p.removeChild(t);
  53. p.replaceChild(frag, t);
  54. }