123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- var lineBreak = require('os').EOL;
- var AT_RULE = 'at-rule';
- var PROPERTY_SEPARATOR = ';';
- function hasMoreProperties(tokens, index) {
- for (var i = index, l = tokens.length; i < l; i++) {
- if (typeof tokens[i] != 'string')
- return true;
- }
- return false;
- }
- function supportsAfterClosingBrace(token) {
- return token[0][0] == 'background' || token[0][0] == 'transform' || token[0][0] == 'src';
- }
- function afterClosingBrace(token, valueIndex) {
- return token[valueIndex][0][token[valueIndex][0].length - 1] == ')' || token[valueIndex][0].indexOf('__ESCAPED_URL_CLEAN_CSS') === 0;
- }
- function afterComma(token, valueIndex) {
- return token[valueIndex][0] == ',';
- }
- function afterSlash(token, valueIndex) {
- return token[valueIndex][0] == '/';
- }
- function beforeComma(token, valueIndex) {
- return token[valueIndex + 1] && token[valueIndex + 1][0] == ',';
- }
- function beforeSlash(token, valueIndex) {
- return token[valueIndex + 1] && token[valueIndex + 1][0] == '/';
- }
- function inFilter(token) {
- return token[0][0] == 'filter' || token[0][0] == '-ms-filter';
- }
- function inSpecialContext(token, valueIndex, context) {
- return !context.spaceAfterClosingBrace && supportsAfterClosingBrace(token) && afterClosingBrace(token, valueIndex) ||
- beforeSlash(token, valueIndex) ||
- afterSlash(token, valueIndex) ||
- beforeComma(token, valueIndex) ||
- afterComma(token, valueIndex);
- }
- function selectors(tokens, context) {
- var store = context.store;
- for (var i = 0, l = tokens.length; i < l; i++) {
- store(tokens[i], context);
- if (i < l - 1)
- store(',', context);
- }
- }
- function body(tokens, context) {
- for (var i = 0, l = tokens.length; i < l; i++) {
- property(tokens, i, i == l - 1, context);
- }
- }
- function property(tokens, position, isLast, context) {
- var store = context.store;
- var token = tokens[position];
- if (typeof token == 'string') {
- store(token, context);
- } else if (token[0] == AT_RULE) {
- propertyAtRule(token[1], false, context);
- } else {
- store(token[0], context);
- store(':', context);
- value(tokens, position, isLast, context);
- }
- }
- function propertyAtRule(value, isLast, context) {
- var store = context.store;
- store(value, context);
- if (!isLast)
- store(PROPERTY_SEPARATOR, context);
- }
- function value(tokens, position, isLast, context) {
- var store = context.store;
- var token = tokens[position];
- var isVariableDeclaration = token[0][0].indexOf('--') === 0;
- var isBlockVariable = isVariableDeclaration && Array.isArray(token[1][0]);
- if (isVariableDeclaration && isBlockVariable && atRulesOrProperties(token[1])) {
- store('{', context);
- body(token[1], context);
- store('};', context);
- return;
- }
- for (var j = 1, m = token.length; j < m; j++) {
- store(token[j], context);
- if (j < m - 1 && (inFilter(token) || !inSpecialContext(token, j, context))) {
- store(' ', context);
- } else if (j == m - 1 && !isLast && hasMoreProperties(tokens, position + 1)) {
- store(PROPERTY_SEPARATOR, context);
- }
- }
- }
- function atRulesOrProperties(values) {
- for (var i = 0, l = values.length; i < l; i++) {
- if (values[i][0] == AT_RULE || Array.isArray(values[i][0]))
- return true;
- }
- return false;
- }
- function all(tokens, context) {
- var joinCharacter = context.keepBreaks ? lineBreak : '';
- var store = context.store;
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
- switch (token[0]) {
- case 'at-rule':
- case 'text':
- store(token[1][0], context);
- store(joinCharacter, context);
- break;
- case 'block':
- selectors([token[1]], context);
- store('{', context);
- all(token[2], context);
- store('}', context);
- store(joinCharacter, context);
- break;
- case 'flat-block':
- selectors([token[1]], context);
- store('{', context);
- body(token[2], context);
- store('}', context);
- store(joinCharacter, context);
- break;
- default:
- selectors(token[1], context);
- store('{', context);
- body(token[2], context);
- store('}', context);
- store(joinCharacter, context);
- }
- }
- }
- module.exports = {
- all: all,
- body: body,
- property: property,
- selectors: selectors,
- value: value
- };
|