Module:CharTree/zh-hant: Difference between revisions
From Elwiki
No edit summary |
No edit summary |
||
Line 3: | Line 3: | ||
local p = {} | local p = {} | ||
local get_char_list = require('Module:CharList').main | local get_char_list = require('Module:CharList').main | ||
-- 英文名稱映射表 | |||
local en_name_map = { | |||
["騎士"] = "Knight", | |||
["劍皇"] = "Sword Emperor", | |||
["魔法騎士"] = "Magic Knight", | |||
["符文殺手"] = "Rune Slayer", | |||
["領主"] = "Lord Knight", | |||
["盧/希爾"] = "Lu/Ciel", | |||
-- 可根據需要添加更多映射 | |||
} | |||
-- Main process | -- Main process | ||
function p.main(frame) | function p.main(frame) | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
local char_outer = mw.html.create('div'):addClass('character-banner-outer'):attr('data-lang', args.lang) | local char_outer = mw.html.create('div'):addClass('character-banner-outer'):attr('data-lang', args.lang) | ||
local char_banner = mw.html.create('div'):addClass('character-banner-wrap border-color tone-2') | local char_banner = mw.html.create('div'):addClass('character-banner-wrap border-color tone-2') | ||
local char_list = get_char_list(frame, args.lang) | local char_list = get_char_list(frame, args.lang) | ||
local lang = '' | local lang = '' | ||
if args.lang then lang = '/' .. args.lang end | if args.lang then lang = '/' .. args.lang end | ||
local is_localized = lang and lang ~= '' | local is_localized = lang and lang ~= '' | ||
Line 30: | Line 41: | ||
local char_tree = mw.html.create('div'):addClass('char-banner-tree') | local char_tree = mw.html.create('div'):addClass('char-banner-tree') | ||
local out = '' | local out = '' | ||
local char, file_name, link, nopath, nopathnojob, entry, image_arg, icon_str | local char, file_name, link, nopath, nopathnojob, entry, image_arg, icon_str | ||
for char_iter=1, #char_order, 1 do | for char_iter=1, #char_order, 1 do | ||
local base, jobs = char_order[char_iter], {{}, {}, {}} | local base, jobs = char_order[char_iter], {{}, {}, {}} | ||
Line 48: | Line 59: | ||
end | end | ||
end | end | ||
end | end | ||
-- 如果有本地化名稱,提取英文名稱和顯示名稱 | for job_iter, job_name in ipairs(jobs) do | ||
for path_iter, path_name in ipairs(job_name) do | |||
-- 分離顯示名稱、圖標名稱和鏈接名稱 | |||
local icon_link_char_name = path_name | |||
local normal_link_char_name = path_name | |||
local display_name = path_name | |||
-- 如果有本地化名稱,提取英文名稱和顯示名稱 | |||
if str_localized(path_name) then | |||
local name_split = split_lang(path_name) | |||
icon_link_char_name = name_split[1]:gsub(':', '') -- 使用英文名稱作為圖標文件名 | |||
display_name = name_split[2] -- 使用本地化名稱(zh-hant)作為顯示名稱 | |||
normal_link_char_name = name_split[1] .. lang -- 鏈接使用本地化格式 | |||
else | |||
-- 如果沒有本地化名稱,嘗試從映射表查找英文名稱 | |||
icon_link_char_name = en_name_map[path_name] or path_name:gsub(':', '') | |||
display_name = path_name | |||
normal_link_char_name = path_name | |||
end | |||
-- 清理圖標名稱中的非法字符 | |||
icon_link_char_name = icon_link_char_name:gsub(':', '') | |||
-- 檢查未發布狀態 | |||
local icon_str = 'Icon - ' | |||
local link = '|link=' .. normal_link_char_name | |||
local unreleased = indexOf(normal_link_char_name, not_exist) | |||
if unreleased then | |||
icon_str = '' | |||
icon_link_char_name = 'Dunno' | |||
link = '|link=#!' | |||
end | |||
-- 生成圖標 Wiki 語法 | |||
local icon_with_link = '[[File:' .. icon_str .. icon_link_char_name .. '.png' .. link .. ']]' | |||
local img = tree:tag('div') | |||
:addClass('char-banner-tree-image') | |||
:attr('data-class-name', display_name) -- 使用本地化名稱作為顯示名稱 | |||
:wikitext(icon_with_link) | |||
if unreleased then | |||
img:attr('data-unreleased', 'true') | |||
end | |||
end | |||
end | end | ||
char_banner:node(tree) | char_banner:node(tree) | ||
Line 111: | Line 125: | ||
local select_banner = mw.html.create('div'):addClass('character-banner-select tone-8 border-color') | local select_banner = mw.html.create('div'):addClass('character-banner-select tone-8 border-color') | ||
for k, v in ipairs(char_order) do | for k, v in ipairs(char_order) do | ||
local display_name = v | local display_name = v | ||
local actual_name = v | local actual_name = v | ||
if str_localized(v) then actual_name = split_lang(v)[1]; display_name = split_lang(v)[2] end | if str_localized(v) then actual_name = split_lang(v)[1]; display_name = split_lang(v)[2] end | ||
if actual_name == 'Lu/Ciel' then actual_name = 'LuCiel (Lu)' end | if actual_name == 'Lu/Ciel' then actual_name = 'LuCiel (Lu)' end | ||
Line 122: | Line 136: | ||
return styles .. tostring(char_outer) | return styles .. tostring(char_outer) | ||
end | end | ||
return p | return p |
Revision as of 03:52, 22 April 2025
Documentation for this module may be created at Module:CharTree/zh-hant/doc
require('Module:CommonFunctions')
local getArgs = require('Module:Arguments').getArgs
local p = {}
local get_char_list = require('Module:CharList').main
-- 英文名稱映射表
local en_name_map = {
["騎士"] = "Knight",
["劍皇"] = "Sword Emperor",
["魔法騎士"] = "Magic Knight",
["符文殺手"] = "Rune Slayer",
["領主"] = "Lord Knight",
["盧/希爾"] = "Lu/Ciel",
-- 可根據需要添加更多映射
}
-- Main process
function p.main(frame)
local args = getArgs(frame)
local char_outer = mw.html.create('div'):addClass('character-banner-outer'):attr('data-lang', args.lang)
local char_banner = mw.html.create('div'):addClass('character-banner-wrap border-color tone-2')
local char_list = get_char_list(frame, args.lang)
local lang = ''
if args.lang then lang = '/' .. args.lang end
local is_localized = lang and lang ~= ''
local char_order = char_list[1]
local not_exist = char_list[3]
local char_list = char_list[2]
function split_lang(str)
local lang_l = is_localized and lang or ''
return is_localized and split(str, lang_l .. '|') or str
end
function str_localized(str)
return string.find(str, (lang or '') .. '|')
end
local base_arg = args[1] or 'Elsword'
local base_name = str_localized(base_arg) and split_lang(base_arg)[1] or base_arg
local char_tree = mw.html.create('div'):addClass('char-banner-tree')
local out = ''
local char, file_name, link, nopath, nopathnojob, entry, image_arg, icon_str
for char_iter=1, #char_order, 1 do
local base, jobs = char_order[char_iter], {{}, {}, {}}
local base_name = split_lang(base)[1] or base
local tree = mw.html.create('div'):addClass('char-banner-tree'):attr('data-base', base_name:gsub('/', '')):attr('data-display-base', split_lang(base)[2] or base)
for path_iter=1, 4, 1 do
local path = char_list[base][path_iter]
for job_iter=1, 3, 1 do
local job = path[job_iter]
local out_table = jobs[job_iter]
if job == nil and jobs[1][path_iter] ~= nil then
job = jobs[1][path_iter]
end
if job ~= nil then
table.insert(out_table, job)
end
end
end
for job_iter, job_name in ipairs(jobs) do
for path_iter, path_name in ipairs(job_name) do
-- 分離顯示名稱、圖標名稱和鏈接名稱
local icon_link_char_name = path_name
local normal_link_char_name = path_name
local display_name = path_name
-- 如果有本地化名稱,提取英文名稱和顯示名稱
if str_localized(path_name) then
local name_split = split_lang(path_name)
icon_link_char_name = name_split[1]:gsub(':', '') -- 使用英文名稱作為圖標文件名
display_name = name_split[2] -- 使用本地化名稱(zh-hant)作為顯示名稱
normal_link_char_name = name_split[1] .. lang -- 鏈接使用本地化格式
else
-- 如果沒有本地化名稱,嘗試從映射表查找英文名稱
icon_link_char_name = en_name_map[path_name] or path_name:gsub(':', '')
display_name = path_name
normal_link_char_name = path_name
end
-- 清理圖標名稱中的非法字符
icon_link_char_name = icon_link_char_name:gsub(':', '')
-- 檢查未發布狀態
local icon_str = 'Icon - '
local link = '|link=' .. normal_link_char_name
local unreleased = indexOf(normal_link_char_name, not_exist)
if unreleased then
icon_str = ''
icon_link_char_name = 'Dunno'
link = '|link=#!'
end
-- 生成圖標 Wiki 語法
local icon_with_link = '[[File:' .. icon_str .. icon_link_char_name .. '.png' .. link .. ']]'
local img = tree:tag('div')
:addClass('char-banner-tree-image')
:attr('data-class-name', display_name) -- 使用本地化名稱作為顯示名稱
:wikitext(icon_with_link)
if unreleased then
img:attr('data-unreleased', 'true')
end
end
end
char_banner:node(tree)
out = not_exist
end
local styles = frame:preprocess('{{#css:MediaWiki:Character-Banner.css}}')
local header = frame:expandTemplate{
title = 'CharHeader',
args = {
'Elsword',
'Elsword' .. lang,
'tone-8',
force_title = split_lang(char_order[1])[2]
}
}
local select_banner = mw.html.create('div'):addClass('character-banner-select tone-8 border-color')
for k, v in ipairs(char_order) do
local display_name = v
local actual_name = v
if str_localized(v) then actual_name = split_lang(v)[1]; display_name = split_lang(v)[2] end
if actual_name == 'Lu/Ciel' then actual_name = 'LuCiel (Lu)' end
local base_icon = mw.html.create('div'):attr('data-base', actual_name):attr('data-display-base', display_name or actual_name):wikitext('[[File: Icon - ' .. actual_name .. '.png]]')
select_banner:node(base_icon)
end
char_outer:wikitext(header):node(char_banner:node(select_banner))
return styles .. tostring(char_outer)
end
return p