Editing Module:Silent1/sandbox

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 save the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
 
local p = {}
 
local p = {}
 +
local args = {}
 
local origArgs = {}
 
local origArgs = {}
local name
+
local root
local width = 'auto'
+
local side
local height = 'auto'
+
local rowh
local add_word
+
local rowd
local only_url
+
local empty_row_categories = {}
local no_link
+
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local link
+
local has_rows = false
  
local data_module_names = {
+
local function fixChildBoxes(sval, tt)
--item = 'Module:Items/data',
+
local function notempty( s ) return s and s:match( '%S' ) end
item = 'Module:Silent1/sandbox/data',
+
other = 'Module:OtherImages/data'
+
if notempty(sval) then
}
+
local marker = '<span class=special_infobox_marker>'
local loaded_data_modules = {}
+
local s = sval
 +
-- start moving templatestyles and categories inside of table rows
 +
local slast = ''
 +
while slast ~= s do
 +
slast = s
 +
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
 +
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
 +
end
 +
-- end moving templatestyles and categories inside of table rows
 +
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
 +
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
 +
if s:match(marker) then
 +
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
 +
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
 +
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
 +
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
 +
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
 +
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
 +
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
 +
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
 +
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
 +
end
 +
if s:match(marker) then
 +
local subcells = mw.text.split(s, marker)
 +
s = ''
 +
for k = 1, #subcells do
 +
if k == 1 then
 +
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
 +
elseif k == #subcells then
 +
local rowstyle = ' style="display:none"'
 +
if notempty(subcells[k]) then rowstyle = '' end
 +
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
 +
subcells[k]
 +
elseif notempty(subcells[k]) then
 +
if (k % 2) == 0 then
 +
s = s .. subcells[k]
 +
else
 +
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
 +
subcells[k] .. '</' .. tt .. '></tr>'
 +
end
 +
end
 +
end
 +
end
 +
-- the next two lines add a newline at the end of lists for the PHP parser
 +
-- [[Special:Diff/849054481]]
 +
-- remove when [[:phab:T191516]] is fixed or OBE
 +
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
 +
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
 +
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
 +
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
 +
return s
 +
else
 +
return sval
 +
end
 +
end
 +
 
 +
-- Cleans empty tables
 +
local function cleanInfobox()
 +
root = tostring(root)
 +
if has_rows == false then
 +
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
 +
end
 +
end
 +
 
 +
-- Returns the union of the values of two tables, as a sequence.
 +
local function union(t1, t2)
 +
 
 +
local vals = {}
 +
for k, v in pairs(t1) do
 +
vals[v] = true
 +
end
 +
for k, v in pairs(t2) do
 +
vals[v] = true
 +
end
 +
local ret = {}
 +
for k, v in pairs(vals) do
 +
table.insert(ret, k)
 +
end
 +
return ret
 +
end
  
function p.loadData (data_type)  
+
-- Returns a table containing the numbers of the arguments that exist
local module_name = data_module_names[data_type]
+
-- for the specified prefix. For example, if the prefix was 'data', and
if loaded_data_modules[module_name] == nil then
+
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
loaded_data_modules[module_name] = mw.loadData(module_name)
+
local function getArgNums(prefix)
 +
local nums = {}
 +
for k, v in pairs(args) do
 +
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
 +
if num then table.insert(nums, tonumber(num)) end
 
end
 
end
 +
table.sort(nums)
 +
return nums
 +
end
 +
 +
-- Adds a row to the infobox, with either a header cell
 +
-- or a label/data cell combination.
 +
local function addRow(rowArgs)
 
 
return loaded_data_modules[module_name]
+
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
 +
has_rows = true
 +
root
 +
:tag('tr')
 +
:addClass(rowArgs.rowclass)
 +
:cssText(rowArgs.rowstyle)
 +
:tag('th')
 +
:attr('colspan', '2')
 +
:addClass('infobox-header')
 +
:addClass(rowArgs.class)
 +
:addClass(args.headerclass)
 +
-- @deprecated next; target .infobox-<name> .infobox-header
 +
:cssText(args.headerstyle)
 +
:cssText(rowArgs.rowcellstyle)
 +
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
 +
if rowArgs.data then
 +
root:wikitext(
 +
'[[Category:Pages using infobox templates with ignored data cells]]'
 +
)
 +
end
 +
