Closes #209. Add CSScomb beautifier for CSS/LESS/SCSS/Sass languages.
To switch from `JS Beautify` (CSS) or `Pretty Diff` (SCSS/Sass/LESS) to using `CSScomb`, you will go into Atom Beautify package settings and find the option for `Language Config - <Your Desired Language: CSS, etc> - Default Beautifier` and select `CSScomb`. CSScomb looks for a `.csscomb.json` file in your Atom's first project directory. If it does not find one, or if importing it fails, it will fallback to `csscomb` predefined configuration.
This commit is contained in:
parent
57e3ef4a48
commit
81fde0c9ea
|
@ -0,0 +1,328 @@
|
|||
{
|
||||
"exclude": [
|
||||
".git/**",
|
||||
"node_modules/**",
|
||||
"bower_components/**"
|
||||
],
|
||||
"always-semicolon": true,
|
||||
"block-indent": " ",
|
||||
"color-case": "lower",
|
||||
"color-shorthand": true,
|
||||
"element-case": "lower",
|
||||
"eof-newline": true,
|
||||
"leading-zero": false,
|
||||
"quotes": "single",
|
||||
"remove-empty-rulesets": true,
|
||||
"space-after-colon": " ",
|
||||
"space-after-combinator": " ",
|
||||
"space-after-opening-brace": "\n",
|
||||
"space-after-selector-delimiter": "\n",
|
||||
"space-before-closing-brace": "\n",
|
||||
"space-before-colon": "",
|
||||
"space-before-combinator": " ",
|
||||
"space-before-opening-brace": "\n",
|
||||
"space-before-selector-delimiter": "",
|
||||
"strip-spaces": true,
|
||||
"unitless-zero": true,
|
||||
"vendor-prefix-align": true,
|
||||
"sort-order": [
|
||||
[
|
||||
"font",
|
||||
"font-family",
|
||||
"font-size",
|
||||
"font-weight",
|
||||
"font-style",
|
||||
"font-variant",
|
||||
"font-size-adjust",
|
||||
"font-stretch",
|
||||
"font-effect",
|
||||
"font-emphasize",
|
||||
"font-emphasize-position",
|
||||
"font-emphasize-style",
|
||||
"font-smooth",
|
||||
"line-height"
|
||||
],
|
||||
[
|
||||
"position",
|
||||
"z-index",
|
||||
"top",
|
||||
"right",
|
||||
"bottom",
|
||||
"left"
|
||||
],
|
||||
[
|
||||
"display",
|
||||
"visibility",
|
||||
"float",
|
||||
"clear",
|
||||
"overflow",
|
||||
"overflow-x",
|
||||
"overflow-y",
|
||||
"-ms-overflow-x",
|
||||
"-ms-overflow-y",
|
||||
"clip",
|
||||
"zoom",
|
||||
"flex-direction",
|
||||
"flex-order",
|
||||
"flex-pack",
|
||||
"flex-align"
|
||||
],
|
||||
[
|
||||
"-webkit-box-sizing",
|
||||
"-moz-box-sizing",
|
||||
"box-sizing",
|
||||
"width",
|
||||
"min-width",
|
||||
"max-width",
|
||||
"height",
|
||||
"min-height",
|
||||
"max-height",
|
||||
"margin",
|
||||
"margin-top",
|
||||
"margin-right",
|
||||
"margin-bottom",
|
||||
"margin-left",
|
||||
"padding",
|
||||
"padding-top",
|
||||
"padding-right",
|
||||
"padding-bottom",
|
||||
"padding-left"
|
||||
],
|
||||
[
|
||||
"table-layout",
|
||||
"empty-cells",
|
||||
"caption-side",
|
||||
"border-spacing",
|
||||
"border-collapse",
|
||||
"list-style",
|
||||
"list-style-position",
|
||||
"list-style-type",
|
||||
"list-style-image"
|
||||
],
|
||||
[
|
||||
"content",
|
||||
"quotes",
|
||||
"counter-reset",
|
||||
"counter-increment",
|
||||
"resize",
|
||||
"cursor",
|
||||
"-webkit-user-select",
|
||||
"-moz-user-select",
|
||||
"-ms-user-select",
|
||||
"user-select",
|
||||
"nav-index",
|
||||
"nav-up",
|
||||
"nav-right",
|
||||
"nav-down",
|
||||
"nav-left",
|
||||
"-webkit-transition",
|
||||
"-moz-transition",
|
||||
"-ms-transition",
|
||||
"-o-transition",
|
||||
"transition",
|
||||
"-webkit-transition-delay",
|
||||
"-moz-transition-delay",
|
||||
"-ms-transition-delay",
|
||||
"-o-transition-delay",
|
||||
"transition-delay",
|
||||
"-webkit-transition-timing-function",
|
||||
"-moz-transition-timing-function",
|
||||
"-ms-transition-timing-function",
|
||||
"-o-transition-timing-function",
|
||||
"transition-timing-function",
|
||||
"-webkit-transition-duration",
|
||||
"-moz-transition-duration",
|
||||
"-ms-transition-duration",
|
||||
"-o-transition-duration",
|
||||
"transition-duration",
|
||||
"-webkit-transition-property",
|
||||
"-moz-transition-property",
|
||||
"-ms-transition-property",
|
||||
"-o-transition-property",
|
||||
"transition-property",
|
||||
"-webkit-transform",
|
||||
"-moz-transform",
|
||||
"-ms-transform",
|
||||
"-o-transform",
|
||||
"transform",
|
||||
"-webkit-transform-origin",
|
||||
"-moz-transform-origin",
|
||||
"-ms-transform-origin",
|
||||
"-o-transform-origin",
|
||||
"transform-origin",
|
||||
"-webkit-animation",
|
||||
"-moz-animation",
|
||||
"-ms-animation",
|
||||
"-o-animation",
|
||||
"animation",
|
||||
"-webkit-animation-name",
|
||||
"-moz-animation-name",
|
||||
"-ms-animation-name",
|
||||
"-o-animation-name",
|
||||
"animation-name",
|
||||
"-webkit-animation-duration",
|
||||
"-moz-animation-duration",
|
||||
"-ms-animation-duration",
|
||||
"-o-animation-duration",
|
||||
"animation-duration",
|
||||
"-webkit-animation-play-state",
|
||||
"-moz-animation-play-state",
|
||||
"-ms-animation-play-state",
|
||||
"-o-animation-play-state",
|
||||
"animation-play-state",
|
||||
"-webkit-animation-timing-function",
|
||||
"-moz-animation-timing-function",
|
||||
"-ms-animation-timing-function",
|
||||
"-o-animation-timing-function",
|
||||
"animation-timing-function",
|
||||
"-webkit-animation-delay",
|
||||
"-moz-animation-delay",
|
||||
"-ms-animation-delay",
|
||||
"-o-animation-delay",
|
||||
"animation-delay",
|
||||
"-webkit-animation-iteration-count",
|
||||
"-moz-animation-iteration-count",
|
||||
"-ms-animation-iteration-count",
|
||||
"-o-animation-iteration-count",
|
||||
"animation-iteration-count",
|
||||
"-webkit-animation-direction",
|
||||
"-moz-animation-direction",
|
||||
"-ms-animation-direction",
|
||||
"-o-animation-direction",
|
||||
"animation-direction",
|
||||
"text-align",
|
||||
"-webkit-text-align-last",
|
||||
"-moz-text-align-last",
|
||||
"-ms-text-align-last",
|
||||
"text-align-last",
|
||||
"vertical-align",
|
||||
"white-space",
|
||||
"text-decoration",
|
||||
"text-emphasis",
|
||||
"text-emphasis-color",
|
||||
"text-emphasis-style",
|
||||
"text-emphasis-position",
|
||||
"text-indent",
|
||||
"-ms-text-justify",
|
||||
"text-justify",
|
||||
"letter-spacing",
|
||||
"word-spacing",
|
||||
"-ms-writing-mode",
|
||||
"text-outline",
|
||||
"text-transform",
|
||||
"text-wrap",
|
||||
"text-overflow",
|
||||
"-ms-text-overflow",
|
||||
"text-overflow-ellipsis",
|
||||
"text-overflow-mode",
|
||||
"-ms-word-wrap",
|
||||
"word-wrap",
|
||||
"word-break",
|
||||
"-ms-word-break",
|
||||
"-moz-tab-size",
|
||||
"-o-tab-size",
|
||||
"tab-size",
|
||||
"-webkit-hyphens",
|
||||
"-moz-hyphens",
|
||||
"hyphens",
|
||||
"pointer-events"
|
||||
],
|
||||
[
|
||||
"opacity",
|
||||
"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity",
|
||||
"-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha",
|
||||
"-ms-interpolation-mode",
|
||||
"color",
|
||||
"border",
|
||||
"border-width",
|
||||
"border-style",
|
||||
"border-color",
|
||||
"border-top",
|
||||
"border-top-width",
|
||||
"border-top-style",
|
||||
"border-top-color",
|
||||
"border-right",
|
||||
"border-right-width",
|
||||
"border-right-style",
|
||||
"border-right-color",
|
||||
"border-bottom",
|
||||
"border-bottom-width",
|
||||
"border-bottom-style",
|
||||
"border-bottom-color",
|
||||
"border-left",
|
||||
"border-left-width",
|
||||
"border-left-style",
|
||||
"border-left-color",
|
||||
"-webkit-border-radius",
|
||||
"-moz-border-radius",
|
||||
"border-radius",
|
||||
"-webkit-border-top-left-radius",
|
||||
"-moz-border-radius-topleft",
|
||||
"border-top-left-radius",
|
||||
"-webkit-border-top-right-radius",
|
||||
"-moz-border-radius-topright",
|
||||
"border-top-right-radius",
|
||||
"-webkit-border-bottom-right-radius",
|
||||
"-moz-border-radius-bottomright",
|
||||
"border-bottom-right-radius",
|
||||
"-webkit-border-bottom-left-radius",
|
||||
"-moz-border-radius-bottomleft",
|
||||
"border-bottom-left-radius",
|
||||
"-webkit-border-image",
|
||||
"-moz-border-image",
|
||||
"-o-border-image",
|
||||
"border-image",
|
||||
"-webkit-border-image-source",
|
||||
"-moz-border-image-source",
|
||||
"-o-border-image-source",
|
||||
"border-image-source",
|
||||
"-webkit-border-image-slice",
|
||||
"-moz-border-image-slice",
|
||||
"-o-border-image-slice",
|
||||
"border-image-slice",
|
||||
"-webkit-border-image-width",
|
||||
"-moz-border-image-width",
|
||||
"-o-border-image-width",
|
||||
"border-image-width",
|
||||
"-webkit-border-image-outset",
|
||||
"-moz-border-image-outset",
|
||||
"-o-border-image-outset",
|
||||
"border-image-outset",
|
||||
"-webkit-border-image-repeat",
|
||||
"-moz-border-image-repeat",
|
||||
"-o-border-image-repeat",
|
||||
"border-image-repeat",
|
||||
"outline",
|
||||
"outline-width",
|
||||
"outline-style",
|
||||
"outline-color",
|
||||
"outline-offset",
|
||||
"background",
|
||||
"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader",
|
||||
"background-color",
|
||||
"background-image",
|
||||
"background-repeat",
|
||||
"background-attachment",
|
||||
"background-position",
|
||||
"background-position-x",
|
||||
"-ms-background-position-x",
|
||||
"background-position-y",
|
||||
"-ms-background-position-y",
|
||||
"-webkit-background-clip",
|
||||
"-moz-background-clip",
|
||||
"background-clip",
|
||||
"background-origin",
|
||||
"-webkit-background-size",
|
||||
"-moz-background-size",
|
||||
"-o-background-size",
|
||||
"background-size",
|
||||
"box-decoration-break",
|
||||
"-webkit-box-shadow",
|
||||
"-moz-box-shadow",
|
||||
"box-shadow",
|
||||
"filter:progid:DXImageTransform.Microsoft.gradient",
|
||||
"-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient",
|
||||
"text-shadow"
|
||||
]
|
||||
]
|
||||
}
|
|
@ -54,6 +54,7 @@
|
|||
"atom-space-pen-views": "^2.0.3",
|
||||
"bluebird": "^2.9.25",
|
||||
"coffee-formatter": "^0.1.2",
|
||||
"csscomb": "^3.0.4",
|
||||
"diff": "^1.3.2",
|
||||
"editorconfig": "^0.11.4",
|
||||
"emissary": "^1.0.0",
|
||||
|
|
|
@ -157,7 +157,7 @@ module.exports = class Beautifier
|
|||
cmd.stderr.on('data', (data) -> stderr += data )
|
||||
# when the spawn child process exits, check if there were any errors and close the writeable stream
|
||||
cmd.on('exit', (code) ->
|
||||
console.log('spawn done', code, stderr, stdout)
|
||||
# console.log('spawn done', code, stderr, stdout)
|
||||
# If return code is not 0 then error occured
|
||||
# if code isnt 0
|
||||
# reject(stderr)
|
||||
|
@ -165,7 +165,7 @@ module.exports = class Beautifier
|
|||
resolve(stdout)
|
||||
)
|
||||
cmd.on('error', (err) ->
|
||||
console.log('error', err)
|
||||
# console.log('error', err)
|
||||
reject(err)
|
||||
)
|
||||
)
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
"use strict"
|
||||
Beautifier = require('./beautifier')
|
||||
|
||||
module.exports = class JSBeautify extends Beautifier
|
||||
name: "CSScomb"
|
||||
|
||||
options: {
|
||||
# TODO: Add support for options
|
||||
CSS: false
|
||||
LESS: false
|
||||
Sass: false
|
||||
SCSS: false
|
||||
}
|
||||
|
||||
beautify: (text, language, options) ->
|
||||
return new @Promise((resolve, reject) ->
|
||||
# console.log('CSSComb', text, language, options)
|
||||
|
||||
# Require
|
||||
Comb = require('csscomb')
|
||||
|
||||
config = null
|
||||
try
|
||||
# Load from Project's .csscomb.json
|
||||
projectConfigPath = atom.project.getDirectories()?[0]?.resolve('.csscomb.json')
|
||||
config = require(projectConfigPath) # Will throw error if does not exist
|
||||
catch e
|
||||
# Fallback to csscomb
|
||||
config = Comb.getConfig('csscomb')
|
||||
# TODO: Add support to select CSSComb predefined config's name
|
||||
# console.log('config', config, options)
|
||||
# Configure
|
||||
comb = new Comb(config)
|
||||
|
||||
# Determine syntax from Language
|
||||
syntax = "css" # Default
|
||||
switch language
|
||||
when "LESS"
|
||||
syntax = "less"
|
||||
when "SCSS"
|
||||
syntax = "scss"
|
||||
when "Sass"
|
||||
syntax = "sass"
|
||||
# Use
|
||||
processedCSS = comb.processString(text, {
|
||||
syntax: syntax
|
||||
})
|
||||
# console.log('processedCSS', processedCSS, syntax)
|
||||
|
||||
resolve(processedCSS)
|
||||
)
|
|
@ -35,6 +35,7 @@ module.exports = class Beautifiers
|
|||
'autopep8'
|
||||
'coffee-formatter'
|
||||
'htmlbeautifier'
|
||||
'csscomb'
|
||||
'js-beautify'
|
||||
'perltidy'
|
||||
'php-cs-fixer'
|
||||
|
@ -110,14 +111,17 @@ module.exports = class Beautifiers
|
|||
# Is a valid Language name
|
||||
if typeof options is "boolean"
|
||||
# Enable / disable all options
|
||||
# Add Beautifier support to Language
|
||||
languages[languageName]?.beautifiers.push(beautifierName)
|
||||
# Check for beautifier's options support
|
||||
if options is true
|
||||
# Beautifier supports all options for this language
|
||||
if laOp
|
||||
# console.log('add supported beautifier', languageName, beautifierName)
|
||||
languages[languageName]?.beautifiers.push(beautifierName)
|
||||
for field, op of laOp
|
||||
op.beautifiers.push(beautifierName)
|
||||
else
|
||||
# Supports language but no options specifically
|
||||
console.warn("Could not find options for language: #{languageName}")
|
||||
else if typeof options is "object"
|
||||
# Iterate over beautifier's options for this language
|
||||
|
@ -202,7 +206,7 @@ module.exports = class Beautifiers
|
|||
flatOptions["#{optionName}_default_beautifier"] = {
|
||||
title: "Language Config - #{name} - Default Beautifier"
|
||||
type: 'string'
|
||||
default: beautifiers[0]
|
||||
default: lang.defaultBeautifier ? beautifiers[0]
|
||||
description: "Default Beautifier to be used for #{name}"
|
||||
enum: _.uniq(beautifiers)
|
||||
}
|
||||
|
@ -270,9 +274,11 @@ module.exports = class Beautifiers
|
|||
# Transform options, if applicable
|
||||
beautifierOptions = beautifier.options[languageName]
|
||||
if typeof beautifierOptions is "boolean"
|
||||
if beautifierOptions isnt true
|
||||
# Disable options
|
||||
options = {}
|
||||
# Language is supported by beautifier
|
||||
# If true then all options are directly supported
|
||||
# If falsy then pass all options to beautifier,
|
||||
# although no options are directly supported.
|
||||
return options
|
||||
else if typeof beautifierOptions is "object"
|
||||
# Transform the options
|
||||
transformedOptions = {}
|
||||
|
@ -298,10 +304,10 @@ module.exports = class Beautifiers
|
|||
transformedOptions[field] = fn.apply(null, vals)
|
||||
|
||||
# Replace old options with new transformed options
|
||||
options = transformedOptions
|
||||
return transformedOptions
|
||||
else
|
||||
console.warn("Unsupported Language options: ", beautifierOptions)
|
||||
return options
|
||||
return options
|
||||
|
||||
# Apply language-specific option transformations
|
||||
options = transformOptions(beautifier, language.name, options)
|
||||
|
|
|
@ -18,6 +18,6 @@ module.exports = class Rubocop extends Beautifier
|
|||
tempFile = @tempFile("temp", text)
|
||||
])
|
||||
.then(=>
|
||||
console.log('rubocop', arguments, tempFile)
|
||||
# console.log('rubocop', arguments, tempFile)
|
||||
@readFile(tempFile)
|
||||
)
|
||||
|
|
|
@ -24,6 +24,8 @@ module.exports = {
|
|||
"css"
|
||||
]
|
||||
|
||||
defaultBeautifier: "JS Beautify"
|
||||
|
||||
options:
|
||||
# CSS
|
||||
indent_size:
|
||||
|
|
|
@ -18,4 +18,6 @@ module.exports = {
|
|||
'less'
|
||||
]
|
||||
|
||||
defaultBeautifier: "Pretty Diff"
|
||||
|
||||
}
|
|
@ -18,4 +18,6 @@ module.exports = {
|
|||
"sass"
|
||||
]
|
||||
|
||||
defaultBeautifier: "Pretty Diff"
|
||||
|
||||
}
|
|
@ -18,4 +18,6 @@ module.exports = {
|
|||
"scss"
|
||||
]
|
||||
|
||||
defaultBeautifier: "Pretty Diff"
|
||||
|
||||
}
|
Loading…
Reference in New Issue