004. vue html模板字符串转为ast(js对象)

 

export default function parse(htmlStr) {
  htmlStr = htmlStr.replace(/^\s+|\s+$/g, '')
  let i = 0
  let rest = htmlStr
  const startReg = /^<([a-z]+[0-6]?)>/
    // const startReg = /^<([a-z]+[0-6]?)(\s[^<]+)?>/ 这个功能更强大 可以匹配出 属性 ru <h1 class="demo" id="text">
  const wordReg = /^([^<\s]+)<\/[a-z]+[0-6]?>/ //除了空格和<的任意1到多个字符
  const endReg = /^<\/([a-z]+[0-6]?)>/
  const stack = []

  while (i < htmlStr.length) {
    rest = htmlStr.slice(i)
    if (startReg.test(rest)) {
      const tag = rest.match(startReg)[1]
      stack.push({ tag: tag, type: 1, children: [] }) //遇到开始标签入栈
      i += tag.length + 2
    }
    else if (wordReg.test(rest)) {
      const word = rest.match(wordReg)[1]
      stack[stack.length - 1].children.push({ text: word, type: 3 })
      i += word.length
    }
    else if (endReg.test(rest)) {
      const tag = rest.match(endReg)[1]
      const tagPop = stack.pop()
      if (!stack.length) return tagPop
      stack[stack.length - 1].children.push(tagPop)

      i += tag.length + 3
    }
    else {
      i++

    }
  }


}

 

进阶 加入atrrs

 

posted on 2021-07-27 17:25  章画  阅读(681)  评论(0编辑  收藏  举报

导航