模板字符串:
我买了一个{{thing}},好{{mood}}啊
对应的tokens:
[
['text','我买了一个'],
['name','thing'],
['text',',好'],
['name','mood'],
['text','啊
']
]
1.index.js入口文件
import parseTemplateToTokens from './parseTemplateToTokens'
import renderTemplate from './renderTemplate'
let mustache = {
render(templateStr,data){
let tokens = parseTemplateToTokens(templateStr)
var dom = renderTemplate(tokens,data)
return dom
}
}
export default mustache
2.parseTemplateToTokens.js解析html字符串为tokens
import Scanner from './Scanner'
import nestTokens from './nestTokens'
export default function parseTemplateToTokens(templateStr){
let scanner = new Scanner(templateStr)
let words
let tokens = []
while (!scanner.eos()) {
words = scanner.scanUtil('{{')
words&&tokens.push(['text',words])
scanner.scan('{{')
words = scanner.scanUtil('}}')
if(words){
switch (words[0]) {
case '#':
tokens.push(['#',words.substring(1)])
break;
case '/':
tokens.push(['/',words.substring(1)])
break;
default:
tokens.push(['name',words])
break;
}
}
scanner.scan('}}')
}
return nestTokens(tokens)
}
3.Scanner .js对html字符串进行扫描
export default class Scanner {
constructor(templateStr) {
this.tail = this.templateStr = templateStr
this.pos = 0
}
//过掉指定标签
scan(tag){
if(this.tail.indexOf(tag)===0){
this.pos +=tag.length
this.tail = this.templateStr.substring(this.pos)
}
}
//查找到某个指定标签
scanUtil(stopTag){
let startPos = this.pos
while (!this.eos()&&this.tail.indexOf(stopTag)!==0) {
this.pos++
this.tail = this.templateStr.substring(this.pos)
}
return this.templateStr.substring(startPos,this.pos)
}
//end of string
eos(){
return this.pos>=this.templateStr.length
}
}
4.nestTokens.js对tokens进行折叠,利用栈的思想以及引用类型的算法
export default function nestTokens(tokens){
let sections = []
let nestTokens=[]
let collector = nestTokens
for(let i = 0;i
5.renderTemplate.js结合数据渲染html字符串
import lookup from './lookup'
export default function renderTemplate(tokens,data){
console.log(tokens,data)
let templateStr = ''
for(var i = 0;i
6.lookup.js查找数据
export default function lookup(keyNames,dataObj){
let value = dataObj
//例如a.b.c这种数据查找方法
if(keyNames!=='.'){
var keys = keyNames.split('.')
for(let i = 0;i