function format(txt, compress /*是否为压缩模式*/ ) { /* 格式化JSON源码(对象转换为JSON文本) */
    var indentChar = '    ';
    if(Object.prototype.toString.call(txt) === '[object Object]'){
        txt = JSON.stringify(txt);
    }

    if (/^\s*$/.test(txt)) {
        format.error ('数据为空,无法格式化! ');
        return null;
    }

    try {
        var data = eval('(' + txt + ')');
    } catch (e) {
        format.error ('数据源语法错误,格式化失败! 错误信息: ' + e.description, 'err');
        return null;
    };

    var draw = [],
        last = false,
        This = this,
        line = compress ?
        '' :
        '\n',
        nodeCount = 0,
        maxDepth = 0;

    var notify = function (name, value, isLast, indent, formObj) {    /*indent缩进*/
        nodeCount++; /*节点计数*/
        for (var i = 0, tab = ''; i < indent; i++)
            tab += indentChar;
        /* 缩进HTML */
        tab = compress ?
            '' :
            tab; /*压缩模式忽略缩进*/
        maxDepth = ++indent; /*缩进递增并记录*/
        if (value && value.constructor == Array) { /*处理数组*/
            draw.push(tab + (formObj ?
                ('"' + name + '":') :
                '') + '[' + line); /*缩进'[' 然后换行*/
            for (var i = 0; i < value.length; i++)
                notify(i, value[i], i == value.length - 1, indent, false);
            draw.push(tab + ']' + (isLast ?
                line :
                (',' + line))); /*缩进']'换行,若非尾元素则添加逗号*/
        } else if (value && typeof value == 'object') { /*处理对象*/
            draw.push(tab + (formObj ?
                ('"' + name + '":') :
                '') + '{' + line); /*缩进'{' 然后换行*/
            var len = 0,
                i = 0;
            for (var key in value)
                len++;
            for (var key in value)
                notify(key, value[key], ++i == len, indent, true);
            draw.push(tab + '}' + (isLast ?
                line :
                (',' + line))); /*缩进'}'换行,若非尾元素则添加逗号*/
        } else {
            if (typeof value == 'string')
                value = '"' + value + '"';
            draw.push(tab + (formObj
                ?('"' + name + '":')
                :'') + value + (
                    isLast
                    ?''
                    :','
                ) + line);
        };
    };
    var isLast = true,
        indent = 0;
    notify('', data, isLast, indent, false);
    return draw.join('');
}
format.error = function(message){
    return message;
}

module.exports = format;

// tab = 4 tab = ?/number
// txt string/Obj
// deCode/enCode