Home / File/ filter-parser.ts — vue Source File

filter-parser.ts — vue Source File

Architecture documentation for filter-parser.ts, a typescript file in the vue codebase. 0 imports, 3 dependents.

File typescript VueCore VDom 3 dependents 2 functions

Entity Profile

Dependency Diagram

graph LR
  452898a7_6631_766c_1752_d0d7f2ce2517["filter-parser.ts"]
  84ab3997_ca97_807e_f586_e8d0a26ded10["helpers.ts"]
  84ab3997_ca97_807e_f586_e8d0a26ded10 --> 452898a7_6631_766c_1752_d0d7f2ce2517
  101d3d34_ac07_228f_62b9_5d5ac4a0ea2e["index.ts"]
  101d3d34_ac07_228f_62b9_5d5ac4a0ea2e --> 452898a7_6631_766c_1752_d0d7f2ce2517
  e3eb242c_569d_4ef6_6acd_a6d0879fa6a1["text-parser.ts"]
  e3eb242c_569d_4ef6_6acd_a6d0879fa6a1 --> 452898a7_6631_766c_1752_d0d7f2ce2517
  style 452898a7_6631_766c_1752_d0d7f2ce2517 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

const validDivisionCharRE = /[\w).+\-_$\]]/

export function parseFilters(exp: string): string {
  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
        // 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
}

function wrapFilter(exp: string, filter: string): string {
  const i = filter.indexOf('(')
  if (i < 0) {
    // _f: resolveFilter
    return `_f("${filter}")(${exp})`
  } else {
    const name = filter.slice(0, i)
    const args = filter.slice(i + 1)
    return `_f("${name}")(${exp}${args !== ')' ? ',' + args : args}`
  }
}

Domain

Subdomains

Frequently Asked Questions

What does filter-parser.ts do?
filter-parser.ts is a source file in the vue codebase, written in typescript. It belongs to the VueCore domain, VDom subdomain.
What functions are defined in filter-parser.ts?
filter-parser.ts defines 2 function(s): parseFilters, wrapFilter.
What files import filter-parser.ts?
filter-parser.ts is imported by 3 file(s): helpers.ts, index.ts, text-parser.ts.
Where is filter-parser.ts in the architecture?
filter-parser.ts is located at src/compiler/parser/filter-parser.ts (domain: VueCore, subdomain: VDom, directory: src/compiler/parser).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free