Files
cdnjs/node_modules/clean-css/lib/text/quote-scanner.js
T
2014-07-17 01:32:32 +08:00

78 lines
2.0 KiB
JavaScript

(function() {
var QuoteScanner = function QuoteScanner(data) {
this.data = data;
};
var findCommentEnd = function(data, matched, cursor) {
var commentStartMark = '/*';
var commentEndMark = '*/';
var escapeMark = '\\';
var commentStarted = false;
while (true) {
if (data[cursor] === undefined)
break;
if (!commentStarted && data[cursor] == commentEndMark[1] && data[cursor - 1] == commentEndMark[0])
break;
if (data[cursor] == matched && data[cursor - 1] != escapeMark)
break;
if (data[cursor] == commentStartMark[1] && data[cursor - 1] == commentStartMark[0])
commentStarted = true;
cursor++;
}
return cursor;
};
QuoteScanner.prototype.each = function(callback) {
var data = this.data;
var tempData = [];
var nextStart = 0;
var nextEnd = 0;
var cursor = 0;
var matchedMark = null;
var singleMark = '\'';
var doubleMark = '"';
var dataLength = data.length;
for (; nextEnd < data.length;) {
var nextStartSingle = data.indexOf(singleMark, nextEnd + 1);
var nextStartDouble = data.indexOf(doubleMark, nextEnd + 1);
if (nextStartSingle == -1)
nextStartSingle = dataLength;
if (nextStartDouble == -1)
nextStartDouble = dataLength;
if (nextStartSingle < nextStartDouble) {
nextStart = nextStartSingle;
matchedMark = singleMark;
} else {
nextStart = nextStartDouble;
matchedMark = doubleMark;
}
if (nextStart == -1)
break;
nextEnd = findCommentEnd(data, matchedMark, nextStart + 1);
if (nextEnd == -1)
break;
var text = data.substring(nextStart, nextEnd + 1);
tempData.push(data.substring(cursor, nextStart));
if (text.length > 0)
callback(text, tempData, nextStart);
cursor = nextEnd + 1;
}
return tempData.length > 0 ?
tempData.join('') + data.substring(cursor, data.length) :
data;
};
module.exports = QuoteScanner;
})();