模組:Akrange

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
貢獻者:
Template-info.svg 模塊文檔  [查看] [] [歷史] [刷新]

本模塊生成明日方舟的「範圍」圖示。main 的語法參見Template:Akrange;legacy 僅用於兼容Template:明日方舟:攻擊範圍。可以用 stringFromLegacy 從舊語法生成新語法的描述字符串。

  1. -- This is an attempt to create a simpler way to build Arknights' "attack"
  2. -- range. It requires one string input to describe the mapping of the range.
  3. -- It generates a CSS grid instance for graphical output.
  4. -- Crappy code originally by One-Six(U:公的驅逐艦), released under CC BY 4.0.
  5. -- Gotta Praise the Crocc.
  6. local getArgs = require('Module:Arguments').getArgs
  7. local p = {}
  8. -- Interpret input string and break it into a 2D array
  9. local function interpret ( s )
  10. local dataTable = {}
  11. local i = 1
  12. local j = 1
  13. dataTable[1] = {}
  14. -- Ignore newline at end of description string,
  15. -- then break string into individual char.
  16. for c in string.gmatch(s:gsub("n+$",""),".") do
  17. -- 'e' marks end of center row for symmetrical ranges.
  18. -- Generate the mirror and then break.
  19. if (c == 'e') then
  20. local iBar = i
  21. while (i > 1) do
  22. iBar = iBar + 1
  23. i = i - 1
  24. dataTable[iBar] = dataTable[i]
  25. end
  26. break
  27. -- 'n' marks end of row. Create the next row.
  28. elseif (c == 'n') then
  29. i = i + 1
  30. j = 1
  31. dataTable[i] = {}
  32. -- Not control char; add char to array and point to next var.
  33. else
  34. dataTable[i][j] = c
  35. j = j + 1
  36. end
  37. end
  38. j = nil
  39. -- Check for longest row.
  40. -- If rows are not all of the same length, mark for space padding.
  41. i = 1
  42. local maxWidth = #dataTable[1]
  43. local needSpacePadding = false
  44. while (dataTable[i] ~= nil) do
  45. if (#dataTable[i] > maxWidth) then
  46. maxWidth = #dataTable[i]
  47. needSpacePadding = true
  48. elseif ( (not needSpacePadding) and #dataTable[i] < maxWidth) then
  49. needSpacePadding = true
  50. end
  51. i = i + 1
  52. end
  53. -- Space padding.
  54. i = 1
  55. while (needSpacePadding and dataTable[i] ~= nil) do
  56. local length = #dataTable[i]
  57. for j = #dataTable[i] + 1, maxWidth do
  58. dataTable[i][j] = 'o'
  59. end
  60. i = i + 1
  61. end
  62. return dataTable
  63. end
  64. -- Generate grid from parsed data table
  65. local function genGrid ( dataTable, sty, clr )
  66. local style = sty
  67. local color = clr
  68. if (style == nil) then
  69. style = ''
  70. end
  71. if (color == nil or color == '') then
  72. color = "#808080"
  73. end
  74. -- prep output string and gridTemplateArea.
  75. local outputString = ''
  76. local gridTemplateArea = ''
  77. for i = 1, #dataTable do
  78. gridTemplateArea = gridTemplateArea .. [[ "]]
  79. for j = 1, #dataTable[i] do
  80. -- make gridTemplateArea
  81. gridTemplateArea = gridTemplateArea .. [[. ]]
  82. -- self: solid box
  83. if (dataTable[i][j] == 's') then
  84. outputString = outputString..'<div style="box-sizing:border-box;width:15px;height:15px;background-color:'..color..';"></div>'
  85. -- range: hollow box
  86. elseif (dataTable[i][j] == 'x') then
  87. outputString = outputString..'<div style="box-sizing:border-box;width:15px;height:15px;border:2px solid '..color..';"></div>'
  88. -- space: placeholder box
  89. elseif (dataTable[i][j] == 'o') then
  90. outputString = outputString..'<div style="box-sizing:border-box;width:15px;height:15px;"></div>'
  91. -- illegal input: warning box
  92. else
  93. outputString = outputString..'<div title="模塊:Akrange 的警告:格式字符串包含不合法的值“'..dataTable[i][j]..'”。" style="box-sizing:border-box;text-align:center;font-size:12px;line-height:12px;padding:1.5px 0;width:15px;height:15px;color:#fff;background-color:#d44;">'..dataTable[i][j]..'</div>'
  94. end
  95. end
  96. gridTemplateArea = gridTemplateArea:sub(1, -2) .. [["]]
  97. end
  98. --return output (after closing the <div>)
  99. return [[<div class='ak-range-container' style='display:grid;grid-gap:2px;margin:5px;width:]]..(17 * #dataTable[1] - 2)..[[px;height:]]..(17 * #dataTable - 2)..[[px;grid-template-areas:]]..gridTemplateArea..[[;]]..style..[['>]]..outputString..[[</div>]]
  100. end
  101. -- Get and return grid from from raw description string
  102. function p.main ( frame )
  103. local args = getArgs(frame, {
  104. wrappers = {
  105. 'Template:Akrange',
  106. 'Template:沙盒'
  107. }
  108. })
  109. return p._main ( args )
  110. end
  111. function p._main ( args )
  112. return genGrid( interpret( args[1] ), args["style"], args["color"] )
  113. end
  114. -- get and return raw description string from legacy data
  115. function p.stringFromLegacy ( frame )
  116. local args = getArgs(frame, {
  117. wrappers = {
  118. 'Template:Akrange',
  119. 'Template:沙盒',
  120. 'Template:明日方舟:攻擊範圍'
  121. }
  122. })
  123. return p._stringFromLegacy ( args )
  124. end
  125. function p._stringFromLegacy ( args )
  126. local dataString = ""
  127. local mr = tonumber(args["r"])
  128. local mc = tonumber(args["c"])
  129. local x = tonumber(args["x"])
  130. local y = tonumber(args["y"])
  131. local b = tonumber(args["broken"])
  132. if b == '' or b == nil then
  133. b = 0
  134. end
  135. if mr%2 == 1 and x == (mr+1)/2 then
  136. for r = 1, x do
  137. for c = 1, mc do
  138. if ( r == 1 and c > (mc - b) and c ~= 1 ) then
  139. break
  140. elseif (r == x and c == y) then
  141. dataString = dataString..'s'
  142. else
  143. dataString = dataString..'x'
  144. end
  145. end
  146. if r == x then
  147. dataString = dataString..'e';
  148. else
  149. dataString = dataString..'n';
  150. end
  151. end
  152. else
  153. for r = 1, mr do
  154. for c = 1, mc do
  155. if ( (r == 1 or r == mr) and c > (mc - b) and c ~= 1 ) then
  156. break
  157. elseif (r == x and c == y) then
  158. dataString = dataString..'s'
  159. else
  160. dataString = dataString..'x'
  161. end
  162. end
  163. dataString = dataString..'n';
  164. end
  165. end
  166. return dataString
  167. end
  168. -- Get and return grid from legacy data
  169. function p.legacy ( frame )
  170. local args = getArgs(frame, {
  171. wrappers = {
  172. 'Template:Akrange',
  173. 'Template:沙盒',
  174. 'Template:明日方舟:攻擊範圍'
  175. }
  176. })
  177. return p._legacy ( args )
  178. end
  179. function p._legacy ( args )
  180. return genGrid( interpret( p._stringFromLegacy ( args ) ), args["style"], args["color"] )
  181. end
  182. -- Return all legal chars in description string in string form
  183. function p.legalChar ( frame )
  184. return 'oxsne'
  185. end
  186. return p
此頁面最後編輯於 2021年6月21日 (週一) 11:32。
搜尋萌娘百科 (按"/"快速搜尋)
有新的未讀公告

阅读更多:模塊:Akrange(http://mzh.moegirl.tw/%E6%A8%A1%E5%A1%8A%3AAkrange )
本文引自萌娘百科(http://mzh.moegirl.tw ),文字内容默认使用《知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆》协议。