|
|
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 override(DEFAULTS, source); }
if (typeof source == 'object') { return override(DEFAULTS, source); }
if (typeof source == 'string' && source == BEAUTIFY_ALIAS) { return override(DEFAULTS, { breaks: breaks(true), indentBy: 2, spaces: spaces(true) }); }
if (typeof source == 'string' && source == KEEP_BREAKS_ALIAS) { return override(DEFAULTS, { breaks: { afterAtRule: true, afterBlockBegins: true, afterBlockEnds: true, afterComment: true, afterRuleEnds: true, beforeBlockEnds: true } }); }
if (typeof source == 'string') { return 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; } }
module.exports = { Breaks: Breaks, Spaces: Spaces, formatFrom: formatFrom };
|