Index: polymer_1.0.4/bower_components/prism/plugins/line-highlight/prism-line-highlight.js |
diff --git a/polymer_1.0.4/bower_components/prism/plugins/line-highlight/prism-line-highlight.js b/polymer_1.0.4/bower_components/prism/plugins/line-highlight/prism-line-highlight.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b8dddebb29dcb952d703457247d8803a02662e82 |
--- /dev/null |
+++ b/polymer_1.0.4/bower_components/prism/plugins/line-highlight/prism-line-highlight.js |
@@ -0,0 +1,109 @@ |
+(function(){ |
+ |
+if(!window.Prism) { |
+ 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 |
+} |
+ |
+var CRLF = crlf = /\r?\n|\r/g; |
+ |
+function highlightLines(pre, lines, classes) { |
+ var ranges = lines.replace(/\s+/g, '').split(','), |
+ offset = +pre.getAttribute('data-line-offset') || 0; |
+ |
+ var lineHeight = parseFloat(getComputedStyle(pre).lineHeight); |
+ |
+ 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(' \r\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 |
+ |
+Prism.hooks.add('after-highlight', function(env) { |
+ 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); |
+ |
+})(); |