diff options
author | J.M. Cléry <jmclery@gmail.com> | 2016-11-22 23:42:21 +0100 |
---|---|---|
committer | J.M. Cléry <jmclery@gmail.com> | 2016-11-22 23:42:21 +0100 |
commit | 35162c1f5e345b88311e9238de3afb4fa3e1fa13 (patch) | |
tree | b6687b548d82d8d37cef2a5038f03769649e16b4 /plugin | |
parent | 3c36ee6cff43d2c4aefe59ef5198df4f327fa094 (diff) | |
download | fosdem-2018-presentation-35162c1f5e345b88311e9238de3afb4fa3e1fa13.tar fosdem-2018-presentation-35162c1f5e345b88311e9238de3afb4fa3e1fa13.tar.gz |
Better version of data-trim on code snippets
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 |