Open main menu
Home
Random
Donate
Recent changes
Special pages
Community portal
Preferences
About Stockhub
Disclaimers
Search
User menu
Talk
Contributions
Create account
Log in
Editing
Module:Authority control/sandbox
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
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(itemId,property) local ids = {} if not mw.wikibase then return ids end local statements = mw.wikibase.getBestStatements( itemId, 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 = mw.ustring.match(val,conf.pattern) elseif conf.patterns then for i = 1,#conf.patterns do valid_value = mw.ustring.match(val,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 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.cat 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 aliases = config.aliases local deprecated = config.deprecated 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 worldcatCat = '' local elementsCat = '' local multipleIdCat = '' local suppressedIdCat = '' local suppressedIdCatArts = '' local deprecatedIdCat = '' local differentOnWDCat = '' local sameOnWDCat = '' local stateCat = '' --redirect aliases to proper parameter names for _, a in pairs(aliases) do local alias, param = a[1], a[2] if (parentArgs[param] == nil or parentArgs[param] == '') and parentArgs[alias] then parentArgs[param] = parentArgs[alias] end end --redirect deprecated parameters to proper parameter names, and assign tracking cat for _, d in pairs( deprecated ) do local dep, param = d[1], d[2] if (parentArgs[param] == nil or parentArgs[param] == '') and parentArgs[dep] then parentArgs[param] = parentArgs[dep] if namespace == 0 then deprecatedIdCat = '[[Category:Articles with deprecated authority control identifiers|'..dep..']]' end end end --use QID= parameter for testing/example purposes only local itemId = nil if namespace ~= 0 then local qid = parentArgs['qid'] or parentArgs['QID'] if qid then itemId = 'Q'..mw.ustring.gsub(qid, '^[Qq]', '') itemId = resolveEntity._id(itemId) --nil if unresolvable end elseif mw.wikibase then itemId = mw.wikibase.getEntityIdForCurrentPage() end --configure rows local rct = 0 local sectionOrder = config.sectionOrder local sections = {{},{},{},{},{},{},{},{}} if itemId then local suppressedIdCount = 0 local iMatches = 0 for _, params in ipairs(conf) do local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]] local wikidataIds = getIdsFromWikidata(itemId,'P'..params.property) if val == nil or val == '' then if wikidataIds[1] then if val == '' and (namespace == 0 or testcases) then suppressedIdCount = suppressedIdCount + 1 suppressedIdCat = '[[Category:Articles with suppressed authority control identifiers|'..params[1]..']]' end end else iParentArgs = iParentArgs + 1 if wikidataIds[1] and differentOnWDCat == '' then local bMatch = false for _, wd in pairs( wikidataIds ) do if val == wd then iMatches = iMatches + 1 bMatch = true end end if bMatch == false then differentOnWDCat = '[[Category:Pages using authority control with parameters different on Wikidata|'..params[1]..']]' end end end end if iMatches > 0 and iMatches == iParentArgs then sameOnWDCat = '[[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 local sCat = 'ACArt with '..suppressedIdCount..' suppressed element'..s suppressedIdCatArts = addCat(sCat) end end end 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 end end return used end for _, params in ipairs(conf) do local wikidataIds = {} if itemId then wikidataIds = getIdsFromWikidata(itemId, 'P' .. params.property) end local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]] local suppress = false if val then if val == '' then suppress = true else -- add local parameter to wikidata IDs table.insert( wikidataIds, val) end end if params.suppressedbyproperty then for _,sc in ipairs(params.suppressedbyproperty) do if parameter_is_used(sc) then suppress = true end end end if not suppress then tval[params.property] = {} -- setup table for values with property number as key local tlinks = {} -- setup table for links local nextIdVal = 1 for _, val in pairs(wikidataIds) do 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 table.insert(tval[params.property],val) local link = makelink(params,val,nextIdVal) local cat = params.cat or params[1] if link then -- add category unless link==false link = link .. getCatForId(cat) end table.insert(tlinks,link) nextIdVal = nextIdVal + 1 end 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' table.insert(sections[params.section],row) rct = rct + 1 if tval[params.property][2] then multipleIdCat = getCatForId( 'multiple' ) end end end end --configure Navbox local outString = '' local extrap = true local extra = parentArgs.extralist if extra == nil or extra == '' then extrap = false end if rct > 0 or extrap then local Navbox = require('Module:Navbox') local sectionID = 1 local args = { pid = 'identifiers' } -- #target the list of identifiers if testcases and itemId then args.qid = itemId end --expensive local pencil = require('Module:EditAtWikidata')._showMessage(args) local navboxArgs = { name = 'Authority control', navboxclass = 'authority-control', bodyclass = 'hlist', state = parentArgs.state or 'autocollapse', navbar = 'off' } for c, sectName in ipairs(sectionOrder) do if #sections[c] ~= 0 then navboxArgs['group'..sectionID] = sectName navboxArgs['list'..sectionID] = table.concat(sections[c]) sectionID = sectionID + 1 end end if extrap then if parentArgs.extragroup then navboxArgs['group'..sectionID] = parentArgs.extragroup else navboxArgs['group'..sectionID] = 'Additional' end navboxArgs['list'..sectionID] = extra sectionID = sectionID + 1 end if navboxArgs.list2 then navboxArgs.title = '[[Help:Authority control|Authority control]]'..pencil else local sect = navboxArgs.group1 if sect == 'General' or sect == 'Other' or sect == 'Additional' then -- Just say "Authority control" with no label if only general or only other IDs are present -- since "general" is redundant and "other" is silly when there's nothing to contrast it with navboxArgs.group1 = '[[Help:Authority control|Authority control]]'..pencil else navboxArgs.group1 = '[[Help:Authority control|Authority control: '..sect..']] '..pencil end end outString = Navbox._navbox(navboxArgs) end --auxCats if rct == 0 or rct >= 25 then if namespace == 0 or testcases then local eCat = 'AC with '..rct..' elements' elementsCat = addCat(eCat) 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 stateCat = addCat(sCat) end end local auxCats = worldcatCat..elementsCat..multipleIdCat..suppressedIdCat..suppressedIdCatArts.. deprecatedIdCat..differentOnWDCat..sameOnWDCat..stateCat 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>Parameter</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 sectionOrder = config.sectionOrder 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 param, pid, section = conf[1], conf.property, sectionOrder[conf.section] local appearsAs = makelink(conf,conf.example,1) local link = conf.idlink or param..' (identifier)' local category = conf.cat or param local args = { id = 'f', pid } local wpl = frame:expandTemplate{ title = 'Wikidata property link', args = args } 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>[['..link..'|'..param..']]</td>'.. '<td>'..section..'</td>'.. '<td>'..appearsAs..'</td>'.. '<td data-sort-value='..pid..'>'..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=3>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
Summary:
Please note that all contributions to Stockhub may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Stockhub:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Templates used on this page:
Module:Authority control/sandbox
(
edit
)
Module:Authority control/sandbox/doc
(
edit
)