OLD | NEW |
1 (function(){ | 1 (function(){ |
2 | 2 |
3 if(!window.Prism) { | 3 if (typeof self === 'undefined' || !self.Prism || !self.document || !document.qu
erySelector) { |
4 return; | 4 return; |
5 } | 5 } |
6 | 6 |
7 function $$(expr, con) { | 7 function $$(expr, con) { |
8 return Array.prototype.slice.call((con || document).querySelectorAll(exp
r)); | 8 return Array.prototype.slice.call((con || document).querySelectorAll(exp
r)); |
9 } | 9 } |
10 | 10 |
11 function hasClass(element, className) { | 11 function hasClass(element, className) { |
12 className = " " + className + " "; | 12 className = " " + className + " "; |
13 return (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(classNa
me) > -1 | 13 return (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(classNa
me) > -1 |
14 } | 14 } |
15 | 15 |
16 var CRLF = crlf = /\r?\n|\r/g; | 16 // Some browsers round the line-height, others don't. |
17 | 17 // We need to test for it to position the elements properly. |
| 18 var isLineHeightRounded = (function() { |
| 19 » var res; |
| 20 » return function() { |
| 21 » » if(typeof res === 'undefined') { |
| 22 » » » var d = document.createElement('div'); |
| 23 » » » d.style.fontSize = '13px'; |
| 24 » » » d.style.lineHeight = '1.5'; |
| 25 » » » d.style.padding = 0; |
| 26 » » » d.style.border = 0; |
| 27 » » » d.innerHTML = ' <br /> '; |
| 28 » » » document.body.appendChild(d); |
| 29 » » » // Browsers that round the line-height should have offse
tHeight === 38 |
| 30 » » » // The others should have 39. |
| 31 » » » res = d.offsetHeight === 38; |
| 32 » » » document.body.removeChild(d); |
| 33 » » } |
| 34 » » return res; |
| 35 » } |
| 36 }()); |
| 37 |
18 function highlightLines(pre, lines, classes) { | 38 function highlightLines(pre, lines, classes) { |
19 var ranges = lines.replace(/\s+/g, '').split(','), | 39 var ranges = lines.replace(/\s+/g, '').split(','), |
20 offset = +pre.getAttribute('data-line-offset') || 0; | 40 offset = +pre.getAttribute('data-line-offset') || 0; |
21 » | 41 |
22 » var lineHeight = parseFloat(getComputedStyle(pre).lineHeight); | 42 » var parseMethod = isLineHeightRounded() ? parseInt : parseFloat; |
| 43 » var lineHeight = parseMethod(getComputedStyle(pre).lineHeight); |
23 | 44 |
24 for (var i=0, range; range = ranges[i++];) { | 45 for (var i=0, range; range = ranges[i++];) { |
25 range = range.split('-'); | 46 range = range.split('-'); |
26 | 47 |
27 var start = +range[0], | 48 var start = +range[0], |
28 end = +range[1] || start; | 49 end = +range[1] || start; |
29 | 50 |
30 var line = document.createElement('div'); | 51 var line = document.createElement('div'); |
31 | 52 |
32 line.textContent = Array(end - start + 2).join(' \n'); | 53 line.textContent = Array(end - start + 2).join(' \n'); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 pre.setAttribute('data-line', ''); | 99 pre.setAttribute('data-line', ''); |
79 } | 100 } |
80 | 101 |
81 highlightLines(pre, range, 'temporary '); | 102 highlightLines(pre, range, 'temporary '); |
82 | 103 |
83 document.querySelector('.temporary.line-highlight').scrollIntoView(); | 104 document.querySelector('.temporary.line-highlight').scrollIntoView(); |
84 } | 105 } |
85 | 106 |
86 var fakeTimer = 0; // Hack to limit the number of times applyHash() runs | 107 var fakeTimer = 0; // Hack to limit the number of times applyHash() runs |
87 | 108 |
88 Prism.hooks.add('after-highlight', function(env) { | 109 Prism.hooks.add('complete', function(env) { |
89 var pre = env.element.parentNode; | 110 var pre = env.element.parentNode; |
90 var lines = pre && pre.getAttribute('data-line'); | 111 var lines = pre && pre.getAttribute('data-line'); |
91 | 112 |
92 if (!pre || !lines || !/pre/i.test(pre.nodeName)) { | 113 if (!pre || !lines || !/pre/i.test(pre.nodeName)) { |
93 return; | 114 return; |
94 } | 115 } |
95 | 116 |
96 clearTimeout(fakeTimer); | 117 clearTimeout(fakeTimer); |
97 | 118 |
98 $$('.line-highlight', pre).forEach(function (line) { | 119 $$('.line-highlight', pre).forEach(function (line) { |
99 line.parentNode.removeChild(line); | 120 line.parentNode.removeChild(line); |
100 }); | 121 }); |
101 | 122 |
102 highlightLines(pre, lines); | 123 highlightLines(pre, lines); |
103 | 124 |
104 fakeTimer = setTimeout(applyHash, 1); | 125 fakeTimer = setTimeout(applyHash, 1); |
105 }); | 126 }); |
106 | 127 |
107 addEventListener('hashchange', applyHash); | 128 addEventListener('hashchange', applyHash); |
108 | 129 |
109 })(); | 130 })(); |
OLD | NEW |