Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
Advertisement

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

本模块主要用于:

数据模块

本模块采用以下子页面中的数据:

这些页面中的每条数据可以按下面2种形式中的任意一种来组织:

  • ['注册名'] = '输出内容',
    • 只包含输出内容,不包含任何flag,所有flag均采用其默认值。
  • ['注册名'] = { '输出内容', flag1, flag2, ... },
    • 指定用于控制特殊行为的flag。各flag的顺序及其含义见grabFlags函数中的定义,目前定义如下:
      • flag1,引用名hideinlist:布尔值,用于控制对应项目是否不在标准译名列表中出现。false为出现,true为不出现,默认值false。
      • flag2,引用名groups:字符串(逗号分隔),用于按组显示特定内容。默认为main(若需要指定其他组,main则默认不包含,需手动填写)。

依赖项


语言
local p = {}

local block = mw.loadData( 'Module:Autolink/Block' )
local item = mw.loadData( 'Module:Autolink/Item' )
local entity = mw.loadData( 'Module:Autolink/Entity' )
local biome = mw.loadData( 'Module:Autolink/Biome' )
local effect = mw.loadData( 'Module:Autolink/Effect' )
local enchantment = mw.loadData( 'Module:Autolink/Enchantment' )
local environment = mw.loadData( 'Module:Autolink/Environment' )
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 function grabName( tbl, key )
	local entry = tbl[key]
	if entry == nil then
		return nil
	end
	if type(entry) == 'string' then
		return entry
	elseif type(entry) == 'table' then
		return entry[1]
	else
		return nil
	end
end

local function grabFlags( tbl, key )
	local entry = tbl[key]
	if entry == nil then
		return nil
	end
	local result = {
		hideinlist = false,
		groups = 'main',
	}
	if type(entry) == 'table' then
		result.hideinlist = tbl[key][2]
		result.groups = tbl[key][3]
	end
	return result
end

local function resolveGroups( src )
	local result = {}
	if string.find(src, ',') then
		for v in mw.text.gsplit(src, ',') do
			local keyname = mw.text.trim(v)
			result[keyname] = 1
		end
	else
		result[src] = 1
	end
	return result
end

-- 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()

	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

	local result

	if type then
		result = grabName(other, arg)
	end
	if result == nil and type and earth[type] then
		result = grabName(earth[type], arg)
	end
	if result == nil and type and dungeons[type] then
		result = grabName(dungeons[type], arg)
	end
	if result == nil and type and type == 'EnvSprite' then
		result = grabName(environment, arg)
	end
	if result == nil and type and type == 'EffectSprite' then
		result = grabName(effect, arg)
	end
	if result == nil and type and type == 'BiomeSprite' then
		result = grabName(biome, arg)
	end
	if result == nil and type and type == 'EntitySprite' then
		result = grabName(entity, arg)
	end
	if result == nil and type and type == 'ItemSprite' then
		result = grabName(item, arg)
	end
	if result == nil then
		result = grabName(block, arg) or grabName(item, arg) or grabName(entity, arg) or grabName(biome, arg) or grabName(effect, arg) or grabName(environment, arg)
	end
	if result == nil and arg:sub(-1) == 's' then
		local singular = arg:sub(0, -2)
		result = grabName(block, singular) or grabName(item, singular)  or grabName(entity, singular) 
	end
	if result == nil then
		result = grabName(other, arg)
	end
	if result == nil then
		for _, list in pairs( dungeons ) do
			result = grabName(list, arg)
			if result then
				break
			end
		end
	end

	if result == nil then
		for _, list in pairs( exclusive ) do
			result = grabName(list, arg)
			if result then
				break
			end
		end
	end
	
	if result == nil then
		result = str
	end

	if be then
		return p.mode(result, mode, '(基岩版)' .. (type or 'NONE'))
	end
	if lce then
		return p.mode(result, mode, '(原主机版)'.. (type or 'NONE'))
	end

	return p.mode(result, mode, (type or 'NONE'))
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 groups = args.groups or 'main'
	groups = groups:lower()
	groups = mw.text.trim(groups)
	local sprite = nil
	local list = nil
	
	local dataRegistry = {
		block               = { block,                              'BlockSprite'               },
		item                = { item,                               'ItemSprite'                },
		entity              = { entity,                             'EntitySprite'              },
		biome               = { biome,                              'BiomeSprite'               },
		effect              = { effect,                             'EffectSprite'              },
		enchantment			= { enchantment,						''							},
--		environment         = { environment,                        'EnvSprite'                 },
		dungeonsitem        = { dungeons.DungeonsItemSprite,        'DungeonsItemSprite'        },
		dungeonsentity      = { dungeons.DungeonsEntitySprite,      'DungeonsEntitySprite'      },
		dungeonsenchantment = { dungeons.DungeonsEnchantmentSprite, 'DungeonsEnchantmentSprite' },
		dungeonslevel       = { dungeons.DungeonsLevelSprite,       'DungeonsLevelSprite'       },
	}
	if dataRegistry[type] == nil then
		return ''
	end
	list = dataRegistry[type][1]
	sprite = dataRegistry[type][2]
	if list == nil or sprite == nil then
		return ''
	end

	local result = ''
	local t = {}

	for k, _ in pairs(list) do
		local flags = grabFlags(list, k)
		if flags.hideinlist == false then
			local query_groups = resolveGroups(groups)
			local store_groups = resolveGroups(flags.groups)
			for current_query, _ in pairs(query_groups) do
				if store_groups[current_query] then
					table.insert(t, k)
				end
			end
		end
	end

	table.sort(t)

	local limit = 50
	local count = 0

	local frame = mw.getCurrentFrame()

	local itemlist = nil
	local header = mw.html.create('tr')
	local spriteids = nil
	if sprite ~= '' then
		spriteids = mw.loadData( 'Module:' .. sprite ).ids
		header:tag('th'):wikitext('图标')
	end
	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 sprite ~= '' then
			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
		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(grabName(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
Advertisement