You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
5.4 KiB
232 lines
5.4 KiB
var systemLineBreak = require('os').EOL; |
|
|
|
var override = require('../utils/override'); |
|
|
|
var Breaks = { |
|
AfterAtRule: 'afterAtRule', |
|
AfterBlockBegins: 'afterBlockBegins', |
|
AfterBlockEnds: 'afterBlockEnds', |
|
AfterComment: 'afterComment', |
|
AfterProperty: 'afterProperty', |
|
AfterRuleBegins: 'afterRuleBegins', |
|
AfterRuleEnds: 'afterRuleEnds', |
|
BeforeBlockEnds: 'beforeBlockEnds', |
|
BetweenSelectors: 'betweenSelectors' |
|
}; |
|
|
|
var BreakWith = { |
|
CarriageReturnLineFeed: '\r\n', |
|
LineFeed: '\n', |
|
System: systemLineBreak |
|
}; |
|
|
|
var IndentWith = { |
|
Space: ' ', |
|
Tab: '\t' |
|
}; |
|
|
|
var Spaces = { |
|
AroundSelectorRelation: 'aroundSelectorRelation', |
|
BeforeBlockBegins: 'beforeBlockBegins', |
|
BeforeValue: 'beforeValue' |
|
}; |
|
|
|
var DEFAULTS = { |
|
breaks: breaks(false), |
|
breakWith: BreakWith.System, |
|
indentBy: 0, |
|
indentWith: IndentWith.Space, |
|
spaces: spaces(false), |
|
wrapAt: false, |
|
semicolonAfterLastProperty: false |
|
}; |
|
|
|
var BEAUTIFY_ALIAS = 'beautify'; |
|
var KEEP_BREAKS_ALIAS = 'keep-breaks'; |
|
|
|
var OPTION_SEPARATOR = ';'; |
|
var OPTION_NAME_VALUE_SEPARATOR = ':'; |
|
var HASH_VALUES_OPTION_SEPARATOR = ','; |
|
var HASH_VALUES_NAME_VALUE_SEPARATOR = '='; |
|
|
|
var FALSE_KEYWORD_1 = 'false'; |
|
var FALSE_KEYWORD_2 = 'off'; |
|
var TRUE_KEYWORD_1 = 'true'; |
|
var TRUE_KEYWORD_2 = 'on'; |
|
|
|
function breaks(value) { |
|
var breakOptions = {}; |
|
|
|
breakOptions[Breaks.AfterAtRule] = value; |
|
breakOptions[Breaks.AfterBlockBegins] = value; |
|
breakOptions[Breaks.AfterBlockEnds] = value; |
|
breakOptions[Breaks.AfterComment] = value; |
|
breakOptions[Breaks.AfterProperty] = value; |
|
breakOptions[Breaks.AfterRuleBegins] = value; |
|
breakOptions[Breaks.AfterRuleEnds] = value; |
|
breakOptions[Breaks.BeforeBlockEnds] = value; |
|
breakOptions[Breaks.BetweenSelectors] = value; |
|
|
|
return breakOptions; |
|
} |
|
|
|
function spaces(value) { |
|
var spaceOptions = {}; |
|
|
|
spaceOptions[Spaces.AroundSelectorRelation] = value; |
|
spaceOptions[Spaces.BeforeBlockBegins] = value; |
|
spaceOptions[Spaces.BeforeValue] = value; |
|
|
|
return spaceOptions; |
|
} |
|
|
|
function formatFrom(source) { |
|
if (source === undefined || source === false) { |
|
return false; |
|
} |
|
|
|
if (typeof source == 'object' && 'breakWith' in source) { |
|
source = override(source, { breakWith: mapBreakWith(source.breakWith) }); |
|
} |
|
|
|
if (typeof source == 'object' && 'indentBy' in source) { |
|
source = override(source, { indentBy: parseInt(source.indentBy) }); |
|
} |
|
|
|
if (typeof source == 'object' && 'indentWith' in source) { |
|
source = override(source, { indentWith: mapIndentWith(source.indentWith) }); |
|
} |
|
|
|
if (typeof source == 'object') { |
|
return remapBreaks(override(DEFAULTS, source)); |
|
} |
|
|
|
if (typeof source == 'string' && source == BEAUTIFY_ALIAS) { |
|
return remapBreaks( |
|
override(DEFAULTS, { |
|
breaks: breaks(true), |
|
indentBy: 2, |
|
spaces: spaces(true) |
|
}) |
|
); |
|
} |
|
|
|
if (typeof source == 'string' && source == KEEP_BREAKS_ALIAS) { |
|
return remapBreaks( |
|
override(DEFAULTS, { |
|
breaks: { |
|
afterAtRule: true, |
|
afterBlockBegins: true, |
|
afterBlockEnds: true, |
|
afterComment: true, |
|
afterRuleEnds: true, |
|
beforeBlockEnds: true |
|
} |
|
}) |
|
); |
|
} |
|
|
|
if (typeof source == 'string') { |
|
return remapBreaks(override(DEFAULTS, toHash(source))); |
|
} |
|
|
|
return DEFAULTS; |
|
} |
|
|
|
function toHash(string) { |
|
return string |
|
.split(OPTION_SEPARATOR) |
|
.reduce(function(accumulator, directive) { |
|
var parts = directive.split(OPTION_NAME_VALUE_SEPARATOR); |
|
var name = parts[0]; |
|
var value = parts[1]; |
|
|
|
if (name == 'breaks' || name == 'spaces') { |
|
accumulator[name] = hashValuesToHash(value); |
|
} else if (name == 'indentBy' || name == 'wrapAt') { |
|
accumulator[name] = parseInt(value); |
|
} else if (name == 'indentWith') { |
|
accumulator[name] = mapIndentWith(value); |
|
} else if (name == 'breakWith') { |
|
accumulator[name] = mapBreakWith(value); |
|
} |
|
|
|
return accumulator; |
|
}, {}); |
|
} |
|
|
|
function hashValuesToHash(string) { |
|
return string |
|
.split(HASH_VALUES_OPTION_SEPARATOR) |
|
.reduce(function(accumulator, directive) { |
|
var parts = directive.split(HASH_VALUES_NAME_VALUE_SEPARATOR); |
|
var name = parts[0]; |
|
var value = parts[1]; |
|
|
|
accumulator[name] = normalizeValue(value); |
|
|
|
return accumulator; |
|
}, {}); |
|
} |
|
|
|
function normalizeValue(value) { |
|
switch (value) { |
|
case FALSE_KEYWORD_1: |
|
case FALSE_KEYWORD_2: |
|
return false; |
|
case TRUE_KEYWORD_1: |
|
case TRUE_KEYWORD_2: |
|
return true; |
|
default: |
|
return value; |
|
} |
|
} |
|
|
|
function mapBreakWith(value) { |
|
switch (value) { |
|
case 'windows': |
|
case 'crlf': |
|
case BreakWith.CarriageReturnLineFeed: |
|
return BreakWith.CarriageReturnLineFeed; |
|
case 'unix': |
|
case 'lf': |
|
case BreakWith.LineFeed: |
|
return BreakWith.LineFeed; |
|
default: |
|
return systemLineBreak; |
|
} |
|
} |
|
|
|
function mapIndentWith(value) { |
|
switch (value) { |
|
case 'space': |
|
return IndentWith.Space; |
|
case 'tab': |
|
return IndentWith.Tab; |
|
default: |
|
return value; |
|
} |
|
} |
|
|
|
function remapBreaks(source) { |
|
for (var key in Breaks) { |
|
var breakName = Breaks[key]; |
|
var breakValue = source.breaks[breakName]; |
|
|
|
if (breakValue === true) { |
|
source.breaks[breakName] = source.breakWith; |
|
} else if (breakValue === false) { |
|
source.breaks[breakName] = ''; |
|
} else { |
|
source.breaks[breakName] = source.breakWith.repeat(parseInt(breakValue)); |
|
} |
|
} |
|
|
|
return source; |
|
} |
|
|
|
module.exports = { |
|
Breaks: Breaks, |
|
Spaces: Spaces, |
|
formatFrom: formatFrom |
|
};
|
|
|