2013-08-24 3 views
0

Я пытаюсь создать объект в javascript из заданной строки, которая включает в себя некоторый bbcode.Создание вложенного объекта из разбора кода bb

var bbStr = 'Text with [url=http://somelink]links and [i]nested bb code[/i][/url].'; 

мне нужно рекурсивно перебирать объекта и преобразовать вышеупомянутую строку в нечто вроде этого:

var result = { 
    children : [ 
    { 
     text : 'Text with ', 
     type : 'text' 
    }, 
    { 
     children: [ 
     { 
      text : 'links and ', 
      type : 'text' 
     }, 
     { 
      text : 'nested bb code', 
      type : 'italic' 
     } 
     ], 
     text : null, 
     type : 'url', 
     url : 'http://somelink' 
    }, 
    { 
     text : '.', 
     type : 'text' 
    } 
    ], 
    type : null, 
    text : null 
}; 

Тогда я послал бы объект функции рендеринга, который будет рекурсивно создать холст текст из него , Но я просто не могу опустить голову, как создать этот объект.

ответ

1

Попробуйте этот простой стек на основе синтаксического анализа:

token = /(?:\[(\w+)(.*?)\])|(?:\[\/(\w+)\])|([^\[\]]+)/g 
root = {children:[]} 
stack = [root] 

bbStr.replace(token, function() { 
    var a = arguments; 

    if(a[1]) { 
     var node = {tag: a[1], attr: a[2], children:[]} 
     stack[0].children.push(node); 
     stack.unshift(node); 
    } else if(a[3]) { 
     if(stack[0].tag != a[3]) 
      throw "Unmatched tag"; 
     stack.shift(); 
    } else if(a[4]) { 
     stack[0].children.push({tag: "#text", value: a[4]}); 
    } 
}) 

Выходной формат отличается от того, что вы в курсе, но это не должно быть никаких проблем.

http://jsfiddle.net/L8UZf/

+0

Это работает как шарм и выглядит очень элегантно. Мой собственный подход был действительно раздутым и, в конце концов, даже не работал. Итак, большое спасибо! – Patrick