Version vom 24. Mai 2024, 09:47 Uhr von Oetterer (Diskussion | Beiträge)
This module is rated as ready for general use. It has reached a mature form and is thought to be bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
This module depends on the following other modules: |
Usage[Quelltext bearbeiten]
{{#invoke:Service portal|main}}
local getArgs = require('Module:Arguments').getArgs
local _CFG = mw.loadData('Modul:Article/config') -- it is intended to load article's config
local _ERROR = require('Modul:Error')._error
local _INFOBOX = require('Module:Infobox').infobox
local _TT = require('Module:TableTools')
local _SMWUTIL = require('Module:SmwUtil')
-- helper vars, standing in for missing config
local category = 'Dienstportalseiten'
local defaultTargetgroups = _TT.shallowClone(_CFG.defaultValues.targetgroup)
local statusImageSuffix = '.png'
local urlTostatusPortal = 'https://statusmeldungen.uni-paderborn.de/state/'
local p = {}
local function arraysEqual(ar1, ar2)
local ar1 = _TT.shallowClone(ar1)
local ar2 = _TT.shallowClone(ar2)
if type(ar1) ~= 'table' or type(ar2) ~= 'table' then
return false
end
table.sort(ar1)
table.sort(ar2)
return #ar1 and #ar2 and (table.concat(ar1, '-') == table.concat(ar2, '-')) -- cheap hack, but should suffice
end
local function compileInfobox(processedArgs)
local targetGroup = processedArgs.targetgroup
if #processedArgs.targetgroup == 0 then
targetGroup = _ERROR{message='Keine Zielgruppe angegeben'}
elseif ( arraysEqual(processedArgs.targetgroup, defaultTargetgroups) ) then
targetGroup = 'Endbenutzer'
else
targetGroup = mw.text.listToText(targetGroup, ', ', ' und ')
end
local ib_args = {
-- aboveclass = 'objtitle titletext',
above = mw.title.getCurrentTitle().rootText,
image = processedArgs.image,
subheader = 'Ein Dienst des ZIM',
caption = mw.title.getCurrentTitle().rootText,
-- headerclass = 'headertext',
labelstyle = 'width: 30%;',
datastyle = 'width: 70%;',
header1 = "Informationen",
label2 = 'Verantwortliche/r',
data2 = processedArgs.responsible, -- not set atm
label3 = 'Zielgruppe',
data3 = targetGroup,
data4 = processedArgs.description,
}
return _INFOBOX(ib_args)
end
-- creates an mw.html node, containing (an) errorbox(es), if errors are present.
-- in this case, Category:Erroneous will be set by template Template warning
local function createErrorNode(errors)
local errorBoxes = mw.html.create('')
local frame = mw.getCurrentFrame()
if #errors > 0 then
for _, errorText in pairs(errors) do
errorBoxes:wikitext(frame:expandTemplate{title = 'Template warning', args={errorText, 'Service portal'}})
errorBoxes:newline()
end
end
return errorBoxes
end
-- Here we process the supplied args, sanitize then, check for plausibility and set defaults, if needed
local function processArgs(args)
local errors = {}
local processedArgs = {}
-- we need to process the following arguments: description, image, targetgroup
-- 1st parameter: targetgroup
if args.targetgroup and #args.targetgroup then
local valid = {}
local suppliedTargetGroups
if type(args.targetgroup) == 'table' then
suppliedTargetGroups = args.targetgroup
else
suppliedTargetGroups = mw.text.gsplit(args.targetgroup, ',', true)
end
for fragment in suppliedTargetGroups do
fragment = mw.text.trim(fragment)
if fragment and mw.ustring.len(fragment) > 0 then
if _TT.inTable(_CFG.validValues.targetgroup, fragment) then
table.insert(valid, fragment)
else
table.insert(errors, "Parameter ''targetgroup'' hat einen ungültigen Wert: \"" .. fragment .. "\"!")
end
end
end
processedArgs.targetgroup = valid
else
processedArgs.targetgroup = defaultTargetgroups
end
-- 2nd parameter (OPTIONAL): description
processedArgs.description = nil
if args.description and mw.ustring.len(mw.text.trim(args.description)) then
processedArgs.description = mw.text.trim(args.description)
end
-- 3rd parameter (OPTIONAL): image
-- if empty, try a fallback name
-- else if encased in [[]], then use directly
-- else if contains . then encase it in [[]] and use
-- else include image from status portal
processedArgs.image = '[[Datei:Logo_' .. mw.title.getCurrentTitle().rootText .. '.png]]'
if args.image and mw.ustring.len(mw.text.trim(args.image)) then
local suppliedImage = mw.text.trim(args.image)
if mw.ustring.match(suppliedImage, '^%[%[.+%]%]$') then
processedArgs.image = suppliedImage
elseif mw.ustring.find(suppliedImage, '.', 1, true) then
if not mw.ustring.match(suppliedImage, ':') then
suppliedImage = 'File:' .. suppliedImage
end
processedArgs.image = '[[' .. suppliedImage .. ']]'
else
processedArgs.image = urlTostatusPortal .. suppliedImage .. statusImageSuffix
end
end
return processedArgs, errors
end
local function storeSementicData(uservalues)
local smwData = {
['is written for target audience'] = uservalues.targetgroup
}
if uservalues.description then
smwData['has short description'] = uservalues.description
smwData['Glossary-Term'] = mw.title.getCurrentTitle().rootText
smwData['Glossary-Definition'] = uservalues.description
end
_SMWUTIL.set(smwData)
end
function p._main(args)
-- sanity, plausibiliy and defaults:
local processedArgs, errors = processArgs(args)
-- store data, if there are no errors
if #errors == 0 then
storeSementicData(processedArgs)
end
-- add infobox
local output = mw.html.create('')
output:wikitext(compileInfobox(processedArgs))
output:newline()
-- display errors, if there are some
if #errors > 0 then
output:newline()
output:node(createErrorNode(errors))
end
-- add category
output:wikitext('[[Category:' .. category .. ']]')
return tostring(output)
end
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
function p.dl(args)
local processedArgs, errors = processArgs(args)
return processedArgs
end
return p