| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | var EscapeStore = require('./escape-store');var EXPRESSION_NAME = 'expression';var EXPRESSION_START = '(';var EXPRESSION_END = ')';var EXPRESSION_PREFIX = EXPRESSION_NAME + EXPRESSION_START;var BODY_START = '{';var BODY_END = '}';var lineBreak = require('os').EOL;function findEnd(data, start) {  var end = start + EXPRESSION_NAME.length;  var level = 0;  var quoted = false;  var braced = false;  while (true) {    var current = data[end++];    if (quoted) {      quoted = current != '\'' && current != '"';    } else {      quoted = current == '\'' || current == '"';      if (current == EXPRESSION_START)        level++;      if (current == EXPRESSION_END)        level--;      if (current == BODY_START)        braced = true;      if (current == BODY_END && !braced && level == 1) {        end--;        level--;      }    }    if (level === 0 && current == EXPRESSION_END)      break;    if (!current) {      end = data.substring(0, end).lastIndexOf(BODY_END);      break;    }  }  return end;}function ExpressionsProcessor(saveWaypoints) {  this.expressions = new EscapeStore('EXPRESSION');  this.saveWaypoints = saveWaypoints;}ExpressionsProcessor.prototype.escape = function (data) {  var nextStart = 0;  var nextEnd = 0;  var cursor = 0;  var tempData = [];  var indent = 0;  var breaksCount;  var lastBreakAt;  var newIndent;  var saveWaypoints = this.saveWaypoints;  for (; nextEnd < data.length;) {    nextStart = data.indexOf(EXPRESSION_PREFIX, nextEnd);    if (nextStart == -1)      break;    nextEnd = findEnd(data, nextStart);    var expression = data.substring(nextStart, nextEnd);    if (saveWaypoints) {      breaksCount = expression.split(lineBreak).length - 1;      lastBreakAt = expression.lastIndexOf(lineBreak);      newIndent = lastBreakAt > 0 ?        expression.substring(lastBreakAt + lineBreak.length).length :        indent + expression.length;    }    var metadata = saveWaypoints ? [breaksCount, newIndent] : null;    var placeholder = this.expressions.store(expression, metadata);    tempData.push(data.substring(cursor, nextStart));    tempData.push(placeholder);    if (saveWaypoints)      indent = newIndent + 1;    cursor = nextEnd;  }  return tempData.length > 0 ?    tempData.join('') + data.substring(cursor, data.length) :    data;};ExpressionsProcessor.prototype.restore = function (data) {  var tempData = [];  var cursor = 0;  for (; cursor < data.length;) {    var nextMatch = this.expressions.nextMatch(data, cursor);    if (nextMatch.start < 0)      break;    tempData.push(data.substring(cursor, nextMatch.start));    var comment = this.expressions.restore(nextMatch.match);    tempData.push(comment);    cursor = nextMatch.end;  }  return tempData.length > 0 ?    tempData.join('') + data.substring(cursor, data.length) :    data;};module.exports = ExpressionsProcessor;
 |