2023年政策修订增补工作正在进行中,欢迎参与!
Module:Aksabun
跳转到导航
跳转到搜索
-- This is a module re-implementing T:Aksabun. Extended functions are added
-- To reduce costly parser function use in certian cases and to cope with
-- The messier-by-day Ak source naming.
-- Crappy code originally by One-Six(U:公的驱逐舰), released under CC BY 4.0.
-- Gotta Praise the Crocc.
local getArgs = require('Module:Arguments').getArgs
local p = {}
local wrapperArray = { 'Template:Aksabun', 'Template:沙盒' }
local function isEmpty( s )
return (s == nil or s == '')
end
local function getArgFromAlias ( args, argsAliasArray )
for i = 1, #argsAliasArray do
if ( args[argsAliasArray[i]] ~= nil ) then
return args[argsAliasArray[i]]
end
end
return nil
end
local function arrayFromCSV ( s )
if s == nil then return {} end
local array = {}
for w in (s:gsub("%,?%s*$",",")):gmatch("([^%,]*)%,%s*") do
table.insert(array, w)
end
return array
end
local function compactArray ( a )
local j=0
for i=1,#a do
if a[i]~=nil then
j=j+1
a[j]=a[i]
end
end
for i=j+1,#a do
a[i]=nil
end
return a
end
local function tableInvert(t)
local s= {}
for k,v in ipairs(t) do
s[v]=k
end
return s
end
-- generate sabun array
function p.getSabunArray ( frame )
local args = getArgs ( frame, { wrappers = wrapperArray } )
return p._getSabunArray ( frame, args )
end
function p._getSabunArray ( frame, args )
local verboseArg = getArgFromAlias ( args, { "verbose", "manual", "手动" } )
-- if verbose argument defined, use directly and return
if verboseArg ~= nil then
return arrayFromCSV ( verboseArg )
end
local suffixArray = arrayFromCSV ( getArgFromAlias ( args, { "suffix-list", "后缀列表" } ) )
local sabunType = string.lower ( getArgFromAlias ( args, { "sabun-type", "差分类型", "类型", "1" } ) )
if sabunType == 'npc' then
sabunType = 'avg_npc'
end
local sabunCode = getArgFromAlias ( args, { "sabun-code", "差分代号", "代号", "2" } )
local separator = getArgFromAlias ( args, { "separator", "分隔符" } ) or '_'
-- check if suffix array is given
if suffixArray[1] == nil then
-- no suffix array, gotta generate it
suffixArray = {''}
-- take care of the first term.
local firstSuffix = getArgFromAlias ( args, { "first", "首项" } )
if not isEmpty ( firstSuffix ) then
-- first term already given, use directly
suffixArray[1] = firstSuffix
else
-- first term not given, test four possible cases
local PFSA = { separator..'1', '', separator..'2', separator..'0' }
local i = 1
-- HACK TO AVOID COSTLY PARSER FUNCTION USE
local sabunExist = frame:callParserFunction('filepath', "Ak_"..sabunType.."_"..sabunCode..PFSA[i]..".png")
while ( sabunExist == '' and i < #PFSA ) do
i = i + 1
sabunExist = frame:callParserFunction( 'filepath', "Ak_"..sabunType.."_"..sabunCode..PFSA[i]..".png")
end
suffixArray[1] = PFSA[i]
end
-- generate the rest of the suffixes
local lastSuffix = tonumber ( getArgFromAlias ( args, { "last", "末项" } ) ) --if not number, will get nil
local omitArray = arrayFromCSV ( getArgFromAlias ( args, { "omit", "忽略" } ) )
-- check if last term is given
if lastSuffix ~= nil then
--good, given! much less costly parser function use
for i = 2, lastSuffix do
table.insert( suffixArray, separator..i )
end
if omitArray[1] ~= nil then
-- remove omitted suffixes from suffix array
local arraySuffix = tableInvert ( suffixArray )
for i = 1, #omitArray do
local key = arraySuffix[ separator..omitArray[i] ]
suffixArray[key] = nil
end
suffixArray = compactArray ( suffixArray )
end
else
-- shit, not defined! gotta check EVERYTHING with a messy omitArray to deal with
local nextSuffix
-- heck next suffix (starts on this number+1, because the first suffix is already defined)
if suffixArray[1] == "" then
nextSuffix = 1
else
nextSuffix = suffixArray[1]:gsub( "^"..separator, "" )
nextSuffix = tonumber ( nextSuffix )
end
-- get ready for while loop
local notDone = true
local i = 1
while notDone do
if i ~= 1 then
table.insert( suffixArray, separator..nextSuffix )
end
-- check next suffix
nextSuffix = nextSuffix + 1
local omit = false
local j = 1
while omitArray[j] ~= nil and not omit do
omit = ( nextSuffix == omitArray[j] )
j = j + 1
end
if not omit then
i = i + 1
-- HACK TO AVOID COSTLY PARSER FUNCTION USE
notDone = ( frame:callParserFunction('filepath', "Ak_"..sabunType.."_"..sabunCode..separator..nextSuffix..".png") ~= '' )
else
omitArray[j-1] = nil
omitArray = compactArray( omitArray )
end
end
end
-- else: suffix array given, go straight to generating sabun array from suffix array
end
-- generate the sabun array from suffix array
local outputArray = {}
for i = 1, #suffixArray do
outputArray[i] = "Ak_" .. sabunType .. "_" .. sabunCode .. suffixArray[i] .. ".png"
end
return outputArray
end
function p.main ( frame )
local args = getArgs ( frame, { wrappers = wrapperArray } )
return p._main ( frame, args )
end
function p._main ( frame, args )
local sabunArray = p._getSabunArray ( frame, args )
local size = tonumber ( getArgFromAlias ( args, { "size" } ) ) or 400
local outputString = '<div class="Tabs black" data-default-tab="1" data-auto-width="yes" style="max-width:calc('..size..'px + 2em);">'
for i = 1, #sabunArray do
outputString = outputString .. '<div class="Tab"><div class="TabLabelText">差分'..i..'</div><div class="TabContentText">[[File:'..sabunArray[i]..'|'..size..'px]]</div></div>'
end
return outputString .. '</div>'
end
return p