置顶公告:【置顶】关于临时开启评论区所有功能的公告(2022.10.22) | 【置顶】关于本站Widget恢复使用的公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

Module:Var-array/main

猛汉♂百科,万男皆可猛的百科全书!转载请标注来源页面的网页链接,并声明引自猛汉百科。内容不可商用。
跳到导航 跳到搜索
Template-info.svg 模块文档  [创建] [刷新]
  1. local module = {}
  2. local getArgs = require("Module:Arguments").getArgs
  3. local varArray = require("Module:var-array")
  4. local var = require("Module:var")
  5. local frame = mw.getCurrentFrame()
  6. local _count = {
  7. get = function(array)
  8. return var.get(array .. ".count")
  9. end
  10. }
  11. _count.plus = function(array)
  12. return tonumber(var.set(array .. ".count", _count.get(array) + 1))
  13. end
  14. _count.minus = function(array)
  15. return tonumber(var.set(array .. ".count", _count.get(array) - 1))
  16. end
  17. local prefix = "@array-innerArrayIdentifier:"
  18. function _ifArrayIndex(val)
  19. return (tostring(val or ''):find("^@array%-innerArrayIdentifier:.+"))
  20. end
  21. function _getArrayIndex(args, askValueIndex)
  22. local arrayIndex = prefix .. args[2]
  23. if arrayIndex ~= var.getPlain(arrayIndex) then
  24. error("变量组名无效", 0)
  25. end
  26. local argsCount = 0
  27. if askValueIndex then
  28. for i, v in ipairs(args) do
  29. argsCount = i
  30. end
  31. end
  32. for i, v in ipairs(args) do
  33. if i > 2 then
  34. if askValueIndex and i == argsCount then
  35. arrayIndex = arrayIndex .. v
  36. else
  37. if (v == "count") then
  38. v = ".count"
  39. end
  40. arrayIndex = var.getPlain(arrayIndex .. v)
  41. end
  42. end
  43. end
  44. return arrayIndex
  45. end
  46. function _new(args, isOmit)
  47. local id = args["id"] or args["name"]
  48. if id == nil then
  49. error("构造变量组时“name”或“id”不能为空", 0)
  50. end
  51. local name = prefix .. id
  52. var.set(name, name)
  53. -- 用ipairs遍历args在遇到空匿名参数时会中断
  54. local count = 0
  55. for i, v in pairs(args) do
  56. if tostring(i):find("^%d+$") then
  57. i = tonumber(i)
  58. if isOmit then
  59. var.set(name .. i, v)
  60. if i > count then
  61. count = i
  62. end
  63. elseif i > 1 then
  64. i = i - 1
  65. var.set(name .. i, v)
  66. if i > count then
  67. count = i
  68. end
  69. end
  70. end
  71. end
  72. var.set(name .. ".count", count)
  73. var.set("array.savedNameUseForArrayId", id)
  74. return id
  75. end
  76. function _id()
  77. local savedName = var.get("array.savedNameUseForArrayId") or math.random()
  78. local idCount = (var.get("array.idCount") or 0) + 1
  79. var.set("array.idCount", idCount)
  80. return prefix .. savedName .. "___" .. idCount .. "___"
  81. end
  82. function _in(args)
  83. local name = _id()
  84. local count = 0
  85. var.set(name, name)
  86. for i, v in pairs(args) do
  87. if tostring(i):find("^%d+$") then
  88. i = tonumber(i)
  89. if i > 1 then
  90. i = i - 1
  91. var.set(name .. i, v)
  92. if i > count then
  93. count = i
  94. end
  95. end
  96. end
  97. end
  98. var.set(name .. ".count", count)
  99. return name
  100. end
  101. function _get(args)
  102. local result = _getArrayIndex(args)
  103. if _ifArrayIndex(result) then
  104. error("不能获取变量组的索引值", 0)
  105. end
  106. return result
  107. end
  108. function _set(args)
  109. local index = _getArrayIndex(args, true)
  110. if _ifArrayIndex(var.get(index)) then
  111. error("不能对变量组索引进行赋值", 0)
  112. end
  113. return var.set(index, args["val"])
  114. end
  115. function _push(val, array, count)
  116. var.set(array .. (count + 1), val)
  117. return _count.plus(array)
  118. end
  119. function _pop(array, count)
  120. if count == 0 then
  121. return
  122. end
  123. _count.minus(array)
  124. return var.remove(array .. count)
  125. end
  126. function _unshift(val, array, count)
  127. for i = count, 1, -1 do
  128. local val = var.getPlain(array .. i)
  129. var.set(array .. (i + 1), val)
  130. end
  131. var.set(array .. "1", val)
  132. return _count.plus(array)
  133. end
  134. function _shift(array, count)
  135. if count == 0 then
  136. return
  137. end
  138. local deletedVal = var.getPlain(array .. 1)
  139. for i = 2, count do
  140. local val = var.getPlain(array .. i)
  141. var.set(array .. (i - 1), val)
  142. end
  143. var.set(array..count, '')
  144. _count.minus(array)
  145. return deletedVal
  146. end
  147. function _splice(array, count, startIndex, howmany, args)
  148. local vals = {}
  149. for i, v in pairs(args) do
  150. if tostring(i):find("^%d+$") then
  151. i = tonumber(i)
  152. if i > 1 then
  153. vals[#vals + 1] = v
  154. end
  155. end
  156. end
  157. if howmany == #vals then
  158. for i=1, howmany do
  159. var.set(array..(startIndex + i - 1), vals[i])
  160. end
  161. return count
  162. else
  163. local fragment = {}
  164. for i=startIndex + howmany, count do
  165. fragment[#fragment + 1] = var.remove(array..i)
  166. end
  167. for i=1, #vals do
  168. var.set(array..(startIndex + i - 1), vals[i])
  169. end
  170. -- 删除操作起始点和尾部保存起始点之间的成员
  171. local d_start = startIndex + #vals
  172. local d_end = count - #fragment
  173. local d_count = d_end - d_start + 2
  174. if d_count > #vals then
  175. for i=d_start, d_end do
  176. var.set(i, '')
  177. end
  178. end
  179. count = startIndex - 1 + #vals
  180. for i=1, #fragment do
  181. var.set(array..(count + i), fragment[i])
  182. end
  183. return var.set(array..'.count', count + #fragment)
  184. end
  185. end
  186. function module.main(frame)
  187. local args = getArgs(frame)
  188. function ifReturn(val)
  189. if args["r"] == "true" then
  190. return val
  191. end
  192. return ""
  193. end
  194. function getArray()
  195. local array = _getArrayIndex(args)
  196. if array == "" then
  197. error("变量组成员下标(序号)定位有误", 0)
  198. end
  199. local count = _count.get(array)
  200. return array, count
  201. end
  202. local switch = {
  203. new = function()
  204. return ifReturn(_new(args))
  205. end,
  206. ["in"] = function()
  207. return _in(args)
  208. end,
  209. get = function()
  210. return _get(args)
  211. end,
  212. set = function()
  213. return ifReturn(_set(args))
  214. end,
  215. push = function()
  216. local array, count = getArray()
  217. return ifReturn(_push(args["val"], array, count))
  218. end,
  219. pop = function()
  220. local array, count = getArray()
  221. return ifReturn(_pop(array, count))
  222. end,
  223. unshift = function()
  224. local array, count = getArray()
  225. return ifReturn(_unshift(args["val"], array, count))
  226. end,
  227. shift = function()
  228. local array, count = getArray()
  229. return ifReturn(_shift(array, count))
  230. end,
  231. getIndex = function()
  232. return _getArrayIndex(args)
  233. end,
  234. ifIndex = function()
  235. if _ifArrayIndex(args[2]) then
  236. return 1
  237. end
  238. end,
  239. splice = function()
  240. local array = args['index']
  241. local count = var.get(array..'.count')
  242. local start = tonumber(args['start'] or 1)
  243. local howmany = tonumber(args['howmany'] or 1)
  244. if start > count then error('start参数(操作起点)不能大于变量组的长度', 0) end
  245. if _ifArrayIndex(array)
  246. then return ifReturn(_splice(array, count, start, howmany, args))
  247. else error('变量组索引无效', 0)
  248. end
  249. end,
  250. print = function()
  251. local content = mw.dumpObject(varArray.get((getArray()):gsub("^@array%-innerArrayIdentifier:", "")))
  252. return frame:extensionTag("pre", content)
  253. end
  254. }
  255. local hasTargetMethod = false
  256. for k, v in pairs(switch) do
  257. if k == args[1] then
  258. hasTargetMethod = true
  259. break
  260. end
  261. end
  262. if hasTargetMethod then
  263. return switch[args[1]]()
  264. else
  265. return ifReturn(_new(args, true))
  266. end
  267. end
  268. return module