Module:Param Parse: Difference between revisions

14,875 bytes added ,  Yesterday at 20:35
Append hours to duration param
(PLEASE_UPLOAD_IMAGE)
Tag: Reverted
(Append hours to duration param)
 
(145 intermediate revisions by 15 users not shown)
Line 3:
--]=]
-- <nowiki>
require('strict')
local Infobox = require('Module:Infobox')
local currency = require('Module:Currency').parse
 
local parse = {}
 
-- Generic functions --
-----------------------
 
-- Standardized "has content" function
Line 13 ⟶ 18:
end
 
-- Standardized numbers
function parse.number(num)
num = string.gsub(num or '',',','')
return tonumber(num)
end
 
-- Standardized imagenumber functionrange: Accepts '1' and '1-5'
function parse.number_or_number_range(prenum)
parse.PLEASE_UPLOAD_IMAGE = '[[Special:Upload|Please upload an image!]]'
if not prenum then return end
function parse.image(img)
local ret = ''
if img and img:find('%S') then
local count = 0
return img
for out in string.gmatch(prenum, "[^-]+") do
if count == 1 then
ret = ret .. "➨\n"
elseif count == 3 then
return nil
end
local num = parse.number(out)
if num == nil then
return nil
end
ret = ret .. num
count = count + 1
end
if count == 0 then
return nil
end
return ret
end
 
function parse.number_or_number_range_low(prenum)
if not prenum then return end
local count = 0
local value = nil
for out in string.gmatch(prenum, "[^-]+") do
if parse.number(out) == nil then
return nil
end
count = count + 1
if count == 1 then
value = out
end
if count > 2 then
return nil
end
end
return parse.number(value)
end
 
function parse.number_or_number_range_high(prenum)
if not prenum then return end
local count = 0
local value = nil
for out in string.gmatch(prenum, "[^-]+") do
if parse.number(out) == nil then
return nil
end
count = count + 1
if count == 2 then
value = out
end
if count > 2 then
return nil
end
end
return parse.number(value)
end
 
-- Yes/No
local yes_no = {
['Yes'] = 'true',
['No'] = 'false',
['N/A'] = 'NIL',
}
function parse.yes_no(text)
if yes_no[text] ~= nil then
return text
end
return nil
end
function parse.image_smwyes_no_smw(imgtext)
if text == 'N/A' then
return img and string.match(img, "File:.-%.png") or nil
return nil
end
local bool = yes_no[text]
if bool ~= nil then
return bool
end
return nil
end
 
-- Premade Params --
--------------------
 
-- Standardized numbersactions function
function parse.number(num)actions = {
name = 'actions',
num = string.gsub(num or '',',','')
func = parse.has_content,
return tonumber(num)
}
 
-- Standardized name function
parse.name = {
name = 'name',
func = parse.has_content,
smw_property = 'Name',
category_incomplete = 'Needs name',
}
local rarities = {"Common", "Uncommon", "Rare", "Epic"}
function parse.get_rarity_func(name)
for _, rarity in ipairs(rarities) do
if name:sub(1, #rarity) == rarity then
return rarity
end
end
return nil
end
parse.rarity_from_name = {
name = 'rarity_from_name',
func = {name = parse.get_rarity_func, params = {Infobox.raw_param('name')}}
}
 
-- Standardized description function
parse.description = {
name = 'description',
func = parse.has_content,
smw_property = 'Description',
category_incomplete = 'Needs description',
}
 
-- Standardized image function
function parse.image_name(img)
if img then
return string.match(img, '%[%[(File:.+%.%w%w%w)|?%d*x?%d*p?x?%]%]')
end
return nil
end
function parse.image_height(img, default)
if img then
return string.match(img, '%[%[File:.+%.%w%w%w|%d*x(%d*)px%]%]') or default
end
return default
end
function parse.image_width(img, default)
if img then
return string.match(img, '%[%[File:.+%.%w%w%w|(%d*)x?%d*px%]%]') or default
end
return default
end
function parse.image_func(img, default_width, default_height)
local name = parse.image_name(img)
local width = parse.image_width(img, default_width)
local height = parse.image_height(img, default_height)
local size = ''
if width and height then
size = '|'..width..'x'..height..'px'
elseif width then
size = '|'..width..'px'
elseif height then
size = '|x'..height..'px'
end
if name then
return '[['..name..size..']]'
end
return nil
end
function parse.image_smw(img)
return parse.image_name(img)
end
 
parse.image = {
name = 'image',
func = parse.image_func,
smw_property = 'Image',
smw_func = parse.image_smw,
empty = '[[Special:Upload|Please upload an image!]]',
category_incomplete = 'Needs image',
}
parse.image_size300 = {
name = 'image',
func = {name = parse.image_func, params = {Infobox.raw_param('image'), 300, 300}},
smw_property = 'Image',
smw_func = parse.image_smw,
empty = '[[Special:Upload|Please upload an image!]]',
category_incomplete = 'Needs image',
}
 
 
-- Episode
local valid_episodes = {['Hopeport'] = 1, ['Hopeforest'] = 1, ['Mine of Mantuban'] = 1, ['Crenopolis'] = 1}
['none'] = 'None',
function parse.episode(episode)
['hopeport'] = 'Hopeport',
if valid_episodes[episode] then
['hopeforest'] = 'Hopeforest',
return '[[File:'..episode..' episode icon.png|18px]] [['..episode..']]'
['mine of mantuban'] = 'Mine of Mantuban',
['crenopolis'] = 'Crenopolis',
['stonemaw hill'] = 'Stonemaw Hill',
['bleakholm crags'] = 'Bleakholm Crags'
}
function parse.episode_func(episode)
local valid_episode = valid_episodes[string.lower(episode or '')]
if valid_episode then
if valid_episode == 'None' then
return '[[File:Unknown episode icon.png|18px|link=]] None'
else
return '[[File:'..valid_episode..' episode icon.png|18px|link='..valid_episode..']] [['..valid_episode..']]'
end
end
return nil
end
function parse.episode_smw(episode)
iflocal valid_episode = valid_episodes[string.lower(episode] thenor '')]
if valid_episode then
return episode
return valid_episode
end
return nil
end
parse.episode = {
name = 'episode',
func = parse.episode_func,
smw_property = 'Episode',
smw_func = parse.episode_smw,
category_incomplete = 'Needs episode',
}
parse.additional_episode = {
name = 'additional_episode',
func = parse.episode_func,
smw_property = 'Additional Episode',
smw_func = parse.episode_smw,
category_complete = 'Infobox with two episodes',
}
 
-- Premium
local premium_episodes = {
['none'] = 'No',
['hopeport'] = 'No',
['hopeforest'] = 'No',
['mine of mantuban'] = 'Yes',
['crenopolis'] = 'Yes',
['stonemaw hill'] = 'Yes',
['bleakholm crags'] = 'Yes'
}
function parse.premium_func(episode)
local premium_episode = premium_episodes[string.lower(episode or '')]
return premium_episode
end
function parse.premium_smw(episode)
return parse.yes_no_smw(parse.premium_func(episode))
end
parse.premium = {
name = 'premium',
func = {name = parse.premium_func, params = {Infobox.raw_param('episode')}},
smw_property = 'Premium',
smw_func = {name = parse.premium_smw, params = {Infobox.raw_param('episode')}}
}
 
-- Yes/NoRelease
local yes_nofunction = {unix_time(date)
-- Convert a time to unix time
['Yes'] = true,
if date == nil then
['No'] = false,
return nil
['N/A'] = 'NIL',
end
local year, month, day = string.match(date, '(%d+)-(%d+)-(%d+)')
if year == nil or month == nil or day == nil then
return nil
end
return os.time{year=year, month=month, day=day}
end
function parse.release_func(date)
local time = unix_time(date)
if time == nil then
return nil
end
local formatted_date = os.date('[[%d %B]] [[%Y]]', time) -- [[01 January]] [[2024]]
formatted_date = string.gsub(formatted_date, '%[%[0', '[[') -- Convert [[01 January]] [[2024]] to [[1 January]] [[2024]]
local iso_date = os.date('%Y-%m-%d', time) -- 2024-01-01
local update_string = formatted_date .. ' ([[Game updates/' .. iso_date .. '|Update]])'
return update_string
end
function parse.release_smw(date)
local time = unix_time(date)
if time == nil then
return nil
end
local formatted_date = os.date('%Y-%m-%d', time) -- 2024-01-01
return formatted_date
end
parse.release = {
name = 'release',
func = parse.release_func,
category_incomplete = 'Needs release date',
smw_property = 'Release Date',
smw_func = parse.release_smw,
}
 
function parse.yes_no(text)
-- Value
if yes_no[text] then
function parse.value_func(val)
return text
local status, val = pcall(currency, val)
if status then
return val
end
end
parse.value = {
name = 'value',
func = parse.value_func,
category_incomplete = 'Items needing value',
smw_property = 'Value',
smw_func = parse.number
}
 
-- Profession
function parse.profession_bubble_func(profession, level)
local profession_valid = parse.has_content(profession)
local profession_valid_link = profession_valid
local level_valid = parse.number_or_number_range(level)
local category_error = false
if not profession_valid and not level_valid then
return nil
end
if not profession_valid and level_valid then
-- Profession undefined but level defined, invalid, show an unknown profession
profession_valid = 'Unknown episode'
profession_valid_link = ''
category_error = true
end
if profession_valid and not level_valid then
-- Profession defined without level, invalid, show an unknown level
level_valid = '?'
category_error = true
end
return '[[File:'..profession_valid..' icon.png|x30px|link='..profession_valid_link..']] '..level_valid..(category_error and '[[Category:Invalid profession bubble]]' or '')
end
function parse.profession_bubble_smw(profession, level)
local profession_valid = parse.has_content(profession)
local level_valid = parse.number(level)
if not profession_valid then
return nil
end
if not level_valid then
return nil
end
return profession_valid..','..level_valid
end
parse.profession_bubble_a = {
name = 'profession_bubble_a',
func = {name = parse.profession_bubble_func, params = {Infobox.raw_param('profession_a'), Infobox.raw_param('profession_a_level')}},
smw_property = 'Profession Requirement A',
smw_func = {name = parse.profession_bubble_smw, params = {Infobox.raw_param('profession_a'), Infobox.raw_param('profession_a_level')}},
}
parse.profession_a_smw = {
name = 'profession_a',
func = parse.has_content,
smw_property = 'Profession A',
}
parse.profession_a_level_smw = {
name = 'profession_a_level',
func = parse.number_or_number_range_low,
smw_property = 'Profession Level A',
}
parse.profession_a_level_high_smw = {
name = 'profession_a_level_high',
func = {name = parse.number_or_number_range_high, params = {Infobox.raw_param('profession_a_level')}},
smw_property = 'Profession Level A High',
}
parse.profession_bubble_b = {
name = 'profession_bubble_b',
func = {name = parse.profession_bubble_func, params = {Infobox.raw_param('profession_b'), Infobox.raw_param('profession_b_level')}},
smw_property = 'Profession Requirement B',
smw_func = {name = parse.profession_bubble_smw, params = {Infobox.raw_param('profession_b'), Infobox.raw_param('profession_b_level')}},
}
parse.profession_b_smw = {
name = 'profession_b',
func = parse.has_content,
smw_property = 'Profession B',
}
parse.profession_b_level_smw = {
name = 'profession_b_level',
func = parse.number_or_number_range_low,
smw_property = 'Profession Level B',
}
parse.profession_b_level_high_smw = {
name = 'profession_b_level_high',
func = {name = parse.number_or_number_range_high, params = {Infobox.raw_param('profession_b_level')}},
smw_property = 'Profession Level B High',
}
 
parse.variant = {
name = 'variant',
func = parse.has_content,
smw_property = 'Variant of',
category_incomplete = 'Needs variant'
}
 
parse.passive = {
name = 'passive',
func = parse.yes_no,
smw_property = 'Passive',
smw_func = parse.yes_no_smw,
category_incomplete = 'Needs passiveness'
}
 
function parse.duration_func(hours)
hours = string.gsub(hours or '',',','')
return (tonumber(hours) .. " Hours")
end
 
parse.duration = {
name = 'duration',
func = parse.duration_func,
smw_property = 'Duration',
category_incomplete = 'Needs duration',
}
 
parse.aggressive = {
name = 'aggressive',
func = parse.yes_no,
smw_property = 'Aggressive',
smw_func = parse.yes_no_smw,
category_incomplete = 'Needs aggressiveness'
}
 
function parse.difficulty_func(val)
if val == "0" then
return "☆☆☆☆☆"
end
if val == "1" then
return "★☆☆☆☆"
end
if val == "2" then
return "★★☆☆☆"
end
if val == "3" then
return "★★★☆☆"
end
if val == "4" then
return "★★★★☆"
end
if val == "5" then
return "★★★★★"
end
return "N/A"
end
function parse.difficulty_smw(val)
if val == 'N/A' then
return -1
end
val = tonumber(val) -- Intentionally do not use parse.tonumber here
if val == nil then
return nil
end
if val >= 0 and val <= 5 and math.floor(val) == val then
return val
end
return nil
end
 
function parse.yes_no_smw(text)
-- Quest difficulty
if text == 'N/A' then
parse.difficulty = {
name = 'difficulty',
func = parse.difficulty_func,
smw_property = 'Difficulty',
smw_func = parse.difficulty_smw,
category_incomplete = 'Needs difficulty'
}
 
local valid_quest_types = {
['main'] = 'Main',
['side'] = 'Side'
}
function parse.quest_type_func(type)
local valid_type = valid_quest_types[string.lower(type or '')]
if valid_type then
return valid_type
else
return 'None'
end
return nil
end
function parse.quest_type_smw(type)
local valid_type = valid_quest_types[string.lower(type or '')]
if valid_type then
return valid_type
end
return nil
end
 
-- Quest type
parse.quest_type = {
name = 'quest_type',
func = parse.quest_type_func,
smw_property = 'quest_type',
smw_func = parse.quest_type_smw,
category_incomplete = 'Needs quest_type'
}
 
-- Quest
function parse.quest_smw(quest)
if quest == 'No' then
return nil
end
return yes_no[text] or nilparse.has_content(quest)
end
 
parse.quest = {
name = 'quest',
func = parse.has_content,
smw_property = 'Quest',
smw_func = parse.quest_smw,
category_incomplete = 'Needs quest'
}
 
-- Unlock Level
function parse.unlock_level_func(profession, level)
local level_valid = parse.number(level)
local profession_valid = parse.has_content(profession)
local profession_valid_link = profession_valid
if not profession_valid and not level_valid then
return nil
end
if not profession_valid and level_valid then
-- Profession undefined but level defined, invalid, show an unknown profession
profession_valid = 'Unknown episode'
profession_valid_link = ''
end
if profession_valid and not level_valid then
-- Profession defined without level, invalid, show an unknown level
level_valid = '?'
end
return '[[File:'..profession_valid..'_icon.png|link='..profession_valid_link..'|width=18x18]] '..level_valid
end
 
function parse.unlock_level_smw(profession, level)
local profession_valid = parse.has_content(profession)
local level_valid = parse.number(level)
if not profession_valid then
return nil
end
if not level_valid then
return nil
end
return level_valid
end
 
parse.unlock_level = {
name = 'unlock_level',
func = {name = parse.unlock_level_func, params = {Infobox.raw_param('profession_a'), Infobox.raw_param('unlock_level')}},
smw_property = 'Unlock level',
smw_func = {name = parse.unlock_level_smw, params = {Infobox.raw_param('profession_a'), Infobox.raw_param('unlock_level')}},
category_incomplete = 'Needs unlock level',
}
 
-- Knowledge
parse.knowledge = {
name = 'knowledge',
func = parse.number,
smw_property = 'Knowledge',
category_incomplete = 'Needs knowledge',
}
 
parse.health = {
name = 'health',
func = parse.number,
smw_property = 'Health',
category_incomplete = 'Needs health',
}
 
parse.experience = {
name = 'experience',
func = parse.number,
smw_property = 'Experience',
category_incomplete = 'Needs experience',
}
 
local valid_attack_styles = {
['none'] = 'None',
['impact'] = 'Impact',
['cryonae'] = 'Cryonae',
['arborae'] = 'Arborae',
['tempestae'] = 'Tempestae',
['infernae'] = 'Infernae',
['necromae'] = 'Necromae',
}
 
local function attack_style_func(style)
local attack_style = valid_attack_styles[string.lower(style or '')]
if attack_style then
if attack_style == 'None' then
return 'None'
else
return string.format('[[File:%s damage icon.png|18px|link=%s]] [[%s]]', attack_style, attack_style, attack_style)
end
end
return nil
end
 
local function attack_style_smw(style)
local attack_style = valid_attack_styles[string.lower(style or '')]
if attack_style then
return attack_style
else
return nil
end
end
 
parse.attack_style = {
name = 'attack_style',
func = attack_style_func,
smw_property = 'Attack style',
smw_func = attack_style_smw,
category_incomplete = 'Needs attack style',
}
 
parse.immune_to = {
name = 'immune_to',
func = attack_style_func,
smw_property = 'Immune to',
smw_func = attack_style_smw,
category_incomplete = 'Needs immune to',
}
 
parse.vulnerable_to = {
name = 'vulnerable_to',
func = attack_style_func,
smw_property = 'Vulnerable to',
smw_func = attack_style_smw,
category_incomplete = 'Needs vulnerable to',
}
 
return parse
592

edits