From 0ad7c6f6f329fc069edcbcdc4e5229089587f11f Mon Sep 17 00:00:00 2001 From: "Anantachai Saothong (Manta)" Date: Tue, 25 Apr 2017 21:57:06 +0700 Subject: [PATCH] Amended "insertNewLine..." formatting options --- edge/createFormattingOptions.js | 32 ++++++------- edge/format.js | 48 ++++++++++++++----- .../formattingOptions.json | 4 ++ .../input.styl | 9 ++-- .../output.styl | 0 .../formattingOptions.json | 0 .../input.styl | 0 .../output.styl | 0 .../formattingOptions.json | 0 .../input.styl | 0 .../output.styl | 0 .../formattingOptions.json | 4 -- .../input.styl | 13 ----- .../output.styl | 13 ----- .../formattingOptions.json | 4 -- .../formattingOptions.json | 4 -- .../input.styl | 13 ----- .../output.styl | 21 -------- test/runner.js | 15 +++--- 19 files changed, 66 insertions(+), 114 deletions(-) create mode 100644 spec/option-insert-new-line-around-any-1/formattingOptions.json rename spec/{option-insert-new-line-between-group-1 => option-insert-new-line-around-any-1}/input.styl (57%) rename spec/{option-insert-new-line-between-group-1 => option-insert-new-line-around-any-1}/output.styl (100%) rename spec/{option-insert-new-line-between-else-if-false => option-insert-new-line-before-else-false}/formattingOptions.json (100%) rename spec/{option-insert-new-line-between-else-if-false => option-insert-new-line-before-else-false}/input.styl (100%) rename spec/{option-insert-new-line-between-else-if-false => option-insert-new-line-before-else-false}/output.styl (100%) rename spec/{option-insert-new-line-between-else-if-true => option-insert-new-line-before-else-true}/formattingOptions.json (100%) rename spec/{option-insert-new-line-between-else-if-true => option-insert-new-line-before-else-true}/input.styl (100%) rename spec/{option-insert-new-line-between-else-if-true => option-insert-new-line-before-else-true}/output.styl (100%) delete mode 100644 spec/option-insert-new-line-between-group-0/formattingOptions.json delete mode 100644 spec/option-insert-new-line-between-group-0/input.styl delete mode 100644 spec/option-insert-new-line-between-group-0/output.styl delete mode 100644 spec/option-insert-new-line-between-group-1/formattingOptions.json delete mode 100644 spec/option-insert-new-line-between-group-2/formattingOptions.json delete mode 100644 spec/option-insert-new-line-between-group-2/input.styl delete mode 100644 spec/option-insert-new-line-between-group-2/output.styl diff --git a/edge/createFormattingOptions.js b/edge/createFormattingOptions.js index 2b2b5d4..98a2ccf 100644 --- a/edge/createFormattingOptions.js +++ b/edge/createFormattingOptions.js @@ -37,24 +37,20 @@ const schema = { ` } }, - insertNewLineBetweenGroups: { - description: 'Represent a number of new-line between different type of groups.', - type: 'integer', - minimum: 0, - default: 1, - example: { - values: [0, 1], - code: ` - .class1 - $gray = #EEE - background red - color $gray - mixin1() - mixin2() - .class2 - background blue - ` - } + insertNewLineAroundBlock: { + description: '', + type: 'boolean', + default: true, + }, + insertNewLineAroundProperties: { + description: '', + type: 'boolean', + default: true, + }, + insertNewLineAroundOthers: { + description: '', + type: 'boolean', + default: true, }, insertNewLineBetweenSelectors: { description: 'Insert or remove a new-line between selectors.', diff --git a/edge/format.js b/edge/format.js index ce3e11d..82b60e8 100644 --- a/edge/format.js +++ b/edge/format.js @@ -140,7 +140,7 @@ function format(content, options = {}) { const groups = [] _.difference(inputNode.nodes, commentNodes).forEach((node, rank, list) => { - if (rank === 0 || getType(node) !== getType(list[rank - 1]) || getType(node) === 'Group') { + if (rank === 0 || getType(node) !== getType(list[rank - 1]) || getType(node) === 'Block') { groups.push([node]) } else { _.last(groups).push(node) @@ -231,14 +231,33 @@ function format(content, options = {}) { } }) - const newLines = _.repeat(options.newLineChar, indentLevel === 0 || originalBaseIndent === '' ? options.insertNewLineBetweenOuterGroups : options.insertNewLineBetweenInnerGroups) - // Insert CSS body - outputBuffer.append(groups.map(group => - group.map(node => - travel(inputNode, node, childIndentLevel) - ).join('') - ).join(newLines)) + outputBuffer.append(_.chain(groups) + .map(group => { + const nodeType = getType(group[0]) + + let newLineAround = '' + if ( + nodeType === 'Block' && options.insertNewLineAroundBlock || + nodeType === 'Property' && options.insertNewLineAroundProperties || + nodeType === 'Other' && options.insertNewLineAroundOthers + ) { + newLineAround = options.newLineChar + } + + return _.compact([newLineAround, group.map(node => travel(inputNode, node, childIndentLevel)), newLineAround]) + }) + .flatten() + .reject((text, rank, list) => text === options.newLineChar && ( + rank === 0 || + rank > 1 && list[rank - 1] === options.newLineChar || + rank === list.length - 1 + )) + .join('') + .value() + ) + + // _.repeat(options.newLineChar, indentLevel === 0 || originalBaseIndent === '' ? options.insertNewLineBetweenOuterGroups : options.insertNewLineBetweenInnerGroups) // Insert the bottom comment(s) const bottomCommentNodes = tryGetSingleLineCommentNodesOnTheBottomOf(_.last(nonCommentNodes)) @@ -1016,18 +1035,21 @@ function format(content, options = {}) { } function getType(inputNode) { - if (inputNode.block !== undefined || (inputNode instanceof Stylus.nodes.Ident && inputNode.val.block !== undefined)) { - return 'Group' - } else if (_.isFunction(inputNode.toJSON)) { - return inputNode.toJSON().__type + if (inputNode instanceof Stylus.nodes.Property) { + return 'Property' + + } else if (inputNode.block !== undefined || (inputNode instanceof Stylus.nodes.Ident && inputNode.val.block !== undefined)) { + return 'Block' + } else { - return null + return 'Other' } } function getProperVariableName(name) { if (/^\d/.test(name) || /\s/.test(name)) { return options.quoteChar + name + options.quoteChar + } else { return name } diff --git a/spec/option-insert-new-line-around-any-1/formattingOptions.json b/spec/option-insert-new-line-around-any-1/formattingOptions.json new file mode 100644 index 0000000..d5340d7 --- /dev/null +++ b/spec/option-insert-new-line-around-any-1/formattingOptions.json @@ -0,0 +1,4 @@ +{ + "insertNewLineAroundBlock": true, + "newLineChar": "\r\n" +} \ No newline at end of file diff --git a/spec/option-insert-new-line-between-group-1/input.styl b/spec/option-insert-new-line-around-any-1/input.styl similarity index 57% rename from spec/option-insert-new-line-between-group-1/input.styl rename to spec/option-insert-new-line-around-any-1/input.styl index 6e268aa..71bb284 100644 --- a/spec/option-insert-new-line-between-group-1/input.styl +++ b/spec/option-insert-new-line-around-any-1/input.styl @@ -1,7 +1,10 @@ -body +.class1 display none - - .class1 + +.class2 + display none + + .class3 display none mixin() diff --git a/spec/option-insert-new-line-between-group-1/output.styl b/spec/option-insert-new-line-around-any-1/output.styl similarity index 100% rename from spec/option-insert-new-line-between-group-1/output.styl rename to spec/option-insert-new-line-around-any-1/output.styl diff --git a/spec/option-insert-new-line-between-else-if-false/formattingOptions.json b/spec/option-insert-new-line-before-else-false/formattingOptions.json similarity index 100% rename from spec/option-insert-new-line-between-else-if-false/formattingOptions.json rename to spec/option-insert-new-line-before-else-false/formattingOptions.json diff --git a/spec/option-insert-new-line-between-else-if-false/input.styl b/spec/option-insert-new-line-before-else-false/input.styl similarity index 100% rename from spec/option-insert-new-line-between-else-if-false/input.styl rename to spec/option-insert-new-line-before-else-false/input.styl diff --git a/spec/option-insert-new-line-between-else-if-false/output.styl b/spec/option-insert-new-line-before-else-false/output.styl similarity index 100% rename from spec/option-insert-new-line-between-else-if-false/output.styl rename to spec/option-insert-new-line-before-else-false/output.styl diff --git a/spec/option-insert-new-line-between-else-if-true/formattingOptions.json b/spec/option-insert-new-line-before-else-true/formattingOptions.json similarity index 100% rename from spec/option-insert-new-line-between-else-if-true/formattingOptions.json rename to spec/option-insert-new-line-before-else-true/formattingOptions.json diff --git a/spec/option-insert-new-line-between-else-if-true/input.styl b/spec/option-insert-new-line-before-else-true/input.styl similarity index 100% rename from spec/option-insert-new-line-between-else-if-true/input.styl rename to spec/option-insert-new-line-before-else-true/input.styl diff --git a/spec/option-insert-new-line-between-else-if-true/output.styl b/spec/option-insert-new-line-before-else-true/output.styl similarity index 100% rename from spec/option-insert-new-line-between-else-if-true/output.styl rename to spec/option-insert-new-line-before-else-true/output.styl diff --git a/spec/option-insert-new-line-between-group-0/formattingOptions.json b/spec/option-insert-new-line-between-group-0/formattingOptions.json deleted file mode 100644 index 820a5cf..0000000 --- a/spec/option-insert-new-line-between-group-0/formattingOptions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "insertNewLineBetweenGroups": 0, - "newLineChar": "\r\n" -} \ No newline at end of file diff --git a/spec/option-insert-new-line-between-group-0/input.styl b/spec/option-insert-new-line-between-group-0/input.styl deleted file mode 100644 index 6e268aa..0000000 --- a/spec/option-insert-new-line-between-group-0/input.styl +++ /dev/null @@ -1,13 +0,0 @@ -body - display none - - .class1 - display none - -mixin() - display block - -var = 1 - -func() - 1+2 \ No newline at end of file diff --git a/spec/option-insert-new-line-between-group-0/output.styl b/spec/option-insert-new-line-between-group-0/output.styl deleted file mode 100644 index 7863861..0000000 --- a/spec/option-insert-new-line-between-group-0/output.styl +++ /dev/null @@ -1,13 +0,0 @@ -body { - display: none; - .class1 { - display: none; - } -} -mixin() { - display: block; -} -var = 1; -func() { - 1 + 2; -} \ No newline at end of file diff --git a/spec/option-insert-new-line-between-group-1/formattingOptions.json b/spec/option-insert-new-line-between-group-1/formattingOptions.json deleted file mode 100644 index 9d432be..0000000 --- a/spec/option-insert-new-line-between-group-1/formattingOptions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "insertNewLineBetweenGroups": 1, - "newLineChar": "\r\n" -} \ No newline at end of file diff --git a/spec/option-insert-new-line-between-group-2/formattingOptions.json b/spec/option-insert-new-line-between-group-2/formattingOptions.json deleted file mode 100644 index 6ee5e28..0000000 --- a/spec/option-insert-new-line-between-group-2/formattingOptions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "insertNewLineBetweenGroups": 2, - "newLineChar": "\r\n" -} \ No newline at end of file diff --git a/spec/option-insert-new-line-between-group-2/input.styl b/spec/option-insert-new-line-between-group-2/input.styl deleted file mode 100644 index 6e268aa..0000000 --- a/spec/option-insert-new-line-between-group-2/input.styl +++ /dev/null @@ -1,13 +0,0 @@ -body - display none - - .class1 - display none - -mixin() - display block - -var = 1 - -func() - 1+2 \ No newline at end of file diff --git a/spec/option-insert-new-line-between-group-2/output.styl b/spec/option-insert-new-line-between-group-2/output.styl deleted file mode 100644 index d36261c..0000000 --- a/spec/option-insert-new-line-between-group-2/output.styl +++ /dev/null @@ -1,21 +0,0 @@ -body { - display: none; - - - .class1 { - display: none; - } -} - - -mixin() { - display: block; -} - - -var = 1; - - -func() { - 1 + 2; -} \ No newline at end of file diff --git a/test/runner.js b/test/runner.js index 3983d7b..5e5b355 100644 --- a/test/runner.js +++ b/test/runner.js @@ -45,7 +45,13 @@ filesAndDirectories.filter(directoriesOnly).forEach(directory => { describe(testSpecName, () => { it('can be formatted', () => { if (fs.existsSync(actualFilePath)) fs.unlinkSync(actualFilePath) - if (fs.existsSync(debuggingFilePath)) fs.unlinkSync(debuggingFilePath) + + try { + const tree = new Stylus.Parser(inputContent).parse() + fs.writeFileSync(debuggingFilePath, JSON.stringify(tree, null, '\t')) + } catch (ex) { + // Do nothing + } const actualContent = format(inputContent, formattingOptions) @@ -55,13 +61,6 @@ filesAndDirectories.filter(directoriesOnly).forEach(directory => { } else { // In case of failure fs.writeFileSync(actualFilePath, actualContent) - try { - const tree = new Stylus.Parser(inputContent).parse() - fs.writeFileSync(debuggingFilePath, JSON.stringify(tree, null, '\t')) - } catch (ex) { - // Do nothing - } - const stack = [ inputFilePath, actualFilePath,