Module:Property proposal
Used by Template:Property proposal
Code
local p = require 'Module:Property navbox'
local frame = p.getFrame()
local lang = p.getLang()
local namespace = p.getNamespace()
local translate = p.translate
local id, issubpage, spn, bpn
local function addcat(catname)
if issubpage then
p.addCategory(catname)
end
end
local function formatIdAsLink(key)
return function(data)
if string.sub(data[key] or '', 1, 1) == 'Q' then
local d = require 'Module:Wikidata'
return d.showentity(data[key], lang)
end
return data[key]
end
end
p.rows = {
--[[
label = name of the message for the header in Module:i18n/property proposal,
value = value of the line (by default, it gets the value of the parameter with the name of the label),
required = boolean,
]]--
{
label = 'description',
required = true
},
{
label = 'aliases',
},
{
label = 'subject item',
value = formatIdAsLink('subject item'),
},
{
label = 'datatype',
value = function(data)
local datatype = data.datatype
if datatype then
local datatypemod = require('Module:Datatype')
return datatypemod.display(datatype, lang)
end
return nil
end,
required = true
},
{
label = 'infobox parameter',
},
{
label = 'domain',
},
{
label = 'allowed values',
},
{
label = 'allowed units',
},
{ -- kept for historical reasons
label = 'example',
},
{
label = 'filter',
},
{
label = 'source',
},
{
label = 'external links',
value = function(data)
local datatypemod = require('Module:Datatype')
local datatype = data.datatype and datatypemod.resolveDatatype(data.datatype)
if (datatype == 'url' or datatype == 'external-id') and data['external links'] then
return frame:expandTemplate{ title = 'External links', args = { data['external links'], data['external links 2'], data['external links 3'], data['external links 4'], data['external links 5'], data['external links 6'], data['external links 7'], data['external links 8'], data['external links 9'], data['external links 10'] } }
end
return nil
end
},
{
label = "mix'n'match",
value = function(data)
local mixnmatch = data["mix'n'match"]
if mixnmatch and tonumber(mixnmatch) then
return '[[mixnmatch:' .. mixnmatch .. '|' .. mixnmatch .. ']]'
end
return mixnmatch
end
},
{
label = 'planned use',
},
{
label = 'number of ids',
},
{
label = 'expected completeness',
value = formatIdAsLink('expected completeness'),
},
{
label = 'implied notability'
},
{
label = 'formatter URL',
value = function(data)
local val = data['formatter URL']
if val then
local append = ''
if val == "none" or val == "-" then
return "''none''"
end
if not mw.ustring.match(val, '^https?://') and not mw.ustring.match(val, '^skype:') then
append = append .. translate('wrong format')
end
if not mw.ustring.find(val, '$1', 7, true) then
if append ~= '' then
append = append .. ', '
end
append = append .. mw.ustring.format(translate('missing stuff'), '$1')
end
if append ~= '' then
append = ' – <span style="color: red;">' .. append .. '</span>'
addcat('Invalid formatter URL')
end
return p.highlightDollarInFormatter(val) .. append
end
end,
},
{
label = 'URL match pattern'
},
{
label = 'robot and gadget jobs',
},
{
label = 'country',
value = formatIdAsLink('country'),
},
{
label = 'see also',
},
{
label = 'applicable stated in value',
value = formatIdAsLink('applicable stated in value'),
},
{
label = 'type constraint - instance of',
},
{
label = 'type constraint - subclass of',
},
{
label = 'single value constraint',
},
{
label = 'distinct values constraint',
},
{
label = 'Wikidata project',
},
{
label = 'proposed by',
},
{
label = 'parent'
},
}
local num_required_examples = 3
local num_optional_examples = 50
local i = num_required_examples + num_optional_examples
while i > num_required_examples do
table.insert(p.rows, 8, {
label = 'example ' .. i,
})
i = i - 1
end
while i >= 1 do
table.insert(p.rows, 8, {
label = 'example ' .. i,
required = true,
})
i = i - 1
end
function p.getI18n()
return mw.loadData('Module:i18n/property proposal')
end
function p.init(args)
spn = mw.text.decode(frame:preprocess('{{#titleparts:{{PAGENAME}}||2}}')) -- same as {{SUBPAGENAME}}, except when there are slashes in the subpage title
bpn = frame:preprocess('{{#titleparts:{{PAGENAME}}|1}}') -- same as {{BASEPAGENAME}}, except when there are slashes in the subpage title
issubpage = namespace == "Wikidata" and bpn == "Property proposal"
and spn ~= "all"
and spn ~= "Authority control"
and spn ~= "Commons"
and spn ~= "Computing"
and spn ~= "Creative work"
and spn ~= "Generic"
and spn ~= "Lexemes"
and spn ~= "Natural science"
and spn ~= "Organization"
and spn ~= "Person"
and spn ~= "Place"
and spn ~= "Sister projects"
and spn ~= "Sports"
and spn ~= "Transportation"
and string.find("spn","Archive/") == nil
if args.id then
id = args.id
args.id = nil
else
if tonumber(args.status) then
id = 'P' .. args.status
elseif args.status then
propWithP = string.match( string.upper( args.status ), 'P%d+$')
if propWithP then
id = propWithP
end
end
end
end
function p.before(args)
local out = ''
local topic = args.topic and string.lower(args.topic)
if topic and issubpage then
addcat('Property proposal ' .. topic)
local topicsubpage = 'Wikidata:Property proposal/' .. string.upper(string.sub(topic, 1, 1)) .. string.sub(topic, 2)
local topicsubpage_content = mw.title.new(topicsubpage):getContent()
topicsubpage_content = topicsubpage_content and string.gsub(topicsubpage_content,"_"," ") or nil
if not topicsubpage_content then
out = '<span style="font-size: 200%; color: red;">' .. translate('invalid topic') .. '</span>'
addcat('Malformed property proposals')
elseif args.status and args.status ~= 'in progress' and args.status ~= 'ready' then
out = mw.ustring.format(translate('proposed at'), '[[' .. topicsubpage .. ']]')
elseif mw.ustring.find(topicsubpage_content, spn, 1, true) then
out = '[[' .. topicsubpage .. '|' .. mw.ustring.format(translate('return to'), topicsubpage) .. ']]'
else
out = '<span style="font-size: 200%; color: red;">'
.. mw.ustring.format(translate('non-transcluded'), '[[' .. topicsubpage .. ']]',
tostring(mw.uri.fullUrl(topicsubpage, { action = 'edit', summary = '+[[' .. tostring(mw.title.getCurrentTitle()) .. ']]' })))
.. '</span>'
addcat('Untranscluded property proposals')
end
elseif issubpage and not (args.status and args.status ~= 'in progress' and args.status ~= 'ready') then
out = '<span style="font-size: 200%; color: red;">' .. translate('invalid topic') .. '</span>'
addcat('Malformed property proposals')
end
return out
end
function p.header(args)
local color, text
local status = string.lower(args.status or 'in progress')
local label = mw.uri.encode(args.subpage or '')
local description = ''
--It's probably not possible to get the description in English since template invocations will be expanded before being passed to Lua.
if lang == 'en' then
description = args.description or ''
if mw.ustring.find(description, "Please translate this into", 1, true) then
description = ''
else
description = string.gsub(description,"<span[^>]*>","")
description = string.gsub(description,"</span>","")
description = mw.uri.encode(description)
end
end
local aliases = ''
if lang == 'en' then
aliases = args.aliases or ''
if mw.ustring.find(aliases, "Please translate this into", 1, true) then
aliases = ''
else
aliases = string.gsub(aliases,"<span[^>]*>","")
aliases = string.gsub(aliases,"</span>","")
aliases = mw.uri.encode(aliases)
end
end
local color_map = {
['done'] = '#0C0',
['in progress'] = '#CCC',
['not done'] = '#C00',
['on hold'] = '#F88000',
['ready'] = '#FFF8DC',
['withdrawn'] = '#C00',
}
if color_map[status] then
text = translate(status)
color = color_map[status]
elseif id then
color = color_map.done
local linguistic = require 'Module:Linguistic'
local d = require 'Module:Wikidata'
local colon = frame:expandTemplate{ title = 'colon', args = { lang = lang } }
text = mw.ustring.format('<span id="%s"></span>%s%s%s' .. linguistic.inparentheses('[[Property talk:%s|%s]]', lang),
id, translate('done'), colon, d.showentity(id, lang), id, translate('talk link'))
else
color = color_map['in progress']
text = status
addcat('Property proposals with status to check')
end
local linkcreate = ''
if status == 'in progress' then
addcat('Open property proposals')
elseif status == 'ready' then
addcat('Properties ready for creation')
addcat('Open property proposals')
local datatypemod = require 'Module:Datatype'
local datatype = (args.datatype and datatypemod.resolveDatatype(args.datatype)) or ''
linkcreate = mw.ustring.format(
' <sup>[https://www.wikidata.org/w/index.php?title=Special:NewProperty&lang=en&label=%s&description=%s&aliases=%s&datatype=%s %s]</sup>',
label, description, aliases, datatype, translate('create'))
elseif status == 'not done' or status == 'withdrawn' then
addcat('Not done proposals')
linkcreate = "__NOINDEX__"
elseif status == 'on hold' then
addcat('On hold proposals')
elseif status ~= '' then
addcat('Done proposals')
linkcreate = "__NOINDEX__"
end
return '<span style="background-color:' .. color .. ';">  </span> ' .. text .. linkcreate
end
function p.links(args)
return {}
end
function p.makeRow(rowparams, data)
-- get value from template
local templateval
local templatequery = rowparams.value
if templatequery and type(templatequery) == 'function' then
templateval = templatequery(data)
else
templateval = data[rowparams.label] -- by default parameter name = label name
end
if not templateval or templateval == '-' then
if rowparams.required and not id then
if not (data['example'] and string.sub(rowparams.label, 1, 8) == 'example ') then
return '<span style="color: red;">' .. translate('missing') .. '</span>'
end
end
return nil
end
if string.find(templateval, '^[*#:;]') then
templateval = '\n' .. templateval
end
return templateval
end
return p