// 재귀 코드 by me
const parser = (input, curParent, prevParent) => {
input = input.trim();
if(input.length < 1) return curParent
if(input[0] === '<'){
const idx = input.indexOf('>');
console.log(input)
if(input[idx -1] === '/'){
curParent.text = input.split('/')[0]
parser(input.split('>')[1], curParent, prevParent)
}
else if(input[input.indexOf('<')+1] === '/'){
curParent.child.push({ name : input.substring(1, idx-1), child :[] });
parser(input.substring(idx+1). curParent, prevParent);
}
else{
const newParent = { name : input.substring(1,idx), child : [] };
curParent.child.push(newParent);
parser(input.substring(idx+1), newParent, curParent);
}
}
return curParent
}
let res = parser(inp, { name : 'Root', child : [] },{ name : 'Root', child : [] })
console.log(res)
//reference code
let inp = `<div>
a
<a>b</a>
</div>`;
const parser = input => {
input = input.trim();
const result = { name : 'ROOT', type : 'node', children : [] };
let i = 0, j = input.length;
let curr = { tag: result , parent : 'body'} ;
while(i < j){
const cursor = i ;
if(input[cursor] === '<'){
let name, isClose;
const idx = input.indexOf('>', cursor);
name = input[idx - 1]=== '/'
? input.subString(cursor + 1, idx-1)
: input.subString(cursor )
}
else{
const idx = input.indexOf('<', cursor);
curr.text = input.subString(cursor, idx);
i = idx;
}
}
}
javascript는 보통 재귀 호출 100번을 제한하며 stack over flow error를 내 뱉는다.