aboutsummaryrefslogtreecommitdiffstats
path: root/appendAnchor.js
blob: 95873bcf6008779beb31d9865987ceb8ec9edde2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * == VimperatorPlugin==
 * @name          appendAnchor
 * @description   append anchors to texts look like url.
 * @author        SAKAI, Kazuaki
 * @version       0.01
 * == VimperatorPlugin==
 */

(function(){

  liberator.commands.addUserCommand(['anc'], 'append anchors to texts look like url',
    function(arg, special) {
      var doc = window.content.document;
      var nodes = liberator.buffer.evaluateXPath(
        '/descendant::*[not(contains(" TITLE STYLE SCRIPT TEXTAREA XMP A ", concat(" ", local-name(), " ")))]/child::text()'
      );
      var regex =  new RegExp("h?(ttps?):/+([a-zA-Z0-9][-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+)");
      var range = doc.createRange();
      var last;
      for (var i = 0; i < nodes.snapshotLength; i++) {
        var node = nodes.snapshotItem(i);
        range.selectNode(node);
        while (node && (last = range.toString().search(regex)) > -1) {
          range.setStart(node, last); 
          range.setEnd(node, last + RegExp.lastMatch.length);
          var anchor = doc.createElement('a');
          var href = 'h' + RegExp.$1 + '://' + RegExp.$2;
          range.insertNode(anchor);
          anchor.setAttribute('href', href);
          range.surroundContents(anchor);
          node = node.nextSibling.nextSibling;
          range.selectNode(node);
        }
      }
      range.detach();
    },{}
  );
})();