Module:Housamo
简介
这个模块主要用于东京放课后召唤师的数据处理,这个模块包含了一些实用的功能函数。
使用本模块的方法:{{#invoke:Housamo|<func_name>|<arg1>|<arg2>|...}}
在本文档中,所有已定义(和即将定义的)的函数名均使用housamo.<func_name>
的格式说明原型,然而在上面的使用范例中,<func_name>
部分不需要添加任何的housamo.*
的前缀,例如,使用时应当遵循如下范例:
{{#invoke:Housamo|Stars|3}}
在本文档中该函数被描述为housamo.Stars
,但使用时只需要且只能写Stars
,否则模块调用失败。
在本文档中,参数表会被展开成具体的参数个体(而模块源码中直接使用frame
接收一个table
),其中,标有[]
的参数表示是可选的参数,这类参数在不指定时会被提供默认值,例如,对于定义为housamo.SomeFunc(arg1,[arg2=0],[arg3=0])
,如果您只想指定arg1
和arg3
,那么您可以考虑如下几种写法:
{{#invoke:Housamo|SomeFunc|a||b}} <!-- arg2的位置留空 --> {{#invoke:Housamo|SomeFunc|a|arg3=b}} <!-- 除给定的arg1之外直接指定arg3 -->
在上述两种情况中,arg2
因未被指定而具有默认值0
。这等价于:
{{#invoke:Housamo|SomeFunc|a|0|b}}
函数列表
数据表示
housamo.Stars(num, [compact = false], [extend = false])
输出稀有度的星级表示。
- 返回
- 以重复的“★”或“数字+★”构成的字符串。
- 参数
num:int
:表示五角星的数量,注意在此函数中num应当不小于0且不大于5,否则会输出错误的字符串compact:bool
:若为false
则稀有度显示是以展开的方式(直接平铺的五角星文本),否则以折叠的方式(数字+★)的模式显现extend:bool
:由于该函数默认限制了星级只能在0~5之间,额外指定该参数为true
可打破这一限制,允许超过5的数字输出正确的结果
housamo.TypeColor(type,[sharp]) housamo.tc(type,[sharp])
输出对应于属性type
的颜色,函数名可简写为tc
,该函数输出的颜色表与参数对照如下:
- 火
- 水
- 木
- 天
- 冥
- 英雄
- 魔
- 世界
- 全
- 返回
- HTML颜色代码
- 参数
type:str
:目标的属性名,可以是火|水|木|天|冥|英雄|魔|世界|全
。sharp:bool
:指定返回结果是否包含#
,默认不包含,在某些场合例如表格的style里我们有必要关闭#
。
housamo.ValueMap([rarity=3], values) housamo.vm([rarity=3],values)
基于给定的稀有度输出等级数据列,亦可作vm
。例如,使用{{#invoke:Housamo|vm|4|100,200,300,400,500,600}}
,会得到:
100 (LV1)
200 (LV35)
300 (LV45)
400 (LV55)
500 (LV65)
600 (LV75)
若某一项数据不知道,推荐使用?
占位,像这样{{#invoke:Housamo|vm|4|100,?,300,?,500,600}}
,会得到:
100 (LV1)
? (LV35)
300 (LV45)
? (LV55)
500 (LV65)
600 (LV75)
此外,如果提供的数据数量不足,则后面的数据列会自动填充为?
。{{#invoke:Housamo|vm|4|100,200,300}}
,会得到:
100 (LV1)
200 (LV35)
300 (LV45)
? (LV55)
? (LV65)
? (LV75)
注意:请不要使用连续的逗号(,
)来跳过数据,因为Lua的匹配模式机制,在本函数中连续的逗号会被视为1个逗号。
- 返回
- 数据列wikitext
- 参数
rarity:int
:给定的稀有度,控制输出的等级节点,该参数可省略但不可跳过。values:numberlist(6)
:数值列,注意,这里所谓的numberlist
类型是用逗号,
分隔的数列,例如10,5,6,24,7,8
这种的,而numberlist(6)
指该数列有6个元素,多余元素不予采纳,若列中某个元素不是数字,则在该函数中会被输出为?
,关于这个参数的具体用法看看上面的范例就知道了。
资源获取
housamo.CharLink(name, [display = ""]) housamo.cl(name, [display = ""])
输出对应于角色的链接文本。即输入{{#invoke:Housamo|CharLink|戍孝}}
则可返回[[东京放课后召唤师:戍孝|戍孝]]
的wikitext,由于魔术字解析后于模板展开,而链接解析后于魔术字解析,因此在页面中执行该调用会直接获得一个链接文本,也就是戍孝。该调用的<func_name>
可简写为cl
。
- 返回
- 链接文本
- 参数
name:str
:待编订链接文本的名称(通常是角色名),该参数必须指定,否则报错!display:str
:指定该参数可以使用该参数文本覆写原有的链接文本,若指定为空字符串则保持与name
相同。
housamo.TypeImage(name, [scale = 30], [full=false]) housamo.typi(name, [scale = 30], [full=false])
输出对应于属性的图片文件名。该调用的<func_name>
可简写为typi
。
- 返回
- 文件名/置入文件
- 参数
name:str
:目标的属性名,可以是火|水|木|天|冥|英雄|魔|世界|全
,该参数必须指定,否则报错!此外,指定的值不在允许的取值范围内也会报错!scale:int
:该参数仅在full=true
时生效,指定该参数可以控制该图片的宽度,注意,我们这里只允许图片等比例放大,因此只能指定一个维度的值。full:bool
:指定该参数为true
时该功能直接返回置入该图片的wiki文本,否则只返回带有后缀的文件名。
housamo.WeaponImage(name, [scale = 30], [full=false]) housamo.wpi(name, [scale = 30], [full=false])
输出对应于武器的图片文件名,用法与housamo.TypeImage
基本相同。该调用的<func_name>
可简写为wpi
。
- 返回
- 文件名/置入文件
- 参数
name:str
:目标的武器名,可以是打击|突击|刺击|射击|斩击|魔法|横一文字|狙击|全域|无|未知
,该参数必须指定,否则报错!此外,指定的值不在允许的取值范围内也会报错!scale:int
:该参数仅在full=true
时生效,指定该参数可以控制该图片的宽度,注意,我们这里只允许图片等比例放大,因此只能指定一个维度的值。full:bool
:指定该参数为true
时该功能直接返回置入该图片的wiki文本,否则只返回带有后缀的文件名。
housamo.WeaponRangeImage(name, [scale = 30], [full=false]) housamo.wpri(name, [scale = 30], [full=false])
输出对应于武器其攻击范围的图片文件名,用法与housamo.WeaponImage
相同,不过这个函数返回的是武器攻击范围的图片而非武器图片。该调用的<func_name>
可简写为wpri
。
- 返回
- 文件名/置入文件
- 参数
name:str
:目标的武器名,可以是打击|突击|刺击|射击|斩击|魔法|横一文字|狙击|全域|无|未知
,该参数必须指定,否则报错!此外,指定的值不在允许的取值范围内也会报错!scale:int
:该参数仅在full=true
时生效,指定该参数可以控制该图片的宽度,注意,我们这里只允许图片等比例放大,因此只能指定一个维度的值。full:bool
:指定该参数为true
时该功能直接返回置入该图片的wiki文本,否则只返回带有后缀的文件名。
housamo.WeaponRangeGrid(name, [scale = 30]) housamo.wprg(name, [scale = 30])
输出对应于武器其攻击范围的图示,用法与housamo.WeaponImage
类似,但不完全相同,这个函数返回的是武器攻击范围的网格图示,完全通过HTML实现而不借助图片。该调用的<func_name>
可简写为wprg
。
注意:使用此函数之前请务必使用<templatestyles src="User:あの太/沙箱/custom.css" />
引用CSS文件,否则您只会获得个寂寞。
不过应该是有办法不需要引入这个东西的,回头我再看看Scribunto怎么调用templatestyles
例如:
<templatestyles src="User:あの太/沙箱/custom.css" /> {{#invoke:Housamo|wprg|斩击}}会得到:
此函数目前尚未实现自定义功能,预计日后能够实现,此外,基于其图示高清晰度和可定制性,此函数有望替代housamo.WeaponRangeImage
- 返回
- HTML网格
- 参数
name:str
:目标的武器名,可以是打击|突击|刺击|射击|斩击|魔法|横一文字|狙击|全域|无
,该参数必须指定,否则报错!此外,指定的值不在允许的取值范围内也会报错!scale:int
:指定该参数可以控制该网格的宽度,注意,我们这里只允许网格长宽等比例,因此只能指定一个维度的值。
local housamo = {} housamo.housamo = housamo local ustring = require("ustring") --[=[ housamo.ifex(condition,true_val,false_val) 这个东西不是给#invoke使用的,而是只针对当前文件使用的一个辅助函数 这个东西相当于三元运算符 ?: ,不过因为lua没提供这个运算符所以这里实现了一下 --]=] function ifex(condition,true_val,false_val) return (condition and {true_val} or {false_val})[1] end function strnone(str) return str == nil or str == [[]] end function tryget(target, fallback) return ifex(target, target, fallback) end function fetchimg(filename, width) return ustring.format("[[File:%s|%dpx]]", filename, width) end do local typeimg = { ["火"] = "東放火屬性.png", ["水"] = "東放水屬性.png", ["木"] = "東放木屬性.png", ["天"] = "東放天屬性.png", ["冥"] = "東放冥屬性.png", ["英雄"] = "東放英雄屬性.png", ["魔"] = "東放魔屬性.png", ["世界"] = "東放世界屬性.png", ["全"] = "東放全屬性.png", ["无限"] = "东放无限属性.png", ["零"] = "东放零属性.png", } housamo.typeimg = typeimg local weaponimg = { ["打击"] = "东放武器-打击.png", ["斩击"] = "东放武器-斩击.png", ["突击"] = "东放武器-突击.png", ["射击"] = "东放武器-射击.png", ["魔法"] = "东放武器-魔法.png", ["横一文字"] = "东放武器-橫一文字.png", ["狙击"] = "东放武器-狙击.png", ["全域"] = "东放武器-全域.png", ["无"] = "东放武器-无.png", ["未知"] = "东放武器-未知.png", } weaponimg["刺击"] = weaponimg["突击"] housamo.weaponimg = weaponimg local wrangeimg = { ["打击"] = "Range_weapon_knock.png", ["斩击"] = "Range_weapon_slash.png", ["突击"] = "Range_weapon_thrust.png", ["射击"] = "Range_weapon_shoot.png", ["魔法"] = "Range_weapon_magic.png", ["横一文字"] = "Range_weapon_longslash.png", ["狙击"] = "Range_weapon_snipe.png", ["全域"] = "Range_weapon_all.png", ["无"] = "Range_weapon_nothing.png", } wrangeimg["刺击"] = wrangeimg["突击"] wrangeimg["未知"] = wrangeimg["无"] housamo.wrangeimg = wrangeimg local wrangemap = { ["打击"] = { {3,3,1}, {4,3,2}, }, ["斩击"] = { {3,2,1}, {3,3,1}, {3,4,1}, {4,3,2}, }, ["突击"] = { {2,3,1}, {3,3,1}, {4,3,2}, }, ["射击"] = { {1,3,1}, {2,3,1}, {3,3,1}, {4,3,2}, }, ["魔法"] = { {1,3,1}, {2,2,1}, {2,3,1}, {2,4,1}, {3,3,1}, {4,3,2}, }, ["横一文字"] = { {3,-1,1}, {4,3,2}, }, ["狙击"] = { {-1,3,1}, }, ["全域"] = { {1,-1,1}, {2,-1,1}, {3,-1,1}, {4,-1,1}, {5,3,2}, }, ["无"] = { {4,3,2}, }, } wrangemap["刺击"]=wrangemap["突击"] housamo.wrangemap = wrangemap local colormap = { ["火"] = "e84e4b", ["水"] = "1d95df", ["木"] = "61ec2a", ["天"] = "b1af0a", ["冥"] = "b21de4", ["英雄"] = "e1e6e9", ["魔"] = "000000", ["世界"] = "976937", ["全"] = "8e8b8c", ["无限"] = "ff7300", ["零"] = "ff00ff", } housamo.colormap = colormap end function housamo.Stars(frame) local num = (frame.args.num and {frame.args.num} or {frame.args[1]})[1] local compact = (frame.args.compact and {frame.args.compact} or {frame.args[2]})[1] local extend = (frame.args.extend and {frame.args.extend} or {frame.args[3]})[1] num = (num == "") and 0 or tonumber(num) compact = (compact == "true") and true or false extend = (extend == "true") and true or false local result; if(num == nil) then result = [['''稀有度应当是数字''']] else if( extend or (num >= 0 and num <= 5)) then if(not(compact)) then result = string.rep("★",num) else result = num .. "★" end else result = [['''稀有度应在0~5之间''']] end end return result end housamo.stars = housamo.Stars --[[ function housamo.test(frame) local argstr = "" for k,v in ipairs(frame.args) do argstr = argstr .. k .. ':' .. v .. '(' .. type(v) .. ')' end return argstr end --]] function housamo.CharLink(frame) local name = ifex(frame.args.name, frame.args.name, frame.args[1]) local display = ifex(frame.args.display, frame.args.display, frame.args[2]) if name == [[]] or name == nil then return "请指定链接角色的名字" end if display == [[]] or display == nil then display = name end return ustring.format("[[东京放课后召唤师:%s|%s]]", name, display) end housamo.cl = housamo.CharLink function housamo.CharLinkList(frame) local str = frame.args[1] or "" local split = frame.args[2] or " • " if str == "" then return [['''无''']] end local list = mw.text.split(str,',') local clist = [[]] for k,v in pairs(list) do if v ~= [[]] then clist = clist .. ustring.format("[[东京放课后召唤师:%s|%s]]", v, v) if next(list,k) then clist = clist .. split end end end return clist end housamo.clist = housamo.CharLinkList function housamo.TypeImage(frame) local name = tryget(frame.args.name, frame.args[1]) local scale = tryget(tonumber(tryget(frame.args.name,frame.args[2])),32) local full = ifex(tryget(frame.args.full,frame.args[3]) == "true", true, false) if strnone(name) then return "'''未提供属性名称'''" end local typ = housamo.typeimg[name] if typ==nil then return ustring.format([['''指定的属性"%s"不存在''']], name) end if full then return fetchimg(typ,scale) --ustring.format("[[File:%s|%dpx]]", typ, scale) else return typ end end housamo.typi = housamo.TypeImage function housamo.Weapon(frame) local name = tryget(frame.args.name, frame.args[1]) local scale = tryget(tonumber(tryget(frame.args.name,frame.args[2])),32) local full = ifex(tryget(frame.args.full,frame.args[3]) == "true", true, false) if strnone(name) then return "'''未提供武器名称'''" end local wep = housamo.weaponimg[name] if wep==nil then return ustring.format([['''指定的武器"%s"不存在''']], name) end if full then return fetchimg(wep,scale) --ustring.format("[[File:%s|%dpx]]", wep, scale) else return wep end end housamo.wpi = housamo.Weapon function housamo.WeaponRangeImage(frame) local name = tryget(frame.args.name, frame.args[1]) local scale = tryget(tonumber(tryget(frame.args.name,frame.args[2])),80) local full = ifex(tryget(frame.args.full,frame.args[3]) == "true", true, false) if strnone(name) then return "'''未提供武器范围名称'''" end local wpr = housamo.wrangeimg[name] if wpr==nil then return ustring.format([['''指定的武器范围"%s"不存在''']], name) end if full then return fetchimg(wpr,scale) else return wpr end end housamo.wpri = housamo.WeaponRangeImage function housamo.WeaponRangeGrid(frame) local field = { {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, } local state= { [0] = "empty" , [1] = "attack" , [2] = "self" , } local name = frame.args.name or frame.args[1] local scale = frame.args.scale or frame.args[2] local manpl = housamo.wrangemap[name] local prompt = [[]] scale = tonumber(scale) or 80 local paint = function(row, col, flg) if flg < 0 or flg > 2 then prompt = prompt .. ustring.format([[Invalid flag %d at %d, fallback to 0.<br/>]],flg,a) flg = 0 end if row == -1 and col == -1 then for i=1,#field do for j=1,#field[i] do field[i][j] = flg end end elseif row == -1 then for i = 1,#field do field[i][col]=flg end elseif col == -1 then for i = 1,#field[row] do field[row][i]=flg end elseif row <=5 and row > 0 and col <= 5 and col > 0 then field[row][col] = flg else prompt = prompt .. ustring.format([[Out of index at param:%d, omitted this time.<br/>]], a) end end if manpl == nil then return ustring.format([['''指定的武器范围"%s"不存在''']], name) else for i=1,#manpl do local row,col,flg = manpl[i][1],manpl[i][2],manpl[i][3] paint(row,col,flg) end end local cellstr = [[]] for i = 1,#field do for j = 1,#field[i] do cellstr = cellstr .. ustring.format([[<div class="wrange-cell %s" style="grid-row=%d; grid-column=%d"></div>]], state[field[i][j]], i, j) end end local container = ustring.format([[<div class="wrange-grid" style = "width:%dpx;height:%dpx">%s</div>]],scale,scale,cellstr) frame:extensionTag( 'templatestyles', '',{ src = "User:あの太/沙箱/custom.css" } ) return container end housamo.wprg = housamo.WeaponRangeGrid function housamo.ValueMap(frame) local rarity = tonumber(frame.args.rarity or frame.args[1]) or 3 local valuestr = frame.args.values or frame.args[2] local pattern = [=[[^,]+]=] local vmap = {} local pop = string.gmatch(valuestr, pattern) for i = 1,6 do local v = pop() vmap[i] = tonumber(v) end local html = mw.html.create() html:wikitext(ustring.format([[%s (LV%d)]],tostring(vmap[1] or '?'),1)):tag("br") -- 1,20,30,40,50,60 -- 1,25,35,45,55,65 -- 1,30,40,50,60,70 for i = 2,5 do local lv = (rarity-1+2*i) * 5 html:wikitext(ustring.format([[%s (LV%d)]],tostring(vmap[i] or '?'),lv)):tag("br") end html:wikitext(ustring.format([[<font color="red">%s (LV%d)</font>]],tostring(vmap[6] or '?'),55+rarity*5)) return tostring(html) end housamo.vm = housamo.ValueMap function housamo.TypeColor(frame) local type = frame.args.type or frame.args[1] local sharp = (frame.args.sharp or frame.args[2]) local colortext = housamo.colormap[type] if type==nil or type==[[]] then colortext = [[ffffff]] end if colortext == nil then return ustring.format([['''指定的属性"%s"没有对应的颜色''']],type) elseif sharp == nil or sharp=="false" then return colortext else return [[#]] .. colortext end end housamo.tc = housamo.TypeColor function housamo.HasPage(name) local str = '东京放课后召唤师:' .. name local title = mw.title.new(str) return title:getContent() ~= nil end function housamo.GeneralList(frame) local r = [[]] local str = frame.args[1] or [[]] local splitter = frame.args[2] or [[ ]] local divider = frame.args[3] or [[、]] local list = mw.text.split(str, splitter) if ustring.len(str) == 0 then return [[]] end for k,v in pairs(list) do local link = nil if housamo.weaponimg[v] ~= nil then link = housamo.wpi{args={name=v,full="true"}} elseif housamo.typeimg[v] ~= nil then link = housamo.typi{args={name=v,full="true"}} --ustring.format("[[File:%s|32px|link=]]",housamo.typeimg[v]) elseif housamo.HasPage(v) then link = housamo.cl{args={name=v}} else link = v end r = r .. link if next(list,k) then r = r .. divider end end return r end housamo.glist = housamo.GeneralList function housamo.test(frame) local str = [[]] for k,v in ipairs(frame.args) do str = str .. k ..[[ ]] .. v ..[[<br/>]] end return str; end return housamo