elseif rowArgs.data and rowArgs.data:gsub(
 +
category_in_empty_row_pattern, ''
 +
):match('^%S') then
 +
has_rows = true
 +
local row = root:tag('tr')
 +
row:addClass(rowArgs.rowclass)
 +
row:cssText(rowArgs.rowstyle)
 +
if rowArgs.label then
 +
row
 +
:tag('th')
 +
:attr('scope', 'row')
 +
:addClass('infobox-label')
 +
-- @deprecated next; target .infobox-<name> .infobox-label
 +
:cssText(args.labelstyle)
 +
:cssText(rowArgs.rowcellstyle)
 +
:wikitext(rowArgs.label)
 +
:done()
 +
end
 +
 
 +
local dataCell = row:tag('td')
 +
dataCell
 +
:attr('colspan', not rowArgs.label and '2' or nil)
 +
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
 +
:addClass(rowArgs.class)
 +
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
 +
:cssText(rowArgs.datastyle)
 +
:cssText(rowArgs.rowcellstyle)
 +
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
 +
else
 +
table.insert(empty_row_categories, rowArgs.data or '')
 +
end
 
end
 
end
  
--Search the item data for item name and return its id
+
-- Adds a nested table to a row in the infobox, 
function p.findItemID(name)
+
-- with a label row and a data cell row.
local items = p.loadData('item')
+
local function addSideRows(rowArgs)
local lname = string.lower(name)
+
--Create references to the new rows
local id = nil
+
if side == nil then
 +
local dataCell = root:tag('tr'):tag('td')
 +
dataCell
 +
:attr('colspan', '2')
 +
:addClass('infobox-subheader')
 +
side = dataCell:tag('table')
 +
side
 +
:addClass('fullWidth-table')
 +
:addClass(args.bodyclass)
 +
:cssText(args.bodystyle)
 +
rowh = side:tag('tr')
 +
rowh:addClass(args['rowclass' .. tostring(num)])
 +
rowh:cssText(args['rowstyle' .. tostring(num)])
 +
rowd = side:tag('tr')
 +
rowd:addClass(args['rowclass' .. tostring(num)])
 +
rowd:cssText(args['rowstyle' .. tostring(num)])
 +
end
 
 
for k,v in pairs(items) do
+
--Add label and data to the rows
if lname == string.lower(v['name']) then  
+
if rowArgs.sdata and rowArgs.sdata:gsub(
id = k
+
category_in_empty_row_pattern, ''
return id
+
):match('^%S') then
 +
rowh
 +
:tag('th')
 +
:attr('scope', 'row')
 +
:addClass('infobox-slabel')
 +
:cssText(args.labelstyle)
 +
:cssText(rowArgs.rowcellstyle)
 +
:wikitext(rowArgs.slabel)
 +
:done()
 +
 
 +
rowd
 +
:tag('td')
 +
:addClass('infobox-sdata')
 +
:addClass(rowArgs.class)
 +
:cssText(rowArgs.datastyle)
 +
:cssText(rowArgs.rowcellstyle)
 +
:wikitext(fixChildBoxes(rowArgs.sdata, 'td'))
 +
:done()
 +
end
 +
end
 +
 
 +
local function renderTitle()
 +
if not args.title then return end
 +
 
 +
has_rows = true
 +
root
 +
:tag('caption')
 +
:addClass('infobox-title')
 +
:addClass(args.titleclass)
 +
-- @deprecated next; target .infobox-<name> .infobox-title
 +
:cssText(args.titlestyle)
 +
:wikitext(args.title)
 +
end
 +
 
 +
local function renderAboveRow()
 +
if not args.above then return end
 +
 
 +
has_rows = true
 +
root
 +
:tag('tr')
 +
:tag('th')
 +
:attr('colspan', '2')
 +
:addClass('infobox-above')
 +
:addClass(args.aboveclass)
 +
-- @deprecated next; target .infobox-<name> .infobox-above
 +
:cssText(args.abovestyle)
 +
:wikitext(fixChildBoxes(args.above,'th'))
 +
end
 +
 
 +
local function renderBelowRow()
 +
if not args.below then return end
 +
 
 +
has_rows = true
 +
root
 +
:tag('tr')
 +
:tag('td')
 +
:attr('colspan', '2')
 +
:addClass('infobox-below')
 +
:addClass(args.belowclass)
 +
-- @deprecated next; target .infobox-<name> .infobox-below
 +
:cssText(args.belowstyle)
 +
