モジュール:サンドボックス/Semi-Brace/Goban
表示
モジュールの解説[作成]
require('strict')
local p = {}
local function trim(str)
return mw.text.trim(str)
end
local function getImage(token, frame)
local qty_spec = frame.args.qty_spec or "px"
local size = tostring(frame.args.size)
return frame:preprocess("[[File:Go " .. trim(token) .. ".svg|" .. size .. "x" .. size .. qty_spec .."|link=]]")
end
local function getOne(token, frame)
return "|" .. getImage(token, frame) .. "\n"
end
local function reqNotEq(declare, actual, mes)
if (declare == actual) then
error(mes)
end
end
local function reqNotNil(actual, mes)
if (actual == nil) then
error(mes)
end
end
function p.main(frame)
-- mw.logObject(frame)
local args = frame.args
--[
mw.log("Provided arguments: ----")
mw.logObject(args)
mw.log("------------------------")
--]--
local width = args.width
local height = args.height
-- アサーション
reqNotNil(width, "widthを指定してください")
reqNotNil(height, "heightを指定してください")
reqNotEq(0, width % 2, "widthは奇数にしてください")
reqNotEq(0, height % 2, "heightは奇数にしてください")
-- `#` 演算子がちゃんと返さない
reqNotNil(args[width * height], "Expected " .. tostring(width * height) .. " arguments")
mw.log("Assertion passed")
local table_head = '{| border="0" cellspacing="0" cellpadding="0" style="border:0;border-collapse:collapse;padding:0;font-size:1px"\n'
local table_row_head = '|- style="vertical-align:top;border:none;"\n'
local table_foot = '|}\n'
local upper_edge = args.u or "u"
local left_edge = args.l or "l"
local right_edge = args.r or "r"
local lower_edge = args.d or "d"
mw.log("upper -> `" .. upper_edge .. "`, left -> `" .. left_edge .. "`, right -> `" .. right_edge .. "`, lower -> `" .. lower_edge .. "`")
local fallback_token = {}
-- init fallbacks
-- upper
if upper_edge ~= "" then
for i=1, width, 1 do
fallback_token[i] = (fallback_token[i] or "") .. upper_edge
end
end
-- left
if left_edge ~= "" then
for i=0, height-1, 1 do
local pos = i * width + 1
fallback_token[pos] = (fallback_token[pos] or "") .. left_edge
end
end
-- lower
if lower_edge ~= "" then
for i=1, width, 1 do
local pos = i + width * (height - 1)
fallback_token[pos] = (fallback_token[pos] or "") .. lower_edge
end
end
-- right
if right_edge ~= "" then
for i=1, height, 1 do
local pos = i * width
fallback_token[pos] = (fallback_token[pos] or "") .. right_edge
end
end
mw.log("Fallbacks: ---------")
mw.logObject(fallback_token)
mw.log("--------------------")
--]]--
local lens = width*height
local build = table_head .. table_row_head
for i=1, lens, 1 do
-- [[File:Go.svg]]は十字
local v = " "
-- mw.log("Trim [" .. tostring(i) .. "]: `" .. args[i] .. "` -> `" .. (args[i]:byte(2)) .. "`")
local ca = string.gsub(trim(args[i]), frame:preprocess(" "), "")
if ca ~= "" then
v = ca
elseif fallback_token[i] ~= nil then
mw.log("" .. tostring(i) .. ": fallback applied: `" .. fallback_token[i] .. "`")
v = fallback_token[i]
end
v = trim(v)
mw.log("" .. tostring(i) .. " -> `" .. v .. "`")
build = build .. getOne(v, frame)
if (i % width == 0) and i ~= lens then
build = build .. table_row_head
end --]]
end
build = build .. table_foot
mw.log(build)
return frame:preprocess(build)
end
return p