Removed class name for soft wrap, made to determinate it automatically by white-space css attribute on the pre tag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
diff --git a/plugins/line-numbers/index.html b/plugins/line-numbers/index.html
index 598ec93..363c2fa 100644
--- a/plugins/line-numbers/index.html
+++ b/plugins/line-numbers/index.html
@@ -29,7 +29,7 @@
<p>Obviously, this is supposed to work only for code blocks (<code><pre><code></code>) and not for inline code.</p>
<p>Add class <strong>line-numbers</strong> to your desired <code><pre></code> and line-numbers plugin will take care.</p>
<p>Optional: You can specify the <code>data-start</code> (Number) attribute on the <code><pre></code> element. It will shift the line counter.</p>
- <p>Optional: To support multiline line numbers add <code>line-numbers-break-word</code> class.</p>
+ <p>Optional: To support multiline line numbers using soft wrap add css <code>white-space</code> to <code>pre-line</code> or <code>pre-wrap</code>.</p>
</section>
<section>
@@ -43,7 +43,7 @@
<h2>HTML</h2>
<p>Please note the <code>data-start="-5"</code> in the code below.</p>
- <pre class="line-numbers line-numbers-break-word" data-src="plugins/line-numbers/index.html" data-start="-5"></pre>
+ <pre class="line-numbers" data-src="plugins/line-numbers/index.html" data-start="-5" style="white-space:pre-wrap;"></pre>
</section>
<footer data-src="templates/footer.html" data-type="text/html"></footer>
diff --git a/plugins/line-numbers/prism-line-numbers.css b/plugins/line-numbers/prism-line-numbers.css
index 861d9af..e32989b 100644
--- a/plugins/line-numbers/prism-line-numbers.css
+++ b/plugins/line-numbers/prism-line-numbers.css
@@ -4,13 +4,10 @@ pre.line-numbers {
counter-reset: linenumber;
}
-pre.line-numbers-break-word > code {
- white-space: pre-wrap;
- display: inline-block;
-}
-
pre.line-numbers > code {
position: relative;
+ display: inline-block;
+ white-space: inherit;
}
.line-numbers .line-numbers-rows {
diff --git a/plugins/line-numbers/prism-line-numbers.js b/plugins/line-numbers/prism-line-numbers.js
index 4eabfa8..2d0f480 100644
--- a/plugins/line-numbers/prism-line-numbers.js
+++ b/plugins/line-numbers/prism-line-numbers.js
@@ -1,34 +1,59 @@
(function(){
/**
- * Class name which is used to flag this code field has break-word css attr
+ * Class name for <pre> which is activating the plugin
* @type {String}
*/
- var BREAK_WORD_CLASS = 'line-numbers-break-word';
+ var PLUGIN_CLASS = 'line-numbers';
/**
* Resizes line numbers spans according to height of line of code
- * @param {Element} element <code> element
+ * @param {Element} element <pre> element
*/
var _resizeElement = function(element){
- var lineNumbersWrapper = element.querySelector('.line-numbers-rows');
- var lineNumberSizer = element.querySelector('.line-numbers-sizer');
- var codeLines = element.textContent.split('\n');
+ var codeStyles = getStyles(element);
+ var whiteSpace = codeStyles['white-space'];
- lineNumberSizer.style.display = 'block';
+ if (whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line'){
+ var codeElement = element.querySelector('code');
+ var lineNumbersWrapper = element.querySelector('.line-numbers-rows');
+ var lineNumberSizer = element.querySelector('.line-numbers-sizer');
+ var codeLines = element.textContent.split('\n');
- codeLines.forEach(function(line, lineNumber){
- lineNumberSizer.textContent = line || '\n';
- var lineSize = lineNumberSizer.getBoundingClientRect().height;
- lineNumbersWrapper.children[lineNumber].style.height = lineSize + 'px';
- });
+ if (!lineNumberSizer){
+ lineNumberSizer = document.createElement('span');
+ lineNumberSizer.className = 'line-numbers-sizer';
- lineNumberSizer.textContent = '';
- lineNumberSizer.style.display = 'none';
+ codeElement.appendChild(lineNumberSizer);
+ }
+
+ lineNumberSizer.style.display = 'block';
+
+ codeLines.forEach(function(line, lineNumber){
+ lineNumberSizer.textContent = line || '\n';
+ var lineSize = lineNumberSizer.getBoundingClientRect().height;
+ lineNumbersWrapper.children[lineNumber].style.height = lineSize + 'px';
+ });
+
+ lineNumberSizer.textContent = '';
+ lineNumberSizer.style.display = 'none';
+ }
};
+ /**
+ * Returns style declarations for the element
+ * @param {Element} element
+ */
+ var getStyles = function(element){
+ if (!element){
+ return null;
+ }
+
+ return window.getComputedStyle ? getComputedStyle(element) : (element.currentStyle || null);
+ };
+
window.addEventListener('resize', function(){
- Array.prototype.forEach.call(document.querySelectorAll('pre.' + BREAK_WORD_CLASS), _resizeElement);
+ Array.prototype.forEach.call(document.querySelectorAll('pre.' + PLUGIN_CLASS), _resizeElement);
});
Prism.hooks.add('after-highlight', function (env) {
@@ -67,14 +92,7 @@
env.element.appendChild(lineNumbersWrapper);
- if (pre.classList.contains(BREAK_WORD_CLASS)){
- var lineHeightSizer = document.createElement('span');
- lineHeightSizer.className = 'line-numbers-sizer';
-
- env.element.appendChild(lineHeightSizer);
- _resizeElement(env.element);
- }
-
+ _resizeElement(pre);
});
})();
\ No newline at end of file