277 lines
8.6 KiB
CoffeeScript
277 lines
8.6 KiB
CoffeeScript
###
|
|
Language Support and default options.
|
|
###
|
|
"use strict"
|
|
# Lazy loaded dependencies
|
|
_ = null
|
|
extend = null
|
|
# Language Beautifiers
|
|
beautifyJS = null
|
|
beautifyHTML = null
|
|
beautifyCSS = null
|
|
beautifySQL = null
|
|
beautifyPHP = null
|
|
beautifyPython = null
|
|
beautifyRuby = null
|
|
beautifyLESS = null
|
|
beautifyCoffeeScript = null
|
|
uncrustifyBeautifier = null
|
|
beautifyHTMLERB = null
|
|
|
|
# Misc
|
|
Analytics = require("analytics-node")
|
|
pkg = require("../package.json")
|
|
|
|
# Analytics
|
|
analyticsWriteKey = "u3c26xkae8"
|
|
module.exports =
|
|
|
|
# Supported unique configuration keys
|
|
# Used for detecting nested configurations in .jsbeautifyrc
|
|
languages: [
|
|
"js"
|
|
"html"
|
|
"css"
|
|
"sql"
|
|
"php"
|
|
"python"
|
|
"ruby"
|
|
"coffeescript"
|
|
"c"
|
|
"cpp"
|
|
"cs"
|
|
"objectivec"
|
|
"java"
|
|
"d"
|
|
"pawn"
|
|
"vala"
|
|
]
|
|
|
|
# Default options per language
|
|
defaultLanguageOptions:
|
|
|
|
# jshint ignore: start
|
|
|
|
# JavaScript
|
|
js_indent_size: 2
|
|
js_indent_char: " "
|
|
js_indent_level: 0
|
|
js_indent_with_tabs: false
|
|
js_preserve_newlines: true
|
|
js_max_preserve_newlines: 10
|
|
js_jslint_happy: false
|
|
js_brace_style: "collapse"
|
|
js_keep_array_indentation: false
|
|
js_keep_function_indentation: false
|
|
js_space_before_conditional: true
|
|
js_break_chained_methods: false
|
|
js_eval_code: false
|
|
js_unescape_strings: false
|
|
js_wrap_line_length: 0
|
|
|
|
# CSS
|
|
css_indent_size: 2
|
|
css_indent_Char: " "
|
|
|
|
# HTML
|
|
html_indent_inner_html: false
|
|
html_indent_size: 2
|
|
html_indent_char: " "
|
|
html_brace_style: "collapse"
|
|
html_indent_scripts: "normal"
|
|
html_wrap_line_length: 250
|
|
|
|
# SQL
|
|
sql_indent_size: 2
|
|
sql_keywords: "upper"
|
|
sql_identifiers: "lower"
|
|
sql_sqlformat_path: ""
|
|
|
|
# PHP
|
|
php_beautifier_path: ""
|
|
|
|
# Python
|
|
python_autopep8_path: ""
|
|
python_max_line_length: 79
|
|
python_indent_size: 4
|
|
python_ignore: ["E24"]
|
|
|
|
# Ruby
|
|
ruby_rbeautify_path: ""
|
|
|
|
# C
|
|
c_configPath: ""
|
|
|
|
# C++
|
|
cpp_configPath: ""
|
|
|
|
# Objective-C
|
|
objectivec_configPath: ""
|
|
|
|
# C#
|
|
cs_configPath: ""
|
|
|
|
# Objective-C
|
|
d_configPath: ""
|
|
|
|
# Java
|
|
java_configPath: ""
|
|
|
|
# Pawn
|
|
pawn_configPath: ""
|
|
|
|
# VALA
|
|
vala_configPath: ""
|
|
|
|
|
|
# jshint ignore: end
|
|
|
|
# Process each language
|
|
beautify: (text, grammar, allOptions, beautifyCompleted) ->
|
|
self = this
|
|
# Beautify!
|
|
unsupportedGrammar = false
|
|
options = undefined
|
|
switch grammar
|
|
# Treat JSON as JavaScript, because it will support comments.
|
|
# And Glavin001 has tested JSON beauifying with beautifyJS.
|
|
when "JSON", "JavaScript"
|
|
beautifyJS ?= require("js-beautify")
|
|
text = beautifyJS(text, self.getOptions("js", allOptions))
|
|
beautifyCompleted text
|
|
when "CoffeeScript"
|
|
beautifyCoffeeScript ?= require("./langs/coffeescript-beautify")
|
|
beautifyCoffeeScript text, self.getOptions("js", allOptions), beautifyCompleted
|
|
when "Handlebars"
|
|
# jshint ignore: start
|
|
allOptions.push indent_handlebars: true # Force jsbeautify to indent_handlebars
|
|
# jshint ignore: end
|
|
when "HTML (Liquid)", "HTML", "XML"
|
|
beautifyHTML ?= require("js-beautify").html
|
|
text = beautifyHTML(text, self.getOptions("html", allOptions))
|
|
beautifyCompleted text
|
|
when "HTML (Ruby - ERB)"
|
|
beautifyHTMLERB ?= require("./langs/html-erb-beautify")
|
|
beautifyHTMLERB text, self.getOptions("html", allOptions), beautifyCompleted
|
|
when "CSS"
|
|
beautifyCSS ?= require("js-beautify").css
|
|
text = beautifyCSS(text, self.getOptions("css", allOptions))
|
|
beautifyCompleted text
|
|
when "Sass", "SCSS", "LESS"
|
|
beautifyLESS ?= require("./langs/less-beautify")
|
|
beautifyLESS text, self.getOptions("css", allOptions), beautifyCompleted
|
|
when "SQL (Rails)", "SQL"
|
|
beautifySQL ?= require("./langs/sql-beautify")
|
|
beautifySQL text, self.getOptions("sql", allOptions), beautifyCompleted
|
|
when "PHP"
|
|
beautifyPHP ?= require("./langs/php-beautify")
|
|
beautifyPHP text, self.getOptions("php", allOptions), beautifyCompleted
|
|
when "Python"
|
|
beautifyPython ?= require("./langs/python-beautify")
|
|
beautifyPython text, self.getOptions("python", allOptions), beautifyCompleted
|
|
when "Ruby"
|
|
beautifyRuby ?= require("./langs/ruby-beautify")
|
|
beautifyRuby text, self.getOptions("ruby", allOptions), beautifyCompleted
|
|
when "C"
|
|
options = self.getOptions("c", allOptions)
|
|
options.languageOverride = "C"
|
|
uncrustifyBeautifier ?= require("./langs/uncrustify/")
|
|
uncrustifyBeautifier text, options, beautifyCompleted
|
|
when "C++"
|
|
options = self.getOptions("cpp", allOptions)
|
|
options.languageOverride = "CPP"
|
|
uncrustifyBeautifier ?= require("./langs/uncrustify/")
|
|
uncrustifyBeautifier text, options, beautifyCompleted
|
|
when "C#"
|
|
options = self.getOptions("cs", allOptions)
|
|
options.languageOverride = "CS"
|
|
uncrustifyBeautifier ?= require("./langs/uncrustify/")
|
|
uncrustifyBeautifier text, options, beautifyCompleted
|
|
when "Objective-C", "Objective-C++"
|
|
options = self.getOptions("objectivec", allOptions)
|
|
options.languageOverride = "OC+"
|
|
uncrustifyBeautifier ?= require("./langs/uncrustify/")
|
|
uncrustifyBeautifier text, options, beautifyCompleted
|
|
when "D"
|
|
options = self.getOptions("d", allOptions)
|
|
options.languageOverride = "D"
|
|
uncrustifyBeautifier ?= require("./langs/uncrustify/")
|
|
uncrustifyBeautifier text, options, beautifyCompleted
|
|
when "Pawn"
|
|
options = self.getOptions("pawn", allOptions)
|
|
options.languageOverride = "PAWN"
|
|
uncrustifyBeautifier ?= require("./langs/uncrustify/")
|
|
uncrustifyBeautifier text, options, beautifyCompleted
|
|
when "Vala"
|
|
options = self.getOptions("vala", allOptions)
|
|
options.languageOverride = "VALA"
|
|
uncrustifyBeautifier ?= require("./langs/uncrustify/")
|
|
uncrustifyBeautifier text, options, beautifyCompleted
|
|
when "Java"
|
|
options = self.getOptions("java", allOptions)
|
|
options.languageOverride = "JAVA"
|
|
uncrustifyBeautifier ?= require("./langs/uncrustify/")
|
|
uncrustifyBeautifier text, options, beautifyCompleted
|
|
else
|
|
unsupportedGrammar = true
|
|
|
|
# Check if Analytics is enabled
|
|
if atom.config.get("atom-beautify.analytics")
|
|
# Setup Analytics
|
|
analytics = new Analytics(analyticsWriteKey)
|
|
unless atom.config.get("atom-beautify._analyticsUserId")
|
|
uuid = require("node-uuid")
|
|
atom.config.set "atom-beautify._analyticsUserId", uuid.v4()
|
|
# Setup Analytics User Id
|
|
userId = atom.config.get("atom-beautify._analyticsUserId")
|
|
analytics.identify userId: userId
|
|
version = pkg.version
|
|
analytics.track
|
|
userId: atom.config.get("atom-beautify._analyticsUserId")
|
|
event: "Beautify"
|
|
properties:
|
|
grammar: grammar
|
|
version: version
|
|
options: allOptions
|
|
label: grammar
|
|
category: version
|
|
#
|
|
if unsupportedGrammar
|
|
throw new Error("Unsupported language for grammar '#{grammar}'.")
|
|
return
|
|
|
|
getOptions: (selection, allOptions) ->
|
|
self = this
|
|
_ ?= require("lodash")
|
|
extend ?= require("extend")
|
|
# console.log(selection, allOptions);
|
|
# Reduce all options into correctly merged options.
|
|
options = _.reduce(allOptions, (result, currOptions) ->
|
|
containsNested = false
|
|
collectedConfig = {}
|
|
key = undefined
|
|
# Check to see if config file uses nested object format to split up js/css/html options
|
|
for key of currOptions
|
|
# Check if is supported language
|
|
if _.indexOf(self.languages, key) >= 0 and typeof currOptions[key] is "object" # Check if nested object (more options in value)
|
|
containsNested = true
|
|
break # Found, break out of loop, no need to continue
|
|
# console.log(containsNested, currOptions);
|
|
# Create a flat object of config options if nested format was used
|
|
unless containsNested
|
|
_.merge collectedConfig, currOptions
|
|
else
|
|
# Merge with selected options
|
|
# where `selection` could be `html`, `js`, 'css', etc
|
|
# console.log(selection, currOptions[selection]);
|
|
_.merge collectedConfig, currOptions[selection]
|
|
extend result, collectedConfig
|
|
, {})
|
|
# TODO: Clean.
|
|
# There is a bug in nopt
|
|
# See https://github.com/npm/nopt/issues/38#issuecomment-45971505
|
|
# console.log('pre-clean', JSON.stringify(options));
|
|
#options = cleanOptions(options, knownOpts);
|
|
#console.log('post-clean', JSON.stringify(options));
|
|
options
|