Module:Authority control: திருத்தங்களுக்கு இடையிலான வேறுபாடு
Jump to navigation
Jump to search
உள்ளடக்கம் நீக்கப்பட்டது உள்ளடக்கம் சேர்க்கப்பட்டது
imported>Lingam No edit summary |
imported>Kanags சிNo edit summary |
||
| (பயனரால் செய்யப்பட்ட 2 இடைப்பட்ட திருத்தங்கள் காட்டப்படவில்லை.) | |||
| வரிசை 1: | வரிசை 1: | ||
require(' |
require('strict') |
||
local p = {} |
local p = {} |
||
local configfile = 'Module:Authority control/config' -- default configuation module |
|||
local arg = mw.getCurrentFrame().args.config |
|||
--[[==========================================================================]] |
|||
if arg and arg~='' then |
|||
--[[ Category functions ]] |
|||
configfile = 'Module:Authority control/config/' .. arg |
|||
--[[==========================================================================]] |
|||
function p.getCatForId( id ) |
|||
local title = mw.title.getCurrentTitle() |
|||
local namespace = title.namespace |
|||
local catName = '' |
|||
if namespace == 0 then |
|||
catName = 'Wikipedia articles with ' .. id .. ' identifiers' |
|||
elseif namespace == 2 and not title.isSubpage then |
|||
catName = 'User pages with ' .. id .. ' identifiers' |
|||
else |
|||
catName = 'Miscellaneous pages with ' .. id .. ' identifiers' |
|||
end |
|||
return '[[Category:' .. catName .. ']]' .. p.redCatLink(catName) |
|||
end |
end |
||
local config |
|||
if mw.title.new(configfile).exists then |
|||
function p.redCatLink( catName ) --catName == 'Blah', not 'Category:Blah', not '[[Category:Blah]]' |
|||
config = mw.loadData(configfile) |
|||
if catName and catName ~= '' and mw.title.new(catName, 14).exists == false then |
|||
else |
|||
return '[[Category:Pages with red-linked authority control categories]]' |
|||
return error('Invalid configuration file',0) |
|||
end |
|||
return '' |
|||
end |
end |
||
local title = mw.title.getCurrentTitle() |
|||
local namespace = title.namespace |
|||
local testcases = title.subpageText == config.i18n.testcases |
|||
local function needsAttention(sortkey) |
|||
--[[==========================================================================]] |
|||
return '[[' .. config.i18n.category .. ':' .. config.i18n.attentioncat .. '|' .. sortkey .. title.text .. ']]' |
|||
--[[ Property formatting functions ]] |
|||
--[[==========================================================================]] |
|||
function p.iaafLink( id ) |
|||
--P1146's format regex: [1-9][0-9]* (e.g. 123) |
|||
if not string.match( id, '^[1-9]%d*$' ) then |
|||
return false |
|||
end |
|||
return '[https://www.iaaf.org/athletes/biographies/athcode='..id..' '..id..']'..p.getCatForId( 'IAAF' ) |
|||
end |
end |
||
function |
local function addCat(cat,sortkey) |
||
if cat and cat ~= '' and (namespace == 0 or namespace == 14 or testcases) then |
|||
--P214's format regex: [1-9]\d(\d{0,7}|\d{17,20}) (e.g. 123456789, 1234567890123456789012) |
|||
local redlinkcat = '' |
|||
if not string.match( id, '^[1-9]%d%d?%d?%d?%d?%d?%d?%d?$' ) and |
|||
if testcases == false and mw.title.new(cat, 14).exists == false then |
|||
not string.match( id, '^[1-9]%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d?%d?%d?$' ) then |
|||
redlinkcat = needsAttention('N') |
|||
return false |
|||
end |
|||
if sortkey then |
|||
cat = '[[' .. config.i18n.category .. ':'..cat..'|' .. sortkey .. title.text .. ']]' |
|||
else |
|||
cat = '[[' .. config.i18n.category .. ':'..cat..']]' |
|||
end |
|||
cat = cat .. redlinkcat |
|||
return cat |
|||
else |
|||
return '' |
|||
end |
end |
||
return '[https://viaf.org/viaf/'..id..' '..id..']'..p.getCatForId( 'VIAF' ) |
|||
end |
end |
||
function |
local function getCatForId(id,faulty) |
||
local cat = config.i18n.Articles_with .. ' ' |
|||
--P1248's format regex: [0-9a-f]{8}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if faulty then cat = cat .. config.i18n.faulty .. ' ' end |
|||
if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
cat = cat .. id .. ' ' .. config.i18n.identifiers |
|||
return false |
|||
return addCat(cat) |
|||
end |
|||
return '[http://kulturnav.org/'..id..' '..id..']'..p.getCatForId( 'KULTURNAV' ) --no https yet (10/2018) |
|||
end |
end |
||
function |
local function getIdsFromWikidata(qid,property) |
||
local function getquals(statement,qualid) |
|||
--P781's format regex: \d{7,9} (e.g. 123456789) |
|||
if statement.qualifiers and statement.qualifiers['P'..qualid] then |
|||
if not string.match( id, '^%d%d%d%d%d%d%d%d?%d?$' ) then |
|||
return mw.wikibase.renderSnak(statement.qualifiers['P'..qualid][1]) |
|||
return false |
|||
else |
|||
return false |
|||
end |
|||
end |
end |
||
local ids = {} |
|||
return '[http://www.sikart.ch/KuenstlerInnen.aspx?id='..id..'&lng=en '..id..']'..p.getCatForId( 'SIKART' ) --no https yet (10/2018) |
|||
if qid then |
|||
end |
|||
for _, statement in ipairs(mw.wikibase.getBestStatements(qid,property)) do |
|||
if statement.mainsnak.datavalue then |
|||
function p.tlsLink( id ) |
|||
local val = statement.mainsnak.datavalue.value |
|||
local id2 = id:gsub(' +', '_') |
|||
if val then |
|||
--P1362's format regex: \p{Lu}[\p{L}\d_',\.\-\(\)\*/–]{3,59} (e.g. Abcd) |
|||
local namedas = getquals(statement,1810) or getquals(statement,742) or '' |
|||
local class = "[%a%d_',%.%-%(%)%*/–]" |
|||
table.insert(ids,{id=val,name=namedas}) |
|||
local regex = "^%u"..string.rep(class, 3)..string.rep(class.."?", 56).."$" |
|||
end |
|||
if not mw.ustring.match( id2, regex ) then |
|||
end |
|||
return false |
|||
end |
|||
end |
end |
||
return ids |
|||
return '[http://tls.theaterwissenschaft.ch/wiki/'..id2..' '..id..']'..p.getCatForId( 'TLS' ) --no https yet (10/2018) |
|||
end |
end |
||
local _makelink = function(conf,val,nextid,qid) --validate values and create a link |
|||
function p.ciniiLink( id ) |
|||
local function tooltip(text,label) |
|||
--P271's format regex: DA\d{7}[\dX] (e.g. DA12345678) |
|||
if label and label~='' then |
|||
if not string.match( id, '^DA%d%d%d%d%d%d%d[%dX]$' ) then |
|||
return mw.getCurrentFrame():expandTemplate{title = "Tooltip", args = {text,label}} |
|||
return false |
|||
else |
|||
return text |
|||
end |
|||
end |
end |
||
local link |
|||
return '[https://ci.nii.ac.jp/author/'..id..'?l=en '..id..']'..p.getCatForId( 'CINII' ) |
|||
if nextid==1 then |
|||
end |
|||
if conf.prefix then |
|||
link = '*' .. conf.prefix .. '\n**' |
|||
function p.bneLink( id ) |
|||
else |
|||
--P950's format regex: (XX|FF|a)\d{4,7}|(bima|bimo|bica|bis[eo]|bivi|Mise|Mimo|Mima)\d{10} (e.g. XX1234567) |
|||
link = '*' |
|||
if not string.match( id, '^[XF][XF]%d%d%d%d%d?%d?%d?$' ) and |
|||
end |
|||
not string.match( id, '^a%d%d%d%d%d?%d?%d?$' ) and |
|||
else |
|||
not string.match( id, '^bi[mcsv][aoei]%d%d%d%d%d%d%d%d%d%d$' ) and |
|||
link = '\n**' |
|||
not string.match( id, '^Mi[sm][eoa]%d%d%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
end |
||
local valid_value = false |
|||
return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id='..id..' '..id..']'..p.getCatForId( 'BNE' ) --no https yet (10/2018) |
|||
if conf.customlink then -- use function to validate and generate link |
|||
end |
|||
local label = nextid>1 and nextid |
|||
local newlink= require(config.auxiliary)[conf.customlink](val.id,label) |
|||
function p.uscongressLink( id ) |
|||
if newlink then |
|||
--P1157's format regex: [A-Z]00[01]\d{3} (e.g. A000123) |
|||
link = link .. newlink |
|||
if not string.match( id, '^[A-Z]00[01]%d%d%d$' ) then |
|||
valid_value = true |
|||
return false |
|||
end |
|||
else |
|||
if conf.pattern then -- use pattern to determine validity if defined |
|||
valid_value = string.match(val.id,'^'..conf.pattern..'$') |
|||
elseif conf.patterns then |
|||
for _,pattern in ipairs(conf.patterns) do |
|||
valid_value = val.id:match('^'..pattern..'$') |
|||
if valid_value then break end |
|||
end |
|||
elseif conf.valid then -- otherwise use function to determine validity |
|||
valid_value = require(config.auxiliary)[conf.valid](val.id) |
|||
else -- no validation possible |
|||
valid_value = val.id |
|||
end |
|||
if valid_value then |
|||
local newlink |
|||
local label = conf.label |
|||
if not label or nextid>1 then |
|||
label = tostring(nextid) |
|||
end |
|||
if conf.link then |
|||
valid_value = valid_value:gsub('%%', '%%%%') |
|||
newlink = '[' .. mw.ustring.gsub(conf.link,'%$1',valid_value) .. ' ' .. label .. ']' |
|||
else |
|||
newlink = valid_value |
|||
end |
|||
link = link .. '<span class="uid">'..tooltip(newlink,val.name)..'</span>' |
|||
end |
|||
end |
end |
||
if valid_value then |
|||
return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index='..id..' '..id..']'..p.getCatForId( 'USCongress' ) --no https yet (10/2018) |
|||
link = link .. getCatForId(conf.category or conf[1]) |
|||
end |
|||
else |
|||
--local preview = require("Module:If preview") |
|||
function p.naraLink( id ) |
|||
local wdlink = qid and '[[:wikidata:' .. qid .. '#P' .. conf.property .. ']]' or '' |
|||
--P1225's format regex: ^([1-9]\d{0,7})$ (e.g. 12345678) |
|||
link = link .. '[[File:' .. config.i18n.warningicon .. '|20px|frameless|link=' .. wdlink .. '|' .. config.i18n.The .. ' ' .. conf[1] .. ' ' .. config.i18n.identifier .. ' ' .. val.id .. ' ' .. config.i18n.isnotvalid .. '.]]' |
|||
if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?%d?%d?$' ) then |
|||
if conf.errorcat then |
|||
return false |
|||
link = link .. addCat(conf.errorcat) |
|||
else |
|||
link = link .. getCatForId(conf.category or conf[1],true) |
|||
end |
|||
link = link .. addCat(config.i18n.allfaultycat,conf[1])-- .. preview._warning({'The '..conf[1]..' id '..val..' is not valid.'}) |
|||
end |
end |
||
return link |
|||
return '[https://catalog.archives.gov/id/'..id..' '..id..']'..p.getCatForId( 'NARA' ) |
|||
end |
end |
||
--[[==========================================================================]] |
|||
function p.botanistLink( id ) |
|||
--[[ Main ]] |
|||
--P428's format regex: ('t )?(d')?(de )?(la )?(van (der )?)?(Ma?c)?(De)?(Di)?\p{Lu}?C?['\p{Ll}]*([-'. ]*(van )?(y )?(d[ae][nr]?[- ])?(Ma?c)?[\p{Lu}bht]?C?['\p{Ll}]*)*\.? ?f?\.? (e.g. L.) |
|||
--[[==========================================================================]] |
|||
--not easily/meaningfully implementable in Lua's regex since "(this)?" is not allowed... |
|||
function p.authorityControl(frame) |
|||
if not mw.ustring.match( id, "^[%u%l%d%. '-]+$" ) then --better than nothing |
|||
local function resolveQID(qid) |
|||
return false |
|||
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 |
end |
||
local |
local conf = config.config |
||
local parentArgs = frame:getParent().args |
|||
return '[https://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation='..id2..' '..id..']'..p.getCatForId( 'Botanist' ) |
|||
local auxCats = '' |
|||
end |
|||
local rct = false -- boolean to track if there are any links to be returned |
|||
local qid,topic |
|||
function p.mgpLink( id ) |
|||
local wikilink = function(qid,hideifequal) |
|||
--P549's format regex: \d{1,6} (e.g. 123456) |
|||
local label,sitelink = mw.wikibase.getLabel(qid),mw.wikibase.getSitelink(qid) |
|||
if not string.match( id, '^%d%d?%d?%d?%d?%d?$' ) then |
|||
if label then |
|||
return false |
|||
if sitelink then |
|||
local target = mw.title.new(sitelink) |
|||
if target==title or (target.isRedirect and target.redirectTarget==title) then -- do not link |
|||
return label |
|||
else -- make wikilink to article |
|||
return '[[' .. sitelink .. '|' .. label .. ']]' |
|||
end |
|||
else |
|||
return label |
|||
end |
|||
else |
|||
auxCats = auxCats .. needsAttention('L') |
|||
return qid |
|||
end |
|||
end |
end |
||
if namespace == 0 then |
|||
return '[http://www.genealogy.ams.org/id.php?id='..id..' '..id..']'..p.getCatForId( 'MGP' ) --no https yet (10/2018) |
|||
qid = mw.wikibase.getEntityIdForCurrentPage() |
|||
end |
|||
function p.rslLink( id ) |
|||
--P947's format regex: \d{1,9} (e.g. 123456789) |
|||
if not string.match( id, '^%d%d?%d?%d?%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
end |
||
if qid then -- article is connected to Wikidata item |
|||
return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request='..id..'&CON_LNG=ENG '..id..']'..p.getCatForId( 'RSL' ) --no https yet (10/2018) |
|||
if parentArgs.qid and (resolveQID(parentArgs.qid) ~= qid) then -- non-matching qid parameter |
|||
end |
|||
auxCats = auxCats .. needsAttention('D') |
|||
end |
|||
function p.leonoreLink( id ) |
|||
else -- page is not connected to any Wikidata item |
|||
--P640's format regex: LH/\d{1,4}/\d{1,3}|19800035/\d{1,4}/\d{1,5}(Bis)?|C/0/\d{1,2} (e.g. LH/2064/18) |
|||
qid = resolveQID(parentArgs.qid) -- check qid parameter if no wikidata item is connected |
|||
if not id:match( '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and --IDs from LH/1/1 to LH/2794/54 (legionaries) |
|||
if qid then -- qid parameter is valid, set topic to display |
|||
not id:match( '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) and --IDs from 19800035/1/1 to 19800035/385/51670 (legionnaires who died 1954-1977 & some who died < 1954) |
|||
topic = mw.wikibase.getLabel(qid) |
|||
not id:match( '^C/0/%d%d?$' ) then --IDs from C/0/1 to C/0/84 (84 famous legionaries) |
|||
if topic then |
|||
return false |
|||
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 = '[[' .. 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 |
end |
||
local qids = {} -- setup any additional QIDs |
|||
return '[http://www.culture.gouv.fr/public/mistral/leonore_fr?ACTION=CHERCHER&FIELD_1=COTE&VALUE_1='..id..' '..id..']'..p.getCatForId( 'Léonore' ) --no https yet (10/2018) |
|||
if parentArgs.additional=='auto' and qid then -- check P527 for parts to add additional qids |
|||
end |
|||
local checkparts = function(property) |
|||
local parts = mw.wikibase.getBestStatements(qid,property) |
|||
function p.sbnLink( id ) |
|||
if parts then |
|||
--P396's format regex: IT\\ICCU\\(\d{10}|\D\D[\D\d]\D\\\d{6}) (e.g. IT\ICCU\CFIV\000163) |
|||
for _,part in ipairs(parts) do |
|||
if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and |
|||
if part.mainsnak.datavalue and part.mainsnak.datavalue.value.id then |
|||
not string.match( id, '^IT\\ICCU\\%u%u[%u%d]%u\\%d%d%d%d%d%d$' ) then --legacy: %u used here instead of %D (but the faulty ID cat is empty, out of ~12k uses) |
|||
local resolvedqid = resolveQID(part.mainsnak.datavalue.value.id) |
|||
return false |
|||
if resolvedqid then |
|||
table.insert(qids,resolvedqid) |
|||
end end end end end |
|||
for _,part in ipairs(config.auto_additional) do |
|||
checkparts('P'..tostring(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 |
end |
||
return '[https://opac.sbn.it/opacsbn/opac/iccu/scheda_authority.jsp?bid='..id..' '..id..']'..p.getCatForId( 'SBN' ) |
|||
end |
|||
local sections = {} |
|||
function p.nkcLink( id ) |
|||
local localparams = false |
|||
--P691's format regex: [a-z]{2,4}[0-9]{2,14} (e.g. abcd12345678901234) |
|||
local numsections = 0 |
|||
if not string.match( id, '^[a-z][a-z][a-z]?[a-z]?%d%d%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?$' ) then |
|||
for _,_ in ipairs(config.sections) do numsections = numsections + 1 end |
|||
return false |
|||
for _ = 1,#qids+numsections do table.insert(sections,{}) end |
|||
end |
|||
local qslink = '' -- setup link to add using QuickStatements |
|||
return '[https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica='..id..'&CON_LNG=ENG '..id..']'..p.getCatForId( 'NKC' ) |
|||
end |
|||
-- check which identifiers to show/suppress in template |
|||
function p.nclLink( id ) |
|||
local show = {} -- setup list |
|||
--P1048's format regex: \d+ (e.g. 1081436) |
|||
local showall = true |
|||
if not string.match( id, '^%d+$' ) then |
|||
local function stripP(pid) |
|||
return false |
|||
if pid:match("^[Pp]%d+$") then |
|||
pid = mw.ustring.gsub(pid,'[Pp]','') --strip P from property number |
|||
end |
|||
if pid:match("^%d+$") then |
|||
return tonumber(pid) |
|||
end |
|||
end |
end |
||
local function addshowlist(list) |
|||
return '[http://aleweb.ncl.edu.tw/F/?func=accref&acc_sequence='..id..'&CON_LNG=ENG '..id..']'..p.getCatForId( 'NCL' ) --no https yet (10/2018) |
|||
if list and list ~= '' then |
|||
end |
|||
for _,v in ipairs(mw.text.split(string.lower(list),"%s*,%s*")) do |
|||
local vprop = stripP(v) |
|||
function p.ndlLink( id ) |
|||
if vprop then -- e.g. show=P214 to show one particular property |
|||
--P349's format regex: 0?\d{8} (e.g. 012345678) |
|||
show[vprop] = true |
|||
if not string.match( id, '^0?%d%d%d%d%d%d%d%d$' ) then |
|||
else -- e.g. show=arts to use whitelist |
|||
return false |
|||
if config.whitelists[v] then |
|||
for _,w in ipairs(config.whitelists[v].properties) do |
|||
show[w] = true |
|||
end |
|||
end |
|||
end |
|||
end |
|||
showall = false |
|||
end |
|||
end |
end |
||
addshowlist(frame.args.show) -- check show= parameter on wrapper template |
|||
return '[https://id.ndl.go.jp/auth/ndlna/'..id..' '..id..']'..p.getCatForId( 'NDL' ) |
|||
addshowlist(parentArgs.show or parentArgs.country) -- check show parameter on article template |
|||
end |
|||
if parentArgs.suppress then |
|||
local suppresslist = mw.text.split(parentArgs.suppress,"%s*,%s*") -- split parameter by comma |
|||
function p.sudocLink( id ) |
|||
for _,v in ipairs(suppresslist) do |
|||
--P269's format regex: (\d{8}[\dX]|) (e.g. 026927608) |
|||
v = stripP(string.upper(v)) |
|||
if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then --legacy: allow lowercase 'x' |
|||
if v then |
|||
return false |
|||
show[v] = false |
|||
auxCats = auxCats .. '[[' .. config.i18n.category .. ':' .. config.i18n.suppressedcat .. ']]' |
|||
else |
|||
auxCats = auxCats .. needsAttention('P') |
|||
end |
|||
end |
|||
end |
end |
||
return '[https://www.idref.fr/'..id..' '..id..']'..p.getCatForId( 'SUDOC' ) |
|||
local function makeSections(qid,addit) |
|||
end |
|||
local tval = {} |
|||
function |
local function parameter_is_used(property) |
||
local used = false |
|||
--P902's format regex: 50\d{3}|[1-4]\d{4}|[1-9]\d{0,3}| (e.g. 50123) |
|||
if property then |
|||
if not string.match( id, '^50%d%d%d$' ) and |
|||
if tval[property] then |
|||
not string.match( id, '^[1-4]%d%d%d%d$' ) and |
|||
if tval[property][1] then |
|||
not string.match( id, '^[1-9]%d?%d?%d?$' ) then |
|||
used = true |
|||
return false |
|||
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 |
|||
local showb = true |
|||
if (show[params.property] == nil) and (show[string.upper(params[1])] == nil ) then |
|||
showb = showall -- if not specified then depends on showall |
|||
elseif (show[params.property] == false) or (show[string.upper(params[1])] == false) then -- if either are false then id will be suppressed |
|||
showb = false |
|||
end |
|||
if not showb then |
|||
tval[params.property] = false -- indicates the identifier is suppressed |
|||
elseif not addit then |
|||
local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]] |
|||
if val and val~='' then -- add local parameter to list if not already in |
|||
localparams = true |
|||
local bnew = true |
|||
for _, w in pairs(tval[params.property]) do |
|||
if val == w.id then |
|||
bnew = false |
|||
end |
|||
end |
|||
if bnew then -- add new value to table |
|||
if qid then |
|||
qslink = qslink .. '%7C%7C' .. qid .. '%7CP' .. params.property .. '%7C%22' .. mw.uri.encode(val,"PATH") .. '%22%7CS143%7CQ328' |
|||
end |
|||
table.insert(tval[params.property],{id=val,name=''}) |
|||
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 tval[params.property] ~= false and not suppress then |
|||
local tlinks = {} -- setup table for links |
|||
local nextIdVal = 1 |
|||
local row = '' |
|||
for _,val in ipairs(tval[params.property]) do |
|||
local link = _makelink(params,val,nextIdVal,qid) |
|||
row = row .. link |
|||
table.insert(tlinks,link) |
|||
nextIdVal = nextIdVal + 1 |
|||
end |
|||
if nextIdVal>=2 then |
|||
row = row .. '\n' |
|||
table.insert(sections[addit or params.section],row) |
|||
rct = true |
|||
end |
|||
end |
|||
end |
|||
end |
end |
||
local function pencil(qid) |
|||
return '[http://www.hls-dhs-dss.ch/textes/f/F'..id..'.php '..id..']'..p.getCatForId( 'HDS' ) --no https yet (10/2018) |
|||
if not qid then |
|||
end |
|||
return '' |
|||
end |
|||
function p.lirLink( id ) |
|||
local args = { pid = 'identifiers' } -- #target the list of identifiers |
|||
--P886's format regex: \d+ (e.g. 1) |
|||
args.qid = qid |
|||
if not string.match( id, '^%d+$' ) then |
|||
return require('Module:EditAtWikidata')._showMessage(args) |
|||
return false |
|||
end |
end |
||
return '[http://www.e-lir.ch/e-LIR___Lexicon.'..id..'.450.0.html '..id..']'..p.getCatForId( 'LIR' ) --no https yet (10/2018) |
|||
end |
|||
makeSections(qid,false) |
|||
function p.splitLccn( id ) |
|||
for c = 1,#qids do |
|||
--P244's format regex: (n|nb|nr|no|ns|sh)([4-9][0-9]|00|20[0-1][0-9])[0-9]{6} (e.g. n78039510) |
|||
makeSections(qids[c],numsections+c) |
|||
if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then |
|||
id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' ) |
|||
end |
end |
||
if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then |
|||
return mw.text.split( id, '/' ) |
|||
end |
|||
return false |
|||
end |
|||
--configure Navbox |
|||
function p.append(str, c, length) |
|||
local outString = '' |
|||
while str:len() < length do |
|||
if rct or localparams then -- there is at least one link to display |
|||
str = c .. str |
|||
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] |
|||
sectname = wikilink(qid) .. pencil(qid) |
|||
end |
|||
navboxArgs['group' .. c] = sectname |
|||
navboxArgs['list' .. c] = table.concat(sections[c]) |
|||
end |
|||
end |
|||
if localparams then |
|||
lastsect = lastsect + 1 |
|||
sect = sect + 1 |
|||
navboxArgs['group' .. lastsect] = config.i18n.warning |
|||
local warning = frame:expandTemplate{title = config.i18n.errortemplate, args = {config.i18n.localparams}} |
|||
if qslink ~= '' then |
|||
warning = warning .. ' ' .. config.i18n.movetowd .. '<span class="qs autoconfirmed-show"> [[File:Commons to Wikidata QuickStatements.svg|20px|link=https://quickstatements.toolforge.org/#/v1=' .. qslink .. '|' .. config.i18n.addtowd .. ']]</span>' |
|||
elseif not qid then |
|||
if namespace == 0 then |
|||
warning = warning .. ' ' .. config.i18n.connecttowd |
|||
elseif namespace==14 or namespace==2 or namespace==118 then |
|||
warning = warning .. ' ' .. config.i18n.qidcode |
|||
end |
|||
end |
|||
navboxArgs['list' .. lastsect] = warning |
|||
end |
|||
if topic then -- display in expanded form with topic |
|||
navboxArgs.title = config.i18n.aclink .. ' – ' .. 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 |
end |
||
return str |
|||
end |
|||
if parentArgs.state |
|||
function p.lccnLink( id ) |
|||
and parentArgs.state~='' |
|||
local parts = p.splitLccn( id ) --e.g. n78039510 |
|||
and parentArgs.state~=config.i18n.collapsed |
|||
if not parts then |
|||
and parentArgs.state~=config.i18n.expanded |
|||
return false |
|||
and parentArgs.state~=config.i18n.autocollapse then --invalid state parameter |
|||
auxCats = auxCats .. needsAttention('S') |
|||
end |
end |
||
local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects' |
|||
id = parts[1] .. parts[2] .. p.append( parts[3], '0', 6 ) |
|||
return '[https://id.loc.gov/authorities/'..lccnType..'/'..id..' '..id..']'..p.getCatForId( 'LCCN' ) |
|||
end |
|||
if testcases then |
|||
function p.mbaLink( id ) |
|||
auxCats = mw.ustring.gsub(auxCats, '(%[%[)(' .. config.i18n.category .. ')', '%1:%2') --for easier checking |
|||
--P434's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
end |
||
return '[https://musicbrainz.org/artist/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz' ) |
|||
end |
|||
--out |
|||
function p.mbareaLink( id ) |
|||
outString = outString..auxCats |
|||
--P982's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if namespace ~= 0 then |
|||
if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
outString = mw.ustring.gsub(outString,'(%[%[)(' .. config.i18n.category .. ':' .. config.i18n.Articles .. ')([^%|%]]+)%|?[^%|%]]*(%]%])','%1:%2%3%4') |
|||
return false |
|||
outString = mw.ustring.gsub(outString,'(%[%[)(' .. config.i18n.category .. ':' .. config.i18n.All_articles .. ')([^%|%]]+)%|?[^%|%]]*(%]%])','%1:%2%3%4') |
|||
end |
end |
||
local check = require('Module:Check for unknown parameters')._check |
|||
return '[https://musicbrainz.org/area/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz area' ) |
|||
local sortkey |
|||
end |
|||
if namespace == 0 then |
|||
sortkey = '*' .. title.text |
|||
function p.mbiLink( id ) |
|||
else |
|||
--P1330's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
sortkey = title.fullText |
|||
if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
end |
||
outString = outString .. check({ |
|||
return '[https://musicbrainz.org/instrument/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz instrument' ) |
|||
['unknown'] = '[[' .. config.i18n.category .. ':' .. config.i18n.pageswithparams .. '|' .. sortkey .. ']]', |
|||
['preview'] = config.i18n.previewwarning, 'show', 'country', 'suppress', 'additional', 'qid', 'state' |
|||
}, parentArgs) |
|||
return outString |
|||
end |
end |
||
p.makelink = function(conf,val,nextid,qid) |
|||
function p.mblLink( id ) |
|||
return _makelink(conf,val,nextid,qid) |
|||
--P966's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
|||
return '[https://musicbrainz.org/label/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz label' ) |
|||
end |
end |
||
function p.mbpLink( id ) |
|||
--P1004's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
|||
return '[https://musicbrainz.org/place/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz place' ) |
|||
end |
|||
function p.mbrgLink( id ) |
|||
--P436's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
|||
return '[https://musicbrainz.org/release-group/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz release group' ) |
|||
end |
|||
function p.mbsLink( id ) |
|||
--P1407's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
|||
return '[https://musicbrainz.org/series/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz series' ) |
|||
end |
|||
function p.mbwLink( id ) |
|||
--P435's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
|||
return '[https://musicbrainz.org/work/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz work' ) |
|||
end |
|||
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits, e.g. 0000000066534145 |
|||
function p.getIsniCheckDigit( isni ) |
|||
local total = 0 |
|||
for i = 1, 15 do |
|||
local digit = isni:byte( i ) - 48 --Get integer value |
|||
total = (total + digit) * 2 |
|||
end |
|||
local remainder = total % 11 |
|||
local result = (12 - remainder) % 11 |
|||
if result == 10 then |
|||
return "X" |
|||
end |
|||
return tostring( result ) |
|||
end |
|||
--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid |
|||
--See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier |
|||
function p.validateIsni( id ) |
|||
--P213 (ISNI) format regex: [0-9]{4} [0-9]{4} [0-9]{4} [0-9]{3}[0-9X] (e.g. 0000-0000-6653-4145) |
|||
--P496 (ORCID) format regex: 0000-000(1-[5-9]|2-[0-9]|3-[0-4])\d{3}-\d{3}[\dX] (e.g. 0000-0002-7398-5483) |
|||
id = id:gsub( '[ %-]', '' ):upper() |
|||
if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then |
|||
return false |
|||
end |
|||
if p.getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then |
|||
return false |
|||
end |
|||
return id |
|||
end |
|||
function p.isniLink( id ) |
|||
id = p.validateIsni( id ) --e.g. 0000-0000-6653-4145 |
|||
if not id then |
|||
return false |
|||
end |
|||
return '[http://isni.org/isni/'..id..' '..id:sub( 1, 4 )..' '..id:sub( 5, 8 )..' '..id:sub( 9, 12 )..' '..id:sub( 13, 16 )..']'..p.getCatForId( 'ISNI' ) --no https yet (10/2018) |
|||
end |
|||
function p.orcidLink( id ) |
|||
id = p.validateIsni( id ) --e.g. 0000-0002-7398-5483 |
|||
if not id then |
|||
return false |
|||
end |
|||
id = id:sub( 1, 4 )..'-'..id:sub( 5, 8 )..'-'..id:sub( 9, 12 )..'-'..id:sub( 13, 16 ) |
|||
return '[https://orcid.org/'..id..' '..id..']'..p.getCatForId( 'ORCID' ) |
|||
end |
|||
function p.gndLink( id ) |
|||
--P227's format regex: (1|1[01])\d{7}[0-9X]|[47]\d{6}-\d|[1-9]\d{0,7}-[0-9X]|3\d{7}[0-9X] (e.g. 4079154-3) |
|||
if not string.match( id, '^1[01]?%d%d%d%d%d%d%d[0-9X]$' ) and |
|||
not string.match( id, '^[47]%d%d%d%d%d%d%-%d$' ) and |
|||
not string.match( id, '^[1-9]%d?%d?%d?%d?%d?%d?%d?%-[0-9X]$' ) and |
|||
not string.match( id, '^3%d%d%d%d%d%d%d[0-9X]$' ) then |
|||
return false |
|||
end |
|||
return '[https://d-nb.info/gnd/'..id..' '..id..']'..p.getCatForId( 'GND' ) |
|||
end |
|||
function p.selibrLink( id ) |
|||
--P906's format regex: [1-9]\d{4,5} (e.g. 123456) |
|||
if not string.match( id, '^[1-9]%d%d%d%d%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://libris.kb.se/auth/'..id..' '..id..']'..p.getCatForId( 'SELIBR' ) |
|||
end |
|||
function p.bnfLink( id ) |
|||
--P268's format regex: \d{8}[0-9bcdfghjkmnpqrstvwxz] (e.g. 123456789) |
|||
if not string.match( id, '^c?b?%d%d%d%d%d%d%d%d[0-9bcdfghjkmnpqrstvwxz]$' ) then |
|||
return false |
|||
end |
|||
--Add cb prefix if it has been removed |
|||
if not string.match( id, '^cb.+$' ) then |
|||
id = 'cb'..id |
|||
end |
|||
return '[https://catalogue.bnf.fr/ark:/12148/'..id..' '..id..'] [http://data.bnf.fr/ark:/12148/'..id..' (data)]'..p.getCatForId( 'BNF' ) |
|||
end |
|||
function p.bpnLink( id ) |
|||
--P651's format regex: \d{8} (e.g. 12345678) |
|||
if not string.match( id, '^%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[http://www.biografischportaal.nl/en/persoon/'..id..' '..id..']'..p.getCatForId( 'BPN' ) --no https yet (10/2018) |
|||
end |
|||
function p.ridLink( id ) |
|||
--P1053's format regex: [A-Z]-\d{4}-(19|20)\d\d (e.g. A-1234-1934) |
|||
if not string.match( id, '^[A-Z]%-%d%d%d%d%-19%d%d$' ) and |
|||
not string.match( id, '^[A-Z]%-%d%d%d%d%-20%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[https://www.researcherid.com/rid/'..id..' '..id..']'..p.getCatForId( 'RID' ) |
|||
end |
|||
function p.bibsysLink( id ) |
|||
--P1015's format regex: [1-9]\d* or [1-9](\d{0,8}|\d{12}) (e.g. 1234567890123) |
|||
--TODO: follow up @ [[d:Property talk:P1015#Discrepancy between the 2 regex constraints]] or escalate/investigate |
|||
if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?$' ) and |
|||
not string.match( id, '^[1-9]%d%d%d%d%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[https://authority.bibsys.no/authority/rest/authorities/html/'..id..' '..id..']'..p.getCatForId( 'BIBSYS' ) |
|||
end |
|||
function p.ulanLink( id ) |
|||
--P245's format regex: 500\d{6} (e.g. 500123456) |
|||
if not string.match( id, '^500%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[https://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid='..id..' '..id..']'..p.getCatForId( 'ULAN' ) |
|||
end |
|||
function p.nlaLink( id ) |
|||
--P409's format regex: [1-9][0-9]{0,11} (e.g. 123456789012) |
|||
if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://nla.gov.au/anbd.aut-an'..id..' '..id..']'..p.getCatForId( 'NLA' ) |
|||
end |
|||
function p.rkdartistsLink( id ) |
|||
--P650's format regex: [1-9]\d{0,5} (e.g. 123456) |
|||
if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://rkd.nl/en/explore/artists/'..id..' '..id..']'..p.getCatForId( 'RKDartists' ) |
|||
end |
|||
function p.snacLink( id ) |
|||
--P3430's format regex: \d*[A-Za-z][0-9A-Za-z]* (e.g. A) |
|||
if not string.match( id, '^%d*[A-Za-z][0-9A-Za-z]*$' ) then |
|||
return false |
|||
end |
|||
return '[http://socialarchive.iath.virginia.edu/ark:/99166/'..id..' '..id..']'..p.getCatForId( 'SNAC-ID' ) --no https yet (10/2018) |
|||
end |
|||
function p.dblpLink( id ) |
|||
--P2456's format regex: \d{2,3} /\d+(-\d+)?|[a-z] /[a-zA-Z][0-9A-Za-z]*(-\d+)? (e.g. 123/123) |
|||
if not string.match( id, '^%d%d%d?/%d+$' ) and |
|||
not string.match( id, '^%d%d%d?/%d+%-%d+$' ) and |
|||
not string.match( id, '^[a-z]/[a-zA-Z][0-9A-Za-z]*$' ) and |
|||
not string.match( id, '^[a-z]/[a-zA-Z][0-9A-Za-z]*%-%d+$' ) then |
|||
return false |
|||
end |
|||
return '[https://dblp.org/pid/'..id..' '..id..']'..p.getCatForId( 'DBLP' ) |
|||
end |
|||
function p.acmLink( id ) |
|||
--P864's format regex: \d{11} (e.g. 12345678901) |
|||
if not string.match( id, '^%d%d%d%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[https://dl.acm.org/author_page.cfm?id='..id..' '..id..']'..p.getCatForId( 'ACM-DL' ) |
|||
end |
|||
function p.autoresuyLink( id ) |
|||
--P2558's format regex: [1-9]\d{0,4} (e.g. 12345) |
|||
if not string.match( id, '^[1-9]%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://autores.uy/autor/'..id..' '..id..']'..p.getCatForId( 'autores.uy' ) |
|||
end |
|||
function p.picLink( id ) |
|||
--P2750's format regex: [1-9]\d* (e.g. 1) |
|||
if not string.match( id, '^[1-9]%d*$' ) then |
|||
return false |
|||
end |
|||
return '[https://pic.nypl.org/constituents/'..id..' '..id..']'..p.getCatForId( 'PIC' ) |
|||
end |
|||
function p.bildLink( id ) |
|||
--P2092's format regex: \d+ (e.g. 1) |
|||
if not string.match( id, '^%d+$' ) then |
|||
return false |
|||
end |
|||
return '[https://www.bildindex.de/document/obj'..id..' '..id..']'..p.getCatForId( 'Bildindex' ) |
|||
end |
|||
function p.jocondeLink( id ) |
|||
--P347's format regex: [\-0-9A-Za-z]{11} (e.g. 12345678901) |
|||
local regex = '^'..string.rep('[%-0-9A-Za-z]', 11)..'$' |
|||
if not string.match( id, regex ) then |
|||
return false |
|||
end |
|||
return '[http://www2.culture.gouv.fr/public/mistral/joconde_fr?ACTION=CHERCHER&FIELD_1=REF&VALUE_1='..id..' '..id..']'..p.getCatForId( 'Joconde' ) --no https yet (10/2018) |
|||
end |
|||
function p.rkdidLink( id ) |
|||
--P350's format regex: [1-9]\d{0,5} (e.g. 123456) |
|||
if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://rkd.nl/nl/explore/images/'..id..' '..id..']'..p.getCatForId( 'RKDID' ) |
|||
end |
|||
function p.balatLink( id ) |
|||
--P3293's format regex: \d+ (e.g. 1) |
|||
if not string.match( id, '^%d+$' ) then |
|||
return false |
|||
end |
|||
return '[http://balat.kikirpa.be/object/104257'..id..' '..id..']'..p.getCatForId( 'BALaT' ) --no https yet (10/2018) |
|||
end |
|||
function p.lnbLink( id ) |
|||
--P1368's format regex: \d{9} (e.g. 123456789) |
|||
if not string.match( id, '^%d%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[https://kopkatalogs.lv/F?func=direct&local_base=lnc10&doc_number='..id..'&P_CON_LNG=ENG '..id..']'..p.getCatForId( 'LNB' ) |
|||
end |
|||
function p.nskLink( id ) |
|||
--P1375's format regex: \d{9} (e.g. 123456789) |
|||
if not string.match( id, '^%d%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[http://katalog.nsk.hr/F/?func=direct&doc_number='..id..'&local_base=nsk10 '..id..']'..p.getCatForId( 'NSK' ) --no https yet (10/2018) |
|||
end |
|||
function p.iciaLink( id ) |
|||
--P1736's format regex: \d+ (e.g. 1) |
|||
if not string.match( id, '^%d+$' ) then |
|||
return false |
|||
end |
|||
return '[https://www.imj.org.il/artcenter/newsite/en/?artist='..id..' '..id..']'..p.getCatForId( 'ICIA' ) |
|||
end |
|||
function p.ta98Link( id ) |
|||
--P1323's format regex: A\d{2}\.\d\.\d{2}\.\d{3}[FM]? (e.g. A12.3.45.678) |
|||
if not string.match( id, '^A%d%d%.%d%.%d%d%.%d%d%d[FM]?$' ) then |
|||
return false |
|||
end |
|||
return '[http://tools.wmflabs.org/wikidata-externalid-url/?p=1323&url_prefix=https:%2F%2Fwww.unifr.ch%2Fifaa%2FPublic%2FEntryPage%2FTA98%20Tree%2FEntity%20TA98%20EN%2F&url_suffix=%20Entity%20TA98%20EN.htm&id='..id..' '..id..']'..p.getCatForId( 'TA98' ) |
|||
end |
|||
function p.teLink( id ) |
|||
--P1693's format regex: E[1-8]\.\d{1,2}\.\d{1,2}\.\d{1,2}\.\d{1}\.\d{1}\.\d{1,3} (e.g. E1.23.45.67.8.9.0) |
|||
local e1, e2 = string.match( id, '^E([1-8])%.(%d%d?)%.%d%d?%.%d%d?%.%d%.%d%.%d%d?%d?$' ) |
|||
if not e1 then |
|||
return false |
|||
end |
|||
local TEnum = 'TEe0'..e1 --no formatter URL in WD, probably due to this complexity |
|||
if e1 == '5' or e1 == '7' then |
|||
if #e2 == 1 then e2 = '0'..e2 end |
|||
TEnum = TEnum..e2 |
|||
end |
|||
return '[http://www.unifr.ch/ifaa/Public/EntryPage/ViewTE/'..TEnum..'.html '..id..']'..p.getCatForId( 'TE' ) |
|||
end |
|||
function p.thLink( id ) |
|||
--P1694's format regex: H\d\.\d{2}\.\d{2}\.\d\.\d{5} (e.g. H1.23.45.6.78901) |
|||
local h1, h2 = string.match( id, '^H(%d)%.(%d%d)%.%d%d%.%d%.%d%d%d%d%d$' ) |
|||
if not h1 then |
|||
return false |
|||
end |
|||
local THnum = 'THh'..h1..h2 --no formatter URL in WD, probably due to this complexity |
|||
return '[http://www.unifr.ch/ifaa/Public/EntryPage/ViewTH/'..THnum..'.html '..id..']'..p.getCatForId( 'TH' ) |
|||
end |
|||
return p |
return p |
||
01:26, 12 மே 2024 இல் கடைசித் திருத்தம்
Documentation for this module may be created at Module:Authority control/doc
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 function needsAttention(sortkey)
return '[[' .. config.i18n.category .. ':' .. config.i18n.attentioncat .. '|' .. 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 = '[[' .. config.i18n.category .. ':'..cat..'|' .. sortkey .. title.text .. ']]'
else
cat = '[[' .. config.i18n.category .. ':'..cat..']]'
end
cat = cat .. redlinkcat
return cat
else
return ''
end
end
local function getCatForId(id,faulty)
local cat = config.i18n.Articles_with .. ' '
if faulty then cat = cat .. config.i18n.faulty .. ' ' end
cat = cat .. id .. ' ' .. config.i18n.identifiers
return addCat(cat)
end
local function getIdsFromWikidata(qid,property)
local function getquals(statement,qualid)
if statement.qualifiers and statement.qualifiers['P'..qualid] then
return mw.wikibase.renderSnak(statement.qualifiers['P'..qualid][1])
else
return false
end
end
local ids = {}
if qid then
for _, statement in ipairs(mw.wikibase.getBestStatements(qid,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
return ids
end
local _makelink = function(conf,val,nextid,qid) --validate values and create a link
local function tooltip(text,label)
if label and label~='' then
return mw.getCurrentFrame():expandTemplate{title = "Tooltip", args = {text,label}}
else
return text
end
end
local link
if nextid==1 then
if conf.prefix then
link = '*' .. conf.prefix .. '\n**'
else
link = '*'
end
else
link = '\n**'
end
local valid_value = false
if conf.customlink then -- use function to validate and generate link
local label = nextid>1 and nextid
local newlink= require(config.auxiliary)[conf.customlink](val.id,label)
if newlink then
link = link .. newlink
valid_value = true
end
else
if conf.pattern then -- use pattern to determine validity if defined
valid_value = string.match(val.id,'^'..conf.pattern..'$')
elseif conf.patterns then
for _,pattern in ipairs(conf.patterns) do
valid_value = val.id:match('^'..pattern..'$')
if valid_value then break end
end
elseif conf.valid then -- otherwise use function to determine validity
valid_value = require(config.auxiliary)[conf.valid](val.id)
else -- no validation possible
valid_value = val.id
end
if valid_value then
local newlink
local label = conf.label
if not label or nextid>1 then
label = tostring(nextid)
end
if conf.link then
valid_value = valid_value:gsub('%%', '%%%%')
newlink = '[' .. mw.ustring.gsub(conf.link,'%$1',valid_value) .. ' ' .. label .. ']'
else
newlink = valid_value
end
link = link .. '<span class="uid">'..tooltip(newlink,val.name)..'</span>'
end
end
if valid_value then
link = link .. getCatForId(conf.category or conf[1])
else
--local preview = require("Module:If preview")
local wdlink = qid and '[[:wikidata:' .. qid .. '#P' .. conf.property .. ']]' or ''
link = link .. '[[File:' .. config.i18n.warningicon .. '|20px|frameless|link=' .. wdlink .. '|' .. config.i18n.The .. ' ' .. conf[1] .. ' ' .. config.i18n.identifier .. ' ' .. val.id .. ' ' .. config.i18n.isnotvalid .. '.]]'
if conf.errorcat then
link = link .. addCat(conf.errorcat)
else
link = link .. getCatForId(conf.category or conf[1],true)
end
link = link .. addCat(config.i18n.allfaultycat,conf[1])-- .. preview._warning({'The '..conf[1]..' id '..val..' is not valid.'})
end
return link
end
--[[==========================================================================]]
--[[ Main ]]
--[[==========================================================================]]
function p.authorityControl(frame)
local function resolveQID(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
local wikilink = function(qid,hideifequal)
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
return label
else -- make wikilink to article
return '[[' .. sitelink .. '|' .. label .. ']]'
end
else
return label
end
else
auxCats = auxCats .. needsAttention('L')
return qid
end
end
if namespace == 0 then
qid = mw.wikibase.getEntityIdForCurrentPage()
end
if qid then -- article is connected to 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 = '[[' .. 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'..tostring(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 sections = {}
local localparams = false
local numsections = 0
for _,_ in ipairs(config.sections) do numsections = numsections + 1 end
for _ = 1,#qids+numsections do table.insert(sections,{}) end
local qslink = '' -- setup link to add using QuickStatements
-- check which identifiers to show/suppress in template
local show = {} -- setup list
local showall = true
local function stripP(pid)
if pid:match("^[Pp]%d+$") then
pid = mw.ustring.gsub(pid,'[Pp]','') --strip P from property number
end
if pid:match("^%d+$") then
return tonumber(pid)
end
end
local function addshowlist(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
showall = false
end
end
addshowlist(frame.args.show) -- check show= parameter on wrapper template
addshowlist(parentArgs.show or parentArgs.country) -- check show parameter on article template
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(string.upper(v))
if v then
show[v] = false
auxCats = auxCats .. '[[' .. config.i18n.category .. ':' .. config.i18n.suppressedcat .. ']]'
else
auxCats = auxCats .. needsAttention('P')
end
end
end
local function makeSections(qid,addit)
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
local showb = true
if (show[params.property] == nil) and (show[string.upper(params[1])] == nil ) then
showb = showall -- if not specified then depends on showall
elseif (show[params.property] == false) or (show[string.upper(params[1])] == false) then -- if either are false then id will be suppressed
showb = false
end
if not showb then
tval[params.property] = false -- indicates the identifier is suppressed
elseif not addit then
local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]]
if val and val~='' then -- add local parameter to list if not already in
localparams = true
local bnew = true
for _, w in pairs(tval[params.property]) do
if val == w.id then
bnew = false
end
end
if bnew then -- add new value to table
if qid then
qslink = qslink .. '%7C%7C' .. qid .. '%7CP' .. params.property .. '%7C%22' .. mw.uri.encode(val,"PATH") .. '%22%7CS143%7CQ328'
end
table.insert(tval[params.property],{id=val,name=''})
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 tval[params.property] ~= false and not suppress then
local tlinks = {} -- setup table for links
local nextIdVal = 1
local row = ''
for _,val in ipairs(tval[params.property]) do
local link = _makelink(params,val,nextIdVal,qid)
row = row .. link
table.insert(tlinks,link)
nextIdVal = nextIdVal + 1
end
if nextIdVal>=2 then
row = row .. '\n'
table.insert(sections[addit or params.section],row)
rct = true
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
makeSections(qid,false)
for c = 1,#qids do
makeSections(qids[c],numsections+c)
end
--configure Navbox
local outString = ''
if rct or localparams 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]
sectname = wikilink(qid) .. pencil(qid)
end
navboxArgs['group' .. c] = sectname
navboxArgs['list' .. c] = table.concat(sections[c])
end
end
if localparams then
lastsect = lastsect + 1
sect = sect + 1
navboxArgs['group' .. lastsect] = config.i18n.warning
local warning = frame:expandTemplate{title = config.i18n.errortemplate, args = {config.i18n.localparams}}
if qslink ~= '' then
warning = warning .. ' ' .. config.i18n.movetowd .. '<span class="qs autoconfirmed-show"> [[File:Commons to Wikidata QuickStatements.svg|20px|link=https://quickstatements.toolforge.org/#/v1=' .. qslink .. '|' .. config.i18n.addtowd .. ']]</span>'
elseif not qid then
if namespace == 0 then
warning = warning .. ' ' .. config.i18n.connecttowd
elseif namespace==14 or namespace==2 or namespace==118 then
warning = warning .. ' ' .. config.i18n.qidcode
end
end
navboxArgs['list' .. lastsect] = warning
end
if topic then -- display in expanded form with topic
navboxArgs.title = config.i18n.aclink .. ' – ' .. 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'] = '[[' .. config.i18n.category .. ':' .. config.i18n.pageswithparams .. '|' .. sortkey .. ']]',
['preview'] = config.i18n.previewwarning, 'show', 'country', 'suppress', 'additional', 'qid', 'state'
}, parentArgs)
return outString
end
p.makelink = function(conf,val,nextid,qid)
return _makelink(conf,val,nextid,qid)
end
return p