:wikitext(fixChildBoxes(args.below,'td'))
 +
end
 +
 
 +
local function addSubheaderRow(subheaderArgs)
 +
if subheaderArgs.data and
 +
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
 +
has_rows = true
 +
local row = root:tag('tr')
 +
row:addClass(subheaderArgs.rowclass)
 +
 
 +
local dataCell = row:tag('td')
 +
dataCell
 +
:attr('colspan', '2')
 +
:addClass('infobox-subheader')
 +
:addClass(subheaderArgs.class)
 +
:cssText(subheaderArgs.datastyle)
 +
:cssText(subheaderArgs.rowcellstyle)
 +
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
 +
else
 +
table.insert(empty_row_categories, subheaderArgs.data or '')
 +
end
 +
end
 +
 
 +
local function renderSubheaders()
 +
if args.subheader then
 +
args.subheader1 = args.subheader
 +
end
 +
if args.subheaderrowclass then
 +
args.subheaderrowclass1 = args.subheaderrowclass
 +
end
 +
local subheadernums = getArgNums('subheader')
 +
for k, num in ipairs(subheadernums) do
 +
addSubheaderRow({
 +
data = args['subheader' .. tostring(num)],
 +
-- @deprecated next; target .infobox-<name> .infobox-subheader
 +
datastyle = args.subheaderstyle,
 +
rowcellstyle = args['subheaderstyle' .. tostring(num)],
 +
class = args.subheaderclass,
 +
rowclass = args['subheaderrowclass' .. tostring(num)]
 +
})
 +
end
 +
end
 +
 
 +
local function addImageRow(imageArgs)
 +
 
 +
if imageArgs.data and
 +
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
 +
 
 +
has_rows = true
 +
local row = root:tag('tr')
 +
row:addClass(imageArgs.rowclass)
 +
 
 +
local dataCell = row:tag('td')
 +
dataCell
 +
:attr('colspan', '2')
 +
:addClass('infobox-image')
 +
:addClass(imageArgs.class)
 +
:cssText(imageArgs.datastyle)
 +
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
 +
else
 +
table.insert(empty_row_categories, imageArgs.data or '')
 +
end
 +
end
 +
 
 +
local function renderImages()
 +
if args.image then
 +
args.image1 = args.image
 +
end
 +
if args.caption then
 +
args.caption1 = args.caption
 +
end
 +
local imagenums = getArgNums('image')
 +
for k, num in ipairs(imagenums) do
 +
local caption = args['caption' .. tostring(num)]
 +
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
 +
if caption then
 +
data
 +
:tag('div')
 +
:addClass('infobox-caption')
 +
-- @deprecated next; target .infobox-<name> .infobox-caption
 +
:cssText(args.captionstyle)
 +
:wikitext(caption)
 
end
 
end
 +
addImageRow({
 +
data = tostring(data),
 +
-- @deprecated next; target .infobox-<name> .infobox-image
 +
datastyle = args.imagestyle,
 +
class = args.imageclass,
 +
rowclass = args['imagerowclass' .. tostring(num)]
 +
})
 
end
 
end
return id
 
 
end
 
end
  
--Find the image from the name
+
-- When autoheaders are turned on, preprocesses the rows
-- function p.findImage(name)
+
local function preprocessRows()
-- local id
+
if not args.autoheaders then return end
-- name = string.lower(name)
 
-- local image = p.loadData('other')[name]
 
 
 
-- --If name is a number, pass in as an item ID
+
local rownums = union(union(getArgNums('header'), getArgNums('data')),
-- if tonumber(name) then
+
union(getArgNums('sbreak'), getArgNums('sdata')))
-- id = name
+
table.sort(rownums)
-- else
+
local lastheader
-- id = p.findItemID(name)
+
for k, num in ipairs(rownums) do
-- end
+
if args['header' .. tostring(num)] then
+
if lastheader then
-- --If id is valid
+
args['header' .. tostring(lastheader)] = nil
-- if id then
+
end
-- local item = p.loadData('item')[id]
+
lastheader = num
-- local url = item['itemImage']
+
elseif (args['data' .. tostring(num)] and
-- local icon = item['itemIcon']
+
args['data' .. tostring(num)]:gsub(category_in_empty_row_pattern, ''):match('^%S')) or
-- local realname = item['name']
+
(args['sdata' .. tostring(num)] and
+
args['sdata' .. tostring(num)]:gsub(category_in_empty_row_pattern, ''):match('^%S')) then
-- if icon then url = icon end
+
--local data = args['data' .. tostring(num)]
-- image = {name = realname, image = url}
+
--if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
+
lastheader = nil
-- if not (image['name'] and image['image']) then
+
--end
-- image = nil
+
end
-- end
+
end
-- end
+
if lastheader then
 +
