Pergi ke kandungan

Modul:Authority control

Daripada Wikipedia, ensiklopedia bebas.

Modul ini mengandungi kod templat {{Kawalan kewibawaan}}}. Lihat pendokumenannya.

Parameter, sifat-sifat Wikidata, dan kategori penjejakan

ParameterBahagianDipaparkan sebagaiSifat WikidataKategori penjejakan dan kiraan halaman
RencanaID yang salah
AAGGaleri seni dan muziumAucklandP33728 [cipta]0 [cipta]
ACM-DLPangkalan data saintifikACM DLP86414 [cipta]0 [cipta]
ADBKamus biografiAustraliaP190725 [cipta]0 [cipta]
admiraltyPengenalan LighthouseAdmiraltyP35620 [cipta]0 [cipta]
AGSAGaleri seni dan muziumAustralia SelatanP68046 [cipta]0 [cipta]
ARLHSPengenalan LighthouseARLHSP29800 [cipta]0 [cipta]
autores.uyKamus biografiUruguayP25583 [cipta]0 [cipta]
AWRKamus biografiAustralian Women's RegisterP41867 [cipta]0 [cipta]
BIBSYSPerpustakaan negaraNorwayP1015: ID NORAF2,2970 [cipta]
BildindexInstitut penyelidikan seniBildindex (Jerman)P20920 [cipta]0 [cipta]
BNCPerpustakaan negaraChileP1890373 [cipta]0 [cipta]
BNEPerpustakaan negaraSepanyolP950: ID Perpustakaan Negara Sepanyol2,6820 [cipta]
BNFPerpustakaan negaraPerancis (data)P268: ID BnF5,3670 [cipta]
BNMMPerpustakaan negaraArgentinaP3788: ID kewibawaan BNMM1550 [cipta]
BotanistPangkalan data saintifikIndeks Nama Tumbuhan AntarabangsaP428340 [cipta]
BPNKamus biografiBelandaP651490 [cipta]
CANTICPerpustakaan negaraCataloniaP1273: ID CANTIC60 [cipta]
CANTICNPerpustakaan negaraCataloniaP99841,4760 [cipta]
CCGPengenalan LighthouseCCGP39200 [cipta]0 [cipta]
CINIIPangkalan data saintifikCiNii (Jepun)P2712,0311 [cipta]
CWGCLain-lainSuruhanjaya Perkuburan Perang KomanwelP19086 [cipta]0 [cipta]
DAAOInstitut penyelidikan seniArtis AustraliaP17072 [cipta]0 [cipta]
DBLPPangkalan data saintifikDBLP (sains komputer)P24561330 [cipta]
DIBKamus biografiIrelandP6829210 [cipta]
DSIInstitut penyelidikan seniScientific illustratorsP2349230 [cipta]
DTBIOKamus biografiJermanP79021,8170 [cipta]
EMUPerpustakaan negaraUkraineP4613: ID Ensiklopedia Ukraine Moden2440 [cipta]
FASTLain-lainAplikasi Berfaset Terminologi SubjekP2163: ID FAST3,8410 [cipta]
FNZAInstitut penyelidikan seniArtis New ZealandP67922 [cipta]0 [cipta]
GNDPerpustakaan negaraJermanP227: ID GND8,01039 [cipta]
Google ScholarPangkalan data saintifikGoogle ScholarP1960: ID pengarang Google Scholar139 [cipta]0 [cipta]
HDSLain-lainKamus Sejarah SwitzerlandP902: ID HDS3260 [cipta]
IAAFLain-lainWorld AthleticsP114619 [cipta]0 [cipta]
ICCUPerpustakaan negaraItaliP396: kod kewibawaan SBN9560 [cipta]
ICIAInstitut penyelidikan seniICIA (Israel)P17360 [cipta]0 [cipta]
IEULain-lainEnsiklopedia Internet UkraineP907031 [cipta]0 [cipta]
ISNIUmumISNIP213: ID ISNI6,3760 [cipta]
J9UPerpustakaan negaraIsraelP8189: ID Perpustakaan Negara Israel6,4220 [cipta]
JocondeInstitut penyelidikan seniJoconde (Perancis)P3470 [cipta]0 [cipta]
KULTURNAVInstitut penyelidikan seniKulturNav (Norway)P12482290 [cipta]
LCCNPerpustakaan negaraAmerika SyarikatP244: ID kewibawaan Perpustakaan Kongres9,0960 [cipta]
LIRLain-lainLexicon istoric retic (Switzerland)P8866 [cipta]0 [cipta]
LNBPerpustakaan negaraLatviaP1368: pengecam LNB1,5040 [cipta]
Marina MilitarePengenalan LighthouseItaliP38630 [cipta]0 [cipta]
MarineTrafficPengenalan LighthouseMarineTrafficP36010 [cipta]0 [cipta]
MATHSNPangkalan data saintifikMathSciNetP4955300 [cipta]0 [cipta]
MBALain-lainMusicBrainz (artis)P434: ID artis MusicBrainz2,6650 [cipta]
MBAREALain-lainMusicBrainz (kawasan)P982: ID kawasan MusicBrainz6080 [cipta]
MBILain-lainMusicBrainz (instrumen)P1330: ID alat muzik MusicBrainz9 [cipta]0 [cipta]
MBLLain-lainMusicBrainz (syarikat rakaman)P966: ID label MusicBrainz1440 [cipta]
MBPLain-lainMusicBrainz (tempat)P1004: ID tempat MusicBrainz1470 [cipta]
MBRGLain-lainMusicBrainz (kumpulan pelancaran)P436: ID kumpulan pelancaran MusicBrainz1110 [cipta]
MBSLain-lainMusicBrainz (siri)P1407: ID siri MusicBrainz12 [cipta]0 [cipta]
MBWLain-lainMusicBrainz (karya)P435: ID karya MusicBrainz580 [cipta]
MGPPangkalan data saintifikProjek Genealogi MatematikP549368 [cipta]0 [cipta]
NARALain-lainArkib Negara (A.S.)P1225: Pengenal Pasti Arkib Negara A.S.9520 [cipta]
NCLPerpustakaan negaraTaiwanP104840 [cipta]0 [cipta]
NDLPerpustakaan negaraJepunP349: ID kewibawaan Perpustakaan Diet Kebangsaan2,9710 [cipta]
NGAPengenalan LighthouseNGAP35630 [cipta]0 [cipta]
NGVGaleri seni dan muziumVictoriaP204121 [cipta]0 [cipta]
NKCPerpustakaan negaraRepublik CzechP691: ID NKCR AUT4,8790 [cipta]
NLAPerpustakaan negaraAustraliaP409: ID Perpustakaan Australia1,7490 [cipta]
NLGPerpustakaan negaraYunaniP33486960 [cipta]
NLKPerpustakaan negaraKoreaP5034: pengecam Perpustakaan Kebangsaan Korea1,49553 [cipta]
NLPPerpustakaan negaraPolandP1695: ID NLP0 [cipta]10 [cipta]
NLRPerpustakaan negaraRomaniaP100332 [cipta]0 [cipta]
NSKPerpustakaan negaraCroatiaP1375: ID NSK8120 [cipta]
NTAPerpustakaan negaraBelandaP1006: ID Tesaurus Nama Pengarang Kebangsaan2,9890 [cipta]
ORCIDUmumORCIDP496: ORCID1920 [cipta]
PICInstitut penyelidikan seniPhotographers' IdentitiesP275062 [cipta]0 [cipta]
PLWABNPerpustakaan negaraPolandP7293: ID PLWABN2,6630 [cipta]
PublonsPangkalan data saintifikPublons (pengkaji)P382919 [cipta]0 [cipta]
RIDPangkalan data saintifikResearcherIDP105331 [cipta]0 [cipta]
RISMLain-lainRISM (Perancis)P55040137 [cipta]
REROLain-lainRERO (Switzerland)P3065: pengecam RERO1,5970 [cipta]
RKDartistsInstitut penyelidikan seniArtis RKD (Belanda)P6501650 [cipta]
RKDIDInstitut penyelidikan seniID RKD (Belanda)P3500 [cipta]0 [cipta]
RSLPerpustakaan negaraRusiaP947840 [cipta]
ScopusPangkalan data saintifikPengarang ScopusP11534300 [cipta]
SELIBRPerpustakaan negaraSwedenP906: ID SELIBR1,1260 [cipta]
SIKARTInstitut penyelidikan seniSIKART (Switzerland)P7815 [cipta]0 [cipta]
SNAC-IDLain-lainRangkaian Sosial dan Konteks ArkibP34301,9200 [cipta]
SUDOCLain-lainSUDOC (Perancis)P269: ID idRef4,6040 [cipta]
TA98Pangkalan data saintifikTerminologia AnatomicaP1323530 [cipta]
TDVİALain-lainİslâm AnsiklopedisiP73142190 [cipta]
TePapaGaleri seni dan muziumTe Papa (New Zealand)P35441370 [cipta]
TLSLain-lainTheaterlexikon (Switzerland)P13624 [cipta]0 [cipta]
TroveLain-lainTrove (Australia)P1315: ID NLA Trove1,5890 [cipta]
UKPARLLain-lainParlimen U.K.P6213143 [cipta]0 [cipta]
ULANInstitut penyelidikan seniNama Artis (Getty)P245: Union List of Artist Names4380 [cipta]
USCGPengenalan LighthouseUSCG (6-0695)P37230 [cipta]0 [cipta]
USCongressLain-lainKongres A.S.P1157: ID Bio Kongres A.S.380 [cipta]
VcBAPerpustakaan negaraVaticanP80346390 [cipta]
VIAFUmumVIAFP214: ID VIAF8,8960 [cipta]
WORLDCATIDUmumWorldCat IdentitiesP785900 [cipta]
ZBMATHPangkalan data saintifikzbMATHP15564500 [cipta]
-GeneralWorldCat (melalui Perpustakaan Kongres)0
-GeneralWorldCat (melalui VIAF)0
Totals96100,298240

