diff options
author | Hakim El Hattab <hakim.elhattab@gmail.com> | 2016-12-01 10:18:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-01 10:18:50 +0100 |
commit | 775d510c2f979181c2194c8705c4b25118dc3144 (patch) | |
tree | cb5d3f3d897d69ad5b4525bdeb565c31548adc49 /plugin | |
parent | 19188205de20c6c7e219c01482e897a880e42a7b (diff) | |
parent | 35162c1f5e345b88311e9238de3afb4fa3e1fa13 (diff) | |
download | fosdem-2018-presentation-775d510c2f979181c2194c8705c4b25118dc3144.tar fosdem-2018-presentation-775d510c2f979181c2194c8705c4b25118dc3144.tar.gz |
Merge pull request #1756 from jmpp/better-data-trim
Implementing a better data-trim
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/highlight/highlight.js | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/plugin/highlight/highlight.js b/plugin/highlight/highlight.js index 8be8c98..6aae081 100644 --- a/plugin/highlight/highlight.js +++ b/plugin/highlight/highlight.js @@ -1,5 +1,52 @@ // START CUSTOM REVEAL.JS INTEGRATION (function() { + // Function to perform a better "data-trim" on code snippets + // Will slice an indentation amount on each line of the snippet (amount based on the line having the lowest indentation length) + function betterTrim(snippetEl) { + // Helper functions + function trimLeft(val) { + // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill + return val.replace(/^[\s\uFEFF\xA0]+/g, ''); + } + function trimLineBreaks(input) { + var lines = input.split('\n'); + + // Trim line-breaks from the beginning + for (var i = 0; i < lines.length; i++) { + if (lines[i].trim() === '') { + lines.splice(i--, 1); + } else break; + } + + // Trim line-breaks from the end + for (var i = lines.length-1; i >= 0; i--) { + if (lines[i].trim() === '') { + lines.splice(i, 1); + } else break; + } + + return lines.join('\n'); + } + + // Main function for betterTrim() + return (function(snippetEl) { + var content = trimLineBreaks(snippetEl.innerHTML); + var lines = content.split('\n'); + // Calculate the minimum amount to remove on each line start of the snippet (can be 0) + var pad = lines.reduce(function(acc, line) { + if (line.length > 0 && trimLeft(line).length > 0 && acc > line.length - trimLeft(line).length) { + return line.length - trimLeft(line).length; + } + return acc; + }, Number.POSITIVE_INFINITY); + // Slice each line with this amount + return lines.map(function(line, index) { + return line.slice(pad); + }) + .join('\n'); + })(snippetEl); + } + if( typeof window.addEventListener === 'function' ) { var hljs_nodes = document.querySelectorAll( 'pre code' ); @@ -8,7 +55,7 @@ // trim whitespace if data-trim attribute is present if( element.hasAttribute( 'data-trim' ) && typeof element.innerHTML.trim === 'function' ) { - element.innerHTML = element.innerHTML.trim(); + element.innerHTML = betterTrim(element); } // Now escape html unless prevented by author |