You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

373 lines
8.6 KiB

  1. function toboolean(str)
  2. return str == "1" or str == "true" or str == 1 or str == true;
  3. end
  4. -- 把字符串转换成数组,并用itemConvertFunc转换所有元素
  5. function toArray(szSeparator , itemConvertFunc)
  6. return function(str)
  7. local strs = string.split(str , szSeparator)
  8. if itemConvertFunc then
  9. local items = {}
  10. for i , v in ipairs(strs) do
  11. table.insert(items , itemConvertFunc(v))
  12. end
  13. return items;
  14. else
  15. return strs;
  16. end
  17. end
  18. end
  19. function createEvalFunction(evalFunction , exp)
  20. local evalTable = {}
  21. evalTable.__call = function(self , ...)return evalFunction(...)end;
  22. evalTable.__index = evalTable;
  23. evalTable.exp = exp;
  24. setmetatable(evalTable , evalTable);
  25. return evalTable;
  26. end
  27. -- 把公式字符串转换成返回整数的函数, 结果是小数的情况就用向上取整
  28. function toInterEval(str)
  29. local function _tmp(...)
  30. local arg = {...}
  31. local env = {};
  32. local index = 1;
  33. for k, v in pairs(arg) do
  34. env["x" .. index] = v;
  35. index = index + 1;
  36. end
  37. return evalServerScript(str ,env)
  38. end
  39. local function retFunc(...)
  40. local value = _tmp(...);
  41. --return math.ceil(value);
  42. -- 是否取整由使用者决定吧
  43. return value;
  44. end
  45. return createEvalFunction(retFunc , str);
  46. end
  47. -- 把公式字符串转换成lua函数
  48. function toEval(str)
  49. local function retFunc(...)
  50. local arg = {...}
  51. local env = {};
  52. local index = 1;
  53. for k, v in pairs(arg) do
  54. env["x" .. index] = v;
  55. index = index + 1;
  56. end
  57. return evalServerScript(str ,env)
  58. end
  59. return createEvalFunction(retFunc , str);
  60. end;
  61. -- 把字符串转换成数值数组
  62. function _toMultiArray(startIndex , ...)
  63. local arg = {...}
  64. if #arg == startIndex then
  65. local desc = arg[startIndex];
  66. return toArray(desc.sep , desc.converter);
  67. else
  68. local function run(str)
  69. local desc = arg[startIndex];
  70. local item = string.split(str , desc.sep)
  71. local index = startIndex + 1;
  72. for ii , vv in ipairs(item) do
  73. item[ii] = _toMultiArray(index , unpack(arg))(vv);
  74. end
  75. return item;
  76. end
  77. return run;
  78. end
  79. end
  80. -- 把字符串转换成多维数组
  81. function toStringArray(...)
  82. local arg = {...}
  83. local numArg = {};
  84. for i , v in ipairs(arg) do
  85. numArg[i] = {sep = v , converter = nil};
  86. end
  87. return _toMultiArray(1 , unpack(numArg));
  88. end
  89. -- 把字符串转换成数值数组
  90. function toNumberArray(...)
  91. local arg = {...}
  92. local numArg = {};
  93. for i , v in ipairs(arg) do
  94. numArg[i] = {sep = v , converter = tonumber};
  95. end
  96. return _toMultiArray(1 , unpack(numArg));
  97. end
  98. -- 把字符串转换成数值数组
  99. function autoMultiArray(str)
  100. local run = nil;
  101. local sing_0 = string.find(str, "_");
  102. local sing_1 = string.find(str, "|");
  103. local sing_2 = string.find(str, ",");
  104. if sing_0 and sing_1 and sing_2 then
  105. run = toNumberArray(",", "|", "_");
  106. elseif sing_0 and sing_1 then
  107. run = toNumberArray("|", "_");
  108. elseif sing_0 then
  109. run = toNumberArray("_");
  110. end
  111. if run then
  112. local array = {}; --newBindableArray();
  113. local t = run(str);
  114. for i, v in pairs(t) do
  115. array[i] = v;
  116. end
  117. return array;
  118. else
  119. return str;
  120. end
  121. end
  122. -- 把字符串转换成数值数组
  123. function autoMultiArray2(str)
  124. local run = nil;
  125. local sing_0 = string.find(str, ",");
  126. local sing_1 = string.find(str, ":");
  127. local sing_2 = string.find(str, "_");
  128. if sing_0 and sing_1 and sing_2 then
  129. run = toNumberArray(",", ":", "_");
  130. elseif sing_0 and sing_1 then
  131. run = toNumberArray(",", ":");
  132. elseif sing_2 then
  133. run = toNumberArray("_");
  134. end
  135. if run then
  136. local array = {}; --newBindableArray();
  137. local t = run(str);
  138. for i, v in pairs(t) do
  139. array[i] = v;
  140. end
  141. return array;
  142. else
  143. return str;
  144. end
  145. end
  146. function autoAllMultiArray(str)
  147. local type = string.find(str, ":");
  148. if type then
  149. return autoMultiArray2(str);
  150. else
  151. return autoMultiArray(str);
  152. end
  153. end
  154. --str是这种格式的 2016-11-1 23:00:00
  155. function stringToTimeStamp(str)
  156. local data = string.split(str , " ");
  157. local timeInfo = string.split(data[2] , ":");
  158. local dateInfo = string.split(data[1] , "-");
  159. local time = {};
  160. time.year = tonumber(dateInfo[1]);
  161. time.month = tonumber(dateInfo[2]);
  162. time.day = tonumber(dateInfo[3]);
  163. time.hour = tonumber(timeInfo[1]);
  164. time.min = tonumber(timeInfo[2]);
  165. time.sec = tonumber(timeInfo[3]);
  166. return BeijingTime.timeFunc(time);
  167. end
  168. function toNumber(str)
  169. return tonumber(str) or 0
  170. end
  171. -- 把255,255,255格式的字符串转换成cc.Color
  172. function toColor3B(colorString)
  173. local numberArray = toNumberArray(",")(colorString)
  174. if #numberArray ~= 3 then
  175. return nil
  176. else
  177. local color = ccColor3B();
  178. color.r = numberArray[1];
  179. color.g = numberArray[2];
  180. color.b = numberArray[3];
  181. return color;
  182. end
  183. end
  184. -- 把多重参数转换成表返回
  185. local function packMultiArgToTable(...)
  186. return {...}
  187. end
  188. -- 使用lua模式匹配把一个字符串转换成数组
  189. function toArrayPattern(pattern)
  190. return function(str)
  191. local result = packMultiArgToTable(string.find(str,pattern));
  192. if result[1] == nil then
  193. error("模式匹配失败:" , pattern);
  194. return;
  195. else
  196. return result;
  197. end
  198. end
  199. end
  200. -- XML翻译器
  201. TextTranslator = {};
  202. -- 收集所有可以翻译的文本,返回string正则表达式
  203. function TextTranslator:collect(sourceString)
  204. print("收集一般文本" , sourceString);
  205. local text = string.trim(sourceString);
  206. local index = 1;
  207. local function getReplace(s)
  208. local ret = "[ctln" .. index .. "]";
  209. index = index + 1;
  210. return ret;
  211. end
  212. text = string.gsub(text , "[0-9]+" , getReplace);
  213. return text;
  214. end
  215. -- 翻译文本
  216. -- sourceString 源文本
  217. -- translated 第三方使用collect翻译后的文本
  218. -- @return 返回原文翻译后的文本
  219. function TextTranslator:translate(sourceString , translated)
  220. local index = 1;
  221. local function getReplace(s)
  222. local num = "%[ctln" .. index .. "%]";
  223. index = index + 1;
  224. translated = string.gsub(translated , num , s);
  225. return s;
  226. end
  227. string.gsub(sourceString , "[0-9]+" , getReplace);
  228. return translated;
  229. end
  230. -- XML翻译器
  231. XmlTranslator = {};
  232. -- 收集所有可以翻译的文本,返回string正则表达式
  233. function XmlTranslator:collect(sourceString)
  234. local function onStartElement(name , atts)
  235. end
  236. local function onEndElement(name , atts)
  237. end
  238. local numIndex = 1;
  239. local tagIndex = 1;
  240. local texts = {};
  241. local function getNumReplace(s)
  242. local ret = "[ctln" .. numIndex .. "]";
  243. numIndex = numIndex + 1;
  244. return ret;
  245. end
  246. local function onText(text)
  247. local re = string.trim(text);
  248. if re ~= "" then
  249. re = string.gsub(re , "[0-9]+" , getNumReplace);
  250. table.insert(texts , re);
  251. table.insert(texts , "[ctlt" .. tostring(tagIndex) .. "]");
  252. tagIndex = tagIndex + 1;
  253. end
  254. end
  255. local success , err = tiny.eval("<font>" .. sourceString .. "</font>" , onStartElement , onEndElement , onText)
  256. if not success then
  257. return TextTranslator:collect(sourceString);
  258. end
  259. if #texts > 1 then
  260. texts[#texts] = nil;
  261. end
  262. return table.concat(texts);
  263. end
  264. -- 翻译文本
  265. -- sourceString 源文本
  266. -- translated 第三方使用collect翻译后的文本
  267. -- @return 返回原文翻译后的文本
  268. function XmlTranslator:translate(sourceString , translated)
  269. local function onStartElement(name , atts)
  270. end
  271. local function onEndElement(name , atts)
  272. end
  273. local xmlText = "<font>" .. sourceString .. "</font>";
  274. local lastParseIndex = 1;
  275. local nums = {};
  276. local tags = {};
  277. local function onText(text , currentByteIndex)
  278. local re = string.trim(text);
  279. if re ~= "" then
  280. local ltrimLen = #text - #string.ltrim(text);
  281. local function getNumReplace(s)
  282. table.insert(nums , s);
  283. return s;
  284. end
  285. string.gsub(re , "[0-9]+" , getNumReplace);
  286. table.insert(tags , string.sub(xmlText , lastParseIndex , currentByteIndex + ltrimLen));
  287. lastParseIndex = currentByteIndex + ltrimLen + string.len(re) + 1;
  288. end
  289. end
  290. -- 解析xml
  291. local success , err = tiny.eval(xmlText , onStartElement , onEndElement , onText)
  292. if not success then
  293. return TextTranslator:translate(sourceString , translated);
  294. end
  295. -- 尾字符串
  296. if lastParseIndex <= #xmlText - string.len("</font>") then
  297. table.insert(tags , string.sub(xmlText , lastParseIndex , #xmlText - string.len("</font>")));
  298. end
  299. local count = #tags;
  300. -- 替换数字
  301. for i , v in ipairs(nums) do
  302. local num = "%[ctln" .. tostring(i) .. "%]";
  303. translated = string.gsub(translated , num , v);
  304. end
  305. -- 替换控制字符串,去头去尾
  306. for i = 1 , #tags - 2 do
  307. local tag = "%[ctlt" .. tostring(i) .. "%]";
  308. local v = string.gsub(tags[i + 1] , "%%" , "%%%%");
  309. translated = string.gsub(translated , tag , v);
  310. end
  311. -- 头
  312. if #tags > 0 then
  313. translated = string.sub(tags[1] , string.len("<font>") + 1) .. translated;
  314. end
  315. -- 尾
  316. if #tags > 1 then
  317. translated = translated .. tags[#tags];
  318. end
  319. return translated;
  320. end