| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | var EscapeStore = require('./escape-store');var QuoteScanner = require('../utils/quote-scanner');var SPECIAL_COMMENT_PREFIX = '/*!';var COMMENT_PREFIX = '/*';var COMMENT_SUFFIX = '*/';var lineBreak = require('os').EOL;function CommentsProcessor(context, keepSpecialComments, keepBreaks, saveWaypoints) {  this.comments = new EscapeStore('COMMENT');  this.specialComments = new EscapeStore('COMMENT_SPECIAL');  this.context = context;  this.restored = 0;  this.keepAll = keepSpecialComments == '*';  this.keepOne = keepSpecialComments == '1' || keepSpecialComments === 1;  this.keepBreaks = keepBreaks;  this.saveWaypoints = saveWaypoints;}function quoteScannerFor(data) {  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;  };}CommentsProcessor.prototype.escape = function (data) {  var tempData = [];  var nextStart = 0;  var nextEnd = 0;  var cursor = 0;  var indent = 0;  var breaksCount;  var lastBreakAt;  var newIndent;  var isQuotedAt = quoteScannerFor(data);  var saveWaypoints = this.saveWaypoints;  for (; nextEnd < data.length;) {    nextStart = data.indexOf(COMMENT_PREFIX, cursor);    if (nextStart == -1)      break;    if (isQuotedAt(nextStart)) {      tempData.push(data.substring(cursor, nextStart + COMMENT_PREFIX.length));      cursor = nextStart + COMMENT_PREFIX.length;      continue;    }    nextEnd = data.indexOf(COMMENT_SUFFIX, nextStart + COMMENT_PREFIX.length);    if (nextEnd == -1) {      this.context.warnings.push('Broken comment: \'' + data.substring(nextStart) + '\'.');      nextEnd = data.length - 2;    }    tempData.push(data.substring(cursor, nextStart));    var comment = data.substring(nextStart, nextEnd + COMMENT_SUFFIX.length);    var isSpecialComment = comment.indexOf(SPECIAL_COMMENT_PREFIX) === 0;    if (saveWaypoints) {      breaksCount = comment.split(lineBreak).length - 1;      lastBreakAt = comment.lastIndexOf(lineBreak);      newIndent = lastBreakAt > 0 ?        comment.substring(lastBreakAt + lineBreak.length).length :        indent + comment.length;    }    if (saveWaypoints || isSpecialComment) {      var metadata = saveWaypoints ? [breaksCount, newIndent] : null;      var placeholder = isSpecialComment ?        this.specialComments.store(comment, metadata) :        this.comments.store(comment, metadata);      tempData.push(placeholder);    }    if (saveWaypoints)      indent = newIndent + 1;    cursor = nextEnd + COMMENT_SUFFIX.length;  }  return tempData.length > 0 ?    tempData.join('') + data.substring(cursor, data.length) :    data;};function restore(context, data, from, isSpecial) {  var tempData = [];  var cursor = 0;  for (; cursor < data.length;) {    var nextMatch = from.nextMatch(data, cursor);    if (nextMatch.start < 0)      break;    tempData.push(data.substring(cursor, nextMatch.start));    var comment = from.restore(nextMatch.match);    if (isSpecial && (context.keepAll || (context.keepOne && context.restored === 0))) {      context.restored++;      tempData.push(comment);      cursor = nextMatch.end;    } else {      cursor = nextMatch.end + (context.keepBreaks && data.substring(nextMatch.end, nextMatch.end + lineBreak.length) == lineBreak ? lineBreak.length : 0);    }  }  return tempData.length > 0 ?    tempData.join('') + data.substring(cursor, data.length) :    data;}CommentsProcessor.prototype.restore = function (data) {  data = restore(this, data, this.comments, false);  data = restore(this, data, this.specialComments, true);  return data;};module.exports = CommentsProcessor;
 |