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

Module:Aksabun

猛汉♂百科,万男皆可猛的百科全书!转载请标注来源页面的网页链接,并声明引自猛汉百科。内容不可商用。
跳到导航 跳到搜索
Template-info.svg 模块文档  [查看] [编辑] [历史] [刷新]
-- 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