args['header' .. tostring(lastheader)] = nil
 +
end
 +
end
 +
 
 +
-- Gets the union of the header and data argument numbers,
 +
-- and renders them all in order
 +
local function renderRows()
 +
 
 +
local rownums = union(union(getArgNums('header'), getArgNums('data')),
 +
union(getArgNums('sbreak'), getArgNums('sdata')))
 +
table.sort(rownums)
 +
for k, num in ipairs(rownums) do
 +
if args['sbreak' .. tostring(num)] then  
 +
side = nil
 +
elseif args['sdata' .. tostring(num)] then
 +
addSideRows({
 +
slabel = args['slabel' .. tostring(num)],
 +
sdata = args['sdata' .. tostring(num)],
 +
datastyle = args.datastyle,
 +
class = args['class' .. tostring(num)],
 +
rowclass = args['rowclass' .. tostring(num)],
 +
-- @deprecated next; target .infobox-<name> rowclass
 +
rowstyle = args['rowstyle' .. tostring(num)],
 +
rowcellstyle = args['rowcellstyle' .. tostring(num)]
 +
})
 +
else
 +
side = nil
 +
 +
addRow({
 +
header = args['header' .. tostring(num)],
 +
label = args['label' .. tostring(num)],
 +
data = args['data' .. tostring(num)],
 +
datastyle = args.datastyle,
 +
class = args['class' .. tostring(num)],
 +
rowclass = args['rowclass' .. tostring(num)],
 +
-- @deprecated next; target .infobox-<name> rowclass
 +
rowstyle = args['rowstyle' .. tostring(num)],
 +
rowcellstyle = args['rowcellstyle' .. tostring(num)]
 +
})
 +
end
 +
end
 +
end
 +
 
 +
local function renderNavBar()
 +
if not args.name then return end
 +
 
 +
has_rows = true
 +
root
 +
:tag('tr')
 +
:tag('td')
 +
:attr('colspan', '2')
 +
:addClass('infobox-navbar')
 +
:wikitext(require('Module:Navbar')._navbar{
 +
args.name,
 +
mini = 1,
 +
})
 +
end
 +
 
 +
local function renderItalicTitle()
 +
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
 +
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
 +
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
 +
end
 +
end
 +
 
 +
-- Categories in otherwise empty rows are collected in empty_row_categories.
 +
-- This function adds them to the module output. It is not affected by
 +
-- args.decat because this module should not prevent module-external categories
 +
-- from rendering.
 +
local function renderEmptyRowCategories()
 +
for _, s in ipairs(empty_row_categories) do
 +
root:wikitext(s)
 +
end
 +
end
 +
 
 +
-- Render tracking categories. args.decat == turns off tracking categories.
 +
local function renderTrackingCategories()
 +
if args.decat == 'yes' then return end
 +
if args.child == 'yes' then
 +
if args.title then
 +
root:wikitext(
 +
'[[Category:Pages using embedded infobox templates with the title parameter]]'
 +
)
 +
end
 +
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
 +
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
 +
end
 +
end
 +
 
 +
--[=[
 +
Loads the templatestyles for the infobox.
 +
 
 +
TODO: FINISH loading base templatestyles here rather than in
 +
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
 +
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
 +
When we do this we should clean up the inline CSS below too.
 +
Will have to do some bizarre conversion category like with sidebar.
 +
 
 +
]=]
 +
local function loadTemplateStyles()
 +
local frame = mw.getCurrentFrame()
 
 
-- return image
+
-- See function description
-- end
+
local base_templatestyles = frame:extensionTag{
 +
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
 +
}
  
function p.findImage(name)
+
local templatestyles = ''
local id
+
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = string.lower(name)
+
name = 'templatestyles', args = { src = args['templatestyles'] }
local image = p.loadData('other')[name]
+
}
 +
end
 
 
if not image then
+
local child_templatestyles = ''
image = p.loadData('item')[name]
+
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
 +
name = 'templatestyles', args = { src = args['child templatestyles'] }
 +
}
 
end
 
