礦藝大典
無編輯摘要
無編輯摘要
第133行: 第133行:
 
end
 
end
 
end
 
end
if result == nil then
+
-- if result == nil then
for _, list in pairs( dungeons ) do
+
-- for _, list in pairs( dungeons ) do
result = list[arg]
+
-- result = list[arg]
if result then
+
-- if result then
break
+
-- break
end
+
-- end
end
+
-- end
end
+
-- end
   
 
if result == nil then
 
if result == nil then

2022年2月7日 (一) 10:19審

这是文档页面,它应该被放置到模組:Autolink,查看Template:Documentation以获取更多信息。

Autolink,即自动链接,用于给模板的参数中的英文转换为对应的中文并显示出来,正如Module:Reverselink能将中文参数转换为英文并提供给模板以显示图片。

本模块主要用于:

本模块使用以下子页面作为具体参数:



local p = {}

local block = mw.loadData( 'Module:Autolink/Block' )
local item = mw.loadData( 'Module:Autolink/Item' )
local other = mw.loadData( 'Module:Autolink/Other' )
local exclusive = mw.loadData( 'Module:Autolink/Exclusive' )
-- local earth = mw.loadData( 'Module:Autolink/Earth' )
-- local dungeons = mw.loadData( 'Module:Autolink/Dungeons' )
local colors = {
	['black '] = '黑',
	['blue '] = '靛',
	['brown '] = '褐',
	['cyan '] = '黛',
	['gray '] = '灰',
	['green '] = '綠',
	['light blue '] = '縹',
	['light gray '] = '蒼',
	['lime '] = '翠',
	['magenta '] = '赬',
	['orange '] = '橙',
	['pink '] = '粉',
	['purple '] = '紫',
	['red '] = '紅',
	['silver '] = '蒼',
	['white '] = '白',
	['yellow '] = '黃',
}

local function Set(list)
	local set = {}
	for _, l in ipairs(list) do set[l] = true end
	return set
end

local coloredItems = Set { 'firework star', 'hardened clay', 'stained clay', 'banner', 'carpet', 'concrete',
	'concrete powder', 'glazed terracotta', 'terracotta', 'shield', 'shulker box', 'stained glass',
	'stained glass pane', 'wool', 'bed', 'hardened glass', 'hardened stained glass', 'balloon',
	'glow stick', 'hardened glass pane', 'hardened glass', 'sparkler', 'candle' }

-- used by templates, called via #invoke
function p.link( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = require( 'Module:ProcessArgs' ).merge( true )
	end
	return p.invlink( args[1] , args[2] , args[3] )
end

function p.invlink( str, mode, type )
	local arg = str:gsub('-', ' '):lower()
	-- check for spawn egg
	if arg:find(' spawn egg$') then
		local mob = other['EntitySprite'][arg:sub(0, -11)]
		if mob == nil then
			error('missing mob entry: ' .. arg:sub(0, -11))
		end
		local index = mob:find('|')
		if index then
			mob = mob:sub(index + 1)
		end
		return p.mode('卵|孳' .. mob .. '之卵', mode)
	end

	local be
	local lce
	-- check for version suffix
	if arg:find(' pe$') or arg:find(' be$') then
		be = 1
		arg = arg:sub(0, -4)
	end
	if arg:find(' lce$') then
		lce = 1
		arg = arg:sub(0, -5)
	end

	-- check for 'spawn'
	if arg:find('^spawn ') then
		local mob = other['EntitySprite'][arg:sub(7)]
		if mob then
			local index = mob:find('|')
			if index then
				mob = mob:sub(index + 1)
			end
			local name = '卵|孳' .. mob .. '之卵'
			if be then
				return p.mode(name, mode, '(基石版)')
			end
			if lce then
				return p.mode(name, mode, '(原主機版)')
			end
			return p.mode(name, mode)
		end
	end

	-- check for color prefix
	local color
	for k, v in pairs( colors ) do
		if arg:find(k) == 1 then
			local i = arg:sub(k:len() + 1)
			if coloredItems[i] then
				color = v
				arg = i
				break
			end
		end
	end
	local result
	if type and other[type] then
		result = other[type][arg]
	end
--	if result == nil and type and earth[type] then
--		result = earth[type][arg]
--	end
--	if result == nil and type and dungeons[type] then
--		result = dungeons[type][arg]
--	end
	if result == nil and type and type == 'ItemSprite' then
		result = item[arg]
	end
	if result == nil then
		result = block[arg] or item[arg]
	end
	if result == nil and arg:sub(-1) == 's' then
		local singular = arg:sub(0, -2)
		result = block[singular] or item[singular]
	end
	if result == nil then
		for _, list in pairs( other ) do
			result = list[arg]
			if result then
				break
			end
		end
	end
--	if result == nil then
--		for _, list in pairs( dungeons ) do
--			result = list[arg]
--			if result then
--				break
--			end
--		end
--	end

	if result == nil then
		result = exclusive[arg] or str
	end

	if color then
		result = result .. '|' .. color .. result
	end

	if be then
		return p.mode(result, mode, '(基石版)')
	end
	if lce then
		return p.mode(result, mode, '(原主機版)')
	end

	return p.mode(result, mode)
end

function p.mode( str, mode, suffix )
	if suffix then
		if str:find('|') then
			str = str .. suffix
		else
			str = str .. '|' .. str .. suffix
		end
	end
	local index = str:find('|')
	-- return the translated part
	if index then
		if mode == 'nolink' then
		  return str:sub(index + 1)
		end
		-- return the page link part
		if mode == 'linkonly' then
			return str:sub(1, index - 1)
		end
	end
	return str
end

-- list out all entries with the type
function p.list( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = require( 'Module:ProcessArgs' ).merge( true )
	end
	local type = args[1]
	type = type:lower()
	local sprite = nil
	local list = nil
	if type == 'block' then
		list = block
		sprite = 'BlockSprite'
	elseif type == 'item' then
		list = item
		sprite = 'ItemSprite'
	elseif type == 'entity' then
		list = other['EntitySprite']
		sprite = 'EntitySprite'
-- 	elseif type == 'dungeonsitem' then
-- 		list = dungeons['DungeonsItemSprite']
-- 		sprite = 'DungeonsItemSprite'
-- 	elseif type == 'dungeonsentity' then
-- 		list = dungeons['DungeonsEntitySprite']
-- 		sprite = 'DungeonsEntitySprite'
-- 	elseif type == 'dungeonsenchantment' then
-- 		list = dungeons['DungeonsEnchantmentSprite']
-- 		sprite = 'DungeonsEnchantmentSprite'
-- 	elseif type == 'dungeonslevel' then
-- 		list = dungeons['DungeonsLevelSprite']
-- 		sprite = 'DungeonsLevelSprite'
	end
	if list == nil then
		return ''
	end

	local spriteids = mw.loadData( 'Module:' .. sprite ).ids

	local result = ''
	local t = {}

	for k, _ in pairs(list) do
		table.insert(t, k)
	end

	table.sort(t)

	local limit = 50
	local count = 0

	local frame = mw.getCurrentFrame()

	local itemlist = nil
	local header = mw.html.create('tr')
	header:tag('th'):wikitext('圖示')
	header:tag('th'):wikitext('英文名')
	header:tag('th'):wikitext('文言名')

	for _, v in ipairs(t) do
		if count == 0 then
			if itemlist ~= nil then
				result = result .. tostring(itemlist)
			end
			itemlist = mw.html.create('table')
				:addClass('data-table')
				:node(header)
		end

		local row = mw.html.create('tr')
		if spriteids[v] or spriteids[mw.ustring.lower( v ):gsub( '[%s%+]', '-' )] then
			row:tag('td'):wikitext(frame:expandTemplate{ title = sprite, args = { v } })
		else
			row:tag('td')
		end
		local words = {}
		v:gsub('[^%s]+', function(w) table.insert(words, w) end)
		for k, w in ipairs(words) do
			if w ~= 'of' and w ~= 'or' and w ~= 'o\'' then
				words[k] = w:gsub('(%l)(.+)', function(a, b) return a:upper() .. b end)
			end
		end
		row:tag('td'):wikitext(tostring(table.concat(words, ' ')))
		row:tag('td'):wikitext(p.mode(list[v], 'nolink'))
		itemlist:node(row)
		count = count + 1
		if count == limit then
			count = 0
		end
	end

	result = result .. tostring(itemlist)
	return result
end

return p