* Cleans up url rebase code getting rid of unnecessary state.
* Cleans up tokenizer code getting rid of unnecessary state.
+* Moves source maps tracker into lib/source-maps/track.
+* Moves tokenizer code into lib/tokenizer.
* Moves URL rebasing & rewriting into lib/urls.
* Fixed issue [#436](https://github.com/jakubpawlowicz/clean-css/issues/436) - refactors URI rewriting.
-var tokenize = require('./tokenizer');
+var tokenize = require('../tokenizer/tokenize');
var SimpleOptimizer = require('./optimizers/simple');
var AdvancedOptimizer = require('./optimizers/advanced');
var addOptimizationMetadata = require('./optimization-metadata');
--- /dev/null
+var Splitter = require('../utils/splitter');
+
+var COMMA = ',';
+var FORWARD_SLASH = '/';
+
+function selectorName(value) {
+ return value[0];
+}
+
+function extractProperties(string, selectors, context) {
+ var list = [];
+ var splitter = new Splitter(/[ ,\/]/);
+
+ if (typeof string != 'string')
+ return [];
+
+ if (string.indexOf('__ESCAPED_COMMENT_') > -1)
+ string = string.replace(/(__ESCAPED_COMMENT_(SPECIAL_)?CLEAN_CSS[^_]+?__)/g, ';$1;');
+
+ if (string.indexOf(')') > -1)
+ string = string.replace(/\)([^\s_;:,\)])/g, context.sourceMap ? ') __ESCAPED_COMMENT_CLEAN_CSS(0,-1)__ $1' : ') $1');
+
+ if (string.indexOf('ESCAPED_URL_CLEAN_CSS') > -1)
+ string = string.replace(/(ESCAPED_URL_CLEAN_CSS[^_]+?__)/g, context.sourceMap ? '$1 __ESCAPED_COMMENT_CLEAN_CSS(0,-1)__ ' : '$1 ');
+
+ var candidates = string.split(';');
+
+ for (var i = 0, l = candidates.length; i < l; i++) {
+ var candidate = candidates[i];
+ var firstColonAt = candidate.indexOf(':');
+
+ if (firstColonAt == -1) {
+ context.track(candidate);
+ if (candidate.indexOf('__ESCAPED_COMMENT_SPECIAL') > -1)
+ list.push(candidate);
+ continue;
+ }
+
+ if (candidate.indexOf('{') > 0) {
+ context.track(candidate);
+ continue;
+ }
+
+ var body = [];
+ var name = candidate.substring(0, firstColonAt);
+ body.push([name.trim()].concat(context.track(name, true)));
+ context.track(':');
+
+ var values = splitter.split(candidate.substring(firstColonAt + 1), true);
+
+ if (values.length == 1 && values[0] === '') {
+ context.warnings.push('Empty property \'' + name + '\' inside \'' + selectors.filter(selectorName).join(',') + '\' selector. Ignoring.');
+ continue;
+ }
+
+ for (var j = 0, m = values.length; j < m; j++) {
+ var value = values[j];
+ var trimmed = value.trim();
+
+ if (trimmed.length === 0)
+ continue;
+
+ var lastCharacter = trimmed[trimmed.length - 1];
+ var endsWithNonSpaceSeparator = trimmed.length > 1 && (lastCharacter == COMMA || lastCharacter == FORWARD_SLASH);
+
+ if (endsWithNonSpaceSeparator)
+ trimmed = trimmed.substring(0, trimmed.length - 1);
+
+ if (trimmed.indexOf('__ESCAPED_COMMENT_CLEAN_CSS(0,-') > -1) {
+ context.track(trimmed);
+ continue;
+ }
+
+ var pos = body.length - 1;
+ if (trimmed == 'important' && body[pos][0] == '!') {
+ context.track(trimmed);
+ body[pos - 1][0] += '!important';
+ body.pop();
+ continue;
+ }
+
+ if (trimmed == '!important' || (trimmed == 'important' && body[pos][0][body[pos][0].length - 1] == '!')) {
+ context.track(trimmed);
+ body[pos][0] += trimmed;
+ continue;
+ }
+
+ body.push([trimmed].concat(context.track(value, true)));
+
+ if (endsWithNonSpaceSeparator) {
+ body.push([lastCharacter]);
+ context.track(lastCharacter);
+ }
+ }
+
+ if (i < l - 1)
+ context.track(';');
+
+ list.push(body);
+ }
+
+ return list;
+}
+
+module.exports = extractProperties;
--- /dev/null
+var Splitter = require('../utils/splitter');
+
+function extractSelectors(string, context) {
+ var list = [];
+ var metadata;
+ var selectors = new Splitter(',').split(string);
+
+ for (var i = 0, l = selectors.length; i < l; i++) {
+ metadata = context.track(selectors[i], true, i);
+ context.track(',');
+ list.push([selectors[i].trim()].concat(metadata));
+ }
+
+ return list;
+}
+
+module.exports = extractSelectors;
-var Chunker = require('../utils/chunker');
-var Extract = require('../utils/extractors');
-var track = require('../utils/source-maps');
+var Chunker = require('./chunker');
+var extractProperties = require('./extract-properties');
+var extractSelectors = require('./extract-selectors');
+var track = require('../source-maps/track');
var path = require('path');
newToken.push(intoTokens(context));
if (typeof newToken[2] == 'string')
- newToken[2] = Extract.properties(newToken[2], [[trimmedValue]], context);
+ newToken[2] = extractProperties(newToken[2], [[trimmedValue]], context);
context.mode = oldMode;
context.track('}');
context.cursor = nextEnd + 2;
} else if (what == 'bodyStart') {
- var selectors = Extract.selectors(chunk.substring(context.cursor, nextSpecial), context);
+ var selectors = extractSelectors(chunk.substring(context.cursor, nextSpecial), context);
oldMode = context.mode;
context.cursor = nextSpecial + 1;
context.mode = 'body';
- var body = Extract.properties(intoTokens(context), selectors, context);
+ var body = extractProperties(intoTokens(context), selectors, context);
context.track('{');
context.mode = oldMode;
+++ /dev/null
-var Splitter = require('./splitter');
-
-var COMMA = ',';
-var FORWARD_SLASH = '/';
-
-function selectorName(value) {
- return value[0];
-}
-
-var Extractors = {
- properties: function (string, selectors, context) {
- var list = [];
- var splitter = new Splitter(/[ ,\/]/);
-
- if (typeof string != 'string')
- return [];
-
- if (string.indexOf('__ESCAPED_COMMENT_') > -1)
- string = string.replace(/(__ESCAPED_COMMENT_(SPECIAL_)?CLEAN_CSS[^_]+?__)/g, ';$1;');
-
- if (string.indexOf(')') > -1)
- string = string.replace(/\)([^\s_;:,\)])/g, context.sourceMap ? ') __ESCAPED_COMMENT_CLEAN_CSS(0,-1)__ $1' : ') $1');
-
- if (string.indexOf('ESCAPED_URL_CLEAN_CSS') > -1)
- string = string.replace(/(ESCAPED_URL_CLEAN_CSS[^_]+?__)/g, context.sourceMap ? '$1 __ESCAPED_COMMENT_CLEAN_CSS(0,-1)__ ' : '$1 ');
-
- var candidates = string.split(';');
-
- for (var i = 0, l = candidates.length; i < l; i++) {
- var candidate = candidates[i];
- var firstColonAt = candidate.indexOf(':');
-
- if (firstColonAt == -1) {
- context.track(candidate);
- if (candidate.indexOf('__ESCAPED_COMMENT_SPECIAL') > -1)
- list.push(candidate);
- continue;
- }
-
- if (candidate.indexOf('{') > 0) {
- context.track(candidate);
- continue;
- }
-
- var body = [];
- var name = candidate.substring(0, firstColonAt);
- body.push([name.trim()].concat(context.track(name, true)));
- context.track(':');
-
- var values = splitter.split(candidate.substring(firstColonAt + 1), true);
-
- if (values.length == 1 && values[0] === '') {
- context.warnings.push('Empty property \'' + name + '\' inside \'' + selectors.filter(selectorName).join(',') + '\' selector. Ignoring.');
- continue;
- }
-
- for (var j = 0, m = values.length; j < m; j++) {
- var value = values[j];
- var trimmed = value.trim();
-
- if (trimmed.length === 0)
- continue;
-
- var lastCharacter = trimmed[trimmed.length - 1];
- var endsWithNonSpaceSeparator = trimmed.length > 1 && (lastCharacter == COMMA || lastCharacter == FORWARD_SLASH);
-
- if (endsWithNonSpaceSeparator)
- trimmed = trimmed.substring(0, trimmed.length - 1);
-
- if (trimmed.indexOf('__ESCAPED_COMMENT_CLEAN_CSS(0,-') > -1) {
- context.track(trimmed);
- continue;
- }
-
- var pos = body.length - 1;
- if (trimmed == 'important' && body[pos][0] == '!') {
- context.track(trimmed);
- body[pos - 1][0] += '!important';
- body.pop();
- continue;
- }
-
- if (trimmed == '!important' || (trimmed == 'important' && body[pos][0][body[pos][0].length - 1] == '!')) {
- context.track(trimmed);
- body[pos][0] += trimmed;
- continue;
- }
-
- body.push([trimmed].concat(context.track(value, true)));
-
- if (endsWithNonSpaceSeparator) {
- body.push([lastCharacter]);
- context.track(lastCharacter);
- }
- }
-
- if (i < l - 1)
- context.track(';');
-
- list.push(body);
- }
-
- return list;
- },
-
- selectors: function (string, context) {
- var list = [];
- var metadata;
- var selectors = new Splitter(',').split(string);
-
- for (var i = 0, l = selectors.length; i < l; i++) {
- metadata = context.track(selectors[i], true, i);
- context.track(',');
- list.push([selectors[i].trim()].concat(metadata));
- }
-
- return list;
- }
-};
-
-module.exports = Extractors;
var optimize = require('../../lib/properties/optimizer');
-var tokenize = require('../../lib/selectors/tokenizer');
+var tokenize = require('../../lib/tokenizer/tokenize');
var SourceTracker = require('../../lib/utils/source-tracker');
var Compatibility = require('../../lib/utils/compatibility');
var Validator = require('../../lib/properties/validator');
var optimize = require('../../lib/properties/optimizer');
-var tokenize = require('../../lib/selectors/tokenizer');
+var tokenize = require('../../lib/tokenizer/tokenize');
var SourceTracker = require('../../lib/utils/source-tracker');
var Compatibility = require('../../lib/utils/compatibility');
var Validator = require('../../lib/properties/validator');
var optimize = require('../../lib/properties/optimizer');
-var tokenize = require('../../lib/selectors/tokenizer');
+var tokenize = require('../../lib/tokenizer/tokenize');
var SourceTracker = require('../../lib/utils/source-tracker');
var Compatibility = require('../../lib/utils/compatibility');
var Validator = require('../../lib/properties/validator');
var optimize = require('../../lib/properties/optimizer');
-var tokenize = require('../../lib/selectors/tokenizer');
+var tokenize = require('../../lib/tokenizer/tokenize');
var SourceTracker = require('../../lib/utils/source-tracker');
var SourceReader = require('../../lib/utils/source-reader');
var InputSourceMapTracker = require('../../lib/utils/input-source-map-tracker');
var optimize = require('../../lib/properties/optimizer');
-var tokenize = require('../../lib/selectors/tokenizer');
+var tokenize = require('../../lib/tokenizer/tokenize');
var SourceTracker = require('../../lib/utils/source-tracker');
var Compatibility = require('../../lib/utils/compatibility');
var Validator = require('../../lib/properties/validator');
var vows = require('vows');
var assert = require('assert');
-var tokenize = require('../../lib/selectors/tokenizer');
+var tokenize = require('../../lib/tokenizer/tokenize');
var extractor = require('../../lib/selectors/extractor');
function buildToken(source) {
var vows = require('vows');
var assert = require('assert');
-var tokenize = require('../../../lib/selectors/tokenizer');
+var tokenize = require('../../../lib/tokenizer/tokenize');
var SimpleOptimizer = require('../../../lib/selectors/optimizers/simple');
var Compatibility = require('../../../lib/utils/compatibility');
var addOptimizationMetadata = require('../../../lib/selectors/optimization-metadata');
var vows = require('vows');
var assert = require('assert');
-var tokenize = require('../../lib/selectors/tokenizer');
+var tokenize = require('../../lib/tokenizer/tokenize');
var extractProperties = require('../../lib/selectors/extractor');
var canReorder = require('../../lib/selectors/reorderable').canReorder;
var canReorderSingle = require('../../lib/selectors/reorderable').canReorderSingle;
var vows = require('vows');
var assert = require('assert');
-var Chunker = require('../../lib/utils/chunker');
+var Chunker = require('../../lib/tokenizer/chunker');
vows.describe(Chunker)
.addBatch({
var vows = require('vows');
var assert = require('assert');
-var tokenize = require('../../lib/selectors/tokenizer');
+var tokenize = require('../../lib/tokenizer/tokenize');
var SourceTracker = require('../../lib/utils/source-tracker');
var SourceReader = require('../../lib/utils/source-reader');
var InputSourceMapTracker = require('../../lib/utils/input-source-map-tracker');
var vows = require('vows');
var assert = require('assert');
-var tokenize = require('../../lib/selectors/tokenizer');
+var tokenize = require('../../lib/tokenizer/tokenize');
var SourceTracker = require('../../lib/utils/source-tracker');
function tokenizerContext(name, specs) {