This Lua module is used on approximately 2,000,000 pages, or roughly 475059% of all pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. |
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
Related pages |
---|
This module uses one or more Wikidata properties; see § Parameters for details.
Lua error in Module:Lua_banner at line 113: attempt to index field 'edit' (a nil value). This module contains the code of the {{Authority control}} template. See its documentation.
Parameters, Wikidata properties, and tracking categories
Lua error in mw.title.lua at line 209: too many expensive function calls.
Additional tracking categories
This module also implements the following hidden tracking categories:
- Category:Pages with red-linked authority control categories (0) – error category to identify missing categories
- Category:Articles with deprecated authority control identifiers (0) – fix/migrate/remove deprecated IDs
- Category:Articles with suppressed authority control identifiers (0) – tracking only (no error)
- Category:Articles with multiple identifiers (0) – tracking only (no error)
- Category:Pages using authority control with parameters (0) – migrate IDs to Wikidata, if possible (no error)
- Category:Pages using authority control with parameters different on Wikidata (0) – determine/remove incorrect IDs & migrate to Wikidata
- Category:Pages using authority control with parameters all matching Wikidata (0) – template parameters may safely be removed
Number of identifiers
- Category:AC with 0 elements (0)
- Category:AC with 25 elements (0)
- Category:AC with 26 elements (0)
- Category:AC with 27 elements (0)
- Category:AC with 28 elements (0)
- Category:AC with 29 elements (0)
- Category:AC with 30 elements (0)
- Category:AC with 31 elements (0)
- Category:AC with 32 elements (0)
- Category:AC with 33 elements (0)
- Category:AC with 34 elements (0)
- Category:AC with 35 elements (0)
- Category:AC with 36 elements (0)
- Category:AC with 37 elements (0)
- Category:AC with 38 elements (0)
- Category:AC with 39 elements (0)
- Category:AC with 40 elements (0)
- Category:AC with 41 elements (0)
- Category:AC with 42 elements (0)
- Category:AC with 43 elements (0)
- Category:AC with 44 elements (0)
- Category:AC with 45 elements (0)
State parameter
- Category:AC using state parameter: collapsed (0)
- Category:AC using state parameter: expanded (0)
- Category:AC using state parameter: autocollapse (0)
- Category:AC using state parameter: other (0)
See also
- m:Interwiki map – definition of global custom interwiki prefixes
require('strict') local p = {} local title = mw.title.getCurrentTitle() local namespace = title.namespace local testcases = (string.sub(title.subpageText,1,9) == 'testcases') local function addCat(cat) if cat and cat ~= '' then local redlinkcat = '' if testcases == false and mw.title.new(cat, 14).exists == false then redlinkcat = '[[Category:Pages with red-linked authority control categories]]' end return '[[Category:'..cat..']]'..redlinkcat else return '' end end local function getCatForId(id) local cat = '' if namespace == 0 then cat = 'Articles with '..id..' identifiers' end return addCat(cat) end local function getIdsFromWikidata(qid,property) local ids = {} if not mw.wikibase or not qid then return ids end local statements = mw.wikibase.getBestStatements(qid,property) if statements then for _, statement in ipairs( statements ) do if statement.mainsnak.datavalue then table.insert( ids, statement.mainsnak.datavalue.value ) end end end return ids end local function makelink(conf,val,nextid) --validate values and create a link local link if conf.link2 then -- use function to validate and generate link link = conf.link2(val) else local valid_value if conf.pattern then -- use pattern to determine validity if defined valid_value = val:match(conf.pattern) elseif conf.patterns then for i = 1,#conf.patterns do valid_value = val:match(conf.patterns[i]) if valid_value then break end end elseif conf.valid then -- otherwise use function to determine validity valid_value = conf.valid(val) else -- no validation possible valid_value = val end if valid_value then local label = conf.label if not label or nextid>1 then label = tostring(nextid) end if conf.link then valid_value = valid_value:gsub('%%', '%%%%') link = '[' .. mw.ustring.gsub(conf.link,'%$1',valid_value) .. ' ' .. label .. ']' else link = valid_value end else link = false end end if link then link = '<span class="uid">'..link..'</span>' else local faultyCat = 'Articles with faulty '..(conf.errorcat or conf.category or conf[1])..' identifiers' link = '<span class="error">The '..conf[1]..' id '..val..' is not valid.</span>'..addCat(faultyCat) end return link end --[[==========================================================================]] --[[ Main ]] --[[==========================================================================]] function p.authorityControl(frame) local config = require("Module:Authority control/config") local conf = config.config local sectionNames = config.sectionNames local resolveEntity = require( 'Module:ResolveEntityId' ) local parentArgs = frame:getParent().args --WD IDs added here later local iParentArgs = 0 --count original/manual parent args only later local iMatches,suppressedIdCount = 0,0 local auxCats = '' local rct = 0 -- total number of links returned local numqids = 4 -- support for 4 additional qids local totsect = #sectionNames + numqids local sections = {} for _ = 1,totsect do table.insert(sections,{}) end -- check for suppressed identifiers local suppress = {} if parentArgs.suppress then local suppresslist = mw.text.split(parentArgs.suppress,"%s*,%s*") -- split parameter by comma for _,v in ipairs(suppresslist) do if v:match("^%d+$") then v = "P"..tostring(v) else v = string.upper(v) end suppress[v] = true -- index table by identifier name end end local function makeSections(qid,additional) local tval = {} local function parameter_is_used(property) local used = false if property then if tval[property] then if tval[property][1] then used = true end elseif tval[property] == false then -- property has been manually suppressed used = true end end return used end for _, params in ipairs(conf) do tval[params.property] = getIdsFromWikidata(qid, 'P' .. params.property) -- setup table for values with property number as key if additional then if suppress["P"..tostring(params.property)] or suppress[string.upper(params[1])] then tval[params.property] = false -- indicates the identifier is suppressed end else local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]] if suppress["P"..tostring(params.property)] or suppress[string.upper(params[1])] or val == '' then if tval[params.property][1] and (namespace == 0 or testcases) then suppressedIdCount = suppressedIdCount + 1 if parentArgs['arts'] ~= 'arts' then auxCats = auxCats .. '[[Category:Articles with suppressed authority control identifiers|'..params[1]..']]' end end tval[params.property] = false -- indicates the identifier is suppressed elseif val then -- add local parameter to wikidata iParentArgs = iParentArgs + 1 local bnew = true for _, w in pairs(tval[params.property]) do if val == w then bnew = false end end if bnew then -- add new value to table if tval[params.property][1] then auxCats = auxCats .. '[[Category:Pages using authority control with parameters different on Wikidata|'..params[1]..']]' end table.insert(tval[params.property],val) else iMatches = iMatches+1 end end end local suppress = false if params.suppressedbyproperty then for _,sc in ipairs(params.suppressedbyproperty) do if parameter_is_used(sc) then suppress = true end end end if not tval[params.property] == false and not suppress then local tlinks = {} -- setup table for links local nextIdVal = 1 for _,val in ipairs(tval[params.property]) do local link = makelink(params,val,nextIdVal) local cat = params.category or params[1] if link then -- add category unless link==false link = link .. getCatForId(cat) end table.insert(tlinks,link) nextIdVal = nextIdVal + 1 end if tval[params.property][1] then -- assemble local row = '' if params.prefix then row = row..'*'..params.prefix end for i, l in ipairs(tlinks) do if i==1 and not params.prefix then row = row..'*' else row = row..'\n**' end row = row .. l end row = row..'\n' local sec = additional or params.section -- uses section 9 for qid2, section 10 for qid3, etc. table.insert(sections[sec],row) rct = rct + 1 end end end end local function pencil(qid) if not qid then return '' end local args = { pid = 'identifiers' } -- #target the list of identifiers args.qid = qid return require('Module:EditAtWikidata')._showMessage(args) end local function resolveQID(qid) if qid then qid = 'Q'..mw.ustring.gsub(qid, '^[Qq]', '') qid = resolveEntity._id(qid) --nil if unresolvable end return qid end local qids = {} qids[1] = mw.wikibase.getEntityIdForCurrentPage() if not qids[1] then qids[1] = resolveQID(parentArgs['qid']) --use qid parameter if no wikidata item is connected end makeSections(qids[1],false) for c = 2,5 do qids[c] = resolveQID(parentArgs['qid' .. c]) if qids[c] then makeSections(qids[c],totsect-numqids+c-1) end end if iMatches > 0 and iMatches == iParentArgs then auxCats = auxCats .. '[[Category:Pages using authority control with parameters all matching Wikidata]]' end if parentArgs['arts'] == 'arts' and suppressedIdCount > 0 then if namespace == 0 or testcases then local s = 's' if suppressedIdCount == 1 then s = '' end auxCats = auxCats .. addCat('ACArt with '..suppressedIdCount..' suppressed element'..s) end end --configure Navbox local outString = '' if rct > 0 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 'autocollapse', navbar = 'off' } for c=1,totsect do if #sections[c] ~= 0 then -- section is non-empty sect = sect + 1 lastsect = c local sectname if c <= totsect - numqids then -- regular section sectname = sectionNames[c] else -- section from additional qid sectname = mw.wikibase.getLabel(qids[c-totsect+numqids+1]) .. pencil(qids[c-totsect+numqids +1]) end navboxArgs['group' .. c] = sectname navboxArgs['list' .. c] = table.concat(sections[c]) end end local aclink = '[[Help:Authority control|Authority control]]' if sect == 1 then -- special display when only one section if lastsect == 1 or lastsect == 8 then -- no special label when only general or other IDs are present navboxArgs['group' .. lastsect] = aclink .. pencil(qids[1]) elseif lastsect <= totsect - numqids then -- other regular section navboxArgs['group' .. lastsect] = aclink .. ': ' .. sectionNames[lastsect] .. pencil(qids[1]) else -- section from additional qid navboxArgs['group' .. lastsect] = aclink .. ': ' .. navboxArgs['group' .. lastsect] end else -- add title to navbox navboxArgs.title = aclink .. pencil(qids[1]) end outString = Navbox._navbox(navboxArgs) end --auxCats if rct == 0 or rct >= 25 then if namespace == 0 or testcases then auxCats = auxCats .. addCat('AC with '..rct..' elements') end end if parentArgs.state then if namespace == 0 or testcases then local sCat if parentArgs.state == 'collapsed' then sCat = 'AC using state parameter: collapsed' elseif parentArgs.state == 'expanded' then sCat = 'AC using state parameter: expanded' elseif parentArgs.state == 'autocollapse' then sCat = 'AC using state parameter: autocollapse' else sCat = 'AC using state parameter: other' end auxCats = auxCats .. addCat(sCat) end end if testcases then auxCats = mw.ustring.gsub(auxCats, '(%[%[)(Category)', '%1:%2') --for easier checking end --out outString = outString..auxCats if namespace ~= 0 then outString = mw.ustring.gsub(outString, '(%[%[)(Category:Articles)', '%1:%2') --by definition end return outString end -- Creates a human-readable standalone wikitable version of conf, and tracking categories with page counts, for use in the documentation function p.docConfTable(frame) local wikiTable = '<table class="wikitable sortable">'.. '<tr><th rowspan=2>Identifier</th>'.. '<th rowspan=2>Remark</th>'.. '<th rowspan=2>Section</th>'.. '<th rowspan=2>Appears as</th>'.. '<th rowspan=2 data-sort-type=number>Wikidata property</th>'.. '<th colspan=2>Tracking categories and page counts</th></tr>'.. '<tr><th>[[:Category:Articles with authority control information|Articles]]</th>'.. '<th>[[:Category:Articles with faulty authority control information|Faulty IDs]]</th></tr>' local lang = mw.getContentLanguage() local a, f, P = 0, 0, 0 --cumulative sums local config = require("Module:Authority control/config") local conf = config.config local sectionNames = config.sectionNames local function checkcat(category,label) local ret='[[:Category:'..category..'|'..label..']]' if mw.title.new(category, 14).exists == false then ret = ret..' <span class="plainlinks" style="font-size:85%;">[['..tostring(mw.uri.fullUrl('Category:'..category,'action=edit&preload=Template:Authority_control/preload'))..' create]]</span>' end return ret end for _, conf in pairs(conf) do local category = conf.category or conf[1] local wpl = frame:expandTemplate{ title = 'Wikidata property link', args = { id = 'f', conf.property } } local articleCat = 'Articles with '..category..' identifiers' local faultyCat = 'Articles with faulty '.. (conf.errorcat or category) ..' identifiers' local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') ) local faultyCount = lang:formatNum( mw.site.stats.pagesInCategory(faultyCat, 'pages') ) P = P + 1 --property count a = a + lang:parseFormattedNumber(articleCount) f = f + lang:parseFormattedNumber(faultyCount) wikiTable = wikiTable..'<tr><td>[['..(conf.idlink or conf[1]..' (identifier)')..'|'..conf[1]..']]</td>'.. '<td>'..(conf.remark or '')..'</td>'.. '<td>'..sectionNames[conf.section]..'</td>'.. '<td>'..makelink(conf,conf.example,1)..'</td>'.. '<td data-sort-value='..conf.property..'>'..wpl..'</td>'.. '<td style="text-align: right;">'..checkcat(articleCat,articleCount)..'</td>'.. '<td style="text-align: right;">'..checkcat(faultyCat,faultyCount)..'</td></tr>' end wikiTable = wikiTable..'<tr><th style="text-align: right;" colspan=4>Totals</th>'.. '<th style="text-align: right;">'..lang:formatNum(P)..'</th>'.. '<th style="text-align: right;">'..lang:formatNum(a)..'</th>'.. '<th style="text-align: right;">'..lang:formatNum(f)..'</th></tr></table>' return require('Module:Suppress categories').main(wikiTable) end return p