| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | var COMMENT_START_MARK = '/*';function QuoteScanner(data) {  this.data = data;}var findQuoteEnd = function (data, matched, cursor, oldCursor) {  var commentEndMark = '*/';  var escapeMark = '\\';  var blockEndMark = '}';  var dataPrefix = data.substring(oldCursor, cursor);  var commentEndedAt = dataPrefix.lastIndexOf(commentEndMark, cursor);  var commentStartedAt = findLastCommentStartedAt(dataPrefix, cursor);  var commentStarted = false;  if (commentEndedAt >= cursor && commentStartedAt > -1)    commentStarted = true;  if (commentStartedAt < cursor && commentStartedAt > commentEndedAt)    commentStarted = true;  if (commentStarted) {    var commentEndsAt = data.indexOf(commentEndMark, cursor);    if (commentEndsAt > -1)      return commentEndsAt;    commentEndsAt = data.indexOf(blockEndMark, cursor);    return commentEndsAt > -1 ? commentEndsAt - 1 : data.length;  }  while (true) {    if (data[cursor] === undefined)      break;    if (data[cursor] == matched && (data[cursor - 1] != escapeMark || data[cursor - 2] == escapeMark))      break;    cursor++;  }  return cursor;};function findLastCommentStartedAt(data, cursor) {  var position = cursor;  while (position > -1) {    position = data.lastIndexOf(COMMENT_START_MARK, position);    if (position > -1 && data[position - 1] != '*') {      break;    } else {      position--;    }  }  return position;}function findNext(data, mark, startAt) {  var escapeMark = '\\';  var candidate = startAt;  while (true) {    candidate = data.indexOf(mark, candidate + 1);    if (candidate == -1)      return -1;    if (data[candidate - 1] != escapeMark)      return candidate;  }}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 = findNext(data, singleMark, nextEnd);    var nextStartDouble = findNext(data, doubleMark, nextEnd);    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 = findQuoteEnd(data, matchedMark, nextStart + 1, cursor);    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;
 |