backoffice/node_modules/clean-css/lib/text/comments.js

86 lines
2.7 KiB
JavaScript

var EscapeStore = require('./escape-store');
var QuoteScanner = require('./quote-scanner');
module.exports = function Comments(context, keepSpecialComments, keepBreaks, lineBreak) {
var comments = new EscapeStore('COMMENT');
return {
// Strip special comments (/*! ... */) by replacing them by a special marker
// for further restoring. Plain comments are removed. It's done by scanning data using
// String#indexOf scanning instead of regexps to speed up the process.
escape: function(data) {
var tempData = [];
var nextStart = 0;
var nextEnd = 0;
var cursor = 0;
var isQuotedAt = (function () {
var quoteMap = [];
new QuoteScanner(data).each(function (quotedString, _, startsAt) {
quoteMap.push([startsAt, startsAt + quotedString.length]);
});
return function (position) {
for (var i = 0, l = quoteMap.length; i < l; i++) {
if (quoteMap[i][0] < position && quoteMap[i][1] > position)
return true;
}
return false;
};
})();
for (; nextEnd < data.length;) {
nextStart = data.indexOf('/*', cursor);
if (nextStart == -1)
break;
if (isQuotedAt(nextStart)) {
tempData.push(data.substring(cursor, nextStart + 2));
cursor = nextStart + 2;
continue;
}
nextEnd = data.indexOf('*/', nextStart + 2);
if (nextEnd == -1) {
context.warnings.push('Broken comment: \'' + data.substring(nextStart) + '\'.');
nextEnd = data.length - 2;
}
tempData.push(data.substring(cursor, nextStart));
if (data[nextStart + 2] == '!') {
// in case of special comments, replace them with a placeholder
var comment = data.substring(nextStart, nextEnd + 2);
var placeholder = comments.store(comment);
tempData.push(placeholder);
}
cursor = nextEnd + 2;
}
return tempData.length > 0 ?
tempData.join('') + data.substring(cursor, data.length) :
data;
},
restore: function(data) {
var restored = 0;
var breakSuffix = keepBreaks ? lineBreak : '';
return data.replace(new RegExp(comments.placeholderPattern + '(' + lineBreak + '| )?', 'g'), function(match, placeholder) {
restored++;
switch (keepSpecialComments) {
case '*':
return comments.restore(placeholder) + breakSuffix;
case 1:
case '1':
return restored == 1 ?
comments.restore(placeholder) + breakSuffix :
'';
case 0:
case '0':
return '';
}
});
}
};
};