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

原文地址:https://www.cnblogs.com/xiaoliziaaa/p/15067044.html