Autolink,即自动链接,用于给模板的参数中的英文转换为对应的中文并显示出来,正如Module:Reverselink能将中文参数转换为英文并提供给模板以显示图片。
本模块主要用于:
数据模块
本模块采用以下子页面中的数据:
- Module:Autolink/Block
- Module:Autolink/Item
- Module:Autolink/Entity
- Module:Autolink/Biome
- Module:Autolink/Effect
- Module:Autolink/Enchantment
- Module:Autolink/Environment
- Module:Autolink/Dungeons
- Module:Autolink/Legends
- Module:Autolink/Exclusive
- Module:Autolink/Earth
- Module:Autolink/Other
这些页面中的每条数据可以按下面2种形式中的任意一种来组织:
['注册名'] = '输出内容',- 只包含输出内容,不包含任何flag,所有flag均采用其默认值。
['注册名'] = { '输出内容', flag1, flag2, ... },- 指定用于控制特殊行为的flag。各flag的顺序及其含义见
grabFlags函数中的定义,目前定义如下:flag1,引用名hideinlist:布尔值,用于控制对应项目是否不在标准译名列表中出现。false为出现,true为不出现,默认值false。flag2,引用名groups:字符串(逗号分隔),用于按组显示特定内容。默认为main(若需要指定其他组,main则默认不包含,需手动填写)。
- 指定用于控制特殊行为的flag。各flag的顺序及其含义见
依赖项
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 grabNameTwice( tbl, key )
local result = grabName( tbl, key )
if result == nil and key:sub(-1) == 's' then
result = grabName( tbl, key:sub(0, -2) )
end
return result
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, spritetype )
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
-- registry
local dataSources = {
BlockSprite = { block, exclusive.BlockSprite, earth.BlockSprite },
ItemSprite = { item, exclusive.ItemSprite, earth.ItemSprite },
EntitySprite = { entity, exclusive.EntitySprite },
BiomeSprite = { biome },
EffectSprite = { effect },
-- ?Sprite = { enchantment },
EnvSprite = { environment },
DungeonsEffectSprite = { dungeons.DungeonsEffectSprite },
DungeonsEmoteSprite = { dungeons.DungeonsEmoteSprite },
DungeonsEnchantmentSprite = { dungeons.DungeonsEnchantmentSprite },
DungeonsEntitySprite = { dungeons.DungeonsEntitySprite },
DungeonsFlairSprite = { dungeons.DungeonsFlairSprite },
DungeonsItemSprite = { dungeons.DungeonsItemSprite },
DungeonsLevelSprite = { dungeons.DungeonsLevelSprite },
DungeonsMiscellaneousSprite = { dungeons.DungeonsMiscellaneousSprite },
EarthEntitySprite = { earth.EarthEntitySprite },
InvSprite = { earth.InvSprite },
}
local dataSources_BE = {
BlockSprite = { exclusive.BlockSprite, block, earth.BlockSprite },
ItemSprite = { exclusive.ItemSprite, item, earth.ItemSprite },
EntitySprite = { exclusive.EntitySprite, entity },
}
local result = nil
-- get priored data source, then get name from it
if spritetype then
local dataSource_first = nil
if be then
dataSource_first = dataSources_BE[spritetype]
if dataSource_first == nil then
dataSource_first = dataSources[spritetype]
if dataSource_first then
dataSources[spritetype] = nil
end
else
dataSources[spritetype] = nil
dataSources_BE[spritetype] = nil
end
else
dataSource_first = dataSources[spritetype]
if dataSource_first and dataSources_BE[spritetype] then
dataSources_BE[spritetype] = nil
end
end
if dataSource_first then
for i=1, #dataSource_first do
result = grabNameTwice(dataSource_first[i], arg)
if result then
break
end
end
end
end
-- get name when sprite type is not set, or failed to find in the priored data source, traverse randomly
if result == nil then
if be then
for k, v in pairs(dataSources_BE) do
if v then
dataSources[k] = nil
for i=1, #v do
result = grabNameTwice(v[i], arg)
if result then
break
end
end
if result then
break
end
end
end
end
if result == nil then
for _, v in pairs(dataSources) do
if v then
for i=1, #v do
result = grabNameTwice(v[i], arg)
if result then
break
end
end
if result then
break
end
end
end
end
end
-- fallback to Module:Autolink/Other or even the string itself
if result == nil then
result = grabNameTwice(other, arg) or str
end
-- formatting
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 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' },
dungeonsemote = { dungeons.DungeonsEmoteSprite, 'DungeonsEmoteSprite' },
dungeonsflair = { dungeons.DungeonsFlairSprite, 'DungeonsFlairSprite' },
dungeonsmiscellaneous = { dungeons.DungeonsMiscellaneousSprite, 'DungeonsMiscellaneousSprite' },
earthentity = { earth.EarthEntitySprite, 'EarthEntitySprite' },
}
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