# Module:Authority control/documentation

require('strict')  
local p = {}  
local configfile = 'Module:Authority control/config' -- default configuation module  
local arg = mw.getCurrentFrame.args.config  
if arg and arg~='' then  
configfile = 'Module:Authority control/config/' .. arg  
end  
local config  
if mw.title.new(configfile).exists then  
config = mw.loadData(configfile)  
else  
return error('Invalid configuration file',0)  
end  
local title = mw.title.getCurrentTitle  
local namespace = title.namespace  
local testcases = title.subpageText == config.i18n.testcases  
local makelink = require(config.i18n.ACmodule).makelink  

local function needsAttention(sortkey)  
return * .. sortkey .. title.text .. *  
end  

local function addCat(cat,sortkey)  
if cat and cat ~= '' and (namespace == 0 or namespace == 14 or testcases) then  
local redlinkcat = ''  
if testcases == false and mw.title.new(cat, 14).exists == false then  
redlinkcat = needsAttention('N')  
end  
if sortkey then  
cat = * .. sortkey .. title.text .. *  
else  
cat = * .. config.i18n.category .. ':'..cat..*  
end  
cat = cat .. redlinkcat  
return cat  
else  
return ''  
end  
end  

-- Creates a human-readable standalone wikitable version of conf, and tracking categories with page counts, for use in the documentation  
function p.docConfTable  
local function checkcat(category,label)  
local ret=*..label..*  
--if mw.title.new(category,14).exists == false then  
--ret = ret..' <span>&#91;['..tostring(mw.uri.fullUrl('Category:'..category,'action=edit&preload=Template:Authority_control/preload'))..' create]&#93;</span>'  
--end  
return ret  
end  
local doc = ''  
local a, P, f = 0, 0, 0 --cumulative sums  
local count = .args.count or false  
local columns = 3 + (count and 1 or 0)  
local lang = mw.getContentLanguage  
local row = function(conf)  
local category = conf.category or conf[1]  
local articleCat = config.i18n.Articles_with..' '..category..' '..config.i18n.identifiers  
local articleCount = mw.site.stats.pagesInCategory(articleCat,config.i18n.pages)  
local errorCat = conf.errorcat or config.i18n.Articles_with..' '..config.i18n.faulty..' '..category..' '..config.i18n.identifiers  
local errorCount = mw.site.stats.pagesInCategory(errorCat,config.i18n.pages)  
P = P + 1 --property count  
a = a + articleCount  
f = f + errorCount  
local getstatement = function(id,propid,qualid)  
local statement = mw.wikibase.getBestStatements('P' .. id, 'P' .. propid)  
local value  
if statement and statement[1] and statement[1].mainsnak.datavalue.value.id then  
value = statement[1].mainsnak.datavalue.value.id  
local qual  
if qualid and statement[1].qualifiers['P' .. qualid][1].datavalue.value then  
qual = statement[1].qualifiers['P' .. qualid][1].datavalue.value  
end  
return value, qual  
end  
end  
local _, example = getstatement(conf.property,1855,conf.property)  
if not example then example = '' end  
example = :expandTemplate{title = "Hlist", args = {'\n' .. makelink(conf,{id=example},1)}} .. '\n'  
local getname = function(nameprop)  
local name = getstatement(conf.property,nameprop)  
if name then  
return :expandTemplate{title='Wikidata fallback link',args={name}}  
end  
end  
local name = getname(1629) or getname(10726) or ''  
local out = ''  
if conf.remark then  
out = out .. '<tr><td rowspan=2>'  
else  
out = out .. '<tr><td>'  
end  
out = out .. name .. '</td>' ..  
'<td>' .. config.sections[conf.section].name .. '</td>' ..  
'<td data-sort-value=' .. conf.property .. '>' .. :expandTemplate{title='Wikidata property link',args={id='f',conf.property}} .. '</td>' ..  
'<td>' .. example .. '</td>'  
if count then  
out = out .. '<td>'..checkcat(articleCat,lang:formatNum(articleCount))..' ('..checkcat(errorCat,errorCount)..')</td>'  
end  
out = out .. '</tr>'  
if conf.remark then  
out = out .. "<tr><td>**Remarks:** " .. :preprocess{text = conf.remark} .. "</td></tr>"  
end  
return out  
end  
local doc = '<table>' ..  
'<tr><th>' .. config.i18n.Identifier .. '</th>' ..  
'<th>' .. config.i18n.Section .. '</th>' ..  
'<th data-sort-type=number>' .. config.i18n.WDproperty .. '</th>' ..  
'<th>' .. config.i18n.Appears_as .. '</th>'  
if count then  
doc = doc .. '<th>' .. config.i18n.Articles .. ' '  
.. '(' .. config.i18n.Faults .. ')</th>'  
end  
doc = doc .. '</tr>'  
for _, conf in pairs(config.config) do  
doc = doc .. row(conf)  
end  
if count then  
doc = doc .. '<tr><th>' .. config.i18n.Totals .. '</th>' ..  
'<th>' .. P .. '</th>' ..  
'<th>' .. lang:formatNum(a) .. ' (' .. f .. ')</th></tr>'  
end  
doc = doc .. '</table>'  
return doc  
end  