Kategori penjejak tambahan

Modul ini juga melaksanakan kategori penjejakan tersembunyi yang berikut:

Bilangan pengenalan


require('Module:No globals')

local p = {}
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
local testcases = (string.sub(title.subpageText,1,9) == 'kes ujian')

--[[==========================================================================]]
--[[                            Category functions                            ]]
--[[==========================================================================]]

local function addCat( cat )
	if cat and cat ~= '' then return '[[Kategori:'..cat..']]'..p.redCatLink(cat) end
	return ''
end

function p.getCatForId( id )
	local cat = ''
	if namespace == 0 then
		cat = 'Rencana dengan pengenalan '..id
	end
	return addCat(cat)
end

function p.redCatLink( cat ) --cat == 'Blah' (not 'Kategori:Blah', not '[[Kategori:Blah]]')
	if cat and cat ~= '' and testcases == false and mw.title.new(cat, 14).exists == false then
		return '[[Kategori:Halaman dengan kategori kawalan kewibawaan berpaut merah]]'
	end
	return ''
end

function p.createRow( id, rawValues, link, links, withUid, specialCat, prefix)
	local faultyCat = 'Rencana dengan pengenalan '..(specialCat or id)..' yang rosak'
	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 'Persatuan Profesional Komputer')..']'..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 'Australia Selatan')..']'..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 (Jerman)')..']'..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 'Sepanyol')..']'..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 'Perancis')..'] [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 'Indeks Nama Tumbuhan Antarabangsa')..']'..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 'Belanda')..']'..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 (Jepun)')..']'..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 'Suruhanjaya Perkuburan Perang Komanwel')..']'..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 'Artis Australia')..']'..p.getCatForId( 'DAAO' )
