m (Hmm) |
m (You dum) |
||
Line 202: | Line 202: | ||
title.namespace ~= 0 |
title.namespace ~= 0 |
||
then |
then |
||
− | return ' |
+ | return '' |
end |
end |
||
local sortkey = tArgs.Title or title.prefixedText |
local sortkey = tArgs.Title or title.prefixedText |
||
category(ret, typ, sortkey) |
category(ret, typ, sortkey) |
||
+ | table.insert(ret, '[[:Category:') |
||
+ | table.insert(ret, typ) |
||
+ | table.insert(ret, '|') |
||
+ | table.insert(ret, typ) |
||
+ | table.insert(ret, ']]') |
||
if catKeys then |
if catKeys then |
Revision as of 21:52, 20 January 2019
-- <nowiki>
-- Infobox template module for [[w:c:dev]] documentation.
-- @module p
-- @version 1.1.2
-- @usage {{#invoke:infobox}}
-- @author Speedit
-- @author DarthKitty
-- @see [[Category:Infobox templates]]
-- @release stable
-- Module libraries.
local yesno = require('Module:Yesno')
local userError = require('Module:User error')
local title = mw.title.getCurrentTitle()
-- Module message data.
-- @see [[Module:Infobox/i18n]]
local i18n = require('Module:I18n').loadMessages('Infobox', 'Common', 'Testharness')
-- Module categories data.
-- @see [[Module:Infobox/data]]
local data = mw.loadData('Module:Infobox/data')
-- Date formatter utility.
-- @param {string} d
-- Unprocessed date.
-- @param {string} f
-- Date format to use.
-- @see [[Template:FormatDate]]
-- @return {string}
-- Formatted, localised date.
-- @local
function dtfm(d, f)
return mw.getCurrentFrame():expandTemplate{
title = 'FormatDate',
args = { d, dateformat = f, uselang = i18n:getLang() }
}
end
-- Breadcrumb link generator.
-- @param {string} t
-- Breadcrumb part.
-- @param {table} parts
-- Collection of title parts.
-- @return {string}
-- Breadcrumb chunk.
-- @local
function crumbpart(parts)
local d = #parts
return table.concat({
(d == 1 and '< ' or ' | '),
'[[',
d == 1
and parts[1]
or table.concat(parts, '/'),
'|',
parts[d],
']]'
})
end
-- Module exports (package).
-- @section p
local p = {}
-- Infobox breadcrumb generator for mobile.
-- @param {table} frame
-- Frame invocation object.
-- @return {string}
-- Breadcrumb designed for mobile.
-- @see [[Template:Breadcrumb]]
function p.breadcrumbs(frame)
local parts = {}
local ret = mw.html.create('center')
for t in tostring(title.fullText):gmatch('[^/]+') do
table.insert(parts, t)
ret:wikitext(crumbpart(parts))
end
return frame:preprocess(tostring(ret))
end
-- Infobox data argument handler.
-- Substitutes $n arguments with version numbers.
-- @param {table} frame
-- Frame invocation object.
-- @param {string} frame.args[1]
-- Infobox data input.
-- @param {string} frame.args.ucfirst
-- Capitalization boolean.
-- @raise 'missing argument from Module:Infobox in p.data'
-- @usage {{#invoke:infobox|data|{{{Data}}}|ucfirst=1}}
-- @return {string}
-- Argument-substituted infobox data.
function p.data(frame)
if not (frame.args or {})[1] then
error('missing argument from Module:Infobox in p.data')
end
local tArgs = frame:getParent().args
local ret = frame.args[1]
local uc1 = yesno(mw.text.trim(frame.args.ucfirst or ''))
if not string.find(ret, '%$') then
return ret
end
-- Argument substitution.
local function repl(d)
local rsub = d == '1'
and (tArgs.Submodule or i18n:msg('original'))
or (tArgs['Submodule' .. d] or i18n:msg('version', d))
return uc1
and rsub:gsub('^%l', mw.ustring.upper)
or rsub
end
ret = ret:gsub('%$(%d+)', repl)
return ret
end
-- Infobox date list generator with version numbers.
-- @param {table} frame
-- Frame invocation object.
-- @param {string} frame.args
-- Invocation arguments.
-- @param {string} frame.args.ext
-- Code type.
-- @param {table} frame:getParent().args
-- Template arguments.
-- @usage {{#invoke:infobox|date}}
-- @return {string} Formatted multi-line date string.
function p.date(frame)
local tArgs = frame:getParent().args
local dateFmt = tArgs.dateformat or ''
local ret = ''
if tArgs.Updated then
-- Generated first formatted date.
ret = dtfm(tArgs.Updated, dateFmt)
if tArgs.Submodule or tArgs.Updated2 then
-- Append first version tag.
local sub1 = tArgs.Submodule or i18n:msg('original')
if sub1 ~= '' then
ret = ret .. ' (' .. sub1 .. ')'
end
end
-- Handle further versions.
for d = 2, math.huge do
local p = tArgs['Updated' .. d]
if not p then
break
end
local s = tArgs['Submodule' .. d] or i18n:msg('version', d)
ret = (d == 2 and '* ' or '') .. ret
.. '\n* '
.. dtfm(p, dateFmt)
.. ' (' .. s ..')'
end
-- Default date field.
elseif tArgs.Code then
-- @todo Use DPL template to extract main code page?
local ext = frame.args.ext or 'js'
local suffix = '.' .. ext
if ext ~= 'css' then
suffix = '/code' .. suffix
end
local u = frame:expandTemplate{
title = 'Updated',
args = {
'MediaWiki:' .. title.baseText .. suffix
}
}
ret = dtfm(u, dateFmt)
end
return ret
end
-- @todo documentation
function category(t, cat, sortkey)
table.insert(t, '[[Category:')
table.insert(t, cat)
if sortkey and sortkey ~= '' then
table.insert(t, '|')
table.insert(t, sortkey)
end
table.insert(t, ']]')
end
-- @todo documentation
function p.categories(frame)
local ret = {}
local typ = frame.args[1]
local tArgs = frame:getParent().args
local catKeys = tArgs.Type
if
mw.ustring.lower(tArgs.Status or '') == 'archive' or
not data.categories[typ or ''] or
title.namespace ~= 0
then
return ''
end
local sortkey = tArgs.Title or title.prefixedText
category(ret, typ, sortkey)
table.insert(ret, '[[:Category:')
table.insert(ret, typ)
table.insert(ret, '|')
table.insert(ret, typ)
table.insert(ret, ']]')
if catKeys then
for v in mw.text.gsplit(mw.ustring.lower(catKeys), '%s*,%s*') do
local cat = data.categories[typ][mw.text.trim(v)]
if cat then
category(ret, cat, sortkey)
end
end
elseif typ == 'JavaScript' then
table.insert(ret, '<br />')
table.insert(ret, userError('Type categorization missing.', 'Content without type categorization'))
table.insert(ret, ' ([[Template:Infobox JavaScript#Types|')
table.insert(ret, mw.message.new('blog-readfullpost'):useDatabase(false):plain())
table.insert(ret, ']])')
end
return table.concat(ret)
end
-- @todo documentation
function p.categoryDoc(frame)
local typ = frame.args[1] or ''
local ret = mw.html.create('table'):attr {
['class'] = 'WikiaTable',
['border'] = '1',
['id'] = 'types'
}
ret:tag('tr')
:tag('th'):wikitext(i18n:msg('type'))
:done()
:tag('th'):wikitext(i18n:msg('description'))
:done()
if
not data.categories[typ] or
not data.descriptions[typ]
then
return ret
end
-- Extract categories from data.
local catData = {}
local catNames = {}
for k, n in pairs(data.categories[typ]) do
if not catData[n] then
catNames[#catNames+1] = n
catData[n] = {k}
else
catData[n][#catData[n]+1] = k
end
if
not catData[n].description and
data.descriptions[typ][k]
then
catData[n].description = data.descriptions[typ][k]
end
end
-- Sort category data by name.
local dataContent = mw.title.new('Module:Infobox/data'):getContent()
local function sortKey(a, b)
local i1, i2 =
dataContent:find('"'.. a .. '"'),
dataContent:find('"'.. b .. '"')
return i1 < i2
end
table.sort(catNames, sortKey)
-- Render documentation table.
local cat, catRow, catKeys, desc
for i, n in ipairs(catNames) do
cat = catData[n]
catRow = ret:tag('tr')
catKeys = catRow:tag('td')
-- Handle multiple keys.
if #cat >= 2 then
catKeys = catKeys:tag('ul')
for i, k in ipairs(cat) do
catKeys
:tag('li'):tag('code')
:wikitext(k)
end
else
catKeys
:tag('code')
:wikitext(cat[1])
end
-- Add description.
desc = cat.description:gsub('^%l', mw.ustring.upper) .. '.'
catRow:tag('td')
:wikitext('[[:Category:' .. n .. ']]')
:tag('p'):wikitext(desc)
end
return tostring(ret)
end
-- @todo documentation
function p.categoryDesc(frame)
local typ = frame.args[1] or ''
local key = frame.args[2] or ''
local ret = data.messages.description
local desc = (data.descriptions[typ] or {})[key]
if not desc then
error('misconfigured arguments in p.categoryDesc from Module:Install')
end
ret = ret:gsub('$1', desc) .. '[[Category:' .. typ .. '|{{SUBPAGENAME}}]]'
return frame:preprocess(ret)
end
-- @todo documentation
function p.luaType(frame)
local tArgs = frame:getParent().args
local typ = tArgs.Type or tArgs.type
return typ
and data.luaTypes[typ:lower()]
or ''
end
-- Test suite status.
-- @param {table} frame
-- Frame invocation object.
-- @return {string}
-- Test suite status badge.
function p.luaSuite(frame)
local page = mw.language.fetchLanguageName(title.subpageText) == ''
and title.subpageText
or title.baseText:match('/*([^/]+)$')
-- DPL query for categories
local query = table.concat({
'{{#dpl:',
'| debug = 0',
'| mode = userformat',
'| allowcachedresults = 1',
'| category = Lua test suites',
'| titleregexp = ^' .. mw.uri.encode(page, 'WIKI') .. '/testcases$',
'| addcategories = true',
'| format = ,%CATNAMES%,,',
'}}'
}, '\n')
-- Fetch category data.
local cats = mw.text.split(frame:preprocess(query), ',')
local status = data.luaStatus[cats[1] or ''] or {}
local badge = mw.html.create('div')
:addClass('plainlinks')
:wikitext('[' .. mw.site.server .. mw.uri.fullUrl('Module talk:' .. page .. '/testcases').path .. ' ')
:tag('span')
:addClass('wds-button')
:css({
['background'] = '#' .. status.background,
['border'] = 'none',
['color'] = '#' .. (status.color or 'ffffff'),
['cursor'] = 'inherit',
['font-weight'] = 'bold'
})
:wikitext(i18n:msg(status.i18n_key))
:done()
:wikitext(']')
return tostring(badge)
end
-- Template wrapper for [[Template:Infobox]].
-- @param {table} frameChild
-- Frame invocation object.
-- @usage {{#invoke:infobox|main}}
-- @return {string|nil}
-- Package function output.
function p.main(frameChild)
local frame = frameChild:getParent()
local args = {}
for p, v in pairs(frame.args) do args[p] = v end
local fn_name = args[1] and table.remove(args, 1)
-- Check for function argument.
if fn_name == nil then
error((mw.ustring.gsub(mw.ustring.match(mw.message.new('scribunto-common-nofunction'):plain(), ':%s(.*)%p$'), '^.', mw.ustring.lower)))
end
-- Check function exists.
if p[fn_name] == nil then
error((mw.ustring.gsub(mw.ustring.match(mw.message.new('scribunto-common-nosuchfunction'):plain(), ':%s(.*)%p$'), '^.', mw.ustring.lower)))
end
frame.args = args
return p[fn_name](frame)
end
return p
-- </nowiki>