function parseFilters()

in assets/modelRepository/vue.js [6696:6807]


  function parseFilters(exp) {
    let inSingle = false;
    let inDouble = false;
    let inTemplateString = false;
    let inRegex = false;
    let curly = 0;
    let square = 0;
    let paren = 0;
    let lastFilterIndex = 0;
    let c, prev, i, expression, filters;

    for (i = 0; i < exp.length; i++) {
      prev = c;
      c = exp.charCodeAt(i);
      if (inSingle) {
        if (c === 0x27 && prev !== 0x5c) {
          inSingle = false;
        }
      } else if (inDouble) {
        if (c === 0x22 && prev !== 0x5c) {
          inDouble = false;
        }
      } else if (inTemplateString) {
        if (c === 0x60 && prev !== 0x5c) {
          inTemplateString = false;
        }
      } else if (inRegex) {
        if (c === 0x2f && prev !== 0x5c) {
          inRegex = false;
        }
      } else if (
        c === 0x7c && // pipe
        exp.charCodeAt(i + 1) !== 0x7c &&
        exp.charCodeAt(i - 1) !== 0x7c &&
        !curly &&
        !square &&
        !paren
      ) {
        if (expression === undefined) {
          // first filter, end of expression
          lastFilterIndex = i + 1;
          expression = exp.slice(0, i).trim();
        } else {
          pushFilter();
        }
      } else {
        switch (c) {
          case 0x22:
            inDouble = true;
            break; // "
          case 0x27:
            inSingle = true;
            break; // '
          case 0x60:
            inTemplateString = true;
            break; // `
          case 0x28:
            paren++;
            break; // (
          case 0x29:
            paren--;
            break; // )
          case 0x5b:
            square++;
            break; // [
          case 0x5d:
            square--;
            break; // ]
          case 0x7b:
            curly++;
            break; // {
          case 0x7d:
            curly--;
            break; // }
        }
        if (c === 0x2f) {
          // /
          let j = i - 1;
          let p = void 0;
          // find first non-whitespace prev char
          for (; j >= 0; j--) {
            p = exp.charAt(j);
            if (p !== " ") {
              break;
            }
          }
          if (!p || !validDivisionCharRE.test(p)) {
            inRegex = true;
          }
        }
      }
    }

    if (expression === undefined) {
      expression = exp.slice(0, i).trim();
    } else if (lastFilterIndex !== 0) {
      pushFilter();
    }

    function pushFilter() {
      (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim());
      lastFilterIndex = i + 1;
    }

    if (filters) {
      for (i = 0; i < filters.length; i++) {
        expression = wrapFilter(expression, filters[i]);
      }
    }

    return expression;
  }