//table 表 namespace util.table; var pop = ..table.pop; var push = ..table.push; var escape = ..string.escape; var math = ..string.match; var next = ..table.next; var eachName = ..table.eachName; var mixin = ..table.assign; var join = ..string.join; var stringfyValue, stringifyTable; var hexFields = {bgcolor:1,color:1,forecolor:1,iconColor:1} stringfyValue = function(k2,v,keys,objreferences,prettyPrintLevel,prettyPrintIndent){ var tv = type(v); if( tv == "table" ){ if( ! objreferences[[v]] ){ objreferences[[v]] = true; if( v@ ? v@._tostring ) { v = tostring(v); if(!v) return; tv = "string"; } else{ return stringifyTable(v,keys,prettyPrintLevel,prettyPrintIndent,objreferences); } } else { return "{ /*...*/ }"; } } select(tv) { case "number"{ if !hexFields[k2] return tostring(v,,'.'#); return ..string.format("0x%06X",v ) } case "string" { var es = escape(v); if(es) return "'" + es + "'"; return '"' ++ v ++ '"'; } case "boolean"{ return tostring(v); } case "buffer"{ return "raw.buffer("+ ..string.escape(v) +")"; } case "null"{ return "null" } } } var strRepeat = ..string.repeat; stringifyTable = function(t,keys,prettyPrintLevel,prettyPrintIndent,objreferences){ if( t@ ? t@._tostring ) return tostring(t); if( ! next(t) ){ if(t@[["_type"]]=="array"){ return `[]`; } return "{}"; } var CRLF = ""; var curIndent = ""; if( prettyPrintLevel !== null ){ if(prettyPrintLevel>=0){ prettyPrintLevel++; CRLF = '\r\n'; curIndent = strRepeat(prettyPrintLevel,prettyPrintIndent); } } else { CRLF = '\r\n'; prettyPrintLevel = -1; } var isArrayType = ..table.isArray(t); var arrayLength = ..table.len(t); var s = { isArrayType ? "[":"{";CRLF }; if(isArrayType){ for k,v in eachName(t, ,keys ? mixin({},keys) ){ if( ! ( math(k,"^[\a_]\w*$") || math(k,"^:+\w*$") ) ){ var es = escape(k); k = es ? "'" + es + "'" : '"' + k + '"' } v = stringfyValue(k,v,keys,objreferences,prettyPrintLevel,prettyPrintIndent); if(v){ push( s,curIndent,k,":",v,",",CRLF); } } if( s[#s-1] == "," && !arrayLength ) pop(s,2); } else { for k,v in eachName(t, ,keys ? mixin({},keys) ){ if( ! ( math(k,"^[$\a_]|<:><\w|<:>>*$") ) ){ var es = escape(k); k = es ? "['" + es + "']" : '["' + k + '"]' } v = stringfyValue(k,v,keys,objreferences,prettyPrintLevel,prettyPrintIndent); if(v){ push( s,curIndent,k,"=",v,";",CRLF); } } if( s[#s-1] == ";" && !arrayLength ) pop(s,2); } var singleLine = 1; for(i=1;arrayLength;1){ if(type(t[i])=="table") { singleLine = 0; break; } } if(singleLine){ if(#s==2) { pop(s,1); singleLine = 2; } else { push(s,curIndent); } for(i=1;arrayLength;1){ push( s,stringfyValue(i,t[i],keys,objreferences,prettyPrintLevel,prettyPrintIndent),","); } if( s[#s] == "," ) pop(s,1); } else{ for(i=1;arrayLength;1){ push( s,curIndent,stringfyValue(i,t[i],keys,objreferences,prettyPrintLevel,prettyPrintIndent),",",CRLF); } if( s[#s-1] == "," ) pop(s,2); } if(prettyPrintLevel > 0 ){ prettyPrintLevel--; curIndent = strRepeat(prettyPrintLevel,prettyPrintIndent); } if(singleLine<2){ push( s,CRLF,curIndent,isArrayType ? "]":"}"); } else { push( s, isArrayType ? "]":"}"); } return join(s); } stringify = function(t,prettyPrint,keys){ if(!prettyPrint){ return stringifyTable(t,keys,-1,null,{t=true}); } else if(type.isString(prettyPrint)) { return stringifyTable(t,keys,0,prettyPrint,{t=true}); } else if(prettyPrint){ return stringifyTable(t,keys,null,null,{t=true}); } } /**intellisense(util.table) stringify( = 将表对象转换为源码格式。\n仅转换表包含的文本、数值、布尔值、嵌套表对象,\n小数精度最大为 6 位、并自动清除小数尾部多余的 0,\n如果表定义了 tostring 元方法、则转换为字符串\n忽略其他类型,忽略循环引用的表 stringify(.(表对象,格式化选项,默认排序表) = 格式化选项为 true 仅第一级键值添加换行,\n格式化选项指定缩进字符串时,则对所有下级键值添加换行与缩进\n,默认排序表为可选参数,指定一个键名排序数组\n不在默认排序表中的名字按默认字典序排序输出 end intellisense**/