function toboolean(str) return str == "1" or str == "true" or str == 1 or str == true; end -- 把字符串转换成数组,并用itemConvertFunc转换所有元素 function toArray(szSeparator , itemConvertFunc) return function(str) local strs = string.split(str , szSeparator) if itemConvertFunc then local items = {} for i , v in ipairs(strs) do table.insert(items , itemConvertFunc(v)) end return items; else return strs; end end end function createEvalFunction(evalFunction , exp) local evalTable = {} evalTable.__call = function(self , ...)return evalFunction(...)end; evalTable.__index = evalTable; evalTable.exp = exp; setmetatable(evalTable , evalTable); return evalTable; end -- 把公式字符串转换成返回整数的函数, 结果是小数的情况就用向上取整 function toInterEval(str) local function _tmp(...) local arg = {...} local env = {}; local index = 1; for k, v in pairs(arg) do env["x" .. index] = v; index = index + 1; end return evalServerScript(str ,env) end local function retFunc(...) local value = _tmp(...); --return math.ceil(value); -- 是否取整由使用者决定吧 return value; end return createEvalFunction(retFunc , str); end -- 把公式字符串转换成lua函数 function toEval(str) local function retFunc(...) local arg = {...} local env = {}; local index = 1; for k, v in pairs(arg) do env["x" .. index] = v; index = index + 1; end return evalServerScript(str ,env) end return createEvalFunction(retFunc , str); end; -- 把字符串转换成数值数组 function _toMultiArray(startIndex , ...) local arg = {...} if #arg == startIndex then local desc = arg[startIndex]; return toArray(desc.sep , desc.converter); else local function run(str) local desc = arg[startIndex]; local item = string.split(str , desc.sep) local index = startIndex + 1; for ii , vv in ipairs(item) do item[ii] = _toMultiArray(index , unpack(arg))(vv); end return item; end return run; end end -- 把字符串转换成多维数组 function toStringArray(...) local arg = {...} local numArg = {}; for i , v in ipairs(arg) do numArg[i] = {sep = v , converter = nil}; end return _toMultiArray(1 , unpack(numArg)); end -- 把字符串转换成数值数组 function toNumberArray(...) local arg = {...} local numArg = {}; for i , v in ipairs(arg) do numArg[i] = {sep = v , converter = tonumber}; end return _toMultiArray(1 , unpack(numArg)); end -- 把字符串转换成数值数组 function autoMultiArray(str) local run = nil; local sing_0 = string.find(str, "_"); local sing_1 = string.find(str, "|"); local sing_2 = string.find(str, ","); if sing_0 and sing_1 and sing_2 then run = toNumberArray(",", "|", "_"); elseif sing_0 and sing_1 then run = toNumberArray("|", "_"); elseif sing_0 then run = toNumberArray("_"); end if run then local array = {}; --newBindableArray(); local t = run(str); for i, v in pairs(t) do array[i] = v; end return array; else return str; end end -- 把字符串转换成数值数组 function autoMultiArray2(str) local run = nil; local sing_0 = string.find(str, ","); local sing_1 = string.find(str, ":"); local sing_2 = string.find(str, "_"); if sing_0 and sing_1 and sing_2 then run = toNumberArray(",", ":", "_"); elseif sing_0 and sing_1 then run = toNumberArray(",", ":"); elseif sing_2 then run = toNumberArray("_"); end if run then local array = {}; --newBindableArray(); local t = run(str); for i, v in pairs(t) do array[i] = v; end return array; else return str; end end function autoAllMultiArray(str) local type = string.find(str, ":"); if type then return autoMultiArray2(str); else return autoMultiArray(str); end end --str是这种格式的 2016-11-1 23:00:00 function stringToTimeStamp(str) local data = string.split(str , " "); local timeInfo = string.split(data[2] , ":"); local dateInfo = string.split(data[1] , "-"); local time = {}; time.year = tonumber(dateInfo[1]); time.month = tonumber(dateInfo[2]); time.day = tonumber(dateInfo[3]); time.hour = tonumber(timeInfo[1]); time.min = tonumber(timeInfo[2]); time.sec = tonumber(timeInfo[3]); return BeijingTime.timeFunc(time); end function toNumber(str) return tonumber(str) or 0 end -- 把255,255,255格式的字符串转换成cc.Color function toColor3B(colorString) local numberArray = toNumberArray(",")(colorString) if #numberArray ~= 3 then return nil else local color = ccColor3B(); color.r = numberArray[1]; color.g = numberArray[2]; color.b = numberArray[3]; return color; end end -- 把多重参数转换成表返回 local function packMultiArgToTable(...) return {...} end -- 使用lua模式匹配把一个字符串转换成数组 function toArrayPattern(pattern) return function(str) local result = packMultiArgToTable(string.find(str,pattern)); if result[1] == nil then error("模式匹配失败:" , pattern); return; else return result; end end end -- XML翻译器 TextTranslator = {}; -- 收集所有可以翻译的文本,返回string正则表达式 function TextTranslator:collect(sourceString) print("收集一般文本" , sourceString); local text = string.trim(sourceString); local index = 1; local function getReplace(s) local ret = "[ctln" .. index .. "]"; index = index + 1; return ret; end text = string.gsub(text , "[0-9]+" , getReplace); return text; end -- 翻译文本 -- sourceString 源文本 -- translated 第三方使用collect翻译后的文本 -- @return 返回原文翻译后的文本 function TextTranslator:translate(sourceString , translated) local index = 1; local function getReplace(s) local num = "%[ctln" .. index .. "%]"; index = index + 1; translated = string.gsub(translated , num , s); return s; end string.gsub(sourceString , "[0-9]+" , getReplace); return translated; end -- XML翻译器 XmlTranslator = {}; -- 收集所有可以翻译的文本,返回string正则表达式 function XmlTranslator:collect(sourceString) local function onStartElement(name , atts) end local function onEndElement(name , atts) end local numIndex = 1; local tagIndex = 1; local texts = {}; local function getNumReplace(s) local ret = "[ctln" .. numIndex .. "]"; numIndex = numIndex + 1; return ret; end local function onText(text) local re = string.trim(text); if re ~= "" then re = string.gsub(re , "[0-9]+" , getNumReplace); table.insert(texts , re); table.insert(texts , "[ctlt" .. tostring(tagIndex) .. "]"); tagIndex = tagIndex + 1; end end local success , err = tiny.eval("" .. sourceString .. "" , onStartElement , onEndElement , onText) if not success then return TextTranslator:collect(sourceString); end if #texts > 1 then texts[#texts] = nil; end return table.concat(texts); end -- 翻译文本 -- sourceString 源文本 -- translated 第三方使用collect翻译后的文本 -- @return 返回原文翻译后的文本 function XmlTranslator:translate(sourceString , translated) local function onStartElement(name , atts) end local function onEndElement(name , atts) end local xmlText = "" .. sourceString .. ""; local lastParseIndex = 1; local nums = {}; local tags = {}; local function onText(text , currentByteIndex) local re = string.trim(text); if re ~= "" then local ltrimLen = #text - #string.ltrim(text); local function getNumReplace(s) table.insert(nums , s); return s; end string.gsub(re , "[0-9]+" , getNumReplace); table.insert(tags , string.sub(xmlText , lastParseIndex , currentByteIndex + ltrimLen)); lastParseIndex = currentByteIndex + ltrimLen + string.len(re) + 1; end end -- 解析xml local success , err = tiny.eval(xmlText , onStartElement , onEndElement , onText) if not success then return TextTranslator:translate(sourceString , translated); end -- 尾字符串 if lastParseIndex <= #xmlText - string.len("") then table.insert(tags , string.sub(xmlText , lastParseIndex , #xmlText - string.len(""))); end local count = #tags; -- 替换数字 for i , v in ipairs(nums) do local num = "%[ctln" .. tostring(i) .. "%]"; translated = string.gsub(translated , num , v); end -- 替换控制字符串,去头去尾 for i = 1 , #tags - 2 do local tag = "%[ctlt" .. tostring(i) .. "%]"; local v = string.gsub(tags[i + 1] , "%%" , "%%%%"); translated = string.gsub(translated , tag , v); end -- 头 if #tags > 0 then translated = string.sub(tags[1] , string.len("") + 1) .. translated; end -- 尾 if #tags > 1 then translated = translated .. tags[#tags]; end return translated; end