VueJSソース学習——命令解析クラス
2571 ワード
src/parsers
原文アドレス項目アドレス
parsersは解析器の機能を実現し,ステータスマシン,正規表現などを用いて表現,html,テキスト,命令などを解析する
src/parsers/directive.js
ここでcacheを参照すると、cacheは最近使用したオブジェクトを保存する双方向チェーンテーブルを実現し、数が制限を超えた場合、最近使用していないオブジェクトを捨て、Least Recently Usedに基づいて、以下のように考えられます.https://github.com/rsms/js-lru
Directiveは、命令を解析するために使用されます.
原文アドレス項目アドレス
parsersは解析器の機能を実現し,ステータスマシン,正規表現などを用いて表現,html,テキスト,命令などを解析する
src/parsers/directive.js
ここでcacheを参照すると、cacheは最近使用したオブジェクトを保存する双方向チェーンテーブルを実現し、数が制限を超えた場合、最近使用していないオブジェクトを捨て、Least Recently Usedに基づいて、以下のように考えられます.https://github.com/rsms/js-lru
Directiveは、命令を解析するために使用されます.
import { toNumber, stripQuotes } from '../util/index'
import Cache from '../cache'
const cache = new Cache(1000)
const filterTokenRE = /[^\s'"]+|'[^']*'|"[^"]*"/g
const reservedArgRE = /^in$|^-?\d+/
/**
* Parser state
*/
var str, dir
var c, i, l, lastFilterIndex
var inSingle, inDouble, curly, square, paren
...
/**
* Parse a directive value and extract the expression
* and its filters into a descriptor.
*
* Example:
*
* "a + 1 | uppercase" will yield:
* {
* expression: 'a + 1',
* filters: [
* { name: 'uppercase', args: null }
* ]
* }
*
* @param {String} str
* @return {Object}
*/
export function parseDirective (s) {
var hit = cache.get(s)
if (hit) {
return hit
}
// reset parser state
str = s
inSingle = inDouble = false
curly = square = paren = 0
lastFilterIndex = 0
dir = {}
for (i = 0, l = str.length; i < l; i++) {
c = str.charCodeAt(i)
if (inSingle) {
// check single quote
if (c === 0x27) inSingle = !inSingle
} else if (inDouble) {
// check double quote
if (c === 0x22) inDouble = !inDouble
} else if (
c === 0x7C && // pipe
str.charCodeAt(i + 1) !== 0x7C &&
str.charCodeAt(i - 1) !== 0x7C
) {
if (dir.expression == null) {
// first filter, end of expression
lastFilterIndex = i + 1
dir.expression = str.slice(0, i).trim()
} else {
// already has filter
pushFilter()
}
} else {
switch (c) {
case 0x22: inDouble = true; break // "
case 0x27: inSingle = 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 (dir.expression == null) {
dir.expression = str.slice(0, i).trim()
} else if (lastFilterIndex !== 0) {
pushFilter()
}
cache.put(s, dir)
return dir
}
命令には式とフィルタが同時に含まれる場合があります.両方が同時に存在する場合、|記号で区切られたループ文字で対応する式とフィルタが見つかります.