|
|
- 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
- };
|