Editing Module:Infobox

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 4: Line 4:


-- <nowiki>
-- <nowiki>
-- Edit button for unknown params
require('strict')
local editbutton = require('Module:Edit button')
local editbutton = require('Module:Edit button')
local smwutils = require('Module:SMW Utils')


local Infobox = {}
local Infobox = {}
Infobox.__index = Infobox
Infobox.__index = Infobox



--[[
--[[
Line 24: Line 24:
args_smw = {}, -- parameters parsed for smw
args_smw = {}, -- parameters parsed for smw
infobox_name = nil, -- template name
infobox_name = nil, -- template name
classes = {}, -- list of classes to add, using the default_version
param_names = {}, -- ordered param list
param_names = {}, -- ordered param list
params = {}, -- param definitions
params = {}, -- param definitions
Line 32: Line 31:
version_names = {}, -- title of each version (for selection and SMW)
version_names = {}, -- title of each version (for selection and SMW)
rtable = nil, -- infobox table to return at the end
rtable = nil, -- infobox table to return at the end
switch_datatable = '', -- datatable for javascript for switch infoboxes
switch_datatable = nil, -- datatable for javascript for switch infoboxes
categories = {}, -- set of categories
categories = {}, -- set of categories
errors = {}, -- list of errors
errors = {}, -- list of errors
Line 59: Line 58:
--]]
--]]
function Infobox.param(param_name)
function Infobox.param(param_name)
local param = {
param = {
property = 'args_parsed',
property = 'args_parsed',
param_name = param_name,
param_name = param_name,
Line 72: Line 71:
--]]
--]]
function Infobox.raw_param(param_name)
function Infobox.raw_param(param_name)
local param = {
param = {
property = 'args_raw',
property = 'args_raw',
param_name = param_name,
param_name = param_name,
Line 85: Line 84:
--]]
--]]
function Infobox.smw_param(param_name)
function Infobox.smw_param(param_name)
local param = {
param = {
property = 'args_smw',
property = 'args_smw',
param_name = param_name,
param_name = param_name,
Line 172: Line 171:
_cell:wikitext(content)
_cell:wikitext(content)
-- Add the switch data if multiple values exist
-- Add the switch data if multiple values exist
local data_attr_param = self:add_switch_data(v.content)
data_attr_param = self:add_switch_data(v.content)
if data_attr_param then
if data_attr_param then
_cell:attr('data-attr-param', data_attr_param)
_cell:attr('data-attr-param', data_attr_param)
Line 189: Line 188:
--]]
--]]
function Infobox:pad(colspan, class)
function Infobox:pad(colspan, class)
local tr = self.rtable:tag('tr'):tag('td'):attr('colspan', colspan or 1):addClass('infobox-padding')
local tr = self:tag('tr'):tag('td'):attr('colspan', colspan or 1):addClass('infobox-padding')
if class then
if class then
tr:addClass(class)
tr:addClass(class)
Line 195: Line 194:
return self
return self
end
end