end

function p.dblpLink( id, label )
	--P2456's format regex: \d{2,3} /\d+(-\d+)?|[a-z] /[a-zA-Z][0-9A-Za-z]*(-\d+)? (e.g. 123/123)
	if not id:match( '^%d%d%d?/%d+$' ) and
	   not id:match( '^%d%d%d?/%d+%-%d+$' ) and
	   not id:match( '^[a-z]/[a-zA-Z][0-9A-Za-z]*$' ) and
	   not id:match( '^[a-z]/[a-zA-Z][0-9A-Za-z]*%-%d+$' ) then
		return false
	end
	return '[https://dblp.org/pid/'..id..' '..(label or 'DBLP (sains komputer)')..']'..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 'Jerman')..']'..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 'Aplikasi Berfaset Terminologi Subjek')..']'..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 'Artis New Zealand')..']'..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 'Jerman')..']'..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 'Kamus Sejarah 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 'Itali')..']'..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 'Ensiklopedia Internet 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 (Perancis)')..']'..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 'Amerika Syarikat')..']'..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 'Itali')..']'..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 '[[MusicBrainz|MusicBrainz]] ['..url..' (artis)]'..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( 'kawasan MusicBrainz' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MusicBrainz|MusicBrainz]] ['..url..' (kawasan)]'..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( 'instrumen MusicBrainz' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MusicBrainz|MusicBrainz]] ['..url..' (instrumen)]'..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( 'syarikat rakaman MusicBrainz' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MusicBrainz|MusicBrainz]] ['..url..' (syarikat rakaman)]'..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( 'tempat MusicBrainz' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MusicBrainz|MusicBrainz]] ['..url..' (tempat)]'..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( 'kumpulan pelancaran MusicBrainz' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MusicBrainz|MusicBrainz]] ['..url..' (kumpulan pelancaran)]'..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( 'siri MusicBrainz' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MusicBrainz|MusicBrainz]] ['..url..' (siri)]'..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( 'karya MusicBrainz' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MusicBrainz|MusicBrainz]] ['..url..' (karya)]'..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 'Projek Genealogi Matematik')..']'..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 'Arkib Negara (A.S.)')..']'..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: 0?\d{8} (e.g. 012345678)
	if not id:match( '^0?%d%d%d%d%d%d%d%d$' ) then
		return false
	end
	return '[https://id.ndl.go.jp/auth/ndlna/'..id..' '..(label or 'Jepun')..']'..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 'Republik Czech')..']'..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 'Yunani')..']'..p.getCatForId( 'NLG' )
end

function p.nlkLink( id, label )
	--P5034's format regex: KA.(19|20).{7} (e.g. KAC201501465)
	if not id:match( '^KA.19.......$' ) and
	   not id:match( '^KA.20.......$' ) then
		return false
	end
	return '[https://librarian.nl.go.kr/LI/contents/L20101000000.do?id='..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 'Belanda')..']'..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 (pengkaji)')..']'..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 (Perancis)')..']'..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 'Artis RKD (Belanda)')..']'..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 'ID RKD (Belanda)')..']'..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 'Rusia')..']'..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 'Pengarang Scopus')..']'..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 'Rangkaian Sosial dan Konteks Arkib')..']'..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 (Perancis)')..']'..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 'Parlimen U.K.')..']'..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 'Nama Artis (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 '[[Pengawal Pantai Amerika Syarikat|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 'Kongres A.S.')..']'..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='[[:Kategori:'..category..'|'..label..']]'
	if mw.title.new(category, 14).exists == false then
		ret = ret..' <span class="plainlinks" style="font-size:85%;">&#91;['..tostring(mw.uri.fullUrl('Kategori:'..category,'action=edit&preload=Template:Authority_control/preload'))..' cipta]&#93;</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>Bahagian</th>'..
	  '<th rowspan=2>Dipaparkan sebagai</th>'..
	  '<th rowspan=2 data-sort-type=number>Sifat Wikidata</th>'..
	  '<th colspan=2>Kategori penjejakan dan kiraan halaman</th></tr>'..
	  '<tr><th>[[:Kategori:Rencana dengan maklumat kawalan kewibawaan|Rencana]]</th>'..
	  '<th>[[:Kategori:Rencana dengan maklumat kawalan kewibawaan yang salah|ID yang salah]]</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..' (pengenalan)'
		local category = conf.category or param
		local args = { id = 'f', pid }
		local wpl = frame:expandTemplate{ title = 'Wikidata property link', args = args }
		--cats
		local articleCat = 'Rencana dengan pengenalan '..category
		local faultyCat =  'Rencana dengan pengenalan '..category..' yang rosak'
		--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 = 'Rencana dengan pengenalan '..w
		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 (melalui Perpustakaan Kongres)]'
		else
			appearsAs = '[https://www.worldcat.org/identities/containsVIAFID/12345789 WorldCat (melalui 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;">[[:Kategori:'..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> (pengenalan)" 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)")
