UNPKG

vue

Version:

Reactive, component-oriented view layer for modern web interfaces.

42 lines (37 loc) 1.14 kB
/* @flow */ import { cached } from 'shared/util' import { parseFilters } from './filter-parser' const defaultTagRE = /\{\{((?:.|\n)+?)\}\}/g const regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g const buildRegex = cached(delimiters => { const open = delimiters[0].replace(regexEscapeRE, '\\$&') const close = delimiters[1].replace(regexEscapeRE, '\\$&') return new RegExp(open + '((?:.|\\n)+?)' + close, 'g') }) export function parseText ( text: string, delimiters?: [string, string] ): string | void { const tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE if (!tagRE.test(text)) { return } const tokens = [] let lastIndex = tagRE.lastIndex = 0 let match, index while ((match = tagRE.exec(text))) { index = match.index // push text token if (index > lastIndex) { tokens.push(JSON.stringify(text.slice(lastIndex, index))) } // tag token const exp = parseFilters(match[1].trim()) tokens.push(`_s(${exp})`) lastIndex = index + match[0].length } if (lastIndex < text.length) { tokens.push(JSON.stringify(text.slice(lastIndex))) } return tokens.join('+') }