function p.errorTable  
local Table = '<table>'..  
'<tr><th>' .. config.i18n.WDproperty .. '</th>'..  
'<th>' .. config.i18n.Faulty .. ' ' .. config.i18n.identifiers .. '</th>'..  
'<th>' .. config.i18n.Tracking_category .. '</th></tr>'  
local f, P = 0, 0, 0 --cumulative sums  
for _, conf in pairs(config.config) do  
local category = conf.errorcat or 'Articles with faulty '..(conf.category or conf[1])..' identifiers'  
local count = mw.site.stats.pagesInCategory(category,'pages')  
if count > 0 then  
P = P + 1  
f = f + count  
Table = Table..'<tr><td>'..:expandTemplate{ title = config.i18n.linktemplate, args = { id = 'f', conf.property } } .. '</td>'..  
'<td>'..tostring(count)..'</td>'..  
'<td>:' .. config.i18n.category .. ':'..category..'</td></tr>'  
end  
end  
Table = Table..'<tr><th>' .. config.i18n.Totals .. '</th>'..  
'<th>' .. '' .. tostring(f) .. '</th>'..  
'<th>'..tostring(P)..'</th></tr></table>'  
return Table  
end  

function p.whitelisttable  
local Table = '<table>'..  
'<tr><th>' .. config.i18n.Code .. '</th>'..  
'<th>' .. config.i18n.Topic .. '</th>'..  
'<th>' .. config.i18n.Identifiers .. '</th></tr>'  
for code, wlist in pairs(config.whitelists) do  
Table = Table .. '<tr><th>' .. code .. '</th>'..  
'<td>' .. mw.wikibase.getSitelink('Q' .. wlist.topic) .. '</td>'  
local plist = {}  
for _, property in pairs(wlist.properties) do  
table.insert(plist,:expandTemplate{title='Wikidata property link', args={'P' .. property}})  
end  
Table = Table .. '<td>' .. table.concat(plist,', ') .. '</td></tr>'  
end  
Table = Table .. '</table>'  
return Table  
end  

function p.sectiontable  
local Table = '<table>'..  
'<tr><th>' .. config.i18n.Section .. '</th>' ..  
'<th>' .. config.i18n.Description .. '</th>'..  
'<th>' .. config.i18n.Identifiers .. '</th></tr>'  
for number,section in ipairs(config.sections) do  
Table = Table .. '<tr><th>' .. number .. '</th>' .. '<td>' .. section.name .. '</td>'  
local plist = {}  
for _,id in pairs(config.config) do  
if id.section == number then  
table.insert(plist,:expandTemplate{title=config.i18n.linktemplate, args={'P' .. id.property}})  
end  
end  
Table = Table .. '<td>' .. table.concat(plist,', ') .. '</td></tr>'  
end  
Table = Table .. '</table>'  
return Table  
end  

-- Main/External Call for Pages with authority control identifiers  
function p.autoDetect  
local function whichTOC -- standardize TOC behavior via  
return :expandTemplate{ title = 'CatAutoTOC', args = { } }  
end  
local function wpa(,id,faulty)  
for _,conf in pairs(config.config) do  
if conf.category == id or conf[1] == id then  
local getname = function(nameprop)  
local name = mw.wikibase.getBestStatements('P'..conf.property,nameprop)  
if name and name[1] and name[1].mainsnak.datavalue.value.id then  
return :expandTemplate{title='Wikidata fallback link',args={name[1].mainsnak.datavalue.value.id}}  
end  
end  
local name = getname('P1629') or getname('P10726') or ''  
local outString = :expandTemplate{ title = 'Category explanation', args = {'articles with '..name..' identifiers.'..' Please do not add .\nPages in this category should only be added by Module:Authority control.'}}  
.. :expandTemplate{ title = 'Cat more', args = {'Wikipedia:Authority control', ':d:Property:P'..conf.property} }  
.. :expandTemplate{ title = 'Possibly empty category' }  
.. :expandTemplate{ title = 'Wikipedia category', args = { hidden = 'yes', tracking = 'yes' } }  
.. :expandTemplate{ title = 'Polluted category' }  
.. whichTOC  
if faulty then  
outString = outString .. addCat('Articles with faulty authority control information',id) .. addCat('Articles with '..id..' identifiers')  
else  
outString = outString .. addCat('Articles with authority control information',id)  
end  
return outString  
end  
end  
end  
if namespace == 14 then --cat space  
local wpfaultyID = mw.ustring.match(title.text, 'Articles with faulty (.+) identifiers')  
local wpID = mw.ustring.match(title.text, 'Articles with (.+) identifiers')  
if wpfaultyID then  
return wpa(,wpfaultyID,true)-- must be before wpID check, in case they both match  
elseif wpID then  
return wpa(,wpID,false)  
else  
return needsAttention('U')  
end  
end  
end  

function p.idproposal  
local property = .args.property or ''  
local out = '<ul><li>Wikidata property: ' .. :expandTemplate{title='Wikidata property link', args={'P' .. property}} .. '</li>'  
out = out .. '<li>Section: '  
local section = .args.section or ''  
if section~='' then  
out = out .. config.sections[section].name .. ' (' .. section .. ')'  
else  
out = out .. 'Not specified'  
end  
out = out .. '</li><li>Link: '  
local link = .args.link or ''  
if link=='' then  
link = mw.wikibase.getBestStatements('P'..property,'P1630') or ''  
link = link[1].mainsnak.datavalue.value  
end  
if link~='' then  
out = out .. '<code>' .. link .. '</code>'  
else  
out = out .. 'Not specified'  
end  
out = out .. '</li><li>Label: '  
local label = .args.label or ''  
if label~='' then  
out = out .. label  
else  
out = out .. 'Not specified'  
end  
out = out .. '</li><li>Example: '  
local example = mw.wikibase.getBestStatements('P'..property,'P1855') or ''  
if example then  
example = example[1].qualifiers['P'..property][1].datavalue.value  
example = :expandTemplate{title = "Hlist", args = {'\n' .. makelink({[1]='',link=link,label=label},{id=example},1)}} .. '\n'  
out = out .. example  
else  
out = out .. 'Not available'  
end  
out = out .. '</li></ul>'  
return out  
end  

return p