end
return image
+
 +
local grandchild_templatestyles = ''
 +
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
 +
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
 +
}
 +
end
 +
 
 +
return table.concat({
 +
base_templatestyles, -- see function description
 +
templatestyles,
 +
child_templatestyles,
 +
grandchild_templatestyles
 +
})
 +
end
 +
 
 +
-- common functions between the child and non child cases
 +
local function structure_infobox_common()
 +
renderSubheaders()
 +
renderImages()
 +
preprocessRows()
 +
renderRows()
 +
renderBelowRow()
 +
-- renderNavBar()
 +
renderItalicTitle()
 +
renderEmptyRowCategories()
 +
renderTrackingCategories()
 +
cleanInfobox()
 
end
 
end
  
--Create a string to output
+
-- Specify the overall layout of the infobox, with special settings if the
local function _image()
+
-- infobox is used as a 'child' inside another infobox.
local image = p.findImage(name)
+
local function _infobox()
local s = ''
+
if args.child ~= 'yes' then
local rs = nil
+
root = mw.html.create('table')
 +
 
 +
root
 +
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
 +
:addClass(args.bodyclass)
 +
-- @deprecated next; target .infobox-<name>
 +
:cssText(args.bodystyle)
 +
 
 +
renderTitle()
 +
renderAboveRow()
 +
else
 +
root = mw.html.create()
 +
 
 +
root
 +
:wikitext(args.title)
 +
end
 +
structure_infobox_common()
 
 
if image then
+
-- return loadTemplateStyles() .. root
local realname = image['name']
+
return root
local url = image['image']
+
end
+
 
if url:sub(1,1) ~= '/' then url = '/' .. url end
+
-- If the argument exists and isn't blank, add it to the argument table.
url = 'https://idlescape.com' .. url
+
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
s = url
+
local function preprocessSingleArg(argName)
+
if origArgs[argName] and origArgs[argName] ~= '' then
if only_url == '1' then rs = s end
+
args[argName] = origArgs[argName]
+
end
s = 'src="' .. s .. '"'
+
end
s = s .. ' alt="' .. realname .. '"'
+
 
s = s .. ' width="' .. width .. '"'
+
-- Assign the parameters with the given prefixes to the args table, in order, in
s = s .. ' height="' .. height .. '"'
+
-- batches of the step size specified. This is to prevent references etc. from
s = '<img ' .. s .. '>'
+
-- appearing in the wrong order. The prefixTable should be an array containing
+
-- tables, each of which has two possible fields, a "prefix" string and a
if add_word == '1' then  
+
-- "depend" table. The function always parses parameters containing the "prefix"
s = s .. ' ' .. realname
+
-- string, but only parses parameters in the "depend" table if the prefix
 +
-- parameter is present and non-blank.
 +
local function preprocessArgs(prefixTable, step)
 +
if type(prefixTable) ~= 'table' then
 +
error("Non-table value detected for the prefix table", 2)
 +
end
 +
if type(step) ~= 'number' then
 +
error("Invalid step value detected", 2)
 +
end
 +
 
 +
-- Get arguments without a number suffix, and check for bad input.
 +
for i,v in ipairs(prefixTable) do
 +
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
 +
(v.depend and type(v.depend) ~= 'table') then
 +
error('Invalid input detected to preprocessArgs prefix table', 2)
 +
end
 +
preprocessSingleArg(v.prefix)
 +
-- Only parse the depend parameter if the prefix parameter is present
 +
-- and not blank.
 +
if args[v.prefix] and v.depend then
 +
for j, dependValue in ipairs(v.depend) do
 +
if type(dependValue) ~= 'string' then
 +
error('Invalid "depend" parameter value detected in preprocessArgs')
 +
end
 +
preprocessSingleArg(dependValue)
 +
end
 
end
 
end
 
if no_link == '1' then rs = s end
 
 
if not (link and link:match('%S')) then link = realname end
 
s = '[[' .. link .. '|' .. s .. ']]'
 
else
 
s = '[[' .. name .. ']]' .. '{{?}}'
 
 
end
 
end
if not rs then rs = s end  
+
 
return rs
+
-- Get arguments with number suffixes.
 +
local a = 1 -- Counter variable.
 +
local moreArgumentsExist = true
 +
while moreArgumentsExist == true do
 +
moreArgumentsExist = false
 +
for i = a, a + step - 1 do
 +
for j,v in ipairs(prefixTable) do
 +
local prefixArgName = v.prefix .. tostring(i)
 +
if origArgs[prefixArgName] then
 +
-- Do another loop if any arguments are found, even blank ones.
 +
moreArgumentsExist = true
 +
preprocessSingleArg(prefixArgName)
 +
end
 +
-- Process the depend table if the prefix argument is present
 +
-- and not blank, or we are processing "prefix1" and "prefix" is
 +
-- present and not blank, and if the depend table is present.
 +
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
 +
for j,dependValue in ipairs(v.depend) do
 +
local dependArgName = dependValue .. tostring(i)
 +
preprocessSingleArg(dependArgName)
 +
end
 +
end
 +
end
 +
end
 +
a = a + step
 +
end
 
end
 
end
  
function p.image(frame)
+
-- Parse the data parameters in the same order that the old {{infobox}} did, so
return p._image(frame:getParent())
+
-- that references etc. will display in the expected places. Parameters that
 +
-- depend on another parameter are only processed if that parameter is present,
 +
-- to avoid phantom references appearing in article reference lists.
 +
local function parseDataParameters()
 +
 
 +
preprocessSingleArg('autoheaders')
 +
preprocessSingleArg('child')
 +
preprocessSingleArg('bodyclass')
 +
preprocessSingleArg('subbox')
 +
preprocessSingleArg('bodystyle')
 +
preprocessSingleArg('title')
 +
preprocessSingleArg('titleclass')
 +
preprocessSingleArg('titlestyle')
 +
preprocessSingleArg('above')
 +
preprocessSingleArg('aboveclass')
 +
preprocessSingleArg('abovestyle')
 +
preprocessArgs({
 +
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
 +
}, 10)
 +
preprocessSingleArg('subheaderstyle')
 +
preprocessSingleArg('subheaderclass')
 +
preprocessArgs({
 +
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
 +
}, 10)
 +
preprocessSingleArg('captionstyle')
 +
preprocessSingleArg('imagestyle')
 +
preprocessSingleArg('imageclass')
 +
preprocessArgs({
 +
{prefix = 'header'},
 +
{prefix = 'data', depend = {'label'}},
 +
{prefix = 'sbreak'},
 +
{prefix = 'sdata', depend = {'slabel'}},
 +
{prefix = 'rowclass'},
 +
{prefix = 'rowstyle'},
 +
{prefix = 'rowcellstyle'},
 +
{prefix = 'class'}
 +
}, 50)
 +
preprocessSingleArg('headerclass')
 +
preprocessSingleArg('headerstyle')
 +
preprocessSingleArg('labelstyle')
 +
preprocessSingleArg('datastyle')
 +
preprocessSingleArg('below')
 +
preprocessSingleArg('belowclass')
 +
preprocessSingleArg('belowstyle')
 +
preprocessSingleArg('name')
 +
-- different behaviour for italics if blank or absent
 +
args['italic title'] = origArgs['italic title']
 +
preprocessSingleArg('decat')
 +
preprocessSingleArg('templatestyles')
 +
preprocessSingleArg('child templatestyles')
 +
preprocessSingleArg('grandchild templatestyles')
 
end
 
end
  
function p._image(frame)
+
-- If called via #invoke, use the args passed into the invoking template.
origArgs = frame.args
+
-- Otherwise, for testing purposes, assume args are being passed directly in.
name = origArgs[1]
+
function p.infobox(frame)
arg = origArgs[2]
+
if frame == mw.getCurrentFrame() then
if not arg then  
+
origArgs = frame:getParent().args
width = 20
+
else
else arg:match('%S')
+
origArgs = frame
width = arg
 
 
end
 
end
arg = origArgs[3]
 
if arg and arg:match('%S') then height = arg end
 
add_word = origArgs['word']
 
only_url = origArgs['url']
 
no_link = origArgs['nolink']
 
link = origArgs['link']
 
 
 
if not name then return '' end
+
parseDataParameters()
return _image()
+
 +
return _infobox() .. tostring(has_rows)
 
end
 
end
  
 +
-- For calling via #invoke within a template
 +
function p.infoboxTemplate(frame)
 +
origArgs = {}
 +
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
 +
 +
parseDataParameters()
 +
 +
return _infobox()
 +
end
 
return p
 
return p

Please note that all contributions to Idlescape Wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, 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 (see IdleScape Wiki:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)

Template used on this page: