Blame view

bower_components/prism/plugins/line-highlight/prism-line-highlight.js 3.4 KB
73bcce88   luigser   COMPONENTS
1
2
  (function(){
  
eb240478   Luigi Serra   public room cards...
3
  if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {
73bcce88   luigser   COMPONENTS
4
5
6
7
8
9
10
11
12
13
14
15
  	return;
  }
  
  function $$(expr, con) {
  	return Array.prototype.slice.call((con || document).querySelectorAll(expr));
  }
  
  function hasClass(element, className) {
    className = " " + className + " ";
    return (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(className) > -1
  }
  
eb240478   Luigi Serra   public room cards...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  // Some browsers round the line-height, others don't.
  // We need to test for it to position the elements properly.
  var isLineHeightRounded = (function() {
  	var res;
  	return function() {
  		if(typeof res === 'undefined') {
  			var d = document.createElement('div');
  			d.style.fontSize = '13px';
  			d.style.lineHeight = '1.5';
  			d.style.padding = 0;
  			d.style.border = 0;
  			d.innerHTML = '&nbsp;<br />&nbsp;';
  			document.body.appendChild(d);
  			// Browsers that round the line-height should have offsetHeight === 38
  			// The others should have 39.
  			res = d.offsetHeight === 38;
  			document.body.removeChild(d);
  		}
  		return res;
  	}
  }());
  
73bcce88   luigser   COMPONENTS
38
39
40
  function highlightLines(pre, lines, classes) {
  	var ranges = lines.replace(/\s+/g, '').split(','),
  	    offset = +pre.getAttribute('data-line-offset') || 0;
eb240478   Luigi Serra   public room cards...
41
42
43
  
  	var parseMethod = isLineHeightRounded() ? parseInt : parseFloat;
  	var lineHeight = parseMethod(getComputedStyle(pre).lineHeight);
73bcce88   luigser   COMPONENTS
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  
  	for (var i=0, range; range = ranges[i++];) {
  		range = range.split('-');
  					
  		var start = +range[0],
  		    end = +range[1] || start;
  		
  		var line = document.createElement('div');
  		
  		line.textContent = Array(end - start + 2).join(' \n');
  		line.className = (classes || '') + ' line-highlight';
  
      //if the line-numbers plugin is enabled, then there is no reason for this plugin to display the line numbers
      if(!hasClass(pre, 'line-numbers')) {
        line.setAttribute('data-start', start);
  
        if(end > start) {
          line.setAttribute('data-end', end);
        }
      }
  
  		line.style.top = (start - offset - 1) * lineHeight + 'px';
  
      //allow this to play nicely with the line-numbers plugin
      if(hasClass(pre, 'line-numbers')) {
        //need to attack to pre as when line-numbers is enabled, the code tag is relatively which screws up the positioning
        pre.appendChild(line);
      } else {
        (pre.querySelector('code') || pre).appendChild(line);
      }
  	}
  }
  
  function applyHash() {
  	var hash = location.hash.slice(1);
  	
  	// Remove pre-existing temporary lines
  	$$('.temporary.line-highlight').forEach(function (line) {
  		line.parentNode.removeChild(line);
  	});
  	
  	var range = (hash.match(/\.([\d,-]+)$/) || [,''])[1];
  	
  	if (!range || document.getElementById(hash)) {
  		return;
  	}
  	
  	var id = hash.slice(0, hash.lastIndexOf('.')),
  	    pre = document.getElementById(id);
  	    
  	if (!pre) {
  		return;
  	}
  	
  	if (!pre.hasAttribute('data-line')) {
  		pre.setAttribute('data-line', '');
  	}
  
  	highlightLines(pre, range, 'temporary ');
  
  	document.querySelector('.temporary.line-highlight').scrollIntoView();
  }
  
  var fakeTimer = 0; // Hack to limit the number of times applyHash() runs
  
eb240478   Luigi Serra   public room cards...
109
  Prism.hooks.add('complete', function(env) {
73bcce88   luigser   COMPONENTS
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
  	var pre = env.element.parentNode;
  	var lines = pre && pre.getAttribute('data-line');
  	
  	if (!pre || !lines || !/pre/i.test(pre.nodeName)) {
  		return;
  	}
  	
  	clearTimeout(fakeTimer);
  	
  	$$('.line-highlight', pre).forEach(function (line) {
  		line.parentNode.removeChild(line);
  	});
  	
  	highlightLines(pre, lines);
  	
  	fakeTimer = setTimeout(applyHash, 1);
  });
  
  addEventListener('hashchange', applyHash);
  
  })();