Module:Param Parse: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
InvalidCards (talk | contribs) (Add support for "None" episode) |
No edit summary Tag: Reverted |
||
Line 134:
if valid_episode then
if valid_episode == 'None' then
return '[[File:Unknown episode icon.
else
local page_name = valid_episode .. ' (episode)'
|
Revision as of 13:34, 6 November 2024
Module documentation
This documentation is transcluded from Module:Param Parse/doc. [edit] [history] [purge]
Module:Param Parse requires Module:Currency.
Module:Param Parse requires Module:Infobox.
Module:Param Parse is required by
.These params and functions are used to validate and format information passed into an Infobox. See Module:Infobox for details and instructions on creating an Infobox. If the information is missing or not valid, the functions here should return nil.
Here is a summary of all the params:
param | explanation |
---|---|
parse.name | Title |
parse.examine | Examine info |
parse.image | [[File:IMAGE.png]]. Use the class infobox-image in the table |
parse.image_size300 | [[File:IMAGE.png|300x300px]] by default unless overridden. Use the class infobox-image in the table |
parse.episode | Episode name |
parse.premium | Premium (Yes, No, N/A) |
parse.release | Release Date in the format YYYY-MM-DD |
parse.value | Shows the value as a denomination of coins |
parse.profession | TODO |
parse.profession_bubble_a, parse.profession_bubble_b | Takes parameters profession_a + profession_a_level, or profession_b + profession_b_level |
parse.profession_a_smw, parse.profession_a_level_smw, parse.profession_b_smw, parse.profession_b_level_smw | Exports the data from profession_bubble_a and profession_bubble_b to smw |
parse.variant | TODO - Which category the subject is a variant of |
parse.passive | Passiveness (Yes, No, N/A) |
Here are some general use functions that can be used for custom or new params:
function name | explanation |
---|---|
has_content(arg) | Returns arg if any non-whitespace character is found in the string. |
number(num) | Removes any commas and parses the string as a number |
yes_no(text) | Only accepts "Yes", "No" and "N/A" |
yes_no_smw(text) | Maps "Yes", "No" to true and false respectively |
Creating New Params
Ideally, params should be defined here so that they can be reused between different Infoboxes. Here is how to create a new param:
parse.paramname = {
name = <param>,
func = <func>,
empty = 'empty', -- optional
category_never = 'category', -- optional
category_partial = 'category', -- optional
category_incomplete = 'category', -- optional
category_complete = 'category', -- optional
smw_property = 'Property', -- optional
smw_func = <func>, -- optional
}
key | value | ||||
---|---|---|---|---|---|
name | parameter name as used in the Template | ||||
func | A function in Module:Param Parse to validate and process the Template argument. You can also use a local function, but this is not recommended.
If func is a function, will call func(Infobox.raw_param(name)): {name = <param>, func = <func>, ... },
If func is a table, it takes the following parameters: {name = <param>, func = { name = <func>, params = <func_params>}, ... },
| ||||
empty (optional) | text to display in the infobox if func returns nil; defaults to "? (edit)" | ||||
category_never (optional) | category to add if func returns nil for all versions | ||||
category_partial (optional) | category to add if func returns nil for some versions, but a value for other versions | ||||
category_incomplete (optional) | category to add if func returns nil for at least 1 version (i.e. category_never and category_partial combined) | ||||
category_complete (optional) | category to add if func returns a value for all versions | ||||
smw_property (optional) | if this string is defined, the parameter will be saved into SMW | ||||
smw_func (optional) | function to validate and process the Template argument to save into SMW. func is used by default if smw_func is not defined |
--[=[
-- Standardized functions to parse Infobox params
--]=]
-- <nowiki>
local Infobox = require('Module:Infobox')
local currency = require('Module:Currency').parse
local parse = {}
-- Generic functions --
-----------------------
-- Standardized "has content" function
function parse.has_content(arg)
-- Return arg if any non-whitespace character is found
return string.match(arg or '', '%S') and arg or nil
end
-- Standardized numbers
function parse.number(num)
num = string.gsub(num or '',',','')
return tonumber(num)
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.yes_no_smw(text)
if text == 'N/A' then
return nil
end
local bool = yes_no[text]
if bool ~= nil then
return bool
end
return nil
end
-- Premade Params --
--------------------
-- Standardized name function
parse.name = {
name = 'name',
func = parse.has_content,
smw_property = 'Name',
category_incomplete = 'Needs name',
}
-- Standardized examine function
parse.examine = {
name = 'examine',
func = parse.has_content,
smw_property = 'Examine',
category_incomplete = 'Needs examine',
}
-- 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 = {
['none'] = 'None',
['hopeport'] = 'Hopeport',
['hopeforest'] = 'Hopeforest',
['mine of mantuban'] = 'Mine of Mantuban',
['crenopolis'] = 'Crenopolis'
}
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.svg|18px|link=]] None'
else
local page_name = valid_episode .. ' (episode)'
-- Check if the page with '(episode)' exists
if mw.title.new(page_name).exists then
return '[[File:'..valid_episode..' episode icon.png|18px|link='..page_name..']] [['..page_name..'|'..valid_episode..']]'
else
-- Fallback to the original episode name
return '[[File:'..valid_episode..' episode icon.png|18px|link='..valid_episode..']] [['..valid_episode..']]'
end
end
end
return nil
end
function parse.episode_smw(episode)
local valid_episode = valid_episodes[string.lower(episode or '')]
if valid_episode then
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',
}
-- Premium
local premium_episodes = {
['none'] = 'No',
['hopeport'] = 'No',
['hopeforest'] = 'No',
['mine of mantuban'] = 'Yes',
['crenopolis'] = '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')}}
}
-- Release
function unix_time(date)
-- Convert a time to unix time
if date == nil then
return 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,
}
-- Value
function parse.value_func(val)
return currency(val)
end
parse.value = {
name = 'value',
func = parse.value_func,
category_incomplete = 'Items needing value',
smw_property = 'Value',
smw_func = parse.number
}
-- Profession (TODO)
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(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,
smw_property = 'Profession Level A',
}
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,
smw_property = 'Profession Level B',
}
parse.profession = {
name = 'profession',
func = parse.has_content,
category_incomplete = 'Needs profession',
smw_property = 'Profession' -- TODO - Need to create property page
}
parse.variant = {
name = 'variant',
func = parse.has_content,
smw_property = 'Variant of'
}
parse.passive = {
name = 'passive',
func = parse.yes_no,
smw_property = 'Passive',
smw_func = parse.yes_no_smw,
category_incomplete = 'Needs passiveness'
}
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
-- Quest difficulty
parse.difficulty = {
name = 'difficulty',
func = parse.difficulty_func,
smw_property = 'Difficulty',
category_incomplete = 'Needs difficulty'
}
return parse
-- </nowiki>