--  Kategori: 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, 'Galeri seni dan muzium', '1' },
	{ 'ACM-DL', 864, p.acmLink, 'Pangkalan data saintifik', '12345678901', prefix = '[[Persatuan Profesional Komputer|ACM DL]]' },
	{ 'ADB', 1907, p.adbLink,'Kamus biografi', 'barton-sir-edmund-toby-71' },
	{ 'admiralty', 3562, p.admiraltyLink, 'Pengenalan Lighthouse', 'D1204.1', prefix='[[Pejabat Hidrografi United Kingdom|Admiralty]]'},
	{ 'AGSA', 6804, p.agsaLink, 'Galeri seni dan muzium', '3625' },
	{ 'ARLHS', 2980, p.ARLHSLink, 'Pengenalan Lighthouse', 'LAT023'},
	{ 'autores.uy', 2558, p.autoresuyLink, 'Kamus biografi', '12345' },
	{ 'AWR', 4186, p.awrLink, 'Kamus biografi', 'PR00768b' },
	{ 'BIBSYS', 1015, p.bibsysLink, 'Perpustakaan negara', '1234567890123' },
	{ 'Bildindex', 2092, p.bildLink, 'Institut penyelidikan seni', '1' },
	{ 'BNC', 1890, p.bncLink, 'Perpustakaan negara', '123456789' },
	{ 'BNE', 950, p.bneLink, 'Perpustakaan negara', 'XX1234567' },
	{ 'BNF', 268, p.bnfLink, 'Perpustakaan negara', '123456789' },
	{ 'BNMM', 3788, p.bnmmLink, 'Perpustakaan negara', '000024044' },
	{ 'Botanist', 428, p.botanistLink , 'Pangkalan data saintifik', 'L.' },
	{ 'BPN', 651, p.bpnLink , 'Kamus biografi', '12345678' },
	{ 'CANTIC', 1273, p.canticLink, 'Perpustakaan negara', 'a12345678' },
	{ 'CANTICN', 9984, p.canticnLink, 'Perpustakaan negara', '981058515460906706' },
	{ 'CCG', 3920, p.ccgLink, 'Pengenalan Lighthouse', 'A1761', prefix='[[Pengawal Pantai Kanada|CCG]]' },
	{ 'CINII', 271, p.ciniiLink, 'Pangkalan data saintifik', 'DA12345678', link = 'CiNii' },
	{ 'CWGC', 1908, p.cwgcLink, 'Lain-lain', '1234567' },
	{ 'DAAO', 1707, p.daaoLink, 'Institut penyelidikan seni', 'rolf-harris' },
	{ 'DBLP', 2456, p.dblpLink, 'Pangkalan data saintifik', '123/123' },
	{ 'DIB',  6829, p.dibLink, 'Kamus biografi', '001953' },
	{ 'DSI', 2349, p.dsiLink, 'Institut penyelidikan seni', '1538' },
	{ 'DTBIO', 7902, p.dtbioLink, 'Kamus biografi', '118554700' },
	{ 'EMU', 4613, p.emuLink, 'Perpustakaan negara', '15409' },
	{ 'FAST', 2163, p.fastLink, 'Lain-lain', '1' },
	{ 'FNZA', 6792, p.fnzaLink, 'Institut penyelidikan seni', '12' },
	{ 'GND', 227, p.gndLink, 'Perpustakaan negara', '4079154-3' },
	{ 'Google Scholar', 1960, p.googleLink, 'Pangkalan data saintifik', 'QPdLuj8AAAAJ' },
	{ 'HDS', 902, p.hdsLink, 'Lain-lain', '050123' },
	{ 'IAAF', 1146, p.iaafLink, 'Lain-lain', '123' },
	{ 'ICCU', 396, p.iccuLink, 'Perpustakaan negara', 'CFIV000163' }, --formerly SBN
	{ 'ICIA', 1736, p.iciaLink, 'Institut penyelidikan seni', '1' },
	{ 'IEU', 9070, p.ieuLink, 'Lain-lain', 'N\\A\\NationalAcademyofArtandArchitecture' },
	{ 'ISNI', 213, p.isniLink, 'Umum', '0000-0000-6653-4145', prefix = '[[Pengecam Nama Piawaian Antarabangsa|ISNI]]' },
	{ 'J9U', 8189, p.j9uLink, 'Perpustakaan negara', '987007305652505171' },
	{ 'Joconde', 347, p.jocondeLink, 'Institut penyelidikan seni', '12345678901' },
	{ 'KULTURNAV', 1248, p.kulturnavLink, 'Institut penyelidikan seni', '12345678-1234-1234-1234-1234567890AB', link = 'KulturNav' },
	{ 'LCCN', 244, p.lccnLink, 'Perpustakaan negara', 'n78039510' },
	{ 'LIR', 886, p.lirLink, 'Lain-lain', '1' },
	{ 'LNB', 1368, p.lnbLink, 'Perpustakaan negara', '123456789' },
	{ 'Marina Militare', 3863, p.marinaMilitareLink, 'Pengenalan Lighthouse', '3856' },
	{ 'MarineTraffic', 3601, p.mtLink, 'Pengenalan Lighthouse', '1000004707' },
	{ 'MATHSN', 4955, p.mathsnLink, 'Pangkalan data saintifik', '175270' },
	{ 'MBA', 434, p.mbaLink, 'Lain-lain', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz' }, --special cat name
	{ 'MBAREA', 982, p.mbareaLink, 'Lain-lain', '12345678-1234-1234-1234-1234567890AB', category = 'kawasan MusicBrainz' }, --special cat name
	{ 'MBI', 1330, p.mbiLink, 'Lain-lain', '12345678-1234-1234-1234-1234567890AB', category = 'instrumen MusicBrainz' }, --special cat name
	{ 'MBL', 966, p.mblLink, 'Lain-lain', '12345678-1234-1234-1234-1234567890AB', category = 'syarikat rakaman MusicBrainz' }, --special cat name
	{ 'MBP', 1004, p.mbpLink, 'Lain-lain', '12345678-1234-1234-1234-1234567890AB', category = 'tempat MusicBrainz' }, --special cat name
	{ 'MBRG', 436, p.mbrgLink, 'Lain-lain', '12345678-1234-1234-1234-1234567890AB', category = 'kumpulan pelancaran MusicBrainz' }, --special cat name
	{ 'MBS', 1407, p.mbsLink, 'Lain-lain', '12345678-1234-1234-1234-1234567890AB', category = 'siri MusicBrainz' }, --special cat name
	{ 'MBW',  435, p.mbwLink, 'Lain-lain', '12345678-1234-1234-1234-1234567890AB', category = 'karya MusicBrainz' }, --special cat name
	{ 'MGP', 549, p.mgpLink, 'Pangkalan data saintifik', '123456' },
	{ 'NARA', 1225, p.naraLink, 'Lain-lain', '12345678' },
	{ 'NCL', 1048, p.nclLink, 'Perpustakaan negara', '1081436' },
	{ 'NDL', 349, p.ndlLink, 'Perpustakaan negara', '012345678' },
	{ 'NGA', 3563, p.ngaLink, 'Pengenalan Lighthouse', '114-5592'},
	{ 'NGV', 2041, p.ngvLink, 'Galeri seni dan muzium', '12354' },
	{ 'NKC', 691, p.nkcLink, 'Perpustakaan negara', 'abcd12345678901234' },
	{ 'NLA', 409, p.nlaLink, 'Perpustakaan negara', '123456789012' },
	{ 'NLG', 3348, p.nlgLink, 'Perpustakaan negara', '12345678' },
	{ 'NLK', 5034, p.nlkLink, 'Perpustakaan negara', 'KAB197000000' },
	{ 'NLP', 1695, p.nlpLink, 'Perpustakaan negara', '9810123456789012345' },
	{ 'NLR', 1003, p.nlrLink, 'Perpustakaan negara', '123456789' },
	{ 'NSK', 1375, p.nskLink, 'Perpustakaan negara', '123456789' },
	{ 'NTA', 1006, p.ntaLink, 'Perpustakaan negara', '12345678X' },
	{ 'ORCID', 496, p.orcidLink, 'Umum', '0000-0002-7398-5483', prefix = '[[ORCID|ORCID]]' },
	{ 'PIC', 2750, p.picLink, 'Institut penyelidikan seni', '1' },
	{ 'PLWABN',  7293, p.plwabnLink, 'Perpustakaan negara', '9812345678905606' },
	{ 'Publons', 3829, p.publonsLink, 'Pangkalan data saintifik', '2776255' },
	{ 'RID', 1053, p.ridLink, 'Pangkalan data saintifik', 'A-1234-1934' },
	{ 'RISM', 5504, p.rismLink, 'Lain-lain', 'pe1',  prefix = '[[RISM|RISM (Perancis)]]' },
	{ 'RERO', 3065, p.reroLink, 'Lain-lain', '02-A012345678', prefix = '[[Rangkaian Perpustakaan Switzerland Barat|RERO (Switzerland)]]' },
	{ 'RKDartists', 650, p.rkdartistsLink, 'Institut penyelidikan seni', '123456' },
	{ 'RKDID', 350, p.rkdidLink, 'Institut penyelidikan seni', '123456' },
	{ 'RSL', 947, p.rslLink, 'Perpustakaan negara', '123456789' },
	{ 'Scopus', 1153, p.scopusLink, 'Pangkalan data saintifik', '7005487412' },
	{ 'SELIBR', 906, p.selibrLink, 'Perpustakaan negara', '123456' },
	{ 'SIKART', 781, p.sikartLink, 'Institut penyelidikan seni', '123456789' },
	{ 'SNAC-ID', 3430, p.snacLink, 'Lain-lain', 'A' },
	{ 'SUDOC', 269, p.sudocLink, 'Lain-lain', '026927608', prefix = '[[Sistem Pendokumenan Universiti|SUDOC (Perancis)]]' },
	{ 'TA98', 1323, p.ta98Link, 'Pangkalan data saintifik', 'A12.3.45.678' },
	{ 'TDVİA', 7314, p.tdviaLink, 'Lain-lain', 'asim-b-behdele' },
	{ 'TePapa', 3544, p.tepapaLink, 'Galeri seni dan muzium', '1' },
	{ 'TLS',  1362, p.tlsLink, 'Lain-lain', 'Abcd' },
	{ 'Trove', 1315, p.troveLink, 'Lain-lain', '12345678', prefix = '[[Trove|Trove (Australia)]]' }, --formerly NLA-person
	{ 'UKPARL', 6213, p.ukparlLink, 'Lain-lain', 'AQUupyiR' },
	{ 'ULAN', 245, p.ulanLink, 'Institut penyelidikan seni', '500123456' },
	{ 'USCG', 3723, p.uscgLink, 'Pengenalan Lighthouse', '6-0695'},
	{ 'USCongress', 1157, p.uscongressLink, 'Lain-lain', 'A000123', prefix = '[[Direktori Biografi Kongres Amerika Syarikat|Kongres A.S.]]' },
	{ 'VcBA', 8034, p.vcbaLink, 'Perpustakaan negara', '494/9793' },
	{ 'VIAF', 214, p.viafLink, 'Umum', '123456789', prefix = '[[Fail Kewibawaan Antarabangsa Maya|VIAF]]' },
	{ 'WORLDCATID', 7859, p.worldcatidLink, 'Umum', 'lccn-n78-95332', prefix = '[[WorldCat|WorldCat Identities]]' },
	{ 'ZBMATH', 1556, p.zbmathLink, 'Pangkalan data saintifik', '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 [[Kategori: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 = '[[Kategori:Rencana dengan pengenalan kawalan kewibawaan yang usang|'..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 = '[[Kategori:Rencana dengan pengenalan kawalan kewibawaan yang disekat|'..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 = '[[Kategori:Halaman menggunakan kawalan kewibawaan dengan parameter berbeza pada Wikidata|'..params[1]..']]'
		end	end	end	end	end
		if iMatches > 0 and iMatches == iParentArgs then
			sameOnWDCat = '[[Kategori:Halaman menggunakan kawalan kewibawaan dengan parameter semua sepadan dengan 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 dengan '..suppressedIdCount..' elemen yang disekat'
				suppressedIdCatArts = addCat(sCat)
			end
		end
	end

	--configure rows
	local rct = 0
	local sectionOrder = {
		'Umum',
		'Perpustakaan negara',
		'Galeri seni dan muzium',
		'Institut penyelidikan seni',
		'Kamus biografi',
		'Pangkalan data saintifik',
		'Pengenalan Lighthouse',
		'Lain-lain'
	}
	local sections = {
		['Umum'] = {},
		['Perpustakaan negara'] = {},
		['Galeri seni dan muzium'] = {},
		['Institut penyelidikan seni'] = {},
		['Kamus biografi'] = {},
		['Pangkalan data saintifik'] = {},
		['Pengenalan Lighthouse'] = {},
		['Lain-lain'] = {}
	}
	--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['Umum'], p.createRow( 'VIAF', viafId, '[https://www.worldcat.org/identities/containsVIAFID/'..viafId..' WorldCat (melalui VIAF)]', nil, false ) )
			if namespace == 0 then
				worldcatCat = '[[Kategori:Recana dengan pengenalan WorldCat-VIAF]]'
			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['Umum'], p.createRow( 'LCCN', lccnId, '[https://www.worldcat.org/identities/lccn-'..lccnIdFmtd..' WorldCat (melalui Perpustakaan Kongres)]', nil, false ) )
				if namespace == 0 then
					worldcatCat = '[[Kategori:Recana dengan pengenalan WorldCat-LCCN]]'
				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  = 'Kawalan kewibawaan',
			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 = '[[Bantuan:Kawalan kewibawaan|Kawalan kewibawaan]]'..pencil
		else
			local sect = navboxArgs.group1
			if sect == 'Umum' or sect == 'Lain-lain' or sect == 'Additional' then
				-- Just say "Kawalan kewibawaan" 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 = '[[Bantuan:Kawalan kewibawaan|Kawalan kewibawaan]]'..pencil
			else
				navboxArgs.group1 = '[[Bantuan:Kawalan kewibawaan|Kawalan kewibawaan: '..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 dengan '..rct..' elemen'
			elementsCat = addCat(eCat)
		end
	end
	if parentArgs.state then
		if namespace == 0 or testcases then
			local sCat
			if parentArgs.state == 'collapsed' then sCat = 'AC menggunakan parameter keadaan: collapsed'
			elseif parentArgs.state == 'expanded' then sCat = 'AC menggunakan parameter keadaan: expanded'
			elseif parentArgs.state == 'autocollapse' then sCat = 'AC menggunakan parameter keadaan: autocollapse'
			else sCat = 'AC menggunakan parameter keadaan: 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, '(%[%[)(Kategori)', '%1:%2') --for easier checking
	end

	--out
	outString = outString..auxCats
	if namespace ~= 0 then
		outString = mw.ustring.gsub(outString, '(%[%[)(Kategori:Rencana)', '%1:%2') --by definition
	end

	return outString
end

return p
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy