From b8ef34575d3cc6577305a11c77eecf87b279ab58 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Sat, 20 Apr 2019 20:12:07 -0700 Subject: [PATCH] Preserve CRLF line endings [closes #593] --- src/core.js | 2 +- src/csscomb.js | 5 +++-- src/format.js | 2 +- src/options/block-indent.js | 12 +++++++----- src/options/eof-newline.js | 5 +++-- src/options/lines-between-rulesets.js | 7 +++++-- src/options/sort-order.js | 19 ++++++++++++------- src/options/space-after-colon.js | 2 +- src/options/space-after-combinator.js | 2 +- src/options/space-after-opening-brace.js | 2 +- src/options/space-after-selector-delimiter.js | 2 +- src/options/space-before-closing-brace.js | 2 +- src/options/space-before-colon.js | 2 +- src/options/space-before-combinator.js | 2 +- src/options/space-before-opening-brace.js | 2 +- .../space-before-selector-delimiter.js | 2 +- src/options/space-between-declarations.js | 2 +- src/options/strip-spaces.js | 8 ++++---- src/options/vendor-prefix-align.js | 4 ++-- 19 files changed, 48 insertions(+), 36 deletions(-) diff --git a/src/core.js b/src/core.js index eea63d2f..349e7fcb 100644 --- a/src/core.js +++ b/src/core.js @@ -134,7 +134,7 @@ class Comb { var result = []; var start = currentLineNumber - 1 - LINES_AROUND; var end = currentLineNumber + LINES_AROUND; - var lines = text.split(/\r\n|\r|\n/); + var lines = text.split(/\r?\n/); for (var i = start; i < end; i++) { var line = lines[i]; diff --git a/src/csscomb.js b/src/csscomb.js index a698767a..2bad9626 100644 --- a/src/csscomb.js +++ b/src/csscomb.js @@ -86,13 +86,14 @@ CSScomb.detectInString = function detectInString(text, options) { result = getDetectedOptions(detectedOptions, handlers); // Handle conflicting options with spaces around braces: + var match; var blockIndent = result['block-indent']; var spaceAfterOpeningBrace = result['space-after-opening-brace']; if (typeof blockIndent === 'string' && spaceAfterOpeningBrace && - spaceAfterOpeningBrace.indexOf('\n') > -1) { - result['space-after-opening-brace'] = '\n'; + (match = /\r?\n/.exec(spaceAfterOpeningBrace)) !== null) { + result['space-after-opening-brace'] = match[0]; } return result; diff --git a/src/format.js b/src/format.js index 261df4c4..42f32785 100644 --- a/src/format.js +++ b/src/format.js @@ -1,5 +1,5 @@ 'use strict'; module.exports = function(string) { - return string.replace(/\n\s+/gm, ' '); + return string.replace(/\r?\n\s+/g, ' '); }; diff --git a/src/options/block-indent.js b/src/options/block-indent.js index 245211e5..84f01b67 100644 --- a/src/options/block-indent.js +++ b/src/options/block-indent.js @@ -42,7 +42,7 @@ let option = { */ process(ast) { ast.eachFor('space', function(whitespaceNode, i) { - var spaces = whitespaceNode.content.replace(/\n[ \t]+/gm, '\n'); + var spaces = whitespaceNode.content.replace(/(\r?\n)[ \t]+/g, '$1'); if (spaces === '') { ast.removeChild(i); @@ -72,7 +72,7 @@ let option = { var lastIndex = spaces.lastIndexOf('\n'); // Do not continue if there is no line break: - if (lastIndex < 0) return; + if (lastIndex === -1) return; // Number of spaces from beginning of line: var spacesLength = spaces.slice(lastIndex + 1).length + 1; @@ -114,9 +114,11 @@ let option = { var value = this.value; node.eachFor('space', function(whitespaceNode) { - if (whitespaceNode.content === '\n') return; + var spaces = whitespaceNode.content; - var spaces = whitespaceNode.content.replace(/[ \t]/gm, ''); + if (spaces === '\n' || spaces === '\r\n') return; + + spaces = spaces.replace(/[ \t]/g, ''); spaces += new Array(level + 2).join(value); whitespaceNode.content = spaces; }); @@ -130,7 +132,7 @@ let option = { var value = this.value; // Remove all whitespaces and tabs, leave only new lines: - var spaces = node.content.replace(/[ \t]/gm, ''); + var spaces = node.content.replace(/[ \t]/g, ''); if (!spaces) return; diff --git a/src/options/eof-newline.js b/src/options/eof-newline.js index 29196cd4..b41cca37 100644 --- a/src/options/eof-newline.js +++ b/src/options/eof-newline.js @@ -1,6 +1,7 @@ 'use strict'; let gonzales = require('gonzales-pe'); +let os = require('os'); let option = { /** @@ -41,8 +42,8 @@ let option = { ast.content.push(lastChild); } - lastChild.content = lastChild.content.replace(/\n$/, ''); - if (this.value) lastChild.content += '\n'; + lastChild.content = lastChild.content.replace(/\r?\n$/, ''); + if (this.value) lastChild.content += os.EOL; }, /** diff --git a/src/options/lines-between-rulesets.js b/src/options/lines-between-rulesets.js index ad2e15dd..31da31dd 100644 --- a/src/options/lines-between-rulesets.js +++ b/src/options/lines-between-rulesets.js @@ -1,6 +1,7 @@ 'use strict'; let gonzales = require('gonzales-pe'); +let os = require('os'); let option = { newLinesString: '', @@ -70,7 +71,7 @@ let option = { numNewLines = Math.round(this.value) + newLinesOffset; for (var i = 0; i < numNewLines; i++) { - spacing += '\n'; + spacing += os.EOL; } return spacing; @@ -136,7 +137,9 @@ let option = { if (!node) { return false; } - return (node.content === '\n'); + + var content = node.content; + return (content === '\n' || content === '\r\n'); }, prevLineIsComment(parent, index) { diff --git a/src/options/sort-order.js b/src/options/sort-order.js index 482e0259..efacc46b 100644 --- a/src/options/sort-order.js +++ b/src/options/sort-order.js @@ -1,6 +1,7 @@ 'use strict'; var gonzales = require('gonzales-pe'); +var os = require('os'); module.exports = { get name() { @@ -55,7 +56,9 @@ module.exports = { let containsOnlyLinebreaks = true; node.forEach((space) => { - if (!space.is('space') || space.content !== '\n') { + var content = space.content; + + if (!space.is('space') || (content !== '\n' && content !== '\r\n')) { containsOnlyLinebreaks = false; return null; } @@ -262,7 +265,7 @@ module.exports = { if (node.syntax === 'sass' && spacesBeforeNode.length) { let space = spacesBeforeNode[0]; - space.content = space.content.replace(/\n/, ''); + space.content = space.content.replace(/\r?\n/, ''); } spacesBeforeNode.reverse().map(this._removeEmptyLines); @@ -272,12 +275,14 @@ module.exports = { // Divide declarations from different groups with // an empty line: if (prevNode && currentNode.groupIndex > prevNode.groupIndex) { + let matches; let space = spacesBeforeNode[0]; + if (space && space.is('space') && (space.syntax === 'sass' || - space.content.match(/\n/g) && - space.content.match(/\n/g).length < 2)) { - space.content = '\n' + space.content; + ((matches = space.content.match(/\r?\n/g)) !== null && matches.length === 1))) { + let eol = matches == null ? os.EOL : matches[0]; // jshint ignore:line + space.content = eol + space.content; } } @@ -292,7 +297,7 @@ module.exports = { currentNode.node.is('extend'))) { let delimiter = gonzales.createNode({ type: 'declarationDelimiter', - content: currentNode.node.syntax === 'sass' ? '\n' : ';' + content: currentNode.node.syntax === 'sass' ? os.EOL : ';' }); node.content.unshift(delimiter); } @@ -338,7 +343,7 @@ module.exports = { * @param {node} node Space node. */ _removeEmptyLines(node) { - node.content = node.content.replace(/\n[\s\t\n\r]*\n/, '\n'); + node.content = node.content.replace(/(\r?\n)\s*\1/, '$1'); }, _separateSortablesFromBlock(block) { diff --git a/src/options/space-after-colon.js b/src/options/space-after-colon.js index bd3007fb..a51a334d 100644 --- a/src/options/space-after-colon.js +++ b/src/options/space-after-colon.js @@ -11,7 +11,7 @@ module.exports = { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/space-after-combinator.js b/src/options/space-after-combinator.js index 556204b4..f0837c82 100644 --- a/src/options/space-after-combinator.js +++ b/src/options/space-after-combinator.js @@ -11,7 +11,7 @@ module.exports = { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/space-after-opening-brace.js b/src/options/space-after-opening-brace.js index ed04b1f3..3a670c80 100644 --- a/src/options/space-after-opening-brace.js +++ b/src/options/space-after-opening-brace.js @@ -11,7 +11,7 @@ module.exports = { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/space-after-selector-delimiter.js b/src/options/space-after-selector-delimiter.js index 995ed373..e93eac8d 100644 --- a/src/options/space-after-selector-delimiter.js +++ b/src/options/space-after-selector-delimiter.js @@ -11,7 +11,7 @@ module.exports = { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/space-before-closing-brace.js b/src/options/space-before-closing-brace.js index 1cd276e2..93e33687 100644 --- a/src/options/space-before-closing-brace.js +++ b/src/options/space-before-closing-brace.js @@ -65,7 +65,7 @@ module.exports = (function() { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/space-before-colon.js b/src/options/space-before-colon.js index 1490bcb3..ea17d8f5 100644 --- a/src/options/space-before-colon.js +++ b/src/options/space-before-colon.js @@ -11,7 +11,7 @@ module.exports = { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/space-before-combinator.js b/src/options/space-before-combinator.js index 6360e6ea..73a83671 100644 --- a/src/options/space-before-combinator.js +++ b/src/options/space-before-combinator.js @@ -11,7 +11,7 @@ module.exports = { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/space-before-opening-brace.js b/src/options/space-before-opening-brace.js index e3eca162..2f3cb0df 100644 --- a/src/options/space-before-opening-brace.js +++ b/src/options/space-before-opening-brace.js @@ -12,7 +12,7 @@ module.exports = (function() { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/space-before-selector-delimiter.js b/src/options/space-before-selector-delimiter.js index 29f153e2..5fdc4263 100644 --- a/src/options/space-before-selector-delimiter.js +++ b/src/options/space-before-selector-delimiter.js @@ -11,7 +11,7 @@ module.exports = { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/space-between-declarations.js b/src/options/space-between-declarations.js index 2c14e60c..2ff1b867 100644 --- a/src/options/space-between-declarations.js +++ b/src/options/space-between-declarations.js @@ -59,7 +59,7 @@ module.exports = (function() { accepts: { number: true, - string: /^[ \t\n]*$/ + string: /^(?:[ \t]|\r?\n)*$/ }, /** diff --git a/src/options/strip-spaces.js b/src/options/strip-spaces.js index 50ea4ae9..813105d7 100644 --- a/src/options/strip-spaces.js +++ b/src/options/strip-spaces.js @@ -8,7 +8,7 @@ module.exports = (function() { * @returns {String} */ function trim(string) { - return string.replace(/[ \t]+\n/g, '\n'); + return string.replace(/[ \t]+(\r?\n)/g, '$1'); } return { @@ -29,7 +29,7 @@ module.exports = (function() { if (lastChild.is('space')) { lastChild.content = trim(lastChild.content) .replace(/[ \t]+$/, '') - .replace(/[\n]+/g, '\n'); + .replace(/(\r?\n)+/g, '$1'); } ast.traverseByType('space', function(space) { @@ -52,12 +52,12 @@ module.exports = (function() { var lastChild = ast.last(); if (lastChild.is('space') && lastChild.content !== '\n' && - lastChild.content.match(/^[ \n\t]+$/)) { + lastChild.content.match(/^(?:[ \t]|\r?\n)+$/)) { detected.push(false); } ast.traverseByType('space', function(space) { - if (space.content.match(/[ \t]\n/)) detected.push(false); + if (space.content.match(/[ \t]\r?\n/)) detected.push(false); }); return detected; diff --git a/src/options/vendor-prefix-align.js b/src/options/vendor-prefix-align.js index a816340e..ecba7d3a 100644 --- a/src/options/vendor-prefix-align.js +++ b/src/options/vendor-prefix-align.js @@ -434,7 +434,7 @@ module.exports = (function() { payload: function(info, i) { if (node.get(i - 1) && node.get(i - 1).content) { let nodeLength = node.get(i - 1).content - .replace(/^[ \t]*\n+/, '').length; + .replace(/^[ \t]*(?:\r?\n)+/, '').length; var sum = nodeLength + info.prefixLength; getResult({node: node, sum: sum, info: info, i: i}); } @@ -452,7 +452,7 @@ module.exports = (function() { if (node.get(i).get(x - 1)) { let nodeLength = node.get(i).get(x - 1).content - .replace(/^[ \t]*\n+/, '').length; + .replace(/^[ \t]*(?:\r?\n)+/, '').length; var sum = nodeLength + info.prefixLength; getResult({node: node, sum: sum, info: info, i: i}); }