Module:Authority control: Difference between revisions
Jump to navigation
Jump to search
Richardpruen (talk | contribs) m (1 revision imported) |
m (add brackets to musicbrainz link to match other entries) |
||
Line 1: | Line 1: | ||
require(' | require('strict') | ||
local p = {} | local p = {} | ||
Line 11: | Line 11: | ||
local function addCat( cat ) | local function addCat( cat ) | ||
if cat then return '[[Category:'..cat..']]'..p.redCatLink(cat) end | if cat and cat ~= '' then return '[[Category:'..cat..']]'..p.redCatLink(cat) end | ||
return '' | return '' | ||
end | end | ||
Line 19: | Line 19: | ||
if namespace == 0 then | if namespace == 0 then | ||
cat = 'Articles with '..id..' identifiers' | cat = 'Articles with '..id..' identifiers' | ||
end | end | ||
return addCat(cat) | return addCat(cat) | ||
Line 28: | Line 24: | ||
function p.redCatLink( cat ) --cat == 'Blah' (not 'Category:Blah', not '[[Category:Blah]]') | function p.redCatLink( cat ) --cat == 'Blah' (not 'Category:Blah', not '[[Category:Blah]]') | ||
if cat and cat ~= '' and | if cat and cat ~= '' and testcases == false and mw.title.new(cat, 14).exists == false then | ||
return '[[Category:Pages with red-linked authority control categories]]' | return '[[Category:Pages with red-linked authority control categories]]' | ||
end | end | ||
Line 41: | Line 34: | ||
if links then -- all links[] use withUid = false; no check needed | if links then -- all links[] use withUid = false; no check needed | ||
local row = '' | local row = '' | ||
if prefix then | if prefix then | ||
row = row..'*'..prefix | row = row..'*'..prefix | ||
end | end | ||
Line 60: | Line 53: | ||
return '*<span class="nowrap">'..link..'</span>\n' | return '*<span class="nowrap">'..link..'</span>\n' | ||
end | end | ||
return '* <span class="error">The '..id..' id '..rawValues..' is not valid.</span>'..addCat(faultyCat)..'\n' | return '* <span class="error">The '..id..' id '..rawValues..' is not valid.</span>'..addCat(faultyCat)..'\n' | ||
end | end | ||
Line 187: | Line 180: | ||
end | end | ||
return '[https://catalogue.bnf.fr/ark:/12148/'..id..' '..(label or 'France')..'] [https://data.bnf.fr/ark:/12148/'..id..' (data)]'..p.getCatForId( 'BNF' ) | return '[https://catalogue.bnf.fr/ark:/12148/'..id..' '..(label or 'France')..'] [https://data.bnf.fr/ark:/12148/'..id..' (data)]'..p.getCatForId( 'BNF' ) | ||
end | |||
function p.bnmmLink( id, label ) | |||
--P3788's format regex: \d{9} (e.g. 000024044) | |||
if id:match( '^%d%d%d%d%d%d%d%d%d$' ) then | |||
return '[https://catalogo.bn.gov.ar/F/?func=direct&local_base=BNA10&doc_number='..id..' '..(label or 'Argentina')..']'..p.getCatForId( 'BNMM' ) | |||
else | |||
return false | |||
end | |||
end | end | ||
Line 215: | Line 217: | ||
end | end | ||
return '[http://cantic.bnc.cat/registres/CUCId/'..id..' '..(label or 'Catalonia')..']'..p.getCatForId( 'CANTIC' ) --no https as of 10/2019 | return '[http://cantic.bnc.cat/registres/CUCId/'..id..' '..(label or 'Catalonia')..']'..p.getCatForId( 'CANTIC' ) --no https as of 10/2019 | ||
end | |||
function p.canticnLink( id, label ) | |||
--P9984's format regex: 981(0|1)\d{9}06706 (e.g. 981058515460906706) | |||
if not id:match( '^981[0-1]%d%d%d%d%d%d%d%d%d06706$' ) then | |||
return false | |||
end | |||
return '[https://cantic.bnc.cat/registre/'..id..' '..(label or 'Catalonia')..']'..p.getCatForId( 'CANTICN' ) | |||
end | end | ||
function p.ccgLink( id, label ) | function p.ccgLink( id, label ) | ||
--P3920's format regex: ([NAIP])?[1-9]\d*(\.\d+)? (e.g. A1761) | --P3920's format regex: ([NAIP])?[1-9]\d*(\.\d+)? (e.g. A1761) | ||
if not id:match( '^[NAIP]?[1-9]%d*$' ) and | if not id:match( '^[NAIP]?[1-9]%d*$' ) and | ||
not id:match( '^[NAIP]?[1-9]%d*%.%d+$' ) then | not id:match( '^[NAIP]?[1-9]%d*%.%d+$' ) then | ||
return false | return false | ||
Line 256: | Line 266: | ||
end | end | ||
return '[https://www.daao.org.au/bio/'..id..' '..(label or 'Australian Artists')..']'..p.getCatForId( 'DAAO' ) | return '[https://www.daao.org.au/bio/'..id..' '..(label or 'Australian Artists')..']'..p.getCatForId( 'DAAO' ) | ||
end | |||
function p.dbiLink( id, label ) | |||
--P1986's format regex: [a-z]+(\-[a-z]+)*(_res\-[0-9a-f]{8}(\-[0-9a-f]{4}){3}\-[0-9a-f]{12})? (e.g. pietro-lombardo_res-ab60c9da-c50a-11e5-b181-00271042e8d9) | |||
local function dbi_is_valid (id) | |||
local part1, part2; | |||
if id:find ('_res', 1, true) then | |||
part1, part2 = id:match ('([^_]+)(_res.+)'); -- split at constant '_res'; part 2 nil when no constant '_res' | |||
else | |||
part1 = id; -- part2 not in target | |||
end | |||
if part1:find ('[^%-%l]') then -- if <part1> has anything but lowercase letters and hyphens | |||
return false; -- invalid so return false | |||
else -- here when <part1> has only lowercase letters and hyphens | |||
if part1:match ('^%-') or part1:match ('%-$') then -- first and last characters in <part1> must be lowercase letters | |||
return false; -- invalid so return false | |||
end | |||
end | |||
if part2 then | |||
if not part2:match ('^_res%-%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; -- invalid so return false | |||
end | |||
end | |||
return true; -- valid so return true | |||
end | |||
if not dbi_is_valid(id) then | |||
return false | |||
end | |||
return '[https://www.treccani.it/enciclopedia/'..id..'_(Dizionario-Biografico) '..(label or 'Italian People')..']'..p.getCatForId( 'DBI' ) | |||
end | end | ||
function p.dblpLink( id, label ) | function p.dblpLink( id, label ) | ||
--P2456's format regex: \d{2,3} /\d+(-\d+)? | --P2456's format regex: \d{2,3}\/\d+(-\d+)?[a-zA-Z-]*(-\d+)?|[a-z]\/[0-9A-Za-z]*(-\d+)? (e.g. 89/4185-p) | ||
if not id:match( '^%d%d%d? | if not id:match( '^%d%d%d?%/%d+-?[%d]*[%a]*-?[%d]*$' ) and | ||
not id:match( '^[%a]+%/[%w]*-?[%d]*$' ) then | |||
not id:match( '^[a | |||
return false | return false | ||
end | end | ||
Line 270: | Line 307: | ||
function p.dibLink( id, label ) | function p.dibLink( id, label ) | ||
--P6829's format regex: | --P6829's format regex: 0[01]\d{4}(\.[A-D])? (e.g. 001953) | ||
if not id:match( '^ | if not id:match( '^0[01]%d%d%d%d%.?[A-D]?$' ) then | ||
return false | return false | ||
end | end | ||
Line 283: | Line 320: | ||
end | end | ||
return '[http://www.uni-stuttgart.de/hi/gnt/dsi2/index.php?table_name=dsi&function=details&where_field=id&where_value='..id..' '..(label or 'Scientific illustrators')..']'..p.getCatForId( 'DSI' ) | return '[http://www.uni-stuttgart.de/hi/gnt/dsi2/index.php?table_name=dsi&function=details&where_field=id&where_value='..id..' '..(label or 'Scientific illustrators')..']'..p.getCatForId( 'DSI' ) | ||
end | |||
function p.dtbioLink( id, label ) | |||
--P7902's format regex: 1[0-9]{7,8}[0-9X] (e.g. 118554700) | |||
if not id:match( '^1[0-9]%d%d%d%d%d%d%d?[0-9X]$' ) then | |||
return false | |||
end | |||
return '[https://www.deutsche-biographie.de/pnd'..id..'.html?language=en '..(label or 'Germany')..']'..p.getCatForId( 'DTBIO' ) | |||
end | end | ||
Line 310: | Line 355: | ||
return false | return false | ||
end | end | ||
return '[https://d-nb.info/gnd/'..id..' '..(label or ' | return '[https://d-nb.info/gnd/'..id..' '..(label or 'Germany')..']'..p.getCatForId( 'GND' ) | ||
end | |||
function p.googleLink( id, label ) | |||
--P1960's format regex: [-_0-9A-Za-z]{12} (e.g. CUO0vDcAAAAJ) | |||
if not id:match( '^[%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u]$' ) then | |||
return false | |||
end | |||
return '[https://scholar.google.com/citations?user='..id..' '..(label or 'Google Scholar')..']'..p.getCatForId( 'Google Scholar' ) | |||
end | end | ||
Line 328: | Line 381: | ||
return '[https://www.iaaf.org/athletes/_/'..id..' '..(label or 'World Athletics')..']'..p.getCatForId( 'IAAF' ) | return '[https://www.iaaf.org/athletes/_/'..id..' '..(label or 'World Athletics')..']'..p.getCatForId( 'IAAF' ) | ||
end | end | ||
function p.iccuLink( id, label ) | function p.iccuLink( id, label ) | ||
--P396's format regex: | --P396's format regex: \D{2}[A-Z0-3]V\d{6} (e.g. CFIV000163) | ||
if not id:match( '^ | if not id:match( '^%u%u[%u0-3]V%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) | ||
return false | return false | ||
end | end | ||
return '[https://opac.sbn.it/ | return '[https://opac.sbn.it/nome/'..id..' '..(label or 'Italy')..']'..p.getCatForId( 'ICCU' ) | ||
end | end | ||
function p.iciaLink( id, label ) | function p.iciaLink( id, label ) | ||
--P1736's format regex: \d+ (e.g. 1) | --P1736's format regex: \d+ (e.g. 1) | ||
Line 360: | Line 412: | ||
end | end | ||
return '[https://isni.org/isni/'..id..' '..(label or 'ISNI')..']'..p.getCatForId( 'ISNI' ) | return '[https://isni.org/isni/'..id..' '..(label or 'ISNI')..']'..p.getCatForId( 'ISNI' ) | ||
end | |||
function p.j9uLink( id, label ) | |||
--P8189's format regex: 9870(0|1)\d{8}05171 (e.g. 987007305652505171) | |||
if not id:match( '^9870[0-1]%d%d%d%d%d%d%d%d05171$' ) then | |||
return false | |||
end | |||
return '[http://uli.nli.org.il/F/?func=find-b&local_base=NLX10&find_code=UID&request='..id..' '..(label or 'Israel')..']'..p.getCatForId( 'J9U' ) | |||
end | end | ||
Line 405: | Line 465: | ||
end | end | ||
function p. | function p.marinaMilitareLink( id, label ) | ||
-- | --P3863's format regex: [1-9]\d* (e.g. 3856) | ||
if | if id:match( '^[1-9]%d*$' ) then | ||
return '[http://www.marina.difesa.it/cosa-facciamo/per-la-difesa-sicurezza/fari/Pagine/'..id..'.aspx '..(label or 'Italy')..']'..p.getCatForId( 'Marina Militare' ) | |||
else | |||
return false | return false | ||
end | end | ||
end | end | ||
function p. | function p.mathsnLink( id, label ) | ||
-- | --P4955's format regex: [1-9]\d{4,6} (e.g. 175270) | ||
if not id:match( '^[1-9]%d%d%d%d | if not id:match( '^[1-9]%d%d%d%d%d?%d?$' ) then | ||
return false | return false | ||
end | end | ||
return '[https:// | return '[https://mathscinet.ams.org/mathscinet/MRAuthorID/'..id..' '..(label or 'MathSciNet')..']'..p.getCatForId( 'MATHSN' ) | ||
end | end | ||
Line 433: | Line 490: | ||
local cat = p.getCatForId( 'MusicBrainz' )--special cat name | local cat = p.getCatForId( 'MusicBrainz' )--special cat name | ||
if label then | if label then | ||
return '['..url..' '..label..']'..cat | return '['..url..' '..label..']'..cat | ||
else | else | ||
return '[[MBA (identifier)|MusicBrainz]] ['..url..' artist]'..cat | return '[[MBA (identifier)|MusicBrainz]] (['..url..' artist])'..cat | ||
end | end | ||
end | end | ||
Line 447: | Line 504: | ||
local cat = p.getCatForId( 'MusicBrainz area' )--special cat name | local cat = p.getCatForId( 'MusicBrainz area' )--special cat name | ||
if label then | if label then | ||
return '['..url..' '..label..']'..cat | return '['..url..' '..label..']'..cat | ||
else | else | ||
return '[[MBAREA (identifier)|MusicBrainz]] ['..url..' area]'..cat | return '[[MBAREA (identifier)|MusicBrainz]] (['..url..' area])'..cat | ||
end | end | ||
end | end | ||
Line 461: | Line 518: | ||
local cat = p.getCatForId( 'MusicBrainz instrument' )--special cat name | local cat = p.getCatForId( 'MusicBrainz instrument' )--special cat name | ||
if label then | if label then | ||
return '['..url..' '..label..']'..cat | return '['..url..' '..label..']'..cat | ||
else | else | ||
return '[[MBI (identifier)|MusicBrainz]] ['..url..' instrument]'..cat | return '[[MBI (identifier)|MusicBrainz]] (['..url..' instrument])'..cat | ||
end | end | ||
end | end | ||
Line 475: | Line 532: | ||
local cat = p.getCatForId( 'MusicBrainz label' )--special cat name | local cat = p.getCatForId( 'MusicBrainz label' )--special cat name | ||
if label then | if label then | ||
return '['..url..' '..label..']'..cat | return '['..url..' '..label..']'..cat | ||
else | else | ||
return '[[MBL (identifier)|MusicBrainz]] ['..url..' label]'..cat | return '[[MBL (identifier)|MusicBrainz]] (['..url..' label])'..cat | ||
end | end | ||
end | end | ||
Line 489: | Line 546: | ||
local cat = p.getCatForId( 'MusicBrainz place' )--special cat name | local cat = p.getCatForId( 'MusicBrainz place' )--special cat name | ||
if label then | if label then | ||
return '['..url..' '..label..']'..cat | return '['..url..' '..label..']'..cat | ||
else | else | ||
return '[[MBP (identifier)|MusicBrainz]] ['..url..' place]'..cat | return '[[MBP (identifier)|MusicBrainz]] (['..url..' place])'..cat | ||
end | end | ||
end | end | ||
Line 503: | Line 560: | ||
local cat = p.getCatForId( 'MusicBrainz release group' )--special cat name | local cat = p.getCatForId( 'MusicBrainz release group' )--special cat name | ||
if label then | if label then | ||
return '['..url..' '..label..']'..cat | return '['..url..' '..label..']'..cat | ||
else | else | ||
return '[[MBRG (identifier)|MusicBrainz]] ['..url..' release group]'..cat | return '[[MBRG (identifier)|MusicBrainz]] (['..url..' release group])'..cat | ||
end | end | ||
end | end | ||
Line 517: | Line 574: | ||
local cat = p.getCatForId( 'MusicBrainz series' )--special cat name | local cat = p.getCatForId( 'MusicBrainz series' )--special cat name | ||
if label then | if label then | ||
return '['..url..' '..label..']'..cat | return '['..url..' '..label..']'..cat | ||
else | else | ||
return '[[MBS (identifier)|MusicBrainz]] ['..url..' series]'..cat | return '[[MBS (identifier)|MusicBrainz]] (['..url..' series])'..cat | ||
end | end | ||
end | end | ||
Line 528: | Line 585: | ||
return false | return false | ||
end | end | ||
local url = 'https://musicbrainz.org/work/'..id | local url = 'https://musicbrainz.org/work/'..id | ||
local cat = p.getCatForId( 'MusicBrainz work' )--special cat name | local cat = p.getCatForId( 'MusicBrainz work' )--special cat name | ||
if label then | if label then | ||
return '['..url..' '..label..']'..cat | return '['..url..' '..label..']'..cat | ||
else | else | ||
return '[[MBW (identifier)|MusicBrainz]] ['..url..' work]'..cat | return '[[MBW (identifier)|MusicBrainz]] (['..url..' work])'..cat | ||
end | end | ||
end | end | ||
Line 543: | Line 600: | ||
return false | return false | ||
end | end | ||
return '[https:// | return '[https://www.mathgenealogy.org/id.php?id='..id..' '..(label or 'Mathematics Genealogy Project')..']'..p.getCatForId( 'MGP' ) | ||
end | |||
function p.mtLink( id, label ) | |||
--P3601's format regex: \d{10} (e.g. 1000004707) | |||
if id:match( '^%d%d%d%d%d%d%d%d%d%d$' ) then | |||
return '[https://www.marinetraffic.com/en/ais/details/lights/'..id..' '..(label or 'MarineTraffic')..']'..p.getCatForId( 'MarineTraffic' ) | |||
else | |||
return false | |||
end | |||
end | end | ||
Line 563: | Line 629: | ||
function p.ndlLink( id, label ) | function p.ndlLink( id, label ) | ||
--P349's format regex: 0?\d{8} (e.g. | --P349's format regex: (a1|s)?[0-9]?\d{8} (e.g. a1100016921) | ||
if not id:match( '^ | if not id:match( '^a1%d?%d%d%d%d%d%d%d%d' ) and | ||
not id:match( '^s?%d?%d%d%d%d%d%d%d%d' ) then | |||
return false | return false | ||
end | end | ||
Line 572: | Line 639: | ||
function p.ngaLink(id,label) | function p.ngaLink(id,label) | ||
--P3563's format rgex: 11[0-6]-\d+(\.\d+)? (e.g. 114-7721.2) | --P3563's format rgex: 11[0-6]-\d+(\.\d+)? (e.g. 114-7721.2) | ||
if not id:match('^11[0-6]%-%d+%.?%d*$') then | if not id:match( '^11[0-6]%-%d+%.?%d*$' ) then | ||
return false | return false | ||
end | end | ||
Line 608: | Line 675: | ||
end | end | ||
return '[https://data.nlg.gr/resource/authority/record'..id..' '..(label or 'Greece')..']'..p.getCatForId( 'NLG' ) | return '[https://data.nlg.gr/resource/authority/record'..id..' '..(label or 'Greece')..']'..p.getCatForId( 'NLG' ) | ||
end | end | ||
function p.nlkLink( id, label ) | function p.nlkLink( id, label ) | ||
--P5034's format regex: | --P5034's format regex: (KAB|KAC|KSH)([0-9]{4}|[0-9]{4}[a-zA-Z])[0-9]{4,6} (e.g. KAC201501465) | ||
if not id:match( '^ | if not id:match( '^KAB%d%d%d%d%a?%d%d%d%d%d?%d?$' ) and | ||
not id:match( '^KAC%d%d%d%d%a?%d%d%d%d%d?%d?$' ) and | |||
not id:match( '^KSH%d%d%d%d%a?%d%d%d%d%d?%d?$' ) then | |||
return false | return false | ||
end | end | ||
return '[https:// | return '[https://lod.nl.go.kr/resource/'..id..' '..(label or 'Korea')..']'..p.getCatForId( 'NLK' ) | ||
end | end | ||
Line 742: | Line 802: | ||
end | end | ||
return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request='..id..'&CON_LNG=ENG '..(label or 'Russia')..']'..p.getCatForId( 'RSL' ) --no https as of 9/2019 | return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request='..id..'&CON_LNG=ENG '..(label or 'Russia')..']'..p.getCatForId( 'RSL' ) --no https as of 9/2019 | ||
end | |||
function p.scopusLink( id, label ) | |||
--P1153's format regex: [1-9]\d{9,10} (e.g. 35247902700) | |||
if not id:match( '^[1-9]%d%d%d%d%d%d%d%d%d%d?$' ) then | |||
return false | |||
end | |||
return '[https://www.scopus.com/authid/detail.uri?authorId='..id..' '..(label or 'Scopus author')..']'..p.getCatForId( 'Scopus' ) | |||
end | end | ||
Line 774: | Line 842: | ||
end | end | ||
return '[https://www.idref.fr/'..id..' '..(label or 'SUDOC (France)')..']'..p.getCatForId( 'SUDOC' ) | return '[https://www.idref.fr/'..id..' '..(label or 'SUDOC (France)')..']'..p.getCatForId( 'SUDOC' ) | ||
end | end | ||
Line 794: | Line 854: | ||
function p.tdviaLink( id, label ) | function p.tdviaLink( id, label ) | ||
--P7314's format regex: [ | --P7314's format regex: [0-9a-z/-]+] (e.g. barkan-omer-lutfi) | ||
if not id:match( '^[ | if not id:match( '^[%d%l/-]+$' ) then | ||
return false | return false | ||
end | end | ||
return '[https://islamansiklopedisi.org.tr/'..id..' '..(label or ' | return '[https://islamansiklopedisi.org.tr/'..id..' '..(label or 'İslâm Ansiklopedisi')..']'..p.getCatForId( 'TDVİA' ) | ||
end | end | ||
function p.tepapaLink( id, label ) | function p.tepapaLink( id, label ) | ||
Line 812: | Line 871: | ||
function p.tlsLink( id, label ) | function p.tlsLink( id, label ) | ||
id = id:gsub(' +', '_') | id = id:gsub(' +', '_') | ||
--P1362's format regex: \p{Lu}[\p{L}\d_',\.\-\(\)\*/–]{3, | --P1362's format regex: \p{Lu}[\p{L}\d_',\.\-\(\)\*\/–&]{3,89} (e.g. Abcd) | ||
local class = "[% | --Mediawiki page title partial URL so consider validation with mw.title or "[^#<>%[%] {|}]" | ||
local idlen = | local class = "[%w_',%.%-%(%)%*%/–&]" | ||
if idlen < 4 or idlen > | local idlen = mw.ustring.len (id) | ||
if idlen < 4 or idlen > 90 then | |||
return false | return false | ||
end | end | ||
Line 855: | Line 915: | ||
return false | return false | ||
end | end | ||
return id..p.getCatForId( 'USCG' ) | return '[[USCG (identifier)|USCG]] ([https://www.navcen.uscg.gov/pdf/lightlists/LightList%20V'..mw.ustring.sub(id,1,1)..'.pdf '..id..'])'..p.getCatForId( 'USCG' ) | ||
end | end | ||
Line 887: | Line 947: | ||
function p.worldcatidLink( id, label ) | function p.worldcatidLink( id, label ) | ||
--P7859's format regex: viaf-\d+|lccn-n[a-z]?[0-9\-]+|n[ | --P7859's format regex: viaf-\d+|lccn-n[a-z]?[0-9\-]+|n[cps]-.+ (e.g. viaf-100181709, lccn-n78-95332, np-verbeck,%20william$1861) | ||
if not id:match( '^viaf%-%d+$' ) and | if not id:match( '^viaf%-%d+$' ) and | ||
not id:match( '^lccn%-n[a-z]?[0-9%-]+$' ) and | not id:match( '^lccn%-n[a-z]?[0-9%-]+$' ) and | ||
not id:match( '^n[ | not id:match( '^n[cps]%-.+$' ) then | ||
return false | return false | ||
end | end | ||
return '[https://www.worldcat.org/identities/'..mw.uri.encode(id, 'PATH')..'/ '..(label or 'WorldCat')..']'..p.getCatForId( 'WORLDCATID' ) | return '[https://www.worldcat.org/identities/'..mw.uri.encode(id, 'PATH')..'/ '..(label or 'WorldCat')..']'..p.getCatForId( 'WORLDCATID' ) | ||
end | |||
function p.zbmathLink( id, label ) | |||
--P1556's format regex: [a-z][a-z\-]*(\.[a-z][a-z\-]*)?(\.[0-9]*)? (e.g. turing.alan-m) | |||
local ps = {'%l[%l%-]*', '%.%l[%l%-]*', '%.%d*'} | |||
if not id:match( '^'..ps[1]..'$' ) and -- prefix with no capture options | |||
not id:match( '^'..ps[1]..ps[2]..'$' ) and -- prefix with first capture option | |||
not id:match( '^'..ps[1]..ps[3]..'$' ) and -- prefix with second capture option | |||
not id:match( '^'..ps[1]..ps[2]..ps[3]..'$' ) then -- prefix and both capture options | |||
return false | |||
end | |||
return '[https://zbmath.org/authors/?q=ai:'..id..' '..(label or 'zbMATH')..']'..p.getCatForId( 'ZBMATH' ) | |||
end | end | ||
Line 952: | Line 1,024: | ||
function p.getIdsFromWikidata( itemId, property ) | function p.getIdsFromWikidata( itemId, property ) | ||
local ids = {} | local ids = {} | ||
if not mw.wikibase then | |||
return ids | |||
end | |||
local statements = mw.wikibase.getBestStatements( itemId, property ) | local statements = mw.wikibase.getBestStatements( itemId, property ) | ||
if statements then | if statements then | ||
Line 961: | Line 1,036: | ||
end | end | ||
return ids | return ids | ||
end | |||
function p.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 | end | ||
-- Creates a human-readable standalone wikitable version of p.conf, and tracking categories with page counts, for use in the documentation | -- Creates a human-readable standalone wikitable version of p.conf, and tracking categories with page counts, for use in the documentation | ||
function p.docConfTable( frame ) | function p.docConfTable( frame ) | ||
local wikiTable = ' | 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 lang = mw.getContentLanguage() | ||
local a | local a, f, P = 0, 0, 0 --cumulative sums | ||
for _, conf in pairs( p.conf ) do | for _, conf in pairs( p.conf ) do | ||
local param, pid, section = conf[1], conf[2], conf[4] | local param, pid, section = conf[1], conf[2], conf[4] | ||
Line 993: | Line 1,072: | ||
--cats | --cats | ||
local articleCat = 'Articles with '..category..' identifiers' | local articleCat = 'Articles with '..category..' identifiers' | ||
local faultyCat = 'Articles with faulty '..category..' identifiers' | local faultyCat = 'Articles with faulty '..category..' identifiers' | ||
--counts | --counts | ||
local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') ) | local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') ) | ||
local faultyCount = lang:formatNum( mw.site.stats.pagesInCategory(faultyCat, 'pages') ) | local faultyCount = lang:formatNum( mw.site.stats.pagesInCategory(faultyCat, 'pages') ) | ||
--calcs | --calcs | ||
P = P + 1 --property count | P = P + 1 --property count | ||
a = a + lang:parseFormattedNumber(articleCount) | a = a + lang:parseFormattedNumber(articleCount) | ||
f = f + lang:parseFormattedNumber(faultyCount) | f = f + lang:parseFormattedNumber(faultyCount) | ||
--concat | --concat | ||
wikiTable = wikiTable..' | 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;">'..p.checkcat(articleCat,articleCount)..'</td>'.. | |||
'<td style="text-align: right;">'..p.checkcat(faultyCat,faultyCount)..'</td></tr>' | |||
end | end | ||
--append derivative WorldCat cats | --append derivative WorldCat cats | ||
local wcd = { 'WorldCat-LCCN', 'WorldCat-VIAF' } | local wcd = { 'WorldCat-LCCN', 'WorldCat-VIAF' } | ||
Line 1,025: | Line 1,094: | ||
local articleCat = 'Articles with '..w..' identifiers' | local articleCat = 'Articles with '..w..' identifiers' | ||
local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') ) | local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') ) | ||
local appearsAs | local appearsAs | ||
if w == 'WorldCat-LCCN' then | if w == 'WorldCat-LCCN' then | ||
appearsAs = '[https://www.worldcat.org/identities/lccn-n79-113947 WorldCat (via Library of Congress)]' | appearsAs = '[https://www.worldcat.org/identities/lccn-n79-113947 WorldCat (via Library of Congress)]' | ||
Line 1,032: | Line 1,101: | ||
end | end | ||
a = a + lang:parseFormattedNumber(articleCount) | a = a + lang:parseFormattedNumber(articleCount) | ||
wikiTable = wikiTable..' | wikiTable = wikiTable..'<tr><td>-</td>'.. | ||
'<td>General</td>'.. | |||
'<td>'..appearsAs..'</td>'.. | |||
'<td data-sort-value='..w..'>—</td>'.. | |||
'<td style="text-align: right;">[[:Category:'..articleCat..'|'..articleCount..']]</td>'.. | |||
'<td style="text-align: right;">—</td></tr>' | |||
end | end | ||
--append sums | --append sums | ||
wikiTable = wikiTable..' | 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) | |||
return require('Module:Suppress categories').main(wikiTable) | |||
end | end | ||
Line 1,066: | Line 1,127: | ||
-- p.conf table basic format: { 'parameter name', propertyId # in Wikidata, formatting/validation function, section, example ID for documentation } | -- p.conf table basic format: { 'parameter name', propertyId # in Wikidata, formatting/validation function, section, example ID for documentation } | ||
-- p.conf table optional named parameters: | -- p.conf table optional named parameters: | ||
-- link: to override the link in the documentation (defaults to "<parameter> (identifer)") | -- link: to override the link in the documentation (defaults to "<parameter> (identifer)") | ||
-- category: to override the ID in category names (defaults to "... with <parameter> identifiers") | -- category: to override the ID in category names (defaults to "... with <parameter> identifiers") | ||
Line 1,084: | Line 1,145: | ||
{ 'BNE', 950, p.bneLink, 'National libraries', 'XX1234567' }, | { 'BNE', 950, p.bneLink, 'National libraries', 'XX1234567' }, | ||
{ 'BNF', 268, p.bnfLink, 'National libraries', '123456789' }, | { 'BNF', 268, p.bnfLink, 'National libraries', '123456789' }, | ||
{ 'BNMM', 3788, p.bnmmLink, 'National libraries', '000024044' }, | |||
{ 'Botanist', 428, p.botanistLink , 'Scientific databases', 'L.' }, | { 'Botanist', 428, p.botanistLink , 'Scientific databases', 'L.' }, | ||
{ 'BPN', 651, p.bpnLink , 'Biographical dictionaries', '12345678' }, | { 'BPN', 651, p.bpnLink , 'Biographical dictionaries', '12345678' }, | ||
{ 'CANTIC', 1273, p.canticLink, 'National libraries', 'a12345678' }, | { 'CANTIC', 1273, p.canticLink, 'National libraries', 'a12345678' }, | ||
{ 'CANTICN', 9984, p.canticnLink, 'National libraries', '981058515460906706' }, | |||
{ 'CCG', 3920, p.ccgLink, 'Lighthouse identifiers', 'A1761', prefix='[[CCG (identifier)|CCG]]' }, | { 'CCG', 3920, p.ccgLink, 'Lighthouse identifiers', 'A1761', prefix='[[CCG (identifier)|CCG]]' }, | ||
{ 'CINII', 271, p.ciniiLink, 'Scientific databases', 'DA12345678', link = 'CiNii (identifier)' }, | { 'CINII', 271, p.ciniiLink, 'Scientific databases', 'DA12345678', link = 'CiNii (identifier)' }, | ||
{ 'CWGC', 1908, p.cwgcLink, 'Other', '1234567' }, | { 'CWGC', 1908, p.cwgcLink, 'Other', '1234567' }, | ||
{ 'DAAO', 1707, p.daaoLink, 'Art research institutes', 'rolf-harris' }, | { 'DAAO', 1707, p.daaoLink, 'Art research institutes', 'rolf-harris' }, | ||
{ 'DBI', 1986, p.dbiLink, 'Biographical dictionaries', 'dante-alighieri' }, | |||
{ 'DBLP', 2456, p.dblpLink, 'Scientific databases', '123/123' }, | { 'DBLP', 2456, p.dblpLink, 'Scientific databases', '123/123' }, | ||
{ 'DIB', 6829, p.dibLink, 'Biographical dictionaries', ' | { 'DIB', 6829, p.dibLink, 'Biographical dictionaries', '001953' }, | ||
{ 'DSI', 2349, p.dsiLink, 'Art research institutes', '1538' }, | { 'DSI', 2349, p.dsiLink, 'Art research institutes', '1538' }, | ||
{ 'DTBIO', 7902, p.dtbioLink, 'Biographical dictionaries', '118554700' }, | |||
{ 'EMU', 4613, p.emuLink, 'National libraries', '15409' }, | { 'EMU', 4613, p.emuLink, 'National libraries', '15409' }, | ||
{ 'FAST', 2163, p.fastLink, 'Other', '1' }, | { 'FAST', 2163, p.fastLink, 'Other', '1' }, | ||
{ 'FNZA', 6792, p.fnzaLink, 'Art research institutes', '12' }, | { 'FNZA', 6792, p.fnzaLink, 'Art research institutes', '12' }, | ||
{ 'GND', 227, p.gndLink, ' | { 'GND', 227, p.gndLink, 'National libraries', '4079154-3' }, | ||
{ 'Google Scholar', 1960, p.googleLink, 'Scientific databases', 'QPdLuj8AAAAJ' }, | |||
{ 'HDS', 902, p.hdsLink, 'Other', '050123' }, | { 'HDS', 902, p.hdsLink, 'Other', '050123' }, | ||
{ 'IAAF', 1146, p.iaafLink, 'Other', '123' }, | { 'IAAF', 1146, p.iaafLink, 'Other', '123' }, | ||
{ 'ICCU', 396, p.iccuLink, 'National libraries', ' | { 'ICCU', 396, p.iccuLink, 'National libraries', 'CFIV000163' }, --formerly SBN | ||
{ 'ICIA', 1736, p.iciaLink, 'Art research institutes', '1' }, | { 'ICIA', 1736, p.iciaLink, 'Art research institutes', '1' }, | ||
{ 'IEU', 9070, p.ieuLink, 'Other', 'N\\A\\NationalAcademyofArtandArchitecture' }, | { 'IEU', 9070, p.ieuLink, 'Other', 'N\\A\\NationalAcademyofArtandArchitecture' }, | ||
{ 'ISNI', 213, p.isniLink, 'General', '0000-0000-6653-4145', prefix = '[[ISNI (identifier)|ISNI]]' }, | { 'ISNI', 213, p.isniLink, 'General', '0000-0000-6653-4145', prefix = '[[ISNI (identifier)|ISNI]]' }, | ||
{ 'J9U', 8189, p.j9uLink, 'National libraries', '987007305652505171' }, | |||
{ 'Joconde', 347, p.jocondeLink, 'Art research institutes', '12345678901' }, | { 'Joconde', 347, p.jocondeLink, 'Art research institutes', '12345678901' }, | ||
{ 'KULTURNAV', 1248, p.kulturnavLink, 'Art research institutes', '12345678-1234-1234-1234-1234567890AB', link = 'KulturNav (identifier)' }, | { 'KULTURNAV', 1248, p.kulturnavLink, 'Art research institutes', '12345678-1234-1234-1234-1234567890AB', link = 'KulturNav (identifier)' }, | ||
Line 1,109: | Line 1,176: | ||
{ 'LIR', 886, p.lirLink, 'Other', '1' }, | { 'LIR', 886, p.lirLink, 'Other', '1' }, | ||
{ 'LNB', 1368, p.lnbLink, 'National libraries', '123456789' }, | { 'LNB', 1368, p.lnbLink, 'National libraries', '123456789' }, | ||
{ ' | { 'Marina Militare', 3863, p.marinaMilitareLink, 'Lighthouse identifiers', '3856' }, | ||
{ ' | { 'MarineTraffic', 3601, p.mtLink, 'Lighthouse identifiers', '1000004707' }, | ||
{ 'MATHSN', 4955, p.mathsnLink, 'Scientific databases', '175270' }, | |||
{ 'MBA', 434, p.mbaLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz' }, --special cat name | { 'MBA', 434, p.mbaLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz' }, --special cat name | ||
{ 'MBAREA', 982, p.mbareaLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz area' }, --special cat name | { 'MBAREA', 982, p.mbareaLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz area' }, --special cat name | ||
Line 1,128: | Line 1,196: | ||
{ 'NLA', 409, p.nlaLink, 'National libraries', '123456789012' }, | { 'NLA', 409, p.nlaLink, 'National libraries', '123456789012' }, | ||
{ 'NLG', 3348, p.nlgLink, 'National libraries', '12345678' }, | { 'NLG', 3348, p.nlgLink, 'National libraries', '12345678' }, | ||
{ 'NLK', 5034, p.nlkLink, 'National libraries', 'KAB197000000' }, | { 'NLK', 5034, p.nlkLink, 'National libraries', 'KAB197000000' }, | ||
{ 'NLP', 1695, p.nlpLink, 'National libraries', '9810123456789012345' }, | { 'NLP', 1695, p.nlpLink, 'National libraries', '9810123456789012345' }, | ||
Line 1,144: | Line 1,211: | ||
{ 'RKDID', 350, p.rkdidLink, 'Art research institutes', '123456' }, | { 'RKDID', 350, p.rkdidLink, 'Art research institutes', '123456' }, | ||
{ 'RSL', 947, p.rslLink, 'National libraries', '123456789' }, | { 'RSL', 947, p.rslLink, 'National libraries', '123456789' }, | ||
{ 'Scopus', 1153, p.scopusLink, 'Scientific databases', '7005487412' }, | |||
{ 'SELIBR', 906, p.selibrLink, 'National libraries', '123456' }, | { 'SELIBR', 906, p.selibrLink, 'National libraries', '123456' }, | ||
{ 'SIKART', 781, p.sikartLink, 'Art research institutes', '123456789' }, | { 'SIKART', 781, p.sikartLink, 'Art research institutes', '123456789' }, | ||
{ 'SNAC-ID', 3430, p.snacLink, 'Other', 'A' }, | { 'SNAC-ID', 3430, p.snacLink, 'Other', 'A' }, | ||
{ 'SUDOC', 269, p.sudocLink, 'Other', '026927608', prefix = '[[SUDOC (identifier)|SUDOC (France)]]' }, | { 'SUDOC', 269, p.sudocLink, 'Other', '026927608', prefix = '[[SUDOC (identifier)|SUDOC (France)]]' }, | ||
{ 'TA98', 1323, p.ta98Link, 'Scientific databases', 'A12.3.45.678' }, | { 'TA98', 1323, p.ta98Link, 'Scientific databases', 'A12.3.45.678' }, | ||
{ 'TDVİA', 7314, p.tdviaLink, 'Other', 'asim-b-behdele' }, | { 'TDVİA', 7314, p.tdviaLink, 'Other', 'asim-b-behdele' }, | ||
Line 1,156: | Line 1,223: | ||
{ 'UKPARL', 6213, p.ukparlLink, 'Other', 'AQUupyiR' }, | { 'UKPARL', 6213, p.ukparlLink, 'Other', 'AQUupyiR' }, | ||
{ 'ULAN', 245, p.ulanLink, 'Art research institutes', '500123456' }, | { 'ULAN', 245, p.ulanLink, 'Art research institutes', '500123456' }, | ||
{ 'USCG', 3723, p.uscgLink, 'Lighthouse identifiers', '6-0695 | { 'USCG', 3723, p.uscgLink, 'Lighthouse identifiers', '6-0695'}, | ||
{ 'USCongress', 1157, p.uscongressLink, 'Other', 'A000123', link = 'US Congress (identifier)' }, | { 'USCongress', 1157, p.uscongressLink, 'Other', 'A000123', link = 'US Congress (identifier)' }, | ||
{ 'VcBA', 8034, p.vcbaLink, 'National libraries', '494/9793' }, | { 'VcBA', 8034, p.vcbaLink, 'National libraries', '494/9793' }, | ||
{ 'VIAF', 214, p.viafLink, 'General', '123456789', prefix = '[[VIAF (identifier)|VIAF]]' }, | { 'VIAF', 214, p.viafLink, 'General', '123456789', prefix = '[[VIAF (identifier)|VIAF]]' }, | ||
{ 'WORLDCATID', 7859, p.worldcatidLink, 'General', 'lccn-n78-95332', link = 'WorldCat Identities (identifier)' }, | { 'WORLDCATID', 7859, p.worldcatidLink, 'General', 'lccn-n78-95332', link = 'WorldCat Identities (identifier)' }, | ||
{ 'ZBMATH', 1556, p.zbmathLink, 'Scientific databases', 'turing.alan-m' }, | |||
} | } | ||
Line 1,167: | Line 1,235: | ||
p.aliases = { | p.aliases = { | ||
{ 'DNB', 'GND' }, --Deutsche Nationalbibliothek -> Gemeinsame Normdatei | { 'DNB', 'GND' }, --Deutsche Nationalbibliothek -> Gemeinsame Normdatei | ||
{ 'MusicBrainz', 'MBA' }, | { 'MusicBrainz', 'MBA' }, | ||
{ 'MusicBrainz artist', 'MBA' }, | { 'MusicBrainz artist', 'MBA' }, | ||
Line 1,207: | Line 1,273: | ||
local sameOnWDCat = '' | local sameOnWDCat = '' | ||
local stateCat = '' | local stateCat = '' | ||
--redirect aliases to proper parameter names | --redirect aliases to proper parameter names | ||
for _, a in pairs( p.aliases ) do | for _, a in pairs( p.aliases ) do | ||
Line 1,215: | Line 1,281: | ||
end | end | ||
end | end | ||
--redirect deprecated parameters to proper parameter names, and assign tracking cat | --redirect deprecated parameters to proper parameter names, and assign tracking cat | ||
for _, d in pairs( p.deprecated ) do | for _, d in pairs( p.deprecated ) do | ||
Line 1,226: | Line 1,292: | ||
end | end | ||
end | end | ||
--use QID= parameter for testing/example purposes only | --use QID= parameter for testing/example purposes only | ||
local itemId = nil | local itemId = nil | ||
Line 1,235: | Line 1,301: | ||
itemId = resolveEntity._id(itemId) --nil if unresolvable | itemId = resolveEntity._id(itemId) --nil if unresolvable | ||
end | end | ||
elseif mw.wikibase then | |||
itemId = mw.wikibase.getEntityIdForCurrentPage() | itemId = mw.wikibase.getEntityIdForCurrentPage() | ||
end | end | ||
--Wikidata fallback if available | --Wikidata fallback if available | ||
if itemId then | if itemId then | ||
Line 1,282: | Line 1,348: | ||
end | end | ||
end | end | ||
--configure rows | --configure rows | ||
local rct = 0 | local rct = 0 | ||
Line 1,305: | Line 1,371: | ||
['Other'] = {} | ['Other'] = {} | ||
} | } | ||
--don't show CANTIC if CANTICN is present, since they both go to the Library of Catalonia | |||
--and the library has deprecated CANTIC IDs in favor of CANTICN IDs | |||
if parentArgs.CANTICN or parentArgs.canticn then | |||
parentArgs.CANTIC = '' | |||
parentArgs.cantic = '' | |||
end | |||
--don't show NLP if PLWABN is present, since they both go to the National Library of Poland | --don't show NLP if PLWABN is present, since they both go to the National Library of Poland | ||
--and the library has deprecated NLP IDs in favor of PLWABN IDs | --and the library has deprecated NLP IDs in favor of PLWABN IDs | ||
Line 1,316: | Line 1,388: | ||
if val and val ~= '' and type(params[3]) == 'function' then | if val and val ~= '' and type(params[3]) == 'function' then | ||
table.insert( tval, val ) | table.insert( tval, val ) | ||
if params.prefix then | if params.prefix then | ||
table.insert( tlinks, params[3]( val, '1' ) ) | table.insert( tlinks, params[3]( val, '1' ) ) | ||
else | else | ||
Line 1,346: | Line 1,418: | ||
end | end | ||
end | end | ||
end | end | ||
--WorldCat-VIAF & WorldCat-LCCN | --WorldCat-VIAF & WorldCat-LCCN | ||
local worldcatId = parentArgs['worldcatid'] or parentArgs['WORLDCATID'] | local worldcatId = parentArgs['worldcatid'] or parentArgs['WORLDCATID'] | ||
Line 1,356: | Line 1,428: | ||
if viafId and viafId ~= '' and p.viafLink( viafId ) then --VIAF must be present, unsuppressed, & validated | if viafId and viafId ~= '' and p.viafLink( viafId ) then --VIAF must be present, unsuppressed, & validated | ||
table.insert( sections['General'], p.createRow( 'VIAF', viafId, '[https://www.worldcat.org/identities/containsVIAFID/'..viafId..' WorldCat (via VIAF)]', nil, false ) ) | table.insert( sections['General'], p.createRow( 'VIAF', viafId, '[https://www.worldcat.org/identities/containsVIAFID/'..viafId..' WorldCat (via VIAF)]', nil, false ) ) | ||
if namespace == 0 then | if namespace == 0 then | ||
worldcatCat = '[[Category:Articles with WorldCat-VIAF identifiers]]' | worldcatCat = '[[Category:Articles with WorldCat-VIAF identifiers]]' | ||
end | end | ||
Line 1,372: | Line 1,444: | ||
end | end | ||
end | end | ||
--configure Navbox | --configure Navbox | ||
local outString = '' | local outString = '' | ||
Line 1,384: | Line 1,456: | ||
local sectionID = 1 | local sectionID = 1 | ||
local args = { pid = 'identifiers' } -- #target the list of identifiers | local args = { pid = 'identifiers' } -- #target the list of identifiers | ||
if testcases and itemId then args | if testcases and itemId then args.qid = itemId end --expensive | ||
local pencil = | local pencil = require('Module:EditAtWikidata')._showMessage(args) | ||
local navboxArgs = { | local navboxArgs = { | ||
name = 'Authority control', | name = 'Authority control', | ||
Line 1,417: | Line 1,489: | ||
-- since "general" is redundant and "other" is silly when there's nothing to contrast it with | -- since "general" is redundant and "other" is silly when there's nothing to contrast it with | ||
navboxArgs.group1 = '[[Help:Authority control|Authority control]]'..pencil | navboxArgs.group1 = '[[Help:Authority control|Authority control]]'..pencil | ||
else | else | ||
navboxArgs.group1 = '[[Help:Authority control|Authority control: '..sect..']] '..pencil | navboxArgs.group1 = '[[Help:Authority control|Authority control: '..sect..']] '..pencil | ||
end | end | ||
Line 1,423: | Line 1,495: | ||
outString = Navbox._navbox(navboxArgs) | outString = Navbox._navbox(navboxArgs) | ||
end | end | ||
--auxCats | --auxCats | ||
if rct == 0 or rct >= 25 then | if rct == 0 or rct >= 25 then | ||
Line 1,447: | Line 1,519: | ||
auxCats = mw.ustring.gsub(auxCats, '(%[%[)(Category)', '%1:%2') --for easier checking | auxCats = mw.ustring.gsub(auxCats, '(%[%[)(Category)', '%1:%2') --for easier checking | ||
end | end | ||
--out | --out | ||
outString = outString..auxCats | outString = outString..auxCats | ||
Line 1,453: | Line 1,525: | ||
outString = mw.ustring.gsub(outString, '(%[%[)(Category:Articles)', '%1:%2') --by definition | outString = mw.ustring.gsub(outString, '(%[%[)(Category:Articles)', '%1:%2') --by definition | ||
end | end | ||
return outString | return outString | ||
end | end | ||
return p | return p |
Revision as of 16:34, 30 November 2022
This Lua module is used on approximately 2,010,000 pages, or roughly 14060% 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.
This module depends on the following other modules: |
This module contains the code of the {{Authority control}} template. See its documentation.
Parameters, Wikidata properties, and tracking categories
Lua error at line 1077: 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') --[[==========================================================================]] --[[ Category functions ]] --[[==========================================================================]] local function addCat( cat ) if cat and cat ~= '' then return '[[Category:'..cat..']]'..p.redCatLink(cat) end return '' end function p.getCatForId( id ) local cat = '' if namespace == 0 then cat = 'Articles with '..id..' identifiers' end return addCat(cat) end function p.redCatLink( cat ) --cat == 'Blah' (not 'Category:Blah', not '[[Category:Blah]]') if cat and cat ~= '' and testcases == false and mw.title.new(cat, 14).exists == false then return '[[Category:Pages with red-linked authority control categories]]' end return '' end function p.createRow( id, rawValues, link, links, withUid, specialCat, prefix) local faultyCat = 'Articles with faulty '..(specialCat or id)..' identifiers' if links then -- all links[] use withUid = false; no check needed local row = '' if prefix then row = row..'*'..prefix end for i, l in ipairs( links ) do if i == 1 and not prefix then row = row..'*' else row = row..'\n**' end if l then row = row..'<span class="uid">'..l..'</span>' else row = row..'<span class="error">The '..id..' id '..rawValues[i]..' is not valid.</span>'..addCat(faultyCat) end end return row..'\n' elseif link then -- All IDs that have a prefix support multiple identifiers, so prefix is not needed if withUid then return '*<span class="nowrap"><span class="uid">'..link..'</span></span>\n' end return '*<span class="nowrap">'..link..'</span>\n' end return '* <span class="error">The '..id..' id '..rawValues..' is not valid.</span>'..addCat(faultyCat)..'\n' end --[[==========================================================================]] --[[ Property formatting functions ]] --[[==========================================================================]] -- If a link has a suitable entry in the global inter-wiki prefix table at [[:m:Interwiki_map]], -- please consider routing through this prefix rather than as external link URL. -- This will ease future maintenance as necessary updates to the link can be centrally carried out there rather than by updating this module. -- The "external link" icon would disappear for such entries. function p.aagLink( id, label) --P3372's format regex: \d+ (e.g. 1) if not id:match( '^%d+$' ) then return false end return '[https://www.aucklandartgallery.com/explore-art-and-ideas/artist/'..id..'/ '..(label or 'Auckland')..']'..p.getCatForId( 'AAG' ) end function p.acmLink( id, label ) --P864's format regex: \d{11} (e.g. 12345678901) if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d$' ) then return false end return '[https://dl.acm.org/profile/'..id..' '..(label or 'Association for Computing Machinery')..']'..p.getCatForId( 'ACM-DL' ) end function p.adbLink( id, label ) --P1907's format regex: [a-z][-a-z]+-([1-3]\d|[1-9])\d{0,3} (e.g. barton-sir-edmund-toby-71) if not id:match( '^[a-z][-a-z]+-[1-3]%d%d?%d?%d?$' ) and not id:match( '^[a-z][-a-z]+-[1-9]%d?%d?%d?$' ) then return false end return '[http://adb.anu.edu.au/biography/'..id..' '..(label or 'Australia')..']'..p.getCatForId( 'ADB' ) end function p.admiraltyLink(id,label) --P3562's format regex: [A-Q]\d{4}(\.\d+)? (e.g. D1204.1) if not id:match('^[A-Q]%d%d%d%d$') and not id:match('^[A-Q]%d%d%d%d%.%d+$') then return false end return id..p.getCatForId( 'admiralty' ) end function p.agsaLink( id, label ) --P6804's format regex: [1-9]\d* (e.g. 3625) if not id:match( '^[1-9]%d*$' ) then return false end return '[https://www.agsa.sa.gov.au/collection-publications/collection/creators/_/'..id..'/ '..(label or 'South Australia')..']'..p.getCatForId( 'AGSA' ) end function p.ARLHSLink(id,label) --P2980's format regex: [A-Z]{3}\d{3,4}[A-Z]?| e.g. LAT023 if not id:match('^[A-Z][A-Z][A-Z]%d%d%d%d?[A-Z]?$') then return false end return '[http://wlol.arlhs.com/lighthouse/'..id..'.html '..(label or 'ARLHS')..']'..p.getCatForId( 'ARLHS' ) end function p.autoresuyLink( id, label ) --P2558's format regex: [1-9]\d{0,4} (e.g. 12345) if not id:match( '^[1-9]%d?%d?%d?%d?$' ) then return false end return '[https://autores.uy/autor/'..id..' '..(label or 'Uruguay')..']'..p.getCatForId( 'autores.uy' ) end function p.awrLink( id, label ) --P4186's format regex: (([A-Z]{3}\d{4})|([A-Z]{2}\d{5}))[a-z] (e.g. PR00768b) if not id:match( '^[A-Z][A-Z][A-Z]%d%d%d%d[a-z]$' ) and not id:match( '^[A-Z][A-Z]%d%d%d%d%d[a-z]$' ) then return false end return '[http://www.womenaustralia.info/biogs/'..id..'.htm '..(label or 'Australian Women\'s Register')..']'..p.getCatForId( 'AWR' ) end function p.bibsysLink( id, label ) --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 id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?$' ) and not id:match( '^[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..' '..(label or 'Norway')..']'..p.getCatForId( 'BIBSYS' ) end function p.bildLink( id, label ) --P2092's format regex: \d+ (e.g. 1) if not id:match( '^%d+$' ) then return false end return '[https://www.bildindex.de/document/obj'..id..' '..(label or 'Bildindex (Germany)')..']'..p.getCatForId( 'Bildindex' ) end function p.bncLink( id, label ) --P1890's format regex: \d{9} (e.g. 123456789) if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then return false end return '[http://www.bncatalogo.cl/F?func=direct&local_base=red10&doc_number='..id..' '..(label or 'Chile')..']'..p.getCatForId( 'BNC' ) end function p.bneLink( id, label ) --P950's format regex: (XX|FF|a)\d{4,7}|(bima|bimo|bica|bis[eo]|bivi|Mise|Mimo|Mima)\d{10} (e.g. XX1234567) if not id:match( '^[XF][XF]%d%d%d%d%d?%d?%d?$' ) and not id:match( '^a%d%d%d%d%d?%d?%d?$' ) and not id:match( '^bi[mcsv][aoei]%d%d%d%d%d%d%d%d%d%d$' ) and not id:match( '^Mi[sm][eoa]%d%d%d%d%d%d%d%d%d%d$' ) then return false end return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id='..id..' '..(label or 'Spain')..']'..p.getCatForId( 'BNE' ) --no https as of 9/2019 end function p.bnfLink( id, label ) --P268's format regex: \d{8}[0-9bcdfghjkmnpqrstvwxz] (e.g. 123456789) if not id:match( '^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 id:match( '^cb.+$' ) then id = 'cb'..id end return '[https://catalogue.bnf.fr/ark:/12148/'..id..' '..(label or 'France')..'] [https://data.bnf.fr/ark:/12148/'..id..' (data)]'..p.getCatForId( 'BNF' ) end function p.bnmmLink( id, label ) --P3788's format regex: \d{9} (e.g. 000024044) if id:match( '^%d%d%d%d%d%d%d%d%d$' ) then return '[https://catalogo.bn.gov.ar/F/?func=direct&local_base=BNA10&doc_number='..id..' '..(label or 'Argentina')..']'..p.getCatForId( 'BNMM' ) else return false end end function p.botanistLink( id, label ) --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... if not mw.ustring.match( id, "^[%u%l%d%. '-]+$" ) then --better than nothing return false end id = id:gsub(' +', '%%20') return '[https://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation='..id..' '..(label or 'International Plant Names Index')..']'..p.getCatForId( 'Botanist' ) end function p.bpnLink( id, label ) --P651's format regex: \d{6,8} (e.g. 00123456) if not id:match( '^%d%d%d%d%d%d%d%d$' ) and --original format regex, changed 8/2019 to not id:match( '^0?%d%d%d%d%d%d%d$' ) and --allow 1-2 leading 0s, allowed by the website not id:match( '^0?0?%d%d%d%d%d%d$' ) then return false end return '[http://www.biografischportaal.nl/en/persoon/'..id..' '..(label or 'Netherlands')..']'..p.getCatForId( 'BPN' ) --no https as of 9/2019 end function p.canticLink( id, label ) --P1273's format regex: a\d{7}[0-9x] (e.g. a10640745) if not id:match( '^a%d%d%d%d%d%d%d[%dx]$' ) then return false end return '[http://cantic.bnc.cat/registres/CUCId/'..id..' '..(label or 'Catalonia')..']'..p.getCatForId( 'CANTIC' ) --no https as of 10/2019 end function p.canticnLink( id, label ) --P9984's format regex: 981(0|1)\d{9}06706 (e.g. 981058515460906706) if not id:match( '^981[0-1]%d%d%d%d%d%d%d%d%d06706$' ) then return false end return '[https://cantic.bnc.cat/registre/'..id..' '..(label or 'Catalonia')..']'..p.getCatForId( 'CANTICN' ) end function p.ccgLink( id, label ) --P3920's format regex: ([NAIP])?[1-9]\d*(\.\d+)? (e.g. A1761) if not id:match( '^[NAIP]?[1-9]%d*$' ) and not id:match( '^[NAIP]?[1-9]%d*%.%d+$' ) then return false end return id..p.getCatForId( 'CCG' ) end function p.ciniiLink( id, label ) --P271's format regex: DA\d{7}[\dX] (e.g. DA12345678) if not id:match( '^DA%d%d%d%d%d%d%d[%dX]$' ) then return false end return '[https://ci.nii.ac.jp/author/'..id..'?l=en '..(label or 'CiNii (Japan)')..']'..p.getCatForId( 'CINII' ) end function p.cwgcLink( id, label ) --P1908's format regex: [1-9]\d* (e.g. 75228351) if not id:match( '^[1-9]%d*$' ) then return false end return '[https://www.cwgc.org/find-war-dead/casualty/'..id..'/ '..(label or 'Commonwealth War Graves Commission')..']'..p.getCatForId( 'CWGC' ) end function p.emuLink( id, label ) --P4613's format regex: \d{1,6} (e.g. 15409 (or 015409)) if not id:match( '^%d%d?%d?%d?%d?%d?$' ) then return false end return '[http://esu.com.ua/search_articles.php?id='..id..' '..(label or 'Ukraine')..']'..p.getCatForId( 'EMU' ) end function p.daaoLink( id, label ) --P1707's format regex: [a-z\-]+\d* (e.g. rolf-harris) if not id:match( '^[a-z%-]+%d*$' ) then return false end return '[https://www.daao.org.au/bio/'..id..' '..(label or 'Australian Artists')..']'..p.getCatForId( 'DAAO' ) end function p.dbiLink( id, label ) --P1986's format regex: [a-z]+(\-[a-z]+)*(_res\-[0-9a-f]{8}(\-[0-9a-f]{4}){3}\-[0-9a-f]{12})? (e.g. pietro-lombardo_res-ab60c9da-c50a-11e5-b181-00271042e8d9) local function dbi_is_valid (id) local part1, part2; if id:find ('_res', 1, true) then part1, part2 = id:match ('([^_]+)(_res.+)'); -- split at constant '_res'; part 2 nil when no constant '_res' else part1 = id; -- part2 not in target end if part1:find ('[^%-%l]') then -- if <part1> has anything but lowercase letters and hyphens return false; -- invalid so return false else -- here when <part1> has only lowercase letters and hyphens if part1:match ('^%-') or part1:match ('%-$') then -- first and last characters in <part1> must be lowercase letters return false; -- invalid so return false end end if part2 then if not part2:match ('^_res%-%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; -- invalid so return false end end return true; -- valid so return true end if not dbi_is_valid(id) then return false end return '[https://www.treccani.it/enciclopedia/'..id..'_(Dizionario-Biografico) '..(label or 'Italian People')..']'..p.getCatForId( 'DBI' ) end function p.dblpLink( id, label ) --P2456's format regex: \d{2,3}\/\d+(-\d+)?[a-zA-Z-]*(-\d+)?|[a-z]\/[0-9A-Za-z]*(-\d+)? (e.g. 89/4185-p) if not id:match( '^%d%d%d?%/%d+-?[%d]*[%a]*-?[%d]*$' ) and not id:match( '^[%a]+%/[%w]*-?[%d]*$' ) then return false end return '[https://dblp.org/pid/'..id..' '..(label or 'DBLP (computer science)')..']'..p.getCatForId( 'DBLP' ) end function p.dibLink( id, label ) --P6829's format regex: 0[01]\d{4}(\.[A-D])? (e.g. 001953) if not id:match( '^0[01]%d%d%d%d%.?[A-D]?$' ) then return false end return '[https://dib.cambridge.org/viewReadPage.do?articleId='..id..' '..(label or 'Ireland')..']'..p.getCatForId( 'DIB' ) end function p.dsiLink( id, label ) --P2349's format regex: [1-9]\d* (e.g. 1538) if not id:match( '^[1-9]%d*$' ) then return false end return '[http://www.uni-stuttgart.de/hi/gnt/dsi2/index.php?table_name=dsi&function=details&where_field=id&where_value='..id..' '..(label or 'Scientific illustrators')..']'..p.getCatForId( 'DSI' ) end function p.dtbioLink( id, label ) --P7902's format regex: 1[0-9]{7,8}[0-9X] (e.g. 118554700) if not id:match( '^1[0-9]%d%d%d%d%d%d%d?[0-9X]$' ) then return false end return '[https://www.deutsche-biographie.de/pnd'..id..'.html?language=en '..(label or 'Germany')..']'..p.getCatForId( 'DTBIO' ) end function p.fastLink( id, label ) --P2163's format regex: [1-9]\d{0,7} (e.g. 1916996) if not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?$' ) then return false end return '[http://id.worldcat.org/fast/'..id..'/ '..(label or 'Faceted Application of Subject Terminology')..']'..p.getCatForId( 'FAST' ) end function p.fnzaLink( id, label ) --P6792's format regex: [1-9]\d* (e.g. 9785) if not id:match( '^[1-9]%d*$' ) then return false end return '[https://findnzartists.org.nz/artist/'..id..'/ '..(label or 'New Zealand Artists')..']'..p.getCatForId( 'FNZA' ) end function p.gndLink( id, label ) --P227's format regex: 1[012]?\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 id:match( '^1[012]?%d%d%d%d%d%d%d[0-9X]$' ) and not id:match( '^[47]%d%d%d%d%d%d%-%d$' ) and not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%-[0-9X]$' ) and not id:match( '^3%d%d%d%d%d%d%d[0-9X]$' ) then return false end return '[https://d-nb.info/gnd/'..id..' '..(label or 'Germany')..']'..p.getCatForId( 'GND' ) end function p.googleLink( id, label ) --P1960's format regex: [-_0-9A-Za-z]{12} (e.g. CUO0vDcAAAAJ) if not id:match( '^[%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u][%-_%d%l%u]$' ) then return false end return '[https://scholar.google.com/citations?user='..id..' '..(label or 'Google Scholar')..']'..p.getCatForId( 'Google Scholar' ) end function p.hdsLink( id, label ) --P902's format regex: \d{6} (e.g. 050123) if not id:match( '^%d%d%d%d%d%d$' ) then return false end return '[https://hls-dhs-dss.ch/fr/articles/'..id..' '..(label or 'Historical Dictionary of Switzerland')..']'..p.getCatForId( 'HDS' ) end function p.iaafLink( id, label ) --P1146's format regex: [0-9][0-9]* (e.g. 012) if not id:match( '^%d+$' ) then return false end return '[https://www.iaaf.org/athletes/_/'..id..' '..(label or 'World Athletics')..']'..p.getCatForId( 'IAAF' ) end function p.iccuLink( id, label ) --P396's format regex: \D{2}[A-Z0-3]V\d{6} (e.g. CFIV000163) if not id:match( '^%u%u[%u0-3]V%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) return false end return '[https://opac.sbn.it/nome/'..id..' '..(label or 'Italy')..']'..p.getCatForId( 'ICCU' ) end function p.iciaLink( id, label ) --P1736's format regex: \d+ (e.g. 1) if not id:match( '^%d+$' ) then return false end return '[https://www.imj.org.il/artcenter/newsite/en/?artist='..id..' '..(label or 'ICIA (Israel)')..']'..p.getCatForId( 'ICIA' ) end function p.ieuLink( id, label ) --P9070's format regex: [A-Z]\\[A-Z]\\[A-Za-z0-9]+ (e.g. K\Y\Kyiv) if not id:match( '^[A-Z]\\[A-Z]\\%w+$' ) then return false end return '[http://www.encyclopediaofukraine.com/display.asp?linkpath=pages\\'..id..' '..(label or 'Internet Encyclopedia of Ukraine')..']'..p.getCatForId( 'IEU' ) end function p.isniLink( id, label ) id = p.validateIsni( id ) --e.g. 0000-0000-6653-4145 if not id then return false end return '[https://isni.org/isni/'..id..' '..(label or 'ISNI')..']'..p.getCatForId( 'ISNI' ) end function p.j9uLink( id, label ) --P8189's format regex: 9870(0|1)\d{8}05171 (e.g. 987007305652505171) if not id:match( '^9870[0-1]%d%d%d%d%d%d%d%d05171$' ) then return false end return '[http://uli.nli.org.il/F/?func=find-b&local_base=NLX10&find_code=UID&request='..id..' '..(label or 'Israel')..']'..p.getCatForId( 'J9U' ) end function p.jocondeLink( id, label ) --P347's format regex: [\-0-9A-Za-z]{11} (e.g. 12345678901) local regex = '^'..string.rep('[%-0-9A-Za-z]', 11)..'$' if not id:match( regex ) then return false end return '[https://www.pop.culture.gouv.fr/notice/joconde/'..id..' '..(label or 'Joconde (France)')..']'..p.getCatForId( 'Joconde' ) end function p.kulturnavLink( id, label ) --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 not id:match( '^%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 '[http://kulturnav.org/'..id..' '..(label or 'KulturNav (Norway)')..']'..p.getCatForId( 'KULTURNAV' ) --no https as of 9/2019 end function p.lccnLink( id, label ) local parts = p.splitLccn( id ) --e.g. n78039510 if not parts then return false 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..' '..(label or 'United States')..']'..p.getCatForId( 'LCCN' ) end function p.lirLink( id, label ) --P886's format regex: \d+ (e.g. 1) if not id:match( '^%d+$' ) then return false end return '[http://www.e-lir.ch/e-LIR___Lexicon.'..id..'.450.0.html '..(label or 'Lexicon Istoric Retic (Switzerland)')..']'..p.getCatForId( 'LIR' ) --no https as of 9/2019 end function p.lnbLink( id, label ) --P1368's format regex: \d{9} (e.g. 123456789) if not id:match( '^%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 '..(label or 'Latvia')..']'..p.getCatForId( 'LNB' ) end function p.marinaMilitareLink( id, label ) --P3863's format regex: [1-9]\d* (e.g. 3856) if id:match( '^[1-9]%d*$' ) then return '[http://www.marina.difesa.it/cosa-facciamo/per-la-difesa-sicurezza/fari/Pagine/'..id..'.aspx '..(label or 'Italy')..']'..p.getCatForId( 'Marina Militare' ) else return false end end function p.mathsnLink( id, label ) --P4955's format regex: [1-9]\d{4,6} (e.g. 175270) if not id:match( '^[1-9]%d%d%d%d%d?%d?$' ) then return false end return '[https://mathscinet.ams.org/mathscinet/MRAuthorID/'..id..' '..(label or 'MathSciNet')..']'..p.getCatForId( 'MATHSN' ) end function p.mbaLink( id, label ) --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 id:match( '^%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 local url = 'https://musicbrainz.org/artist/'..id local cat = p.getCatForId( 'MusicBrainz' )--special cat name if label then return '['..url..' '..label..']'..cat else return '[[MBA (identifier)|MusicBrainz]] (['..url..' artist])'..cat end end function p.mbareaLink( id, label ) --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 not id:match( '^%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 local url = 'https://musicbrainz.org/area/'..id local cat = p.getCatForId( 'MusicBrainz area' )--special cat name if label then return '['..url..' '..label..']'..cat else return '[[MBAREA (identifier)|MusicBrainz]] (['..url..' area])'..cat end end function p.mbiLink( id, label ) --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) if not id:match( '^%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 local url = 'https://musicbrainz.org/instrument/'..id local cat = p.getCatForId( 'MusicBrainz instrument' )--special cat name if label then return '['..url..' '..label..']'..cat else return '[[MBI (identifier)|MusicBrainz]] (['..url..' instrument])'..cat end end function p.mblLink( id, label ) --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 id:match( '^%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 local url = 'https://musicbrainz.org/label/'..id local cat = p.getCatForId( 'MusicBrainz label' )--special cat name if label then return '['..url..' '..label..']'..cat else return '[[MBL (identifier)|MusicBrainz]] (['..url..' label])'..cat end end function p.mbpLink( id, label ) --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 id:match( '^%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 local url = 'https://musicbrainz.org/place/'..id local cat = p.getCatForId( 'MusicBrainz place' )--special cat name if label then return '['..url..' '..label..']'..cat else return '[[MBP (identifier)|MusicBrainz]] (['..url..' place])'..cat end end function p.mbrgLink( id, label ) --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 id:match( '^%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 local url = 'https://musicbrainz.org/release-group/'..id local cat = p.getCatForId( 'MusicBrainz release group' )--special cat name if label then return '['..url..' '..label..']'..cat else return '[[MBRG (identifier)|MusicBrainz]] (['..url..' release group])'..cat end end function p.mbsLink( id, label ) --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 id:match( '^%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 local url = 'https://musicbrainz.org/series/'..id local cat = p.getCatForId( 'MusicBrainz series' )--special cat name if label then return '['..url..' '..label..']'..cat else return '[[MBS (identifier)|MusicBrainz]] (['..url..' series])'..cat end end function p.mbwLink( id, label ) --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 id:match( '^%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 local url = 'https://musicbrainz.org/work/'..id local cat = p.getCatForId( 'MusicBrainz work' )--special cat name if label then return '['..url..' '..label..']'..cat else return '[[MBW (identifier)|MusicBrainz]] (['..url..' work])'..cat end end function p.mgpLink( id, label ) --P549's format regex: \d{1,6} (e.g. 123456) if not id:match( '^%d%d?%d?%d?%d?%d?$' ) then return false end return '[https://www.mathgenealogy.org/id.php?id='..id..' '..(label or 'Mathematics Genealogy Project')..']'..p.getCatForId( 'MGP' ) end function p.mtLink( id, label ) --P3601's format regex: \d{10} (e.g. 1000004707) if id:match( '^%d%d%d%d%d%d%d%d%d%d$' ) then return '[https://www.marinetraffic.com/en/ais/details/lights/'..id..' '..(label or 'MarineTraffic')..']'..p.getCatForId( 'MarineTraffic' ) else return false end end function p.naraLink( id, label ) --P1225's format regex: ^([1-9]\d{0,8})$ (e.g. 123456789) if not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?$' ) then return false end return '[https://catalog.archives.gov/id/'..id..' '..(label or 'National Archives (US)')..']'..p.getCatForId( 'NARA' ) end function p.nclLink( id, label ) --P1048's format regex: \d+ (e.g. 1081436) if not id:match( '^%d+$' ) then return false end return '[http://aleweb.ncl.edu.tw/F/?func=accref&acc_sequence='..id..'&CON_LNG=ENG '..(label or 'Taiwan')..']'..p.getCatForId( 'NCL' ) --no https as of 9/2019 end function p.ndlLink( id, label ) --P349's format regex: (a1|s)?[0-9]?\d{8} (e.g. a1100016921) if not id:match( '^a1%d?%d%d%d%d%d%d%d%d' ) and not id:match( '^s?%d?%d%d%d%d%d%d%d%d' ) then return false end return '[https://id.ndl.go.jp/auth/ndlna/'..id..' '..(label or 'Japan')..']'..p.getCatForId( 'NDL' ) end function p.ngaLink(id,label) --P3563's format rgex: 11[0-6]-\d+(\.\d+)? (e.g. 114-7721.2) if not id:match( '^11[0-6]%-%d+%.?%d*$' ) then return false end return '[https://wikidata-externalid-url.toolforge.org/?url=https%3A%2F%2Fmsi.nga.mil%2FqueryResults%3Fpublications%2Fngalol%2Flights-buoys%3Fvolume%3D%251%26featureNumber%3D%252%26includeRemovals%3Dfalse%26output%3Dhtml&exp=(%5Cd%7B3%7D)-(.*)&id='..id..' '..(label or 'NGA')..']'..p.getCatForId( 'NGA' ) end function p.ngvLink( id, label ) --P2041's format regex: \d+ (e.g. 12354) if not id:match( '^%d+$' ) then return false end return '[https://www.ngv.vic.gov.au/explore/collection/artist/'..id..'/ '..(label or 'Victoria')..']'..p.getCatForId( 'NGV' ) end function p.nkcLink( id, label ) --P691's format regex: [a-z]{2,4}[0-9]{2,14} (e.g. abcd12345678901234) if not id:match( '^[a-z][a-z][a-z]?[a-z]?%d%d%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?$' ) then return false end return '[https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica='..id..'&CON_LNG=ENG '..(label or 'Czech Republic')..']'..p.getCatForId( 'NKC' ) end function p.nlaLink( id, label ) --P409's format regex: [1-9][0-9]{0,11} (e.g. 123456789012) if not id:match( '^[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..' '..(label or 'Australia')..']'..p.getCatForId( 'NLA' ) end function p.nlgLink( id, label ) --P3348's format regex: [1-9]\d* (e.g. 1) if not id:match( '^[1-9]%d*$' ) then return false end return '[https://data.nlg.gr/resource/authority/record'..id..' '..(label or 'Greece')..']'..p.getCatForId( 'NLG' ) end function p.nlkLink( id, label ) --P5034's format regex: (KAB|KAC|KSH)([0-9]{4}|[0-9]{4}[a-zA-Z])[0-9]{4,6} (e.g. KAC201501465) if not id:match( '^KAB%d%d%d%d%a?%d%d%d%d%d?%d?$' ) and not id:match( '^KAC%d%d%d%d%a?%d%d%d%d%d?%d?$' ) and not id:match( '^KSH%d%d%d%d%a?%d%d%d%d%d?%d?$' ) then return false end return '[https://lod.nl.go.kr/resource/'..id..' '..(label or 'Korea')..']'..p.getCatForId( 'NLK' ) end function p.nlpLink( id, label ) --P1695's format regex: 9810[0-9]\d* or A[0-9]{7}[0-9X] (e.g. 9810123456789012345 or A10414836) if not id:match( '^9810%d+$' ) and not id:match( '^A%d%d%d%d%d%d%d[%dX]$' ) then return false end return '[https://tools.wmflabs.org/wikidata-externalid-url?p=1695&id='..id..' '..(label or 'Poland')..']'..p.getCatForId( 'NLP' ) end function p.nlrLink( id, label ) --P1003's format regex: \d{9} (e.g. 123456789) if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then return false end return '[http://aleph.bibnat.ro:8991/F/?func=direct&local_base=NLR10&doc_number='..id..' '..(label or 'Romania')..']'..p.getCatForId( 'NLR' ) end function p.nskLink( id, label ) --P1375's format regex: \d{9} (e.g. 123456789) if not id:match( '^%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 '..(label or 'Croatia')..']'..p.getCatForId( 'NSK' ) --no https as of 9/2019 end function p.ntaLink( id, label ) --P1006's format regex: \d{8}[\dX] (e.g. 12345678X) if not id:match( '^%d%d%d%d%d%d%d%d[%dX]$' ) then return false end return '[http://data.bibliotheken.nl/id/thes/p'..id..' '..(label or 'Netherlands')..']'..p.getCatForId( 'NTA' ) end function p.orcidLink( id, label ) 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..' '..(label or 'ORCID')..']'..p.getCatForId( 'ORCID' ) end function p.picLink( id, label ) --P2750's format regex: [1-9]\d* (e.g. 1) if not id:match( '^[1-9]%d*$' ) then return false end return '[https://pic.nypl.org/constituents/'..id..' '..(label or 'Photographers\' Identities')..']'..p.getCatForId( 'PIC' ) end function p.plwabnLink( id, label ) --P7293's format regex: 981[0-9]{8}05606 (e.g. 9810696457305606) if not id:match( '^981%d%d%d%d%d%d%d%d05606*$' ) then return false end return '[http://mak.bn.org.pl/cgi-bin/KHW/makwww.exe?BM=1&NU=1&IM=4&WI='..id..' '..(label or 'Poland')..']'..p.getCatForId( 'PLWABN' ) end function p.publonsLink( id, label ) --P3829's format regex: \d+ (e.g. 654601) if not id:match( '^%d+$' ) then return false end return '[https://publons.com/author/'..id..'/ '..(label or 'Publons (researchers)')..']'..p.getCatForId( 'Publons' ) end function p.ridLink( id, label ) --P1053's format regex: [A-Z]{1,3}-\d{4}-(19|20)\d\d (e.g. AAS-5150-2020) if not id:match( '^[A-Z][A-Z]?[A-Z]?%-%d%d%d%d%-19%d%d$' ) and not id:match( '^[A-Z][A-Z]?[A-Z]?%-%d%d%d%d%-20%d%d$' ) then return false end return '[https://www.researcherid.com/rid/'..id..' '..(label or 'ResearcherID')..']'..p.getCatForId( 'RID' ) end function p.rismLink( id, label ) --P5504's format regex: (pe|ks)?\[1-9]d* (e.g. pe30006410) if not id:match( '^pe[1-9]%d*$' ) and --99% start with 'pe' not id:match( '^ks[1-9]%d*$' ) and not id:match( '^[1-9]%d*$' ) then return false end return '[https://opac.rism.info/search?id='..id..' '..(label or 'RISM (France)')..']'..p.getCatForId( 'RISM' ) end function p.reroLink( id, label ) --P3065's format regex: 0[1-2]-[A-Z0-9]{1,10} (e.g. 02-A012345678) if not id:match( '^0[1-2]%-[A-Z%d][A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?$' ) then return false end return '[http://data.rero.ch/'..id..' '..(label or 'RERO (Switzerland)')..']'..p.getCatForId( 'RERO' ) end function p.rkdartistsLink( id, label ) --P650's format regex: [1-9]\d{0,5} (e.g. 123456) if not id:match( '^[1-9]%d?%d?%d?%d?%d?$' ) then return false end return '[https://rkd.nl/en/explore/artists/'..id..' '..(label or 'RKD Artists (Netherlands)')..']'..p.getCatForId( 'RKDartists' ) end function p.rkdidLink( id, label ) --P350's format regex: [1-9]\d{0,5} (e.g. 123456) if not id:match( '^[1-9]%d?%d?%d?%d?%d?$' ) then return false end return '[https://rkd.nl/nl/explore/images/'..id..' '..(label or 'RKD ID (Netherlands)')..']'..p.getCatForId( 'RKDID' ) end function p.rslLink( id, label ) --P947's format regex: \d{1,9} (e.g. 123456789) if not id:match( '^%d%d?%d?%d?%d?%d?%d?%d?%d?$' ) then return false end return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request='..id..'&CON_LNG=ENG '..(label or 'Russia')..']'..p.getCatForId( 'RSL' ) --no https as of 9/2019 end function p.scopusLink( id, label ) --P1153's format regex: [1-9]\d{9,10} (e.g. 35247902700) if not id:match( '^[1-9]%d%d%d%d%d%d%d%d%d%d?$' ) then return false end return '[https://www.scopus.com/authid/detail.uri?authorId='..id..' '..(label or 'Scopus author')..']'..p.getCatForId( 'Scopus' ) end function p.selibrLink( id, label ) --P906's format regex: [1-9]\d{4,5} (e.g. 123456) if not id:match( '^[1-9]%d%d%d%d%d?$' ) then return false end return '[https://libris.kb.se/auth/'..id..' '..(label or 'Sweden')..']'..p.getCatForId( 'SELIBR' ) end function p.sikartLink( id, label ) --P781's format regex: \d{7,9} (e.g. 123456789) if not id:match( '^%d%d%d%d%d%d%d%d?%d?$' ) then return false end return '[http://www.sikart.ch/KuenstlerInnen.aspx?id='..id..'&lng=en '..(label or 'SIKART (Switzerland)')..']'..p.getCatForId( 'SIKART' ) --no https as of 9/2019 end function p.snacLink( id, label ) --P3430's format regex: \d*[A-Za-z][0-9A-Za-z]* (e.g. A) if not id:match( '^%d*[A-Za-z][0-9A-Za-z]*$' ) then return false end return '[https://snaccooperative.org/ark:/99166/'..id..' '..(label or 'Social Networks and Archival Context')..']'..p.getCatForId( 'SNAC-ID' ) end function p.sudocLink( id, label ) --P269's format regex: (\d{8}[\dX]|) (e.g. 026927608) if not id:match( '^%d%d%d%d%d%d%d%d[%dxX]$' ) then --legacy: allow lowercase 'x' return false end return '[https://www.idref.fr/'..id..' '..(label or 'SUDOC (France)')..']'..p.getCatForId( 'SUDOC' ) end function p.ta98Link( id, label ) --P1323's format regex: A\d{2}\.\d\.\d{2}\.\d{3}[FM]? (e.g. A12.3.45.678) if not id:match( '^A%d%d%.%d%.%d%d%.%d%d%d[FM]?$' ) then return false end local longurl = '[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=' return longurl..id..' '..(label or 'Terminologia Anatomica')..']'..p.getCatForId( 'TA98' ) end function p.tdviaLink( id, label ) --P7314's format regex: [0-9a-z/-]+] (e.g. barkan-omer-lutfi) if not id:match( '^[%d%l/-]+$' ) then return false end return '[https://islamansiklopedisi.org.tr/'..id..' '..(label or 'İslâm Ansiklopedisi')..']'..p.getCatForId( 'TDVİA' ) end function p.tepapaLink( id, label ) --P3544's format regex: \d+ (e.g. 1) if not id:match( '^%d+$' ) then return false end return '[https://collections.tepapa.govt.nz/agent/'..id..' '..(label or 'Te Papa (New Zealand)')..']'..p.getCatForId( 'TePapa' ) end function p.tlsLink( id, label ) id = id:gsub(' +', '_') --P1362's format regex: \p{Lu}[\p{L}\d_',\.\-\(\)\*\/–&]{3,89} (e.g. Abcd) --Mediawiki page title partial URL so consider validation with mw.title or "[^#<>%[%] {|}]" local class = "[%w_',%.%-%(%)%*%/–&]" local idlen = mw.ustring.len (id) if idlen < 4 or idlen > 90 then return false end local regex = '^%u'..string.rep(class, idlen - 1)..'$' if not mw.ustring.match( id, regex ) then return false end return '[http://tls.theaterwissenschaft.ch/wiki/'..id..' '..(label or 'Theaterlexikon (Switzerland)')..']'..p.getCatForId( 'TLS' ) --no https as of 9/2019 end function p.troveLink( id, label ) --P1315's format regex: [1-9]\d{5,7} (e.g. 12345678) if not id:match( '^[1-9]%d%d%d%d%d%d?%d?$' ) then return false end return '[https://trove.nla.gov.au/people/'..id..' '..(label or 'Trove (Australia)')..']'..p.getCatForId( 'Trove' ) end function p.ukparlLink( id, label ) --P6213's format regex: [a-zA-Z\d]{8} (e.g. AQUupyiR) if not id:match( '^[a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d]$' ) then return false end return '[https://id.parliament.uk/'..id..' '..(label or 'UK Parliament')..']'..p.getCatForId( 'UKPARL' ) end function p.ulanLink( id, label ) --P245's format regex: 500\d{6} (e.g. 500123456) if not id:match( '^500%d%d%d%d%d%d$' ) then return false end return '[https://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid='..id..' '..(label or 'Artist Names (Getty)')..']'..p.getCatForId( 'ULAN' ) end function p.uscgLink( id, label ) --P3723's format regex: [1-7]-\d{1,5}(.[1-9])? (e.g. 6-0695) if not id:match( '^[1-7]%-%d%d?%d?%d?%d?$' ) and not id:match( '^[1-7]%-%d%d?%d?%d?%d?%.%d*[1-9]$' ) then return false end return '[[USCG (identifier)|USCG]] ([https://www.navcen.uscg.gov/pdf/lightlists/LightList%20V'..mw.ustring.sub(id,1,1)..'.pdf '..id..'])'..p.getCatForId( 'USCG' ) end function p.uscongressLink( id, label ) --P1157's format regex: [A-Z]00[01]\d{3} (e.g. A000123) if not id:match( '^[A-Z]00[01]%d%d%d$' ) then return false end return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index='..id..' '..(label or 'US Congress')..']'..p.getCatForId( 'USCongress' ) --no https as of 9/2019 end function p.vcbaLink( id, label ) --P8034's format regex: \d{3}\/[1-9]\d{0,5} (e.g. 494/9793) if not id:match( '^%d%d%d\/[1-9]%d?%d?%d?%d?%d?$' ) then return false end id = id:gsub('\/', '_') return '[https://opac.vatlib.it/auth/detail/'..id..' '..(label or 'Vatican')..']'..p.getCatForId( 'VcBA' ) end function p.viafLink( id, label ) --P214's format regex: [1-9]\d(\d{0,7}|\d{17,20}) (e.g. 123456789, 1234567890123456789012) if not id:match( '^[1-9]%d%d?%d?%d?%d?%d?%d?%d?$' ) and not id:match( '^[1-9]%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d?%d?%d?$' ) then return false end -- If the "VIAF" entry at [[:m:Interwiki map]] would resolve to "https://viaf.org/viaf/$1" (rather than "http://viaf.org/viaf/$1", as it currently still does), -- then the code below could change from '[https://viaf.org/viaf/'..id..' '..id..']' to '[[:VIAF:'..id..'|'..id..']]'. return '[https://viaf.org/viaf/'..id..' '..(label or 'VIAF')..']'..p.getCatForId( 'VIAF' ) end function p.worldcatidLink( id, label ) --P7859's format regex: viaf-\d+|lccn-n[a-z]?[0-9\-]+|n[cps]-.+ (e.g. viaf-100181709, lccn-n78-95332, np-verbeck,%20william$1861) if not id:match( '^viaf%-%d+$' ) and not id:match( '^lccn%-n[a-z]?[0-9%-]+$' ) and not id:match( '^n[cps]%-.+$' ) then return false end return '[https://www.worldcat.org/identities/'..mw.uri.encode(id, 'PATH')..'/ '..(label or 'WorldCat')..']'..p.getCatForId( 'WORLDCATID' ) end function p.zbmathLink( id, label ) --P1556's format regex: [a-z][a-z\-]*(\.[a-z][a-z\-]*)?(\.[0-9]*)? (e.g. turing.alan-m) local ps = {'%l[%l%-]*', '%.%l[%l%-]*', '%.%d*'} if not id:match( '^'..ps[1]..'$' ) and -- prefix with no capture options not id:match( '^'..ps[1]..ps[2]..'$' ) and -- prefix with first capture option not id:match( '^'..ps[1]..ps[3]..'$' ) and -- prefix with second capture option not id:match( '^'..ps[1]..ps[2]..ps[3]..'$' ) then -- prefix and both capture options return false end return '[https://zbmath.org/authors/?q=ai:'..id..' '..(label or 'zbMATH')..']'..p.getCatForId( 'ZBMATH' ) end --[[=========================== Helper functions =============================]] function p.append(str, c, length) while str:len() < length do str = c..str end return str 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.splitLccn( id ) --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) 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 if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then return mw.text.split( id, '/' ) end return false end --[[==========================================================================]] --[[ Wikidata & documentation functions ]] --[[==========================================================================]] function p.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 function p.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 -- Creates a human-readable standalone wikitable version of p.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 for _, conf in pairs( p.conf ) do local param, pid, section = conf[1], conf[2], conf[4] local appearsAs if conf.prefix then appearsAs = conf.prefix else appearsAs = conf[3](conf[5]) end local link = conf.link or param..' (identifier)' local category = conf.category or param local args = { id = 'f', pid } local wpl = frame:expandTemplate{ title = 'Wikidata property link', args = args } --cats local articleCat = 'Articles with '..category..' identifiers' local faultyCat = 'Articles with faulty '..category..' identifiers' --counts local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') ) local faultyCount = lang:formatNum( mw.site.stats.pagesInCategory(faultyCat, 'pages') ) --calcs P = P + 1 --property count a = a + lang:parseFormattedNumber(articleCount) f = f + lang:parseFormattedNumber(faultyCount) --concat 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;">'..p.checkcat(articleCat,articleCount)..'</td>'.. '<td style="text-align: right;">'..p.checkcat(faultyCat,faultyCount)..'</td></tr>' end --append derivative WorldCat cats local wcd = { 'WorldCat-LCCN', 'WorldCat-VIAF' } for _, w in pairs(wcd) do local articleCat = 'Articles with '..w..' identifiers' local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') ) local appearsAs if w == 'WorldCat-LCCN' then appearsAs = '[https://www.worldcat.org/identities/lccn-n79-113947 WorldCat (via Library of Congress)]' else appearsAs = '[https://www.worldcat.org/identities/containsVIAFID/12345789 WorldCat (via VIAF)]' end a = a + lang:parseFormattedNumber(articleCount) wikiTable = wikiTable..'<tr><td>-</td>'.. '<td>General</td>'.. '<td>'..appearsAs..'</td>'.. '<td data-sort-value='..w..'>—</td>'.. '<td style="text-align: right;">[[:Category:'..articleCat..'|'..articleCount..']]</td>'.. '<td style="text-align: right;">—</td></tr>' end --append sums 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 --[[==========================================================================]] --[[ Configuration ]] --[[==========================================================================]] -- Please use "<parameter> (identifier)" redirects rather than linking directly to the target page. -- This reduces clutter in "What links here" on both the redirect and the target, -- and improves reverse lookup of articles where a manifestation of each identifier is used. -- p.conf table basic format: { 'parameter name', propertyId # in Wikidata, formatting/validation function, section, example ID for documentation } -- p.conf table optional named parameters: -- link: to override the link in the documentation (defaults to "<parameter> (identifer)") -- category: to override the ID in category names (defaults to "... with <parameter> identifiers") -- prefix: to include a prefix (usually a wikilink explaining what the identifier is) before the external link itself p.conf = { { 'AAG', 3372, p.aagLink, 'Art galleries and museums', '1' }, { 'ACM-DL', 864, p.acmLink, 'Scientific databases', '12345678901', link = 'ACM DL (identifier)' }, { 'ADB', 1907, p.adbLink,'Biographical dictionaries', 'barton-sir-edmund-toby-71' }, { 'admiralty', 3562, p.admiraltyLink, 'Lighthouse identifiers', 'D1204.1', prefix='[[Admiralty number|Admiralty]]'}, { 'AGSA', 6804, p.agsaLink, 'Art galleries and museums', '3625' }, { 'ARLHS', 2980, p.ARLHSLink, 'Lighthouse identifiers', 'LAT023'}, { 'autores.uy', 2558, p.autoresuyLink, 'Biographical dictionaries', '12345' }, { 'AWR', 4186, p.awrLink, 'Biographical dictionaries', 'PR00768b' }, { 'BIBSYS', 1015, p.bibsysLink, 'National libraries', '1234567890123' }, { 'Bildindex', 2092, p.bildLink, 'Art research institutes', '1' }, { 'BNC', 1890, p.bncLink, 'National libraries', '123456789' }, { 'BNE', 950, p.bneLink, 'National libraries', 'XX1234567' }, { 'BNF', 268, p.bnfLink, 'National libraries', '123456789' }, { 'BNMM', 3788, p.bnmmLink, 'National libraries', '000024044' }, { 'Botanist', 428, p.botanistLink , 'Scientific databases', 'L.' }, { 'BPN', 651, p.bpnLink , 'Biographical dictionaries', '12345678' }, { 'CANTIC', 1273, p.canticLink, 'National libraries', 'a12345678' }, { 'CANTICN', 9984, p.canticnLink, 'National libraries', '981058515460906706' }, { 'CCG', 3920, p.ccgLink, 'Lighthouse identifiers', 'A1761', prefix='[[CCG (identifier)|CCG]]' }, { 'CINII', 271, p.ciniiLink, 'Scientific databases', 'DA12345678', link = 'CiNii (identifier)' }, { 'CWGC', 1908, p.cwgcLink, 'Other', '1234567' }, { 'DAAO', 1707, p.daaoLink, 'Art research institutes', 'rolf-harris' }, { 'DBI', 1986, p.dbiLink, 'Biographical dictionaries', 'dante-alighieri' }, { 'DBLP', 2456, p.dblpLink, 'Scientific databases', '123/123' }, { 'DIB', 6829, p.dibLink, 'Biographical dictionaries', '001953' }, { 'DSI', 2349, p.dsiLink, 'Art research institutes', '1538' }, { 'DTBIO', 7902, p.dtbioLink, 'Biographical dictionaries', '118554700' }, { 'EMU', 4613, p.emuLink, 'National libraries', '15409' }, { 'FAST', 2163, p.fastLink, 'Other', '1' }, { 'FNZA', 6792, p.fnzaLink, 'Art research institutes', '12' }, { 'GND', 227, p.gndLink, 'National libraries', '4079154-3' }, { 'Google Scholar', 1960, p.googleLink, 'Scientific databases', 'QPdLuj8AAAAJ' }, { 'HDS', 902, p.hdsLink, 'Other', '050123' }, { 'IAAF', 1146, p.iaafLink, 'Other', '123' }, { 'ICCU', 396, p.iccuLink, 'National libraries', 'CFIV000163' }, --formerly SBN { 'ICIA', 1736, p.iciaLink, 'Art research institutes', '1' }, { 'IEU', 9070, p.ieuLink, 'Other', 'N\\A\\NationalAcademyofArtandArchitecture' }, { 'ISNI', 213, p.isniLink, 'General', '0000-0000-6653-4145', prefix = '[[ISNI (identifier)|ISNI]]' }, { 'J9U', 8189, p.j9uLink, 'National libraries', '987007305652505171' }, { 'Joconde', 347, p.jocondeLink, 'Art research institutes', '12345678901' }, { 'KULTURNAV', 1248, p.kulturnavLink, 'Art research institutes', '12345678-1234-1234-1234-1234567890AB', link = 'KulturNav (identifier)' }, { 'LCCN', 244, p.lccnLink, 'National libraries', 'n78039510' }, { 'LIR', 886, p.lirLink, 'Other', '1' }, { 'LNB', 1368, p.lnbLink, 'National libraries', '123456789' }, { 'Marina Militare', 3863, p.marinaMilitareLink, 'Lighthouse identifiers', '3856' }, { 'MarineTraffic', 3601, p.mtLink, 'Lighthouse identifiers', '1000004707' }, { 'MATHSN', 4955, p.mathsnLink, 'Scientific databases', '175270' }, { 'MBA', 434, p.mbaLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz' }, --special cat name { 'MBAREA', 982, p.mbareaLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz area' }, --special cat name { 'MBI', 1330, p.mbiLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz instrument' }, --special cat name { 'MBL', 966, p.mblLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz label' }, --special cat name { 'MBP', 1004, p.mbpLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz place' }, --special cat name { 'MBRG', 436, p.mbrgLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz release group' }, --special cat name { 'MBS', 1407, p.mbsLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz series' }, --special cat name { 'MBW', 435, p.mbwLink, 'Other', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz work' }, --special cat name { 'MGP', 549, p.mgpLink, 'Scientific databases', '123456' }, { 'NARA', 1225, p.naraLink, 'Other', '12345678' }, { 'NCL', 1048, p.nclLink, 'National libraries', '1081436' }, { 'NDL', 349, p.ndlLink, 'National libraries', '012345678' }, { 'NGA', 3563, p.ngaLink, 'Lighthouse identifiers', '114-5592'}, { 'NGV', 2041, p.ngvLink, 'Art galleries and museums', '12354' }, { 'NKC', 691, p.nkcLink, 'National libraries', 'abcd12345678901234' }, { 'NLA', 409, p.nlaLink, 'National libraries', '123456789012' }, { 'NLG', 3348, p.nlgLink, 'National libraries', '12345678' }, { 'NLK', 5034, p.nlkLink, 'National libraries', 'KAB197000000' }, { 'NLP', 1695, p.nlpLink, 'National libraries', '9810123456789012345' }, { 'NLR', 1003, p.nlrLink, 'National libraries', '123456789' }, { 'NSK', 1375, p.nskLink, 'National libraries', '123456789' }, { 'NTA', 1006, p.ntaLink, 'National libraries', '12345678X' }, { 'ORCID', 496, p.orcidLink, 'General', '0000-0002-7398-5483', prefix = '[[ORCID (identifier)|ORCID]]' }, { 'PIC', 2750, p.picLink, 'Art research institutes', '1' }, { 'PLWABN', 7293, p.plwabnLink, 'National libraries', '9812345678905606' }, { 'Publons', 3829, p.publonsLink, 'Scientific databases', '2776255' }, { 'RID', 1053, p.ridLink, 'Scientific databases', 'A-1234-1934' }, { 'RISM', 5504, p.rismLink, 'Other', 'pe1', prefix = '[[RISM (identifier)|RISM (France)]]' }, { 'RERO', 3065, p.reroLink, 'Other', '02-A012345678', prefix = '[[RERO (identifier)|RERO (Switzerland)]]' }, { 'RKDartists', 650, p.rkdartistsLink, 'Art research institutes', '123456' }, { 'RKDID', 350, p.rkdidLink, 'Art research institutes', '123456' }, { 'RSL', 947, p.rslLink, 'National libraries', '123456789' }, { 'Scopus', 1153, p.scopusLink, 'Scientific databases', '7005487412' }, { 'SELIBR', 906, p.selibrLink, 'National libraries', '123456' }, { 'SIKART', 781, p.sikartLink, 'Art research institutes', '123456789' }, { 'SNAC-ID', 3430, p.snacLink, 'Other', 'A' }, { 'SUDOC', 269, p.sudocLink, 'Other', '026927608', prefix = '[[SUDOC (identifier)|SUDOC (France)]]' }, { 'TA98', 1323, p.ta98Link, 'Scientific databases', 'A12.3.45.678' }, { 'TDVİA', 7314, p.tdviaLink, 'Other', 'asim-b-behdele' }, { 'TePapa', 3544, p.tepapaLink, 'Art galleries and museums', '1' }, { 'TLS', 1362, p.tlsLink, 'Other', 'Abcd' }, { 'Trove', 1315, p.troveLink, 'Other', '12345678', prefix = '[[Trove (identifier)|Trove (Australia)]]' }, --formerly NLA-person { 'UKPARL', 6213, p.ukparlLink, 'Other', 'AQUupyiR' }, { 'ULAN', 245, p.ulanLink, 'Art research institutes', '500123456' }, { 'USCG', 3723, p.uscgLink, 'Lighthouse identifiers', '6-0695'}, { 'USCongress', 1157, p.uscongressLink, 'Other', 'A000123', link = 'US Congress (identifier)' }, { 'VcBA', 8034, p.vcbaLink, 'National libraries', '494/9793' }, { 'VIAF', 214, p.viafLink, 'General', '123456789', prefix = '[[VIAF (identifier)|VIAF]]' }, { 'WORLDCATID', 7859, p.worldcatidLink, 'General', 'lccn-n78-95332', link = 'WorldCat Identities (identifier)' }, { 'ZBMATH', 1556, p.zbmathLink, 'Scientific databases', 'turing.alan-m' }, } -- Legitimate aliases to p.conf, for convenience -- Format: { 'alias', 'parameter name in p.conf' } p.aliases = { { 'DNB', 'GND' }, --Deutsche Nationalbibliothek -> Gemeinsame Normdatei { 'MusicBrainz', 'MBA' }, { 'MusicBrainz artist', 'MBA' }, { 'MusicBrainz label', 'MBL' }, { 'MusicBrainz release group', 'MBRG' }, { 'MusicBrainz work', 'MBW' }, { 'SBN', 'ICCU' }, --SBN alias to be deprecated at a later stage { 'TDVIA', 'TDVİA' }, --alias name without diacritics { 'tdvia', 'TDVİA' }, --lowercase variant without diacritics } -- Deprecated aliases to p.conf; tracked in [[Category:Articles with deprecated authority control identifiers]] -- Format: { 'deprecated parameter name', 'replacement parameter name in p.conf' } p.deprecated = { { 'GKD', 'GND' }, { 'PND', 'GND' }, { 'RLS', 'RSL' }, { 'SWD', 'GND' }, { 'NARA-organization', 'NARA' }, { 'NARA-person', 'NARA' }, } --[[==========================================================================]] --[[ Main ]] --[[==========================================================================]] function p.authorityControl( frame ) 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( p.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( p.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 --Wikidata fallback if available if itemId then local suppressedIdCount = 0 local iMatches = 0 for _, params in ipairs( p.conf ) do if params[2] > 0 then local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]] if val == nil or val == '' then local wikidataIds = p.getIdsFromWikidata( itemId, 'P'..params[2] ) 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]..']]' else parentArgs[params[1]] = wikidataIds[1] --add ID from WD end end else iParentArgs = iParentArgs + 1 local wikidataIds = p.getIdsFromWikidata( itemId, 'P'..params[2] ) 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 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 --configure rows local rct = 0 local sectionOrder = { 'General', 'National libraries', 'Art galleries and museums', 'Art research institutes', 'Biographical dictionaries', 'Scientific databases', 'Lighthouse identifiers', 'Other' } local sections = { ['General'] = {}, ['National libraries'] = {}, ['Art galleries and museums'] = {}, ['Art research institutes'] = {}, ['Biographical dictionaries'] = {}, ['Scientific databases'] = {}, ['Lighthouse identifiers'] = {}, ['Other'] = {} } --don't show CANTIC if CANTICN is present, since they both go to the Library of Catalonia --and the library has deprecated CANTIC IDs in favor of CANTICN IDs if parentArgs.CANTICN or parentArgs.canticn then parentArgs.CANTIC = '' parentArgs.cantic = '' end --don't show NLP if PLWABN is present, since they both go to the National Library of Poland --and the library has deprecated NLP IDs in favor of PLWABN IDs if parentArgs.PLWABN or parentArgs.plwabn then parentArgs.NLP = '' parentArgs.nlp = '' end for _, params in ipairs( p.conf ) do local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]] local tval, tlinks = {}, {} --init tables if val and val ~= '' and type(params[3]) == 'function' then table.insert( tval, val ) if params.prefix then table.insert( tlinks, params[3]( val, '1' ) ) else table.insert( tlinks, params[3]( val ) ) end end --collect other unique vals (IDs) from WD, if present if itemId and tval[1] then local nextIdVal = 2 local wikidataIds = p.getIdsFromWikidata( itemId, 'P'..params[2] ) for _, v in pairs( wikidataIds ) do local bnew = true for _, w in pairs( tval ) do if v == w then bnew = false end end if bnew then table.insert( tval, v ) table.insert( tlinks, params[3]( v, tostring(nextIdVal) ) ) nextIdVal = nextIdVal + 1 end end end --assemble if tval[1] then table.insert( sections[params[4]], p.createRow( params[1], tval, nil, tlinks, true, params.category, params.prefix) ) rct = rct + 1 if tval[2] then multipleIdCat = p.getCatForId( 'multiple' ) end end end --WorldCat-VIAF & WorldCat-LCCN local worldcatId = parentArgs['worldcatid'] or parentArgs['WORLDCATID'] if worldcatId == nil then --if WORLDCATID absent but unsuppressed local viafId = parentArgs['viaf'] or parentArgs['VIAF'] local lccnId = parentArgs['lccn'] or parentArgs['LCCN'] if viafId and viafId ~= '' and p.viafLink( viafId ) then --VIAF must be present, unsuppressed, & validated table.insert( sections['General'], p.createRow( 'VIAF', viafId, '[https://www.worldcat.org/identities/containsVIAFID/'..viafId..' WorldCat (via VIAF)]', nil, false ) ) if namespace == 0 then worldcatCat = '[[Category:Articles with WorldCat-VIAF identifiers]]' end rct = rct + 1 elseif lccnId and lccnId ~= '' and p.lccnLink( lccnId ) then --LCCN must be present, unsuppressed, & validated local lccnParts = p.splitLccn( lccnId ) if lccnParts and lccnParts[1] ~= 'sh' then local lccnIdFmtd = lccnParts[1]..lccnParts[2]..'-'..lccnParts[3] table.insert( sections['General'], p.createRow( 'LCCN', lccnId, '[https://www.worldcat.org/identities/lccn-'..lccnIdFmtd..' WorldCat (via Library of Congress)]', nil, false ) ) if namespace == 0 then worldcatCat = '[[Category:Articles with WorldCat-LCCN identifiers]]' end end rct = rct + 1 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 _, sectName in ipairs(sectionOrder) do if #sections[sectName] ~= 0 then navboxArgs['group'..sectionID] = sectName navboxArgs['list'..sectionID] = table.concat(sections[sectName]) 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 return p