从解析的bb代码创建嵌套对象

时间:2013-08-24 07:30:50

标签: javascript object bbcode nested

我正在尝试使用包含一些bbcode的给定字符串在javascript中创建一个对象。

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 个答案:

答案 0 :(得分: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/