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

Module:Arcana

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

真·女神转生》大系数据编纂和样式设计统一模块。已封装为各种模板,请参见模板说明。

Megami Tensei Wiki 同步修改,但有较大本地化差异。

结构

数据库

维护

可参与的维护工作

请至《真·女神转生》大系编辑者群(832689630中进一步了解。

可阅读 User:Greykid/参考手册 了解更多相关知识。

更新日志

往期更新日志
  • 2020/5/10:完成移植工作,原始范本借鉴自Megami Tensei Wiki 2020/3/12版本。完成汉化工作,简化部分关键词,修改部分水土不服的样式。
  • 2020/6/30:跟进更新Megami Tensei Wiki 2020/6/2。紧急修复“祝”“咒”关键字。完善部分汉化,补充部分关键词。从现在开始已经可以使用标准“弱点和抗性”写法了。为避免版权争议完全重构了样式,暂时还没想好怎么样比较好看,先调成标准wikitable了。
  • 2020/7/10:增加{{Arcana}}(原位替代){{Skill}}(替代{{Pskill}}){{SkillTable}}(替代psk废案)模板。调整格式,添加功能。现在已经和范本相去甚远啦。
  • 2020/7/13-16:增加第一个中英日语言转换模板{{Persona}}。未来还会尝试解决其他地方的语言输入问题。修复部分问题。终于解决了hover+ruby问题。添加P5R特性专用填写模板{{PersonaTrait}}。
  • 2020/8/7:修复{{SkillTable}}的问题,已达成预期效果。
  • 2020/8/10-11:完善样式,添加中英技能名称、人格面具名称的填写规则,现在可以直接用中文填写啦!
  • 2020/8/20-21:现在已经可以完全替代旧模板了。
  • 2020/9/5:添加更多自定义功能。
  • 2020/11/7-8:大幅拆分、调整模块结构,为《真·女神转生III》《真·女神转生V》数据编写做准备。
  • 2020/12/8:增「连携技能表」「合体表」,调格式。
local getArgs = require('Module:Arguments').getArgs
local getGames = require('Module:Psk/Gamedata')

local p = {}

-- 實現 #invoke 函数式調用
local function makeInvokeFunction(funcName)
	return function (frame)
		local args = getArgs(frame, {parentOnly = true})
		return p[funcName](args)
	end
end

-- 實現 #invoke 函数式調用,保留frame
local function makeInvokeFunctionWithFrame(funcName)
	return function (frame)
		local args = getArgs(frame, {parentOnly = true})
		return p[funcName](frame, args)
	end
end

-- 添加分类
local function cate(catename)
	if mw.title.getCurrentTitle():inNamespace('') then
		return '[[Category:' .. catename .. ']]' -- 防止給列表頁加分類
	else
		return ''
	end
end

-- 添加注释
local function refer(frame, refernote)
	if mw.title.getCurrentTitle():inNamespace('') and refernote ~= nil and refernote ~= '' then
		return frame:expandTemplate{ title = 'refn', args = {refernote, group = '注', name = hash(frame, refernote) } }
	else
		return ''
	end
end

-- ruby格式
local function ruby(text1, text2, lang)
	if lang == nil then
		return '<ruby><rb>' .. text1 .. '</rb><rp> (</rp><rt style="font-size:.75em">' .. text2 .. '</rt><rp>) </rp></ruby>'
	else
		return '<ruby><rb>' .. text1 .. '</rb><rp> (</rp><rt style="font-size:.75em" lang="' .. lang .. '">' .. text2 .. '</rt><rp>) </rp></ruby>'
	end
end

-- 简繁转换设置
local function sinotrans(zh, zhsc)
	return '-{zh-hant:' .. zh .. '; zh-hans:' .. zhsc .. ';}-'
end

-- Hover效果,调用TextHover模板
local function hover(frame, text1, text2)
	return frame:expandTemplate{ title = 'TextHover', args = {text1, text2, 'before', 'center', tag = 'span'} }
end

-- Wiki文本解析,调用Eval模板
local function wikitext(frame, text1)
	return frame:expandTemplate{ title = 'Eval', args = {'wikitext', text1} }
end

-- 阿尔卡那渲染
local function getArcana(frame, ar,game,gamen, sort)
	local arcana, alias
	local data = require('Module:Arcana/data')
	if gamen == "p1" or gamen == "p2is" or gamen == "p2ep" then
		if ar == "8" or ar == "剛毅" or ar == "刚毅" or ar == "力量" or ar == "Strength" or ar == "VIII" then ar = "11s" end
		if ar == "11" or ar == "正义" or ar == "Justice" or ar == "XI" then ar = "8s" end
	end
	arcana = data.arcanas[ar]
	if not arcana then
		alias = data.aliases[ar]
		if alias then
			ar = alias
			arcana = data.arcanas[ar]
		else
			local result = ''
			if not ar or ar == '' or ar == '-' or ar == 'Unclassified' or ar == 'None' or ar == 'none' then result = '-'
			elseif ar == 'Coin' or ar == 'Coins' or ar == 'Pentacle' then result = '[[阿尔卡那#小阿爾卡那|星幣花色]]' .. cate('星幣阿爾卡那')
			elseif ar == 'Sword' or ar == 'Swords' then result = '[[阿尔卡那#小阿爾卡那|寶劍花色]]' .. cate('寶劍阿爾卡那')
			elseif ar == 'Cup' or ar == 'Cups' then result = '[[阿尔卡那#小阿爾卡那|聖盃花色]]' .. cate('聖盃阿爾卡那')
			elseif ar == 'Wand' or ar == 'Wands' or ar == 'Rod' then result = '[[阿尔卡那#小阿爾卡那|權杖花色]]' .. cate('權杖阿爾卡那')
			elseif ar == 'Rumor' then result = '[[仲魔/傳說|傳說]]' .. cate('仲魔/傳說')
			elseif ar == 'Taurus' or ar == 'Aquarius' or ar == 'Leo' or ar == 'Scorpio' or ar == 'Masquerade' then
				result = '[[Masked Circle|' .. ar .. ']]' .. cate('Masked Circle')
			elseif ar == 'Reich' then result = '[[Last Battalion|' .. ar .. ']]'
			elseif ar == 'Grave' or ar == 'Zonbie' or ar == 'Zombie' then result = '僵屍' .. cate('僵屍族')
			elseif ar == 'Human' then result = '人類' .. cate('人族')
			elseif ar == 'Machine' then result = '機械' .. cate('機械族')
			else result = ar end
			return result -- 找不到
		end
	end
 	local result = '[[阿尔卡那/' .. arcana.arczh .. '|' .. ruby(arcana.arczh, arcana.arc) .. ']]' 
	if ar == "0g" then result = hover(frame, '[[阿尔卡那/小丑|' .. ruby('小丑', 'The Jester') .. ']]', '[[阿尔卡那/慾望|' .. ruby('慾望', 'Hunger') .. ']]') end
	if sort == 'sort' then result = 'data-sort-value="' .. ar .. '"|' .. result end
	-- result = result .. cate(arcana.arczh .. '阿爾卡那')
	return result
end

-- 关键字消歧义
local function get_prop(args)
	local prop = {}
	for k, v in pairs(require('Module:Psk/Property_names')) do
		for _, name in ipairs(v) do
			if args[name] then
				prop[k] = args[name]
				break
			end
		end
		prop[k] = prop[k] or v.default
	end
	return prop
end



-- 阿尔卡那ruby格式渲染模块

p.arcana = makeInvokeFunctionWithFrame('_arcana')

function p._arcana(frame, args)
	local game = args[1] or args.game or args.Game or ''
	game = game:lower()
	if args.FES then game = 'p3f' end
	if args.P3P then game = 'p3p' end
	if args.P4G then game = 'p4g' end
	if args.P5R then game = 'p5r' end
	if args.P5S then game = 'p5s' end
	local gameg -- 遊戲的總樣式
	if getGames.games[game].fallback then
		gameg = getGames.games[game].fallback -- 遊戲對應序號作
		else gameg = game
	end
	local gamen = getGames.games[game].name -- 遊戲全名
	local gamegn = getGames.games[gameg].name -- 遊戲對應序號作全名
	local gamed
	if gameg then
		gamed = gameg:upper()
	end
	local arca = args[2] or args.arcana or args.Arcana or ''
	if args[3] == 'sort' then return getArcana(frame, arca,gameg,gamegn, 'sort') end
	return getArcana(frame, arca,gameg,gamegn)
end



return p