数据与模板生成dom
原有tokens

export default function (tokens, data) {
let convertedStr = ''
tokens.forEach(i => {
console.log(tokens)
if (i[0] === 'text') {
convertedStr += i[1]
} else if (i[0] === 'name') {
convertedStr += data[i[1]]
}
})
return convertedStr
}
import Scanner from './scaner'
import NextTokens from './nextTokens'
import RenderTp from './renderTp'
export default function (tpStr, data) {
const tokens = []
const ScannerInit = new Scanner(tpStr)
let words;
while (!ScannerInit.eos()) {
words = ScannerInit.scanUtil('{{')
if (words !== '') {
tokens.push(['text', words])
}
ScannerInit.scan('{{')
words = ScannerInit.scanUtil('}}')
if (words !== '') {
if (words[0] === '#') {
tokens.push(['#', words.substring(1)])
} else if (words[0] === '/') {
tokens.push(['/', words.substring(1)])
} else {
tokens.push(['name', words])
}
}
ScannerInit.scan('}}')
}
const nextTokens = NextTokens(tokens)
return RenderTp(nextTokens, data)
}
const tmpStr = `我想{{doSth}},{{doSth}}使我快乐!`;
const data = {
doSth: "painting",
};
TpEngine.render(tmpStr, data);
export default class Scanner {
constructor(tpStr) {
console.log('render函数里 调用Scanner')
this.tpStr = tpStr
this.pos = 0
this.tail = tpStr
}
scan(tag) {
if (this.tail.indexOf(tag) === 0) {
this.pos += tag.length
this.tail = this.tpStr.substring(this.pos)
}
}
scanUtil(stopTag) {
const pos_backup = this.pos
while (this.tail.indexOf(stopTag) !== 0 && !this.eos()) {
this.pos++
this.tail = this.tpStr.substr(this.pos)
}
return this.tpStr.substring(pos_backup, this.pos)
}
eos() {
return this.pos >= this.tpStr.length
}
}