--[[
--[[
Line 209: Line 209:
-- config: table containing configuration parameters
-- config: table containing configuration parameters
---- infobox_name = mandatory unique identifier for this infobox, used for css
---- infobox_name = mandatory unique identifier for this infobox, used for css
---- max_buttons = max number of switch buttons before using a dropdown list instead
---- max_buttuons = max number of switch buttons before using a dropdown list instead
--]]
--]]
function Infobox:config(config)
function Infobox:config(config)
Line 217: Line 217:
elseif k == 'max_buttons' then
elseif k == 'max_buttons' then
self.max_buttons = tonumber(v)
self.max_buttons = tonumber(v)
elseif k == 'class' then
if type(v) == 'string' then
self.classes = {v}
elseif type(v) == 'table' then
self.classes = v
end
end
end
end
end
Line 238: Line 232:
--]]
--]]
function Infobox:parse_versions()
function Infobox:parse_versions()
local function insert_version_name(version_name)
table.insert(self.version_names, version_name)
if smwutils.valid_subobject_name(version_name) == false then
table.insert(self.errors, 'Illegal version value: must not be "0" nor contain a "." in the first five characters')
end
end
-- Count the versions and setup self.version_names
-- Count the versions and setup self.version_names
local i = 1
local i = 1
while self.args_raw['version'..i] do
while self.args_raw['version'..i] do
insert_version_name(self.args_raw['version'..i])
table.insert(self.version_names, self.args_raw['version'..i])
i = i + 1
i = i + 1
end
end
self.versions = i - 1
self.versions = i - 1
-- Handle the no version case - check for a custom version_name
if self.versions == 0 then
table.insert(self.version_names, self.args_raw['version'] or 'DEFAULT')
end
-- Should either have 0 or 2+ versions
-- Should either have 0 or 2+ versions
if self.versions == 1 then
if self.versions == 1 then
table.insert(self.errors, 'There should be multiple versions or no versions. If defining a custom version name for a single entry, use "version=Name" instead of "version1=Name".')
table.insert(self.errors, 'There should be multiple versions or no versions. If defining a custom version name for a single entry, use "version=Name" instead of "version1=Name".')
self.versions = 0
end
-- Handle the no version case - check for a custom version_name
if self.versions == 0 then
insert_version_name(self.args_raw['version'] or 'DEFAULT')
self.versions = 1
end
end
-- Check for a default_version
-- Check for a default_version
Line 369: Line 356:
local func_params = func.params
local func_params = func.params
local func_fetched_params = {}
local func_fetched_params = {}
local i = 1
for _, func_param in ipairs(func_params) do
for _, func_param in ipairs(func_params) do
func_fetched_params[i] = self:get_param(func_param, version)
table.insert(func_fetched_params, self:get_param(func_param, version))
i = i + 1
end
end
return func_name(unpack(func_fetched_params))
return func_name(unpack(func_fetched_params))
Line 411: Line 396:
:addClass('infobox')
:addClass('infobox')
:addClass('infobox-'..self.infobox_name)
:addClass('infobox-'..self.infobox_name)
for _, class in ipairs(self.classes) do
local class_name = self:get_param(class, self.default_version)
if type(class_name) == 'string' then
self.rtable:addClass('infobox-'..mw.ustring.gsub(class_name, '%s', '_'))
end
end
-- Create the switch datatable if multiple versions
-- Create the switch datatable if multiple versions
if self.versions > 1 then
if self.versions > 1 then
Line 424: Line 403:
:addClass('infobox-resources-'..self.infobox_name)
:addClass('infobox-resources-'..self.infobox_name)
:addClass('hidden')
:addClass('hidden')
self.switch_datatable:tag('span'):wikitext('Versions: '..self.versions)
self.switch_datatable:tag('span'):wikitext('Default version: '..self.default_version)
end
end
return self
return self
Line 441: Line 422:
:tag('div')
:tag('div')
:addClass('infobox-buttons')
:addClass('infobox-buttons')
:attr('data-default-index', self.default_version)
:attr('data-default-version', self.default_version)
-- Dropdown list instead of buttons if too many versions
-- Dropdown list instead of buttons if too many versions
if self.versions > self.max_buttons then
if self.versions > self.max_buttons then
Line 448: Line 429:
-- Create all the buttons
-- Create all the buttons
for version=1, self.versions do
for version=1, self.versions do
local button = buttons:tag('span')
buttons:tag('span')
:attr('data-switch-index', version)
:attr('data-switch-index', version)
:attr('data-switch-anchor', '#'..self.version_names[version])
:attr('data-switch-anchor', '#'..self.version_names[version])
:addClass('button')
:addClass('button')
:wikitext(self.version_names[version])
:wikitext(self.version_names[version])
-- In case of dropdown list, hide the buttons as the switch gadget will convert them to a dropdown list - we can't directly create the dropdown list here as the select/option tags are rejected by wikitext
if self.versions > self.max_buttons then
button:addClass('hidden')
end
end
end
end
end
Line 468: Line 445:
-- Generate a subobject name
-- Generate a subobject name
-- Reminder - subobject name cannot have a . in the first 5 characters
-- Reminder - subobject name cannot have a . in the first 5 characters
local subobject_name = self.version_names[version]
local subobject_name = 'Infobox.'..mw.title.getCurrentTitle().fullText..'#'..self.version_names[version]
-- Store each param that has smw_property defined and is not nil
-- Store each param that has smw_property defined and is not nil
local subobject = {Infobox = self.infobox_name} -- Also store the current Infobox name
local subobject = {}
for _, param_name in ipairs(self.param_names) do
for _, param_name in ipairs(self.param_names) do
local property = self.params[param_name].smw_property
local property = self.params[param_name].smw_property
if property then
if property then
local value = self:get_param(self.smw_param(param_name), version)
value = self:get_param(self.smw_param(param_name), version)
if value ~= nil then
if value ~= nil then
subobject[property] = value
subobject[property] = value
Line 484: Line 461:
-- Save subobjects if not in mainspace
-- Save subobjects if not in mainspace
if mw.title.getCurrentTitle():inNamespace(0) then
if mw.title.getCurrentTitle():inNamespace(0) then
local result = true
local result = mw.smw.subobject(subobject, subobject_name)
if self.versions == 1 then
result = mw.smw.set(subobject)
else
result = mw.smw.subobject(subobject, subobject_name)
end
if result ~= true then
if result ~= true then
table.insert(self.errors, 'SMW error: '..result.error)
table.insert(self.errors, 'SMW error: '..result.error)
Line 527: Line 499:
--]]
--]]
function Infobox:add_switch_data(content)
function Infobox:add_switch_data(content)
if self.versions < 2 then
if self.versions <= 1 then
return false
return false
end
end
Line 555: Line 527:
name = 'smw__' + name
name = 'smw__' + name
end
end
local data_param = self.switch_datatable:tag('span'):attr('data-attr-param', name)
data_param = self.switch_datatable:tag('span'):attr('data-attr-param', name)
-- Add each version to the datatable
-- Add each version to the datatable
for version=1, self.versions do
for version=1, self.versions do
local text = self:get_param(content, version)
text = self:get_param(content, version)
if text == nil then
if text == nil then
text = self.params[content.param_name].empty
text = self.params[content.param_name].empty
Line 580: Line 552:
-- Create categories
-- Create categories
local category_text = ''
local category_text = ''
for key, _ in pairs(self.categories) do
if mw.title.getCurrentTitle():inNamespace(0) then
category_text = category_text..'[[Category:'..key..']]'
for key, _ in pairs(self.categories) do
category_text = category_text..'[[Category:'..key..']]'
end
end
local dump = ''
if self.args_raw.__dump then
setmetatable(self, nil)
dump = '<nowiki>'..mw.dumpObject(self)..'</nowiki>'
setmetatable(self, Infobox)
end
end
return tostring(self.rtable) .. tostring(self.switch_datatable) .. error_text .. category_text .. dump
return tostring(self.rtable) .. tostring(self.switch_datatable) .. error_text .. category_text
end
end


Please note that all contributions to Brighter Shores Wiki are considered to be released under the CC BY-NC-SA 3.0 (see Brighter Shores:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)
Preview page with this template

This page is a member of a hidden category: