Anonymous
    ×
    Create a new article
    Write your page title here:
    We currently have 187 articles on Edge of Twilight Wiki. Type your article name above or click on one of the titles below and start writing!



    Edge of Twilight Wiki

    Module:Authority control: Difference between revisions

    en>MSGJ
    m fix for identifiers containing a space character
     
    m 1 revision imported
     
    (No difference)

    Latest revision as of 13:03, 8 September 2025

    Lua error in Module:Lua_banner at line 113: attempt to index field 'edit' (a nil value). This module contains the code for the {{Authority control}} template.

    Please see Template:Authority control/doc.


    require('strict')
    local p = {}
    local frame = mw.getCurrentFrame()
    local config_file = frame.args.config and frame.args.config~='' and ('/' .. frame.args.config) or ''
    local config = mw.loadData('Module:Authority control/config' .. config_file)
    local title = mw.title.getCurrentTitle()
    local namespace = title.namespace
    local testcases = title.subpageText == config.i18n.testcases
    
    local wikilink = function(target, label)
    	return label and '[[' .. target .. '|' .. label .. ']]' or '[[' .. target .. ']]'
    end
    
    local needsAttention = function(sortkey)
    	return wikilink(config.i18n.category .. ':' .. config.i18n.attentioncat, sortkey .. title.text)
    end
    
    local addCat = function(cat, sortkey)
    	if cat and cat~='' and (namespace==0 or namespace==14 or testcases) then
    		local redlinkcat = ''
    		if testcases==false then
    			local success, exists = pcall(function() return mw.title.new(cat, 14).exists end)
    			if success and not exists then 
    				redlinkcat = needsAttention('N')
    			end
    		end
    		return wikilink(config.i18n.category..':'..cat, sortkey and sortkey..title.text) .. redlinkcat
    	else
    		return ''
    	end
    end
    
    local tooltip = function(text, label)
    	if label and label~='' then
    		return frame:expandTemplate{
    			title = 'Tooltip',
    			args = {text, label}
    		}
    	else
    		return text
    	end
    end
    
    local _makelink = function(id, val, additional, qid) --validate values and create a link
    	local link = mw.html.create('span'):addClass('uid')
    	if not additional and id.prefix then --show prefix on primary value
    		link:wikitext(id.prefix .. ': ')
    	end
    	local valid_value = false
    	if id.customlink then -- use function to validate and generate link
    		local newlink = require(config.auxiliary)[id.customlink](val.id, additional)
    		if newlink then
    			link:wikitext(newlink)
    			valid_value = true
    		end
    	else
    		if id.pattern then -- check pattern to determine validity
    			valid_value = string.match(val.id, '^' .. id.pattern .. '$')
    		elseif id.patterns then -- check multiple patterns to determine validity
    			for _, pattern in ipairs(id.patterns) do
    				valid_value = val.id:match('^' .. pattern .. '$')
    				if valid_value then break end
    			end
    		elseif id.valid then -- use function to determine validity
    			valid_value = require(config.auxiliary)[id.valid](val.id)
    		else -- no validation possible
    			valid_value = val.id
    		end
    		if valid_value then
    			local label = id.label
    			if not label or additional then
    				label = tostring(additional)
    			end
    			local newlink
    			if id.link then
    				valid_value = valid_value:gsub('%%', '%%%%')
    				local target = mw.ustring.gsub(id.link, '%$1', valid_value):gsub(' ', '%%20')
    				newlink = '[' .. target .. ' ' .. label .. ']'
    			else
    				newlink = valid_value
    			end
    			link:wikitext(tooltip(newlink, val.name))
    		end
    	end
    	if valid_value then
    		local cat =  id.category and string.format(config.i18n.cat, id.category)
    		link:wikitext(addCat(cat))
    	else
    		local wdlink = qid and wikilink(':wikidata:' .. qid .. '#P' .. id.property) or ''
    		local name = mw.wikibase.getLabel('P' .. id.property) or ''
    		local tooltip = string.format(
    			config.i18n.idnotvalid,
    			name,
    			val.id
    		)
    		local cat = id.category and string.format(
    			config.i18n.cat,
    			config.i18n.faulty .. ' ' .. id.category
    		)
    		link:wikitext(wikilink('File:' .. config.i18n.warningicon .. '|20px|frameless|link=' .. wdlink, tooltip .. '.'))
    			:wikitext(addCat(cat))
    			:wikitext(addCat(config.i18n.allfaultycat, name))
    	end
    	return link
    end
    
    local _makelinks = function(id, qid)
    --[[==================================]]
    --[[            Make links            ]]
    --[[==================================]]
    local getquals = function(statement, qualid)
    	if statement.qualifiers and statement.qualifiers['P'..qualid] then
    		return mw.wikibase.renderSnak(statement.qualifiers['P'..qualid][1])
    	end
    end
    local ids = {}
    if qid then
    	for _, statement in ipairs(mw.wikibase.getBestStatements(qid, 'P'..id.property)) do
    		if statement.mainsnak.datavalue then
    			local val = statement.mainsnak.datavalue.value
    			if val then
    				local namedas = getquals(statement, 1810) or getquals(statement, 742) or ''
    				table.insert(ids, {id=val, name=namedas})
    end end end end
    local links
    if ids[1] then
    	links = mw.html.create('li'):node(_makelink(id, ids[1], false, qid))
    	if ids[2] then
    		local sublinks = mw.html.create('ul')
    		for n = 2, #ids do
    			sublinks:tag('li'):node(_makelink(id, ids[n], n, qid)):done()
    		end
    		links:node(sublinks)
    	end
    end
    return links
    end
    
    p.authorityControl = function(frame)
    --[[==================================]]
    --[[               Main               ]]
    --[[==================================]]
    local resolveQID = function(qid)
    	if qid then
    		qid = 'Q' .. mw.ustring.gsub(qid, '^[Qq]', '')
    		if mw.wikibase.isValidEntityId(qid) and mw.wikibase.entityExists(qid) then
    			local sitelink = mw.wikibase.getSitelink(qid)
    			if sitelink then
    				return mw.wikibase.getEntityIdForTitle(sitelink) or mw.wikibase.getEntity(qid).id
    			end
    			return mw.wikibase.getEntity(qid).id
    end end end
    local conf = config.config
    local parentArgs = frame:getParent().args
    local auxCats = ''
    local rct = false -- boolean to track if there are any links to be returned
    local qid, topic
    if namespace==0 then
    	qid = mw.wikibase.getEntityIdForCurrentPage()
    end
    if qid then -- article is connected to a Wikidata item
    	if parentArgs.qid and resolveQID(parentArgs.qid)~=qid then -- non-matching qid parameter
    		auxCats = auxCats .. needsAttention('D')
    	end
    else -- page is not connected to any Wikidata item
    	qid = resolveQID(parentArgs.qid) -- check qid parameter if no wikidata item is connected
    	if qid then -- qid parameter is valid, set topic to display
    		topic = mw.wikibase.getLabel(qid)
    		if topic then
    			if mw.ustring.lower(title.subpageText)==mw.ustring.lower(topic) then -- suppress topic display if subpagename equals topic up to case change
    				topic = nil
    			end
    			if topic and mw.wikibase.getSitelink(qid) then -- make wikilink to article
    				topic = wikilink(mw.wikibase.getSitelink(qid), topic)
    			end
    		else
    			auxCats = auxCats .. needsAttention('L')
    		end
    	elseif parentArgs.qid and parentArgs.qid~='' then -- invalid qid has been supplied, add to tracking cat
    		auxCats = auxCats .. needsAttention('Q')
    	end
    end
    local qids = {} -- setup any additional QIDs
    if parentArgs.additional=='auto' and qid then  -- check P527 for parts to add additional qids
    	local checkparts = function(property)
    		local parts = mw.wikibase.getBestStatements(qid, property)
    		if parts then
    			for _, part in ipairs(parts) do
    				if part.mainsnak.datavalue and part.mainsnak.datavalue.value.id then
    					local resolvedqid = resolveQID(part.mainsnak.datavalue.value.id)
    					if resolvedqid then
    						table.insert(qids,resolvedqid)
    	end end end end end
    	for _, part in ipairs(config.auto_additional) do
    		checkparts('P' .. part)
    	end
    elseif parentArgs.additional and parentArgs.additional~='' then
    	for _, v in ipairs(mw.text.split(parentArgs.additional, '%s*,%s*')) do
    		v = resolveQID(v)
    		if v then
    			if v==qid then -- duplicate of qid parameter
    				auxCats = auxCats .. needsAttention('R')
    			end
    			table.insert(qids, v)
    		else -- invalid QID specified
    			auxCats = auxCats .. needsAttention('A')
    		end
    	end
    end
    local numsections, sections = 0, {}
    for _, _ in ipairs(config.sections) do -- count number of regular sections
    	numsections = numsections + 1
    end
    for _ = 1, #qids+numsections do
    	table.insert(sections, {})
    end
    
    -- check which identifiers to show/suppress in template
    local show, show_all_unsuppressed = {}, true
    local stripP = function(pid) --strip P from property number
    	if pid:match('^[Pp]%d+$') then
    		pid = mw.ustring.gsub(pid, '[Pp]', '')
    	end
    	if pid:match('^%d+$') then
    		return tonumber(pid)
    	end
    end
    local addshowlist = function(list)
    	if list and list~='' then
    		for _, v in ipairs(mw.text.split(string.lower(list), '%s*,%s*')) do
    			local vprop = stripP(v)
    			if vprop then -- e.g. show=P214 to show one particular property
    				show[vprop] = true
    			else -- e.g. show=arts to use whitelist
    				if config.whitelists[v] then
    					for _, w in ipairs(config.whitelists[v].properties) do
    						show[w] = true
    		end end end end
    		show_all_unsuppressed = false
    end end
    addshowlist(frame.args.show) -- check show parameter on wrapper template
    addshowlist(parentArgs.show) -- check show parameter on article
    addshowlist(parentArgs.country) -- check country parameter on article
    if parentArgs.suppress then
    	local suppresslist = mw.text.split(parentArgs.suppress, '%s*,%s*') -- split parameter by comma
    	for _, v in ipairs(suppresslist) do
    		v = stripP(v)
    		if v then
    			show[v] = false
    			auxCats = auxCats .. wikilink(config.i18n.category .. ':' .. config.i18n.suppressedcat)
    		else
    			auxCats = auxCats .. needsAttention('P')
    		end
    	end
    end
    
    local makeSections = function(qid, addit)
    	for _, id in ipairs(conf) do
    		if id.suppressedbyproperty then
    			for _, property in ipairs(id.suppressedbyproperty) do
    				if show[property]=='used' then -- property is in use
    					show[id.property] = false -- suppressed by another property
    		end end end
    		if show[id.property]==nil then
    			show[id.property] = show_all_unsuppressed
    		end
    		if show[id.property] then
    			local links = _makelinks(id, qid)
    			if links then
    				table.insert(
    					sections[addit or id.section],
    					links
    				)
    				show[id.property] = 'used'
    				rct = true
    			end
    		end
    	end
    end
    local pencil = function(qid)
    	if qid then
    		return require('Module:EditAtWikidata')._showMessage{
    			pid = 'identifiers',
    			qid = qid
    		}
    	else
    		return ''
    	end
    end
    makeSections(qid, false)
    for c = 1, #qids do
    	makeSections(qids[c], numsections+c)
    end
    
    --configure Navbox
    local outString = ''
    if rct then -- there is at least one link to display
    	local Navbox = require('Module:Navbox')
    	local sect, lastsect = 0, 0
    	local navboxArgs = {
    		name  = 'Authority control',
    		navboxclass = 'authority-control',
    		bodyclass = 'hlist',
    		state = parentArgs.state or config.i18n.autocollapse,
    		navbar = 'off'
    	}
    	for c = 1, numsections+#qids do
    		if #sections[c]>0 then -- section is non-empty
    			sect = sect + 1
    			lastsect = c
    			local sectname
    			if c<=numsections then -- regular section
    				sectname = config.sections[c].name
    			else -- section from additional qid
    				local qid = qids[c-numsections]
    				local label, sitelink = mw.wikibase.getLabel(qid), mw.wikibase.getSitelink(qid)
    				if label then
    					if sitelink then
    						local target = mw.title.new(sitelink)
    						if target==title or (target.isRedirect and target.redirectTarget==title) then -- do not link
    							sectname = label
    						else -- make wikilink to article
    							sectname = wikilink(sitelink, label)
    						end
    					else
    						sectname = label
    					end
    				else
    					auxCats = auxCats .. needsAttention('L')
    					sectname = qid
    				end
    				sectname = sectname .. pencil(qid)
    			end
    			navboxArgs['group' .. c] = sectname
    			local list = mw.html.create('ul')
    			for _, link in ipairs(sections[c]) do
    				list:node(link)
    			end
    			navboxArgs['list' .. c] = tostring(list)
    		end
    	end
    	if topic then -- display in expanded form with topic
    		navboxArgs.title = config.i18n.aclink .. ' &ndash; ' .. topic .. pencil(qid)
    	elseif sect==1 then -- special display when only one section
    		if lastsect<=numsections then
    			if config.sections[lastsect].hidelabelwhenalone then -- no special label when only general or other IDs are present
    				navboxArgs['group' .. lastsect] = config.i18n.aclink .. pencil(qid)
    			else -- other regular section
    				navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect] .. pencil(qid)
    			end
    		else -- section from additional qid
    			navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect]
    		end
    	else -- add title to navbox
    		navboxArgs.title = config.i18n.aclink .. pencil(qid)
    	end
    	outString = Navbox._navbox(navboxArgs)
    end
    
    if parentArgs.state
    	and parentArgs.state~=''
    	and parentArgs.state~=config.i18n.collapsed
    	and parentArgs.state~=config.i18n.expanded
    	and parentArgs.state~=config.i18n.autocollapse then --invalid state parameter
    	auxCats = auxCats .. needsAttention('S')
    end
    if testcases then
    	auxCats = mw.ustring.gsub(auxCats, '(%[%[)(' .. config.i18n.category .. ')', '%1:%2') --for easier checking
    end
    
    --out
    outString = outString .. auxCats
    if namespace~=0 then
    	outString = mw.ustring.gsub(outString, '(%[%[)(' .. config.i18n.category .. ':' .. config.i18n.Articles .. ')([^%|%]]+)%|?[^%|%]]*(%]%])','%1:%2%3%4')
    	outString = mw.ustring.gsub(outString, '(%[%[)(' .. config.i18n.category .. ':' .. config.i18n.All_articles .. ')([^%|%]]+)%|?[^%|%]]*(%]%])','%1:%2%3%4')
    end
    local check = require('Module:Check for unknown parameters')._check
    local sortkey
    if namespace==0 then
    	sortkey = '*' .. title.text
    else
    	sortkey = title.fullText
    end
    outString = outString .. check({
    	['unknown'] = wikilink(config.i18n.category .. ':' .. config.i18n.pageswithparams, sortkey),
    	['preview'] = config.i18n.previewwarning, 'show', 'country', 'suppress', 'additional', 'qid', 'state'
    	}, parentArgs)
    return outString
    end
    
    p.makelink = function(id, qid)
    	return _makelinks(id, qid)
    end
    
    return p