const textNode = (text, targetNode)=>{ if(text.length) targetNode.push({tag:{type:"TEXT", text}}); return ''; } const htmlparser = (input) => { const stacks = [], result = {tag:{TYPE:"ROOT", children: []}}; let cursor = 0, stack = result; let char = '', text=''; // debugger; while(input.length > cursor) { char = input[cursor++]; if(char === '<') { text = textNode(text, stack.tag.children); if( input[cursor++] !== '/' ) { let element = input.substring(cursor-1, cursor = input.indexOf('>', cursor)) // <____ /> 형태 조건 // if(element.indexOf('/') !== -1) element = element.substring(0, element.indexOf('/')) const isClose = input[cursor] === '/'; if(isClose) name = name.substr(0, name.length -1); stack.tag.children.push({tag:{TYPE:"NODE", element, children: []}}) cursor++; }else { // 형태 조건 cursor = input.indexOf('>', cursor)+1; } }else { text += char; } } console.log(stack) } const str = `
a b c d
` htmlparser(str);