コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「モジュール:Authority control」の版間の差分

削除された内容 追加された内容
en:Module:Authority control oldid=1089010245 よりDIB、MGP、TDVIA、TLS、ZBMATHを修正
sandboxを複製、WP:AN/PEによる
9行目: 9行目:
--[[ Category functions ]]
--[[ Category functions ]]
--[[==========================================================================]]
--[[==========================================================================]]

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


function p.getCatForId( id )
function p.getCatForId( id )
local cat = ''
local catName = ''
if namespace == 0 then
if namespace == 0 then
cat = id..'識別子が指定されている記事'
catName = id..'識別子が指定されている記事'
elseif namespace == 2 and not title.isSubpage then
elseif namespace == 2 and not title.isSubpage then
cat = id..'識別子が指定されている利用者ページ'
catName = id..'識別子が指定されている利用者ページ'
else
else
cat = id..'識別子が指定されているその他のページ'
catName = id..'識別子が指定されているその他のページ'
end
end
return '[[Category:'..catName..']]'..p.redCatLink(catName)
return addCat(cat)
end
end


function p.redCatLink( cat ) --cat == 'Blah' (not 'Category:Blah', not '[[Category:Blah]]')
function p.redCatLink( catName ) --catName == 'Blah' (not 'Category:Blah', not '[[Category:Blah]]')
if cat and cat ~= '' and
if catName and catName ~= '' and
testcases == false and
testcases == false and
mw.title.new(cat, 14).exists == false
mw.title.new(catName, 14).exists == false
then
then
return '[[Category:赤リンクの典拠情報カテゴリがあるページ]]'
return '[[Category:赤リンクの典拠情報カテゴリがあるページ]]'
37行目: 32行目:
end
end


function p.createRow( id, label, rawValues, link, links, withUid, specialCat, prefix )
function p.createRow( id, rawValues, link, links, withUid, specialCat, prefix )
local faultyCat = '誤った'..(specialCat or id)..'識別子が指定されている記事'
local catName = '誤った'..(specialCat or id)..'識別子が指定されている記事'
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 label then
if prefix then
row = row..'*'..label
row = row .. '*' .. prefix
end
end
--if prefix then
local totlen = 0
-- row = row..'*'..prefix
--end
for i, l in ipairs( links ) do
for i, l in ipairs( links ) do
if i == 1 and not label then row = row..'*' end
if i == 1 and not prefix then row = row..'*'
if i ~= 1 then row = row..', ' end
else row = row..'\n**' end
if l then
if l then
row = row..'<span class="uid">'..l..'</span>'
row = row..'<span class="uid">'..l..'</span>'
else
else
row = row..'<span class="error">'..id..'識別子の値'..rawValues[i]..'は正しくありません。</span>'..addCat(faultyCat)
row = row..'<span class="error">'..id..'識別子の値'..rawValues[i]..'は正しくありません。</span>[[Category:'..catName..']]'..p.redCatLink(catName)
end
end
end
end
59行目: 52行目:
elseif link then -- All IDs that have a prefix support multiple identifiers, so prefix is not needed
elseif link then -- All IDs that have a prefix support multiple identifiers, so prefix is not needed
if withUid then
if withUid then
return '*<span class="nowrap">'..label..' <span class="uid">'..link..'</span></span>\n'
return '*<span class="nowrap"><span class="uid">'..link..'</span></span>\n'
end
end
return '*<span class="nowrap">'..label..' '..link..'</span>\n'
return '*<span class="nowrap">'..link..'</span>\n'
end
end


return '* <span class="error">'..id..'識別子の値'..rawValues..'は正しくありません。</span>'..addCat(faultyCat)..'\n'
return '* <span class="error">'..id..'識別子の値'..rawValues..'は正しくありません。</span>[[Category:'..catName..']]'..p.redCatLink(catName)..'\n'
end
end


71行目: 64行目:
--[[==========================================================================]]
--[[==========================================================================]]


-- If a link has a suitable entry in the global inter-wiki prefix table at [[:m:Interwiki_map]],
-- 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.
-- 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 )
function p.aagLink( id, label )
--P3372's format regex: \d+ (e.g. 1)
--P3372's format regex: \d+ (e.g. 1)
if not id:match( '^%d+$' ) then
if not id:match( '^%d+$' ) then
return false
return false
end
end
return '[https://www.aucklandartgallery.com/explore-art-and-ideas/artist/'..id..'/ '..id..']'..p.getCatForId( 'AAG' )
return '[https://www.aucklandartgallery.com/explore-art-and-ideas/artist/'..id..'/ '..(label or 'オークランド')..']'..p.getCatForId( 'AAG' )
end
end


function p.acmLink( id )
function p.acmLink( id, label )
--P864's format regex: \d{11} (e.g. 12345678901)
--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
if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d$' ) then
return false
return false
end
end
return '[https://dl.acm.org/profile/'..id..' '..id..']'..p.getCatForId( 'ACM-DL' )
return '[https://dl.acm.org/profile/'..id..' '..(label or '計算機協会')..']'..p.getCatForId( 'ACM-DL' )
end
end


function p.adbLink( id )
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)
--P1907's format regex: [a-z][-a-z]+-([1-2]\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
if not id:match( '^[a-z][-a-z]+-[1-2]%d%d?%d?%d?$' ) and
not id:match( '^[a-z][-a-z]+-[1-9]%d?%d?%d?$' ) then
not id:match( '^[a-z][-a-z]+-[1-9]%d?%d?%d?$' ) then
return false
return false
end
end
return '[http://adb.anu.edu.au/biography/'..id..' '..id..']'..p.getCatForId( 'ADB' )
return '[http://adb.anu.edu.au/biography/'..id..' '..(label or 'オーストラリア')..']'..p.getCatForId( 'ADB' )
end
end


function p.admiraltyLink( id )
function p.agsaLink( 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 )
--P6804's format regex: [1-9]\d* (e.g. 3625)
--P6804's format regex: [1-9]\d* (e.g. 3625)
if not id:match( '^[1-9]%d*$' ) then
if not id:match( '^[1-9]%d*$' ) then
return false
return false
end
end
return '[https://www.agsa.sa.gov.au/collection-publications/collection/creators/_/'..id..'/ '..id..']'..p.getCatForId( 'AGSA' )
return '[https://www.agsa.sa.gov.au/collection-publications/collection/creators/_/'..id..'/ '..(label or '南オーストラリア')..']'..p.getCatForId( 'AGSA' )
end

function p.ARLHSLink( id )
--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 '..id..']'..p.getCatForId( 'ARLHS' )
end
end


function p.autoresuyLink( id )
function p.autoresuyLink( id, label )
--P2558's format regex: [1-9]\d{0,4} (e.g. 12345)
--P2558's format regex: [1-9]\d{0,4} (e.g. 12345)
if not id:match( '^[1-9]%d?%d?%d?%d?$' ) then
if not id:match( '^[1-9]%d?%d?%d?%d?$' ) then
return false
return false
end
end
return '[https://autores.uy/autor/'..id..' '..id..']'..p.getCatForId( 'autores.uy' )
return '[https://autores.uy/autor/'..id..' '..(label or 'ウルグアイ')..']'..p.getCatForId( 'autores.uy' )
end
end


function p.awrLink( id )
function p.awrLink( id, label )
--P4186's format regex: (([A-Z]{3}\d{4})|([A-Z]{2}\d{5}))[a-z] (e.g. PR00768b)
--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
if not id:match( '^[A-Z][A-Z][A-Z]%d%d%d%d[a-z]$' ) and
140行目: 113行目:
return false
return false
end
end
return '[http://www.womenaustralia.info/biogs/'..id..'.htm '..id..']'..p.getCatForId( 'AWR' )
return '[http://www.womenaustralia.info/biogs/'..id..'.htm '..(label or 'Australian Women\'s Register')..']'..p.getCatForId( 'AWR' )
end
end


function p.bibsysLink( id )
function p.bibsysLink( id, label )
--P1015's format regex: [1-9]\d* or [1-9](\d{0,8}|\d{12}) (e.g. 1234567890123)
--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
--TODO: follow up @ [[d:Property talk:P1015#Discrepancy between the 2 regex constraints]] or escalate/investigate
150行目: 123行目:
return false
return false
end
end
return '[https://authority.bibsys.no/authority/rest/authorities/html/'..id..' '..id..']'..p.getCatForId( 'BIBSYS' )
return '[https://authority.bibsys.no/authority/rest/authorities/html/'..id..' '..(label or 'ノルウェー')..']'..p.getCatForId( 'BIBSYS' )
end
end


function p.bildLink( id )
function p.bildLink( id, label )
--P2092's format regex: \d+ (e.g. 1)
--P2092's format regex: \d+ (e.g. 1)
if not id:match( '^%d+$' ) then
if not id:match( '^%d+$' ) then
return false
return false
end
end
return '[https://www.bildindex.de/document/obj'..id..' '..id..']'..p.getCatForId( 'Bildindex' )
return '[https://www.bildindex.de/document/obj'..id..' '..(label or 'Bildindex(ドイツ)')..']'..p.getCatForId( 'Bildindex' )
end
end


function p.bncLink( id )
function p.bncLink( id, label )
--P1890's format regex: \d{9} (e.g. 123456789)
--P1890's format regex: \d{9} (e.g. 123456789)
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
return false
return false
end
end
return '[http://www.bncatalogo.cl/F?func=direct&local_base=red10&doc_number='..id..' '..id..']'..p.getCatForId( 'BNC' )
return '[http://www.bncatalogo.cl/F?func=direct&local_base=red10&doc_number='..id..' '..(label or 'チリ')..']'..p.getCatForId( 'BNC' )
end
end


function p.bneLink( id )
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)
--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
if not id:match( '^[XF][XF]%d%d%d%d%d?%d?%d?$' ) and
177行目: 150行目:
return false
return false
end
end
return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id='..id..' '..id..']'..p.getCatForId( 'BNE' ) --no https as of 9/2019
return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id='..id..' '..(label or 'スペイン')..']'..p.getCatForId( 'BNE' ) --no https as of 9/2019
end
end


function p.bnfLink( id )
function p.bnfLink( id, label )
--P268's format regex: \d{8}[0-9bcdfghjkmnpqrstvwxz] (e.g. 123456789)
--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
if not id:match( '^c?b?%d%d%d%d%d%d%d%d[0-9bcdfghjkmnpqrstvwxz]$' ) then
189行目: 162行目:
id = 'cb'..id
id = 'cb'..id
end
end
return '[https://catalogue.bnf.fr/ark:/12148/'..id..' '..id..'] [https://data.bnf.fr/ark:/12148/'..id..' (データ)]'..p.getCatForId( 'BNF' )
return '[https://catalogue.bnf.fr/ark:/12148/'..id..' '..(label or 'フランス')..'] [https://data.bnf.fr/ark:/12148/'..id..' (データ)]'..p.getCatForId( 'BNF' )
end
end


function p.botanistLink( id )
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.)
--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...
--not easily/meaningfully implementable in Lua's regex since "(this)?" is not allowed...
198行目: 171行目:
return false
return false
end
end
local id2 = id:gsub(' +', '%%20')
id = id:gsub(' +', '%%20')
return '[https://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation='..id2..' '..id..']'..p.getCatForId( 'Botanist' )
return '[https://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation='..id..' '..(label or 'International Plant Names Index')..']'..p.getCatForId( 'Botanist' )
end
end


function p.bpnLink( id )
function p.bpnLink( id, label )
--P651's format regex: \d{6,8} (e.g. 00123456)
--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
if not id:match( '^%d%d%d%d%d%d%d%d$' ) and --original format regex, changed 8/2019 to
209行目: 182行目:
return false
return false
end
end
return '[http://www.biografischportaal.nl/en/persoon/'..id..' '..id..']'..p.getCatForId( 'BPN' ) --no https as of 9/2019
return '[http://www.biografischportaal.nl/en/persoon/'..id..' '..(label or 'オランダ')..']'..p.getCatForId( 'BPN' ) --no https as of 9/2019
end
end


function p.canticLink( id )
function p.canticLink( id, label )
--P1273's format regex: a\d{7}[0-9x] (e.g. a10640745)
--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
if not id:match( '^a%d%d%d%d%d%d%d[%dx]$' ) then
return false
return false
end
end
return '[http://cantic.bnc.cat/registres/CUCId/'..id..' '..id..']'..p.getCatForId( 'CANTIC' ) --no https as of 10/2019
return '[http://cantic.bnc.cat/registres/CUCId/'..id..' '..(label or 'カタルーニャ')..']'..p.getCatForId( 'CANTIC' ) --no https as of 10/2019
end
end


function p.ccgLink( id )
function p.ciniiLink( 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 )
--P271's format regex: DA\d{7}[\dX] (e.g. DA12345678)
--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
if not id:match( '^DA%d%d%d%d%d%d%d[%dX]$' ) then
return false
return false
end
end
return '[https://ci.nii.ac.jp/author/'..id..'?l=ja '..id..']'..p.getCatForId( 'CINII' )
return '[https://ci.nii.ac.jp/author/'..id..'?l=en '..(label or 'CiNii(日本)')..']'..p.getCatForId( 'CINII' )
end
end


function p.cwgcLink( id )
function p.cwgcLink( id, label )
--P1908's format regex: [1-9]\d* (e.g. 75228351)
--P1908's format regex: [1-9]\d* (e.g. 75228351)
if not id:match( '^[1-9]%d*$' ) then
if not id:match( '^[1-9]%d*$' ) then
return false
return false
end
end
return '[https://www.cwgc.org/find-war-dead/casualty/'..id..'/ '..id..']'..p.getCatForId( 'CWGC' )
return '[https://www.cwgc.org/find-war-dead/casualty/'..id..'/ '..(label or 'コモンウェルス戦争墓地委員会')..']'..p.getCatForId( 'CWGC' )
end
end


function p.daaoLink( id )
function p.daaoLink( id, label )
--P1707's format regex: [a-z\-]+\d* (e.g. rolf-harris)
--P1707's format regex: [a-z\-]+\d* (e.g. rolf-harris)
if not id:match( '^[a-z%-]+%d*$' ) then
if not id:match( '^[a-z%-]+%d*$' ) then
return false
return false
end
end
return '[https://www.daao.org.au/bio/'..id..' '..id..']'..p.getCatForId( 'DAAO' )
return '[https://www.daao.org.au/bio/'..id..' '..(label or 'オーストラリアのアーティスト')..']'..p.getCatForId( 'DAAO' )
end
end


function p.dblpLink( id )
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)
--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
if not id:match( '^%d%d%d?/%d+$' ) and
261行目: 225行目:
return false
return false
end
end
return '[https://dblp.org/pid/'..id..' '..id..']'..p.getCatForId( 'DBLP' )
return '[https://dblp.org/pid/'..id..' '..(label or 'DBLP(コンピュータ科学)')..']'..p.getCatForId( 'DBLP' )
end
end


function p.dibLink( id )
function p.dibLink( id, label )
--P6829's format regex: 0[01]\d{4}(\.[A-D])? (e.g. 001953)
--P6829's format regex: a\d{4}\d?(-[A-D])? (e.g. a1953)
if not id:match( '^0[01]%d%d%d%d%.?[A-D]?$' ) then
if not id:match( '^a%d%d%d%d%d?%-?[A-D]?$' ) then
return false
return false
end
end
return '[https://dib.cambridge.org/viewReadPage.do?articleId='..id..' '..id..']'..p.getCatForId( 'DIB' )
return '[https://dib.cambridge.org/viewReadPage.do?articleId='..id..' '..(label or 'アイルランド')..']'..p.getCatForId( 'DIB' )
end
end


function p.dsiLink( id )
function p.dsiLink( id, label )
--P2349's format regex: [1-9]\d* (e.g. 1538)
--P2349's format regex: [1-9]\d* (e.g. 1538)
if not id:match( '^[1-9]%d*$' ) then
if not id:match( '^[1-9]%d*$' ) then
return false
return false
end
end
return '[http://www.uni-stuttgart.de/hi/gnt/dsi2/index.php?table_name=dsi&function=details&where_field=id&where_value='..id..' '..id..']'..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 '科学画家')..']'..p.getCatForId( 'DSI' )
end
end


function p.dtbioLink( id )
function p.fastLink( 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 '..id..']'..p.getCatForId( 'DTBIO' )
end

function p.emuLink( id )
--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..' '..id..']'..p.getCatForId( 'EMU' )
end

function p.fastLink( id )
--P2163's format regex: [1-9]\d{0,7} (e.g. 1916996)
--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
if not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?$' ) then
return false
return false
end
end
return '[http://id.worldcat.org/fast/'..id..'/ '..id..']'..p.getCatForId( 'FAST' )
return '[http://id.worldcat.org/fast/'..id..'/ '..(label or 'Faceted Application of Subject Terminology')..']'..p.getCatForId( 'FAST' )
end
end


function p.fnzaLink( id )
function p.fnzaLink( id, label )
--P6792's format regex: [1-9]\d* (e.g. 9785)
--P6792's format regex: [1-9]\d* (e.g. 9785)
if not id:match( '^[1-9]%d*$' ) then
if not id:match( '^[1-9]%d*$' ) then
return false
return false
end
end
return '[https://findnzartists.org.nz/artist/'..id..'/ '..id..']'..p.getCatForId( 'FNZA' )
return '[https://findnzartists.org.nz/artist/'..id..'/ '..(label or 'ニュージーランドのアーティスト')..']'..p.getCatForId( 'FNZA' )
end
end


function p.gndLink( id )
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)
--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
if not id:match( '^1[012]?%d%d%d%d%d%d%d[0-9X]$' ) and
320行目: 268行目:
return false
return false
end
end
return '[https://d-nb.info/gnd/'..id..' '..id..']'..p.getCatForId( 'GND' )
return '[https://d-nb.info/gnd/'..id..' '..(label or '統合典拠ファイル(ドイツ)')..']'..p.getCatForId( 'GND' )
end
end


function p.googleLink( id )
function p.hdsLink( 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..' '..id..']'..p.getCatForId( 'Google Scholar' )
end

function p.hdsLink( id )
--P902's format regex: \d{6} (e.g. 050123)
--P902's format regex: \d{6} (e.g. 050123)
if not id:match( '^%d%d%d%d%d%d$' ) then
if not id:match( '^%d%d%d%d%d%d$' ) then
return false
return false
end
end
return '[https://hls-dhs-dss.ch/fr/articles/'..id..' '..id..']'..p.getCatForId( 'HDS' )
return '[https://hls-dhs-dss.ch/fr/articles/'..id..' '..(label or 'スイス歴史辞典')..']'..p.getCatForId( 'HDS' )
end
end


function p.iaafLink( id )
function p.iaafLink( id, label )
--P1146's format regex: [0-9][0-9]* (e.g. 012)
--P1146's format regex: [0-9][0-9]* (e.g. 012)
if not id:match( '^%d+$' ) then
if not id:match( '^%d+$' ) then
return false
return false
end
end
return '[https://www.iaaf.org/athletes/_/'..id..' '..id..']'..p.getCatForId( 'IAAF' )
return '[https://www.iaaf.org/athletes/_/'..id..' '..(label or 'ワールドアスレティックス')..']'..p.getCatForId( 'IAAF' )
end
end


function p.iccuLink( id )
function p.iccuLink( id, label )
--P396's format regex: \D{2}[A-Z0-3]V\d{6} (e.g. CFIV000163)
--P396's format regex: IT\\ICCU\\(\d{10}|\D\D[\D\d]\D\\\d{6}) (e.g. IT\ICCU\CFIV\000163)
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)
if not id:match( '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and
not id:match( '^IT\\ICCU\\%u%u[%u%d]%u\\%d%d%d%d%d%d$' ) then --legacy: %u used here instead of %D (but the faulty ID cat is empty, out of ~12k uses)
return false
return false
end
end
return '[https://opac.sbn.it/nome/'..id..' '..id..']'..p.getCatForId( 'ICCU' )
return '[https://opac.sbn.it/opacsbn/opac/iccu/scheda_authority.jsp?bid='..id..' '..(label or 'イタリア')..']'..p.getCatForId( 'ICCU' )
end
end


function p.iciaLink( id )
function p.iciaLink( id, label )
--P1736's format regex: \d+ (e.g. 1)
--P1736's format regex: \d+ (e.g. 1)
if not id:match( '^%d+$' ) then
if not id:match( '^%d+$' ) then
return false
return false
end
end
return '[https://www.imj.org.il/artcenter/newsite/en/?artist='..id..' '..id..']'..p.getCatForId( 'ICIA' )
return '[https://www.imj.org.il/artcenter/newsite/en/?artist='..id..' '..(label or 'ICIA(イスラエル)')..']'..p.getCatForId( 'ICIA' )
end
end


function p.ieuLink( id )
function p.ieuLink( id, label )
--P9070's format regex: [A-Z]\\[A-Z]\\[A-Za-z0-9]+ (e.g. K\Y\Kyiv)
--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
if not id:match( '^[A-Z]\\[A-Z]\\%w+$' ) then
return false
return false
end
end
return '[http://www.encyclopediaofukraine.com/display.asp?linkpath=pages\\'..id..' '..id..']'..p.getCatForId( 'IEU' )
return '[http://www.encyclopediaofukraine.com/display.asp?linkpath=pages\\'..id..' '..(label or 'ウクライナ・インターネット百科事典')..']'..p.getCatForId( 'IEU' )
end
end


function p.isniLink( id )
function p.isniLink( id, label )
id = p.validateIsni( id ) --e.g. 0000-0000-6653-4145
id = p.validateIsni( id ) --e.g. 0000-0000-6653-4145
if not id then
if not id then
return false
return false
end
end
return '[https://isni.org/isni/'..id..' '..id:sub( 1, 4 )..' '..id:sub( 5, 8 )..' '..id:sub( 9, 12 )..' '..id:sub( 13, 16 )..']'..p.getCatForId( 'ISNI' ) --no https as of 9/2019
return '[https://isni.org/isni/'..id..' '..(label or 'ISNI')..']'..p.getCatForId( 'ISNI' )
end
end


function p.j9uLink( id )
function p.jocondeLink( 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..' '..id..']'..p.getCatForId( 'J9U' )
end

function p.jocondeLink( id )
--P347's format regex: [\-0-9A-Za-z]{11} (e.g. 12345678901)
--P347's format regex: [\-0-9A-Za-z]{11} (e.g. 12345678901)
local regex = '^'..string.rep('[%-0-9A-Za-z]', 11)..'$'
local regex = '^'..string.rep('[%-0-9A-Za-z]', 11)..'$'
393行目: 326行目:
return false
return false
end
end
return '[https://www.pop.culture.gouv.fr/notice/joconde/'..id..' '..id..']'..p.getCatForId( 'Joconde' )
return '[https://www.pop.culture.gouv.fr/notice/joconde/'..id..' '..(label or 'Joconde(フランス)')..']'..p.getCatForId( 'Joconde' )
end
end


function p.kulturnavLink( id )
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)
--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
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
return false
end
end
return '[http://kulturnav.org/'..id..' '..id..']'..p.getCatForId( 'KULTURNAV' ) --no https as of 9/2019
return '[http://kulturnav.org/'..id..' '..(label or 'KulturNav(ノルウェー)')..']'..p.getCatForId( 'KULTURNAV' ) --no https as of 9/2019
end
end


function p.lccnLink( id )
function p.lccnLink( id, label )
local parts = p.splitLccn( id ) --e.g. n78039510
local parts = p.splitLccn( id ) --e.g. n78039510
if not parts then
if not parts then
411行目: 344行目:
local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
id = parts[1] .. parts[2] .. p.append( parts[3], '0', 6 )
id = parts[1] .. parts[2] .. p.append( parts[3], '0', 6 )
return '[https://id.loc.gov/authorities/'..lccnType..'/'..id..' '..id..']'..p.getCatForId( 'LCCN' )
return '[https://id.loc.gov/authorities/'..lccnType..'/'..id..' '..(label or 'アメリカ')..']'..p.getCatForId( 'LCCN' )
end
end


function p.lirLink( id )
function p.lirLink( id, label )
--P886's format regex: \d+ (e.g. 1)
--P886's format regex: \d+ (e.g. 1)
if not id:match( '^%d+$' ) then
if not id:match( '^%d+$' ) then
return false
return false
end
end
return '[http://www.e-lir.ch/e-LIR___Lexicon.'..id..'.450.0.html '..id..']'..p.getCatForId( 'LIR' ) --no https as of 9/2019
return '[http://www.e-lir.ch/e-LIR___Lexicon.'..id..'.450.0.html '..(label or 'Lexicon Istoric Retic(スイス)')..']'..p.getCatForId( 'LIR' ) --no https as of 9/2019
end
end


function p.lnbLink( id )
function p.lnbLink( id, label )
--P1368's format regex: \d{9} (e.g. 123456789)
--P1368's format regex: \d{9} (e.g. 123456789)
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
return false
return false
end
end
return '[https://kopkatalogs.lv/F?func=direct&local_base=lnc10&doc_number='..id..'&P_CON_LNG=ENG '..id..']'..p.getCatForId( 'LNB' )
return '[https://kopkatalogs.lv/F?func=direct&local_base=lnc10&doc_number='..id..'&P_CON_LNG=ENG '..(label or 'ラトビア')..']'..p.getCatForId( 'LNB' )
end
end


function p.leonoreLink( id )
function p.leonoreLink( id, label )
--P640's format regex: LH//\d{1,4}/\d{1,3}|19800035/\d{1,4}/\d{1,5}(Bis|Ter)?|C/0/\d{1,2} (e.g. LH//2064/18)
--P640's format regex: LH/\d{1,4}/\d{1,3}|19800035/\d{1,4}/\d{1,5}(Bis)?|C/0/\d{1,2} (e.g. LH/2064/18)
if not id:match( '^LH//%d%d?%d?%d?/%d%d?%d?$' ) and --IDs from LH//1/1 to LH//2794/54 (legionaries)
if not id:match( '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and --IDs from LH/1/1 to LH/2794/54 (legionaries)
not id:match( '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) and --IDs from 19800035/1/1 to 19800035/385/51670 (legionnaires who died 1954-1977 & some who died < 1954)
not id:match( '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) and --IDs from 19800035/1/1 to 19800035/385/51670 (legionnaires who died 1954-1977 & some who died < 1954)
not id:match( '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?Bis$' ) and --IDs from ?
not id:match( '^C/0/%d%d?$' ) then --IDs from C/0/1 to C/0/84 (84 famous legionaries)
not id:match( '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?Ter$' ) and --IDs from ?
not id:match( '^C/0/%d%d?$' ) then --IDs from C/0/1 to C/0/84 (84 famous legionaries)
return false
return false
end
end
return '[http://www.culture.gouv.fr/public/mistral/leonore_fr?ACTION=CHERCHER&FIELD_1=COTE&VALUE_1='..id..' '..id..']'..p.getCatForId( 'Léonore' ) --no https as of 9/2019
return '[http://www.culture.gouv.fr/public/mistral/leonore_fr?ACTION=CHERCHER&FIELD_1=COTE&VALUE_1='..id..' '..(label or 'Léonore(フランス)')..']'..p.getCatForId( 'Léonore' ) --no https as of 9/2019
end
end


function p.mathsnLink( id )
function p.maLink( id, label )
--P4955's format regex: [1-9]\d{4,6} (e.g. 175270)
--P6366's format regex: [1-9]\d{4,9} (e.g. 1498221862)
if not id:match( '^[1-9]%d%d%d%d%d?%d?$' ) then
if not id:match( '^[1-9]%d%d%d%d%d?%d?%d?%d?%d?$' ) then
return false
return false
end
end
return '[https://mathscinet.ams.org/mathscinet/MRAuthorID/'..id..' '..id..']'..p.getCatForId( 'MATHSN' )
return '[https://academic.microsoft.com/v2/detail/'..id..' '..(label or 'マイクロソフト・アカデミック')..']'..p.getCatForId( 'MA' )
end
end


function p.mbaLink( id )
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)
--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
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
return false
end
end
return '[https://musicbrainz.org/artist/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz' ) --special cat name
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 (識別子)|MusicBrainz]] [' .. url .. ' アーティスト]' .. cat
end
end
end


function p.mbareaLink( id )
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)
--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
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
return false
end
end
return '[https://musicbrainz.org/area/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz地域' ) --special cat name
local url = 'https://musicbrainz.org/area/'..id
local cat = p.getCatForId( 'MusicBrainz地域' )--special cat name
if label then
return '['..url..' '..label..']'..cat
else
return '[[MBAREA (識別子)|MusicBrainz]] [' .. url .. ' 地域]' .. cat
end
end
end


function p.mbiLink( id )
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)
--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
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
return false
end
end
return '[https://musicbrainz.org/instrument/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz楽器' ) --special cat name
local url = 'https://musicbrainz.org/instrument/'..id
local cat = p.getCatForId( 'MusicBrainz楽器' )--special cat name
if label then
return '['..url..' '..label..']'..cat
else
return '[[MBI (識別子)|MusicBrainz]] [' .. url .. ' 楽器]' .. cat
end
end
end


function p.mblLink( id )
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)
--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
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
return false
end
end
return '[https://musicbrainz.org/label/'..id..' '..id..']'..p.getCatForId( 'MusicBrainzレーベル' ) --special cat name
local url = 'https://musicbrainz.org/label/'..id
local cat = p.getCatForId( 'MusicBrainzレーベル' )--special cat name
if label then
return '['..url..' '..label..']'..cat
else
return '[[MBL (識別子)|MusicBrainz]] [' .. url .. ' レーベル]' .. cat
end
end
end


function p.mbpLink( id )
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)
--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
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
return false
end
end
return '[https://musicbrainz.org/place/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz場所' ) --special cat name
local url = 'https://musicbrainz.org/place/'..id
local cat = p.getCatForId( 'MusicBrainz場所' )--special cat name
if label then
return '['..url..' '..label..']'..cat
else
return '[[MBP (識別子)|MusicBrainz]] [' .. url .. ' 場所]' .. cat
end
end
end


function p.mbrgLink( id )
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)
--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
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
return false
end
end
return '[https://musicbrainz.org/release-group/'..id..' '..id..']'..p.getCatForId( 'MusicBrainzリリース・グループ' ) --special cat name
local url = 'https://musicbrainz.org/release-group/'..id
local cat = p.getCatForId( 'MusicBrainzリリース・グループ' )--special cat name
if label then
return '['..url..' '..label..']'..cat
else
return '[[MBRG (識別子)|MusicBrainz]] [' .. url .. ' リリース・グループ]' .. cat
end
end
end


function p.mbsLink( id )
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)
--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
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
return false
end
end
return '[https://musicbrainz.org/series/'..id..' '..id..']'..p.getCatForId( 'MusicBrainzシリーズ' ) --special cat name
local url = 'https://musicbrainz.org/series/'..id
local cat = p.getCatForId( 'MusicBrainzシリーズ' )--special cat name
if label then
return '['..url..' '..label..']'..cat
else
return '[[MBS (識別子)|MusicBrainz]] [' .. url .. ' シリーズ]' .. cat
end
end
end


function p.mbwLink( id )
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)
--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
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
return false
end
end
return '[https://musicbrainz.org/work/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz作品' ) --special cat name
local url = 'https://musicbrainz.org/work/'..id
local cat = p.getCatForId( 'MusicBrainz作品' )--special cat name
if label then
return '['..url..' '..label..']'..cat
else
return '[[MBW (識別子)|MusicBrainz]] [' .. url .. ' 作品]' .. cat
end
end
end


function p.mgpLink( id )
function p.mgpLink( id, label )
--P549's format regex: \d{1,6} (e.g. 123456)
--P549's format regex: \d{1,6} (e.g. 123456)
if not id:match( '^%d%d?%d?%d?%d?%d?$' ) then
if not id:match( '^%d%d?%d?%d?%d?%d?$' ) then
return false
return false
end
end
return '[https://www.mathgenealogy.org/id.php?id='..id..' '..id..']'..p.getCatForId( 'MGP' )
return '[https://genealogy.math.ndsu.nodak.edu/id.php?id='..id..' '..(label or 'Mathematics Genealogy Project')..']'..p.getCatForId( 'MGP' )
end
end


function p.naraLink( id )
function p.naraLink( id, label )
--P1225's format regex: ^([1-9]\d{0,8})$ (e.g. 123456789)
--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
if not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?$' ) then
return false
return false
end
end
return '[https://catalog.archives.gov/id/'..id..' '..id..']'..p.getCatForId( 'NARA' )
return '[https://catalog.archives.gov/id/'..id..' '..(label or '公文書館(アメリカ)')..']'..p.getCatForId( 'NARA' )
end
end


function p.nclLink( id )
function p.nclLink( id, label )
--P1048's format regex: \d+ (e.g. 1081436)
--P1048's format regex: \d+ (e.g. 1081436)
if not id:match( '^%d+$' ) then
if not id:match( '^%d+$' ) then
return false
return false
end
end
return '[http://aleweb.ncl.edu.tw/F/?func=accref&acc_sequence='..id..'&CON_LNG=ENG '..id..']'..p.getCatForId( 'NCL' ) --no https as of 9/2019
return '[http://aleweb.ncl.edu.tw/F/?func=accref&acc_sequence='..id..'&CON_LNG=ENG '..(label or '台湾')..']'..p.getCatForId( 'NCL' ) --no https as of 9/2019
end
end


function p.ndlLink( id )
function p.ndlLink( id, label )
--P349's format regex: 0?\d{8} (e.g. 012345678)
--P349's format regex: 0?\d{8} (e.g. 012345678)
if not id:match( '^0?%d%d%d%d%d%d%d%d$' ) then
if not id:match( '^0?%d%d%d%d%d%d%d%d$' ) then
return false
return false
end
end
return '[https://id.ndl.go.jp/auth/ndlna/'..id..' '..id..']'..p.getCatForId( 'NDL' )
return '[https://id.ndl.go.jp/auth/ndlna/'..id..' '..(label or '日本')..']'..p.getCatForId( 'NDL' )
end
end


function p.ngaLink( id )
function p.ngvLink( 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..' '..id..']'..p.getCatForId( 'NGA' )
end

function p.ngvLink( id )
--P2041's format regex: \d+ (e.g. 12354)
--P2041's format regex: \d+ (e.g. 12354)
if not id:match( '^%d+$' ) then
if not id:match( '^%d+$' ) then
return false
return false
end
end
return '[https://www.ngv.vic.gov.au/explore/collection/artist/'..id..'/ '..id..']'..p.getCatForId( 'NGV' )
return '[https://www.ngv.vic.gov.au/explore/collection/artist/'..id..'/ '..(label or 'ヴィクトリア')..']'..p.getCatForId( 'NGV' )
end
end


function p.nkcLink( id )
function p.nkcLink( id, label )
--P691's format regex: [a-z]{2,4}[0-9]{2,14} (e.g. abcd12345678901234)
--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
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
return false
end
end
return '[https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica='..id..'&CON_LNG=ENG '..id..']'..p.getCatForId( 'NKC' )
return '[https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica='..id..'&CON_LNG=ENG '..(label or 'チェコ')..']'..p.getCatForId( 'NKC' )
end
end


function p.nlaLink( id )
function p.nlaLink( id, label )
--P409's format regex: [1-9][0-9]{0,11} (e.g. 123456789012)
--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
if not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?$' ) then
return false
return false
end
end
return '[https://nla.gov.au/anbd.aut-an'..id..' '..id..']'..p.getCatForId( 'NLA' )
return '[https://nla.gov.au/anbd.aut-an'..id..' '..(label or 'オーストラリア')..']'..p.getCatForId( 'NLA' )
end
end


function p.nlgLink( id )
function p.nlgLink( id, label )
--P3348's format regex: [1-9]\d* (e.g. 1)
--P3348's format regex: [1-9]\d* (e.g. 1)
if not id:match( '^[1-9]%d*$' ) then
if not id:match( '^[1-9]%d*$' ) then
return false
return false
end
end
return '[https://data.nlg.gr/resource/authority/record'..id..' '..id..']'..p.getCatForId( 'NLG' )
return '[https://data.nlg.gr/resource/authority/record'..id..' '..(label or 'ギリシャ')..']'..p.getCatForId( 'NLG' )
end
end


function p.nliLink( id )
function p.nliLink( id, label )
--P949's format regex: \d{9} (e.g. 123456789)
--P949's format regex: \d{9} (e.g. 123456789)
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
return false
return false
end
end
return '[http://uli.nli.org.il/F/?func=direct&doc_number='..id..'&local_base=nlx10'..' '..id..']'..p.getCatForId( 'NLI' )
return '[http://uli.nli.org.il/F/?func=direct&doc_number='..id..'&local_base=nlx10'..' '..(label or 'イスラエル')..']'..p.getCatForId( 'NLI' )
end
end


function p.nlkLink( id )
function p.nlkLink( id, label )
--P5034's format regex: KA.(19|20).{7} (e.g. KAC201501465)
--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( '^KA.19.......$' ) and
if not id:match( '^KAB%d%d%d%d%a?%d%d%d%d%d?%d?$' ) and
not id:match( '^KA.20.......$' ) then
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://librarian.nl.go.kr/LI/contents/L20101000000.do?id='..id..' '..id..']'..p.getCatForId( 'NLK' )
return '[https://lod.nl.go.kr/resource/'..id..' '..(label or '韓国')..']'..p.getCatForId( 'NLK' )
end
end


function p.nlpLink( id )
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)
--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
if not id:match( '^9810%d+$' ) and
609行目: 581行目:
return false
return false
end
end
return '[https://tools.wmflabs.org/wikidata-externalid-url?p=1695&id='..id..' '..id..']'..p.getCatForId( 'NLP' )
return '[https://tools.wmflabs.org/wikidata-externalid-url?p=1695&id='..id..' '..(label or 'ポーランド')..']'..p.getCatForId( 'NLP' )
end
end


function p.nlrLink( id )
function p.nlrLink( id, label )
--P1003's format regex: \d{9} (e.g. 123456789)
--P1003's format regex: \d{9} (e.g. 123456789)
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
return false
return false
end
end
return '[http://aleph.bibnat.ro:8991/F/?func=direct&local_base=NLR10&doc_number='..id..' '..id..']'..p.getCatForId( 'NLR' )
return '[http://aleph.bibnat.ro:8991/F/?func=direct&local_base=NLR10&doc_number='..id..' '..(label or 'ルーマニア')..']'..p.getCatForId( 'NLR' )
end
end


function p.nskLink( id )
function p.nskLink( id, label )
--P1375's format regex: \d{9} (e.g. 123456789)
--P1375's format regex: \d{9} (e.g. 123456789)
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
return false
return false
end
end
return '[http://katalog.nsk.hr/F/?func=direct&doc_number='..id..'&local_base=nsk10 '..id..']'..p.getCatForId( 'NSK' ) --no https as of 9/2019
return '[http://katalog.nsk.hr/F/?func=direct&doc_number='..id..'&local_base=nsk10 '..(label or 'クロアチア')..']'..p.getCatForId( 'NSK' ) --no https as of 9/2019
end
end


function p.ntaLink( id )
function p.ntaLink( id, label )
--P1006's format regex: \d{8}[\dX] (e.g. 12345678X)
--P1006's format regex: \d{8}[\dX] (e.g. 12345678X)
if not id:match( '^%d%d%d%d%d%d%d%d[%dX]$' ) then
if not id:match( '^%d%d%d%d%d%d%d%d[%dX]$' ) then
return false
return false
end
end
return '[http://data.bibliotheken.nl/id/thes/p'..id..' '..id..']'..p.getCatForId( 'NTA' )
return '[http://data.bibliotheken.nl/id/thes/p'..id..' '..(label or 'オランダ')..']'..p.getCatForId( 'NTA' )
end
end


function p.orcidLink( id )
function p.orcidLink( id, label )
id = p.validateIsni( id ) --e.g. 0000-0002-7398-5483
id = p.validateIsni( id ) --e.g. 0000-0002-7398-5483
if not id then
if not id then
642行目: 614行目:
end
end
id = id:sub( 1, 4 )..'-'..id:sub( 5, 8 )..'-'..id:sub( 9, 12 )..'-'..id:sub( 13, 16 )
id = id:sub( 1, 4 )..'-'..id:sub( 5, 8 )..'-'..id:sub( 9, 12 )..'-'..id:sub( 13, 16 )
return '[https://orcid.org/'..id..' '..id..']'..p.getCatForId( 'ORCID' )
return '[https://orcid.org/'..id..' '..(label or 'ORCID')..']'..p.getCatForId( 'ORCID' )
end
end


function p.picLink( id )
function p.picLink( id, label )
--P2750's format regex: [1-9]\d* (e.g. 1)
--P2750's format regex: [1-9]\d* (e.g. 1)
if not id:match( '^[1-9]%d*$' ) then
if not id:match( '^[1-9]%d*$' ) then
return false
return false
end
end
return '[https://pic.nypl.org/constituents/'..id..' '..id..']'..p.getCatForId( 'PIC' )
return '[https://pic.nypl.org/constituents/'..id..' '..(label or 'Photographers\' Identities')..']'..p.getCatForId( 'PIC' )
end
end


function p.plwabnLink( id )
function p.plwabnLink( id, label )
--P7293's format regex: 981[0-9]{8}05606 (e.g. 9810696457305606)
--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
if not id:match( '^981%d%d%d%d%d%d%d%d05606*$' ) then
return false
return false
end
end
return '[http://mak.bn.org.pl/cgi-bin/KHW/makwww.exe?BM=1&NU=1&IM=4&WI='..id..' '..id..']'..p.getCatForId( 'PLWABN' )
return '[http://mak.bn.org.pl/cgi-bin/KHW/makwww.exe?BM=1&NU=1&IM=4&WI='..id..' '..(label or 'ポーランド')..']'..p.getCatForId( 'PLWABN' )
end
end


function p.publonsLink( id )
function p.publonsLink( id, label )
--P3829's format regex: \d+ (e.g. 654601)
--P3829's format regex: \d+ (e.g. 654601)
if not id:match( '^%d+$' ) then
if not id:match( '^%d+$' ) then
return false
return false
end
end
return '[https://publons.com/author/'..id..'/ '..id..']'..p.getCatForId( 'Publons' )
return '[https://publons.com/author/'..id..'/ '..(label or 'Publons(研究者)')..']'..p.getCatForId( 'Publons' )
end
end


function p.ridLink( id )
function p.ridLink( id, label )
--P1053's format regex: [A-Z]{1,3}-\d{4}-(19|20)\d\d (e.g. AAS-5150-2020)
--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
if not id:match( '^[A-Z][A-Z]?[A-Z]?%-%d%d%d%d%-19%d%d$' ) and
675行目: 647行目:
return false
return false
end
end
return '[https://www.researcherid.com/rid/'..id..' '..id..']'..p.getCatForId( 'RID' )
return '[https://www.researcherid.com/rid/'..id..' '..(label or 'ResearcherID')..']'..p.getCatForId( 'RID' )
end

function p.reroLink( id )
--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..' '..id..']'..p.getCatForId( 'RERO' )
end
end


function p.rismLink( id )
function p.rismLink( id, label )
--P5504's format regex: (pe|ks)?\[1-9]d* (e.g. pe30006410)
--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'
if not id:match( '^pe[1-9]%d*$' ) and --99% start with 'pe'
693行目: 657行目:
return false
return false
end
end
return '[https://opac.rism.info/search?id='..id..' '..id..']'..p.getCatForId( 'RISM' )
return '[https://opac.rism.info/search?id='..id..' '..(label or 'RISM(フランス)')..']'..p.getCatForId( 'RISM' )
end
end


function p.rkdartistsLink( id )
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(スイス)')..']'..p.getCatForId( 'RERO' )
end

function p.rkdartistsLink( id, label )
--P650's format regex: [1-9]\d{0,5} (e.g. 123456)
--P650's format regex: [1-9]\d{0,5} (e.g. 123456)
if not id:match( '^[1-9]%d?%d?%d?%d?%d?$' ) then
if not id:match( '^[1-9]%d?%d?%d?%d?%d?$' ) then
return false
return false
end
end
return '[https://rkd.nl/en/explore/artists/'..id..' '..id..']'..p.getCatForId( 'RKDartists' )
return '[https://rkd.nl/en/explore/artists/'..id..' '..(label or 'RKDアーティスト(オランダ)')..']'..p.getCatForId( 'RKDartists' )
end
end


function p.rkdidLink( id )
function p.rkdidLink( id, label )
--P350's format regex: [1-9]\d{0,5} (e.g. 123456)
--P350's format regex: [1-9]\d{0,5} (e.g. 123456)
if not id:match( '^[1-9]%d?%d?%d?%d?%d?$' ) then
if not id:match( '^[1-9]%d?%d?%d?%d?%d?$' ) then
return false
return false
end
end
return '[https://rkd.nl/nl/explore/images/'..id..' '..id..']'..p.getCatForId( 'RKDID' )
return '[https://rkd.nl/nl/explore/images/'..id..' '..(label or 'RKD ID(オランダ)')..']'..p.getCatForId( 'RKDID' )
end
end


function p.rslLink( id )
function p.rslLink( id, label )
--P947's format regex: \d{1,9} (e.g. 123456789)
--P947's format regex: \d{1,9} (e.g. 123456789)
if not id:match( '^%d%d?%d?%d?%d?%d?%d?%d?%d?$' ) then
if not id:match( '^%d%d?%d?%d?%d?%d?%d?%d?%d?$' ) then
return false
return false
end
end
return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request='..id..'&CON_LNG=ENG '..id..']'..p.getCatForId( 'RSL' ) --no https 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 'ロシア')..']'..p.getCatForId( 'RSL' ) --no https as of 9/2019
end
end


function p.scopusLink( id )
function p.selibrLink( 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..' '..id..']'..p.getCatForId( 'Scopus' )
end

function p.selibrLink( id )
--P906's format regex: [1-9]\d{4,5} (e.g. 123456)
--P906's format regex: [1-9]\d{4,5} (e.g. 123456)
if not id:match( '^[1-9]%d%d%d%d%d?$' ) then
if not id:match( '^[1-9]%d%d%d%d%d?$' ) then
return false
return false
end
end
return '[https://libris.kb.se/auth/'..id..' '..id..']'..p.getCatForId( 'SELIBR' )
return '[https://libris.kb.se/auth/'..id..' '..(label or 'スウェーデン')..']'..p.getCatForId( 'SELIBR' )
end
end


function p.sikartLink( id )
function p.sikartLink( id, label )
--P781's format regex: \d{7,9} (e.g. 123456789)
--P781's format regex: \d{7,9} (e.g. 123456789)
if not id:match( '^%d%d%d%d%d%d%d%d?%d?$' ) then
if not id:match( '^%d%d%d%d%d%d%d%d?%d?$' ) then
return false
return false
end
end
return '[http://www.sikart.ch/KuenstlerInnen.aspx?id='..id..'&lng=en '..id..']'..p.getCatForId( 'SIKART' ) --no https as of 9/2019
return '[http://www.sikart.ch/KuenstlerInnen.aspx?id='..id..'&lng=en '..(label or 'SIKART(スイス)')..']'..p.getCatForId( 'SIKART' ) --no https as of 9/2019
end
end


function p.snacLink( id )
function p.snacLink( id, label )
--P3430's format regex: \d*[A-Za-z][0-9A-Za-z]* (e.g. A)
--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
if not id:match( '^%d*[A-Za-z][0-9A-Za-z]*$' ) then
return false
return false
end
end
return '[https://snaccooperative.org/ark:/99166/'..id..' '..id..']'..p.getCatForId( 'SNAC-ID' )
return '[https://snaccooperative.org/ark:/99166/'..id..' '..(label or 'Social Networks and Archival Context')..']'..p.getCatForId( 'SNAC-ID' )
end
end


function p.sudocLink( id )
function p.sudocLink( id, label )
--P269's format regex: (\d{8}[\dX]|) (e.g. 026927608)
--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'
if not id:match( '^%d%d%d%d%d%d%d%d[%dxX]$' ) then --legacy: allow lowercase 'x'
return false
return false
end
end
return '[https://www.idref.fr/'..id..' '..id..']'..p.getCatForId( 'SUDOC' )
return '[https://www.idref.fr/'..id..' '..(label or 'SUDOC(フランス)')..']'..p.getCatForId( 'SUDOC' )
end
end


function p.ta98Link( id )
function p.s2authoridLink( id, label )
--P4012's format regex: [1-9]\d* (e.g. 1796130)
if not id:match( '^[1-9]%d*$' ) then
return false
end
return '[https://www.semanticscholar.org/author/'..id..' '..(label or 'Semantic Scholar')..']'..p.getCatForId( 'Semantic Scholar著者' ) --special cat name
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)
--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
if not id:match( '^A%d%d%.%d%.%d%d%.%d%d%d[FM]?$' ) then
return false
return false
end
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 '[http://tools.wmflabs.org/wikidata-externalid-url/?p=1323&url_prefix=https:%2F%2Fwww.unifr.ch%2Fifaa%2FPublic%2FEntryPage%2FTA98%20Tree%2FEntity%20TA98%20EN%2F&url_suffix=%20Entity%20TA98%20EN.htm&id='..id..' '..(label or 'Terminologia Anatomica')..']'..p.getCatForId( 'TA98' )
return longurl..id..' '..id..']'..p.getCatForId( 'TA98' )
end
end


function p.tdviaLink( id )
function p.tdviaLink( id, label )
--P7314's format regex: [0-9a-z/-]+] (e.g. barkan-omer-lutfi)
--P7314's format regex: [a-z/-]+] (e.g. barkan-omer-lutfi)
if not id:match( '^[%d%l/-]+$' ) then
if not id:match( '^[a-z/-]+$' ) then
return false
return false
end
end
return '[https://islamansiklopedisi.org.tr/'..id..' '..id..']'..p.getCatForId( 'TDVİA' )
return '[https://islamansiklopedisi.org.tr/'..id..' '..(label or 'イスラーム百科事典(トルコ)')..']'..p.getCatForId( 'TDVİA' )
end
end


function p.tepapaLink( id )
function p.tepapaLink( id, label )
--P3544's format regex: \d+ (e.g. 1)
--P3544's format regex: \d+ (e.g. 1)
if not id:match( '^%d+$' ) then
if not id:match( '^%d+$' ) then
return false
return false
end
end
return '[https://collections.tepapa.govt.nz/agent/'..id..' '..id..']'..p.getCatForId( 'TePapa' )
return '[https://collections.tepapa.govt.nz/agent/'..id..' '..(label or 'Te Papa(ニュージーランド)')..']'..p.getCatForId( 'TePapa' )
end
end


function p.tlsLink( id )
function p.tlsLink( id, label )
local id2 = id:gsub(' +', '_')
id = id:gsub(' +', '_')
--P1362's format regex: \p{Lu}[\p{L}\d_',\.\-\(\)\*\/–&]{3,89} (e.g. Abcd)
--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 "[^#<>%[%] {|}]"
--Mediawiki page title partial URL so consider validation with mw.title or "[^#<>%[%] {|}]"
local class = "[%w_',%.%-%(%)%*%/–&]"
local class = "[%w_',%.%-%(%)%*%/–&]"
local idlen = #id
local idlen = mw.ustring.len (id)
if idlen < 4 or idlen > 90 then
if idlen < 4 or idlen > 90 then
return false
return false
end
end
local regex = '^%u'..string.rep(class, idlen - 1)..'$'
local regex = '^%u'..string.rep(class, idlen - 1)..'$'
if not mw.ustring.match( id2, regex ) then
if not mw.ustring.match( id, regex ) then
return false
return false
end
end
return '[http://tls.theaterwissenschaft.ch/wiki/'..id2..' '..id..']'..p.getCatForId( 'TLS' ) --no https as of 9/2019
return '[http://tls.theaterwissenschaft.ch/wiki/'..id..' '..(label or 'Theaterlexikon(スイス)')..']'..p.getCatForId( 'TLS' ) --no https as of 9/2019
end
end


function p.troveLink( id )
function p.troveLink( id, label )
--P1315's format regex: [1-9]\d{5,7} (e.g. 12345678)
--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
if not id:match( '^[1-9]%d%d%d%d%d%d?%d?$' ) then
return false
return false
end
end
return '[https://trove.nla.gov.au/people/'..id..' '..id..']'..p.getCatForId( 'Trove' )
return '[https://trove.nla.gov.au/people/'..id..' '..(label or 'Trove(オーストラリア)')..']'..p.getCatForId( 'Trove' )
end
end


function p.ukparlLink( id )
function p.ukparlLink( id, label )
--P6213's format regex: [a-zA-Z\d]{8} (e.g. AQUupyiR)
--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
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
return false
end
end
return '[https://id.parliament.uk/'..id..' '..id..']'..p.getCatForId( 'UKPARL' )
return '[https://id.parliament.uk/'..id..' '..(label or '英議会')..']'..p.getCatForId( 'UKPARL' )
end
end


function p.ulanLink( id )
function p.ulanLink( id, label )
--P245's format regex: 500\d{6} (e.g. 500123456)
--P245's format regex: 500\d{6} (e.g. 500123456)
if not id:match( '^500%d%d%d%d%d%d$' ) then
if not id:match( '^500%d%d%d%d%d%d$' ) then
return false
return false
end
end
return '[https://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid='..id..' '..id..']'..p.getCatForId( 'ULAN' )
return '[https://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid='..id..' '..(label or 'アーティスト名(ゲティ)')..']'..p.getCatForId( 'ULAN' )
end

function p.uscgLink( id )
--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 id..p.getCatForId( 'USCG' )
end
end


function p.uscongressLink( id )
function p.uscongressLink( id, label )
--P1157's format regex: [A-Z]00[01]\d{3} (e.g. A000123)
--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
if not id:match( '^[A-Z]00[01]%d%d%d$' ) then
return false
return false
end
end
return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index='..id..' '..id..']'..p.getCatForId( 'USCongress' ) --no https as of 9/2019
return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index='..id..' '..(label or '米議会')..']'..p.getCatForId( 'USCongress' ) --no https as of 9/2019
end
end


function p.vcbaLink( id )
function p.vcbaLink( id, label )
--P8034's format regex: \d{3}\/[1-9]\d{0,5} (e.g. 494/9793)
--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
if not id:match( '^%d%d%d\/[1-9]%d?%d?%d?%d?%d?$' ) then
return false
return false
end
end
local id2 = id:gsub('\/', '_')
id = id:gsub('\/', '_')
return '[https://opac.vatlib.it/auth/detail/'..id2..' '..id..']'..p.getCatForId( 'VcBA' )
return '[https://opac.vatlib.it/auth/detail/'..id..' '..(label or 'バチカン')..']'..p.getCatForId( 'VcBA' )
end
end


function p.viafLink( id )
function p.viafLink( id, label )
--P214's format regex: [1-9]\d(\d{0,7}|\d{17,20}) (e.g. 123456789, 1234567890123456789012)
--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
if not id:match( '^[1-9]%d%d?%d?%d?%d?%d?%d?%d?$' ) and
857行目: 819行目:
return false
return false
end
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),
-- 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), the code below could change from '[https://viaf.org/viaf/'..id..' '..id..']' to '[[:VIAF:'..id..'|'..id..']]'.
-- 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' )
return '[https://viaf.org/viaf/'..id..' '..id..']'..p.getCatForId( 'VIAF' )
end

function p.worldcatidLink( id )
--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')..'/ '..id..']'..p.getCatForId( 'WORLDCATID' )
end

function p.zbmathLink( id )
--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..' '..id..']'..p.getCatForId( 'ZBMATH' )
end
end


888行目: 827行目:
function p.append(str, c, length)
function p.append(str, c, length)
while str:len() < length do
while str:len() < length do
str = c..str
str = c .. str
end
end
return str
return str
903行目: 842行目:
local result = (12 - remainder) % 11
local result = (12 - remainder) % 11
if result == 10 then
if result == 10 then
return 'X'
return "X"
end
end
return tostring( result )
return tostring( result )
955行目: 894行目:
local wikiTable = '{| class="wikitable sortable"\n'..
local wikiTable = '{| class="wikitable sortable"\n'..
'! rowspan=2 | 識別子\n'..
'! rowspan=2 | 識別子\n'..
'! rowspan=2 | 識別子表示名\n'..
'! rowspan=2 | グループ\n'..
'! rowspan=2 | 表示名\n'..
'! rowspan=2; data-sort-type=number | ウィキデータのプロパティ\n'..
'! rowspan=2; data-sort-type=number | ウィキデータのプロパティ\n'..
'! colspan=4 | 追跡カテゴリのページ数\n'..
'! colspan=4 | 追跡カテゴリのページ数\n'..
964行目: 904行目:
'! [[:Category:誤った典拠管理情報が指定されている記事|'..'誤った識別子]]\n'..
'! [[:Category:誤った典拠管理情報が指定されている記事|'..'誤った識別子]]\n'..
'|-\n'
'|-\n'
local lang = mw.getContentLanguage()
local lang = mw.getContentLanguage()
local a, u, m, f, P = 0, 0, 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]
local category = conf.category or param
local appearsAs
local appearsAs
if conf.prefix then
if param == "WORLDCATID" then
-- WorldCat is special
appearsAs = "[https://www.worldcat.org/identities/lccn-n78039510 WorldCat]"
elseif conf.prefix then
appearsAs = conf.prefix
appearsAs = conf.prefix
else
else
appearsAs = conf[3](conf[5])
appearsAs = conf[3](conf[5])
end
end
local link = conf.link or param..' (識別子)'
local link = conf.link or param .. ' (識別子)'
local displayname = conf.displayname or param --日本語版独自
local category = conf.category or param
local category = conf.category or param
local args = { id = 'f', pid }
local args = { id = 'f', pid }
991行目: 930行目:
local miscCount = lang:formatNum( mw.site.stats.pagesInCategory(miscCat, 'pages') )
local miscCount = lang:formatNum( mw.site.stats.pagesInCategory(miscCat, 'pages') )
local faultyCount = lang:formatNum( mw.site.stats.pagesInCategory(faultyCat, 'pages') )
local faultyCount = lang:formatNum( mw.site.stats.pagesInCategory(faultyCat, 'pages') )
--calcs
P = P + 1 --property count
a = a + lang:parseFormattedNumber(articleCount)
u = u + lang:parseFormattedNumber(userCount)
m = m + lang:parseFormattedNumber(miscCount)
f = f + lang:parseFormattedNumber(faultyCount)
--concat
--concat
wikiTable = wikiTable..'\n'..
wikiTable = wikiTable..'\n'..
'|-\n'..
'|-\n'..
'||'..param..
'||[['..link..'|'..param..']]'..
'||[['..link..'|'..displayname..']]'..
'||'..section..
'||'..appearsAs..
'||data-sort-value='..pid..'|'..wpl..
'||data-sort-value='..pid..'|'..wpl..
'||style="text-align: right;"|[[:Category:'..articleCat..'|'..articleCount..']]'..
'||style="text-align: right;"|[[:Category:'..articleCat..'|'..articleCount..']]'..
1,014行目: 949行目:
local articleCat = w..'識別子が指定されている記事'
local articleCat = w..'識別子が指定されている記事'
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(アメリカ議会図書館経由)]"
appearsAs = 'WorldCat-LCCN'
else
else
appearsAs = "[https://www.worldcat.org/identities/containsVIAFID/12345789 WorldCat(VIAF経由)]"
appearsAs = 'WorldCat-VIAF'
end
end
a = a + lang:parseFormattedNumber(articleCount)
wikiTable = wikiTable..'\n'..
wikiTable = wikiTable..'\n'..
'|-\n'..
'|-\n'..
'||'..'—'..
'||'..'—'..
'||'..w..
'||全般'..
'||'..appearsAs..
'||data-sort-value='..w..'|'..'—'..
'||data-sort-value='..w..'|'..'—'..
'||style="text-align: right;"|[[:Category:'..articleCat..'|'..articleCount..']]'..
'||style="text-align: right;"|[[:Category:'..articleCat..'|'..articleCount..']]'..
1,032行目: 967行目:
end
end
return require("Module:Suppress categories").main(wikiTable)..'\n|}'
--append sums
wikiTable = wikiTable..'\n'..
'|-\n'..
'! style="text-align: right;" colspan=2|合計'..
'||style="text-align: right;"|'..lang:formatNum(P)..
'||style="text-align: right;"|'..lang:formatNum(a)..
'||style="text-align: right;"|'..lang:formatNum(u)..
'||style="text-align: right;"|'..lang:formatNum(m)..
'||style="text-align: right;"|'..lang:formatNum(f)
return require('Module:Suppress categories').main(wikiTable)..'\n|}'
end
end


1,049行目: 974行目:
--[[==========================================================================]]
--[[==========================================================================]]


-- Please use "<parameter> (identifier)" redirects rather than linking directly to the target page.
-- If a specific "(identifier) redirect" exists for an identifier, please route through this particular redirect rather than linking directly to the target page. This reduces clutter in "What links here" and improves reverse lookup of articles where a manifestation of this particular identifier is used.
-- 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 }
-- Parameter 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)")
-- 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")
-- category to override the ID in category names (defaults to parameter),
-- prefix: to include a prefix (usually a wikilink explaining what the identifier is) before the external link itself
-- prefix to include a prefix (usually a wikilink explaining what the identifier is) before the external link itself
p.conf = {
p.conf = {
{ 'AAG', 3372, p.aagLink, '', '1', link=':en:AAG (identifier)' },
{ 'AAG', 3372, p.aagLink, "美術館と博物館", "1", link = ":en:AAG (identifier)"},
{ 'ACM-DL', 864, p.acmLink, '', '12345678901', link='ACM DL (識別子)' },
{ 'ACM-DL', 864, p.acmLink, "科学データベース", "12345678901", link="ACM DL (識別子)"},
{ 'ADB', 1907, p.adbLink, '', 'barton-sir-edmund-toby-71', link=':en:ADB (identifier)' },
{ 'ADB', 1907, p.adbLink, "人名辞典", "barton-sir-edmund-toby-71", link = ":en:ADB (identifier)"},
{ 'AGSA', 6804, p.agsaLink, "美術館と博物館", "3625"},
{ 'admiralty', 3562, p.admiraltyLink, '', 'D1204.1', link=':en:Admiralty (identifier)'},
{ 'AGSA', 6804, p.agsaLink, '', '3625' },
{ 'autores.uy', 2558, p.autoresuyLink, "人名辞典", "12345"},
{ 'ARLHS', 2980, p.ARLHSLink, '', 'LAT023', link=':en:ARLHS (identifier)' },
{ 'AWR', 4186, p.awrLink, "人名辞典", "PR00768b", link = ":en:AWR (identifier)"},
{ 'BIBSYS', 1015, p.bibsysLink, "国立図書館", "1234567890123", link = ":en:BIBSYS (identifier)"},
{ 'autores.uy', 2558, p.autoresuyLink, '', '12345' },
{ 'AWR', 4186, p.awrLink, '', 'PR00768b', link=':en:AWR (identifier)' },
{ 'Bildindex', 2092, p.bildLink, "美術研究組織", "1", link = ":en:Bildindex (identifier)"},
{ 'BIBSYS', 1015, p.bibsysLink, '', '1234567890123', link=':en:BIBSYS (identifier)' },
{ 'BNC', 1890, p.bncLink, "国立図書館", "123456789", link = ":en:BNC (identifier)"},
{ 'BNE', 950, p.bneLink, "国立図書館", "XX1234567"},
{ 'Bildindex', 2092, p.bildLink, '', '1', link=':en:Bildindex (identifier)' },
{ 'BNC', 1890, p.bncLink, '', '123456789', link=':en:BNC (identifier)' },
{ 'BNF', 268, p.bnfLink, "国立図書館", "123456789"},
{ 'BNE', 950, p.bneLink, '', 'XX1234567' },
{ 'Botanist', 428, p.botanistLink , "科学データベース", "L."},
{ 'BNF', 268, p.bnfLink, '', '123456789' },
{ 'BPN', 651, p.bpnLink , "人名辞典", "12345678", link = ":en:BPN (identifier)"},
{ 'CANTIC', 1273, p.canticLink, "国立図書館", "a12345678", link = ":en:CANTIC (identifier)"},
{ 'Botanist', 428, p.botanistLink, '', 'L.' },
{ 'BPN', 651, p.bpnLink, '', '12345678', link=':en:BPN (identifier)' },
{ 'CINII', 271, p.ciniiLink, "科学データベース", "DA12345678", link = "CiNii (識別子)"},
{ 'CWGC', 1908, p.cwgcLink, "その他", "1234567"},
{ 'CANTIC', 1273, p.canticLink, '', 'a12345678', link=':en:CANTIC (identifier)' },
{ 'CCG', 3920, p.ccgLink, '', 'A1761', link=':en:CCG (identifier)' },
{ 'DAAO', 1707, p.daaoLink, "美術研究組織", "rolf-harris", link = ":en:DAAO (identifier)"},
{ 'DBLP', 2456, p.dblpLink, "科学データベース", "123/123"},
{ 'CINII', 271, p.ciniiLink, '', 'DA12345678', link='CiNii (識別子)' },
{ 'CWGC', 1908, p.cwgcLink, '', '1234567' },
{ 'DIB', 6829, p.dibLink, "人名辞典", "a1234", link = ":en:DIB (identifier)"},
{ 'DAAO', 1707, p.daaoLink, '', 'rolf-harris', link=':en:DAAO (identifier)' },
{ 'DSI', 2349, p.dsiLink, "美術研究組織", "1538", link = ":en:DSI (identifier)"},
{ 'DBLP', 2456, p.dblpLink, '', '123/123' },
{ 'FAST', 2163, p.fastLink, "その他", "1", link = ":en:FAST (identifier)"},
{ 'DIB', 6829, p.dibLink, '', '001953', link=':en:DIB (identifier)' },
{ 'FNZA', 6792, p.fnzaLink, "美術研究組織", "12", link = ":en:FNZA (identifier)"},
{ 'DSI', 2349, p.dsiLink, '', '1538', link=':en:DSI (identifier)' },
{ 'GND', 227, p.gndLink, "全般", "4079154-3"},
{ 'HDS', 902, p.hdsLink, "その他", "050123"},
{ 'DTBIO', 7902, p.dtbioLink, '', '118554700', link=':en:DTBIO (identifier)' },
{ 'EMU', 4613, p.emuLink, '', '15409', link=':en:EMU (identifier)' },
{ 'IAAF', 1146, p.iaafLink, "その他", "123"},
{ 'FAST', 2163, p.fastLink, '', '1', link=':en:FAST (identifier)' },
{ 'ICCU', 396, p.iccuLink, "国立図書館", "IT\\ICCU\\CFIV\\000163", link = ":en:ICCU (identifier)"}, --formerly SBN
{ 'FNZA', 6792, p.fnzaLink, '', '12', link=':en:FNZA (identifier)' },
{ 'ICIA', 1736, p.iciaLink, "美術研究組織", "1", link = ":en:ICIA (identifier)"},
{ 'IEU', 9070, p.ieuLink, "その他", "N\\A\\NationalAcademyofArtandArchitecture", link = ":en:IEU (identifier)"},
{ 'GND', 227, p.gndLink, '', '4079154-3' },
{ 'ISNI', 213, p.isniLink, "全般", "0000-0000-6653-4145", prefix = '[[ISNI (識別子)|ISNI]]'},
{ 'Google Scholar', 1960, p.googleLink, '', 'QPdLuj8AAAAJ' },
{ 'Joconde', 347, p.jocondeLink, "美術研究組織", "12345678901", link = ":en:Joconde (identifier)"},
{ 'HDS', 902, p.hdsLink, '', '050123' },
{ 'KULTURNAV', 1248, p.kulturnavLink, "美術研究組織", "12345678-1234-1234-1234-1234567890AB", link=":en:KulturNav (identifier)"},
{ 'IAAF', 1146, p.iaafLink, '', '123' },
{ 'LCCN', 244, p.lccnLink, "国立図書館", "n78039510"},
{ 'ICCU', 396, p.iccuLink, '', 'CFIV000163', link=':en:ICCU (identifier)' }, --formerly SBN
{ 'ICIA', 1736, p.iciaLink, '', '1', link=':en:ICIA (identifier)' },
{ 'LIR', 886, p.lirLink, "その他", "1"},
{ 'IEU', 9070, p.ieuLink, '', 'N\\A\\NationalAcademyofArtandArchitecture', link=':en:IEU (identifier)' },
{ 'LNB', 1368, p.lnbLink, "国立図書館", "123456789", link = ":en:LNB (identifier)"},
{ 'Léonore', 640, p.leonoreLink, "その他", "LH/1/1", prefix = "[[:en:Léonore (identifier)|Léonore(フランス)]]"},
{ 'ISNI', 213, p.isniLink, '', '0000-0000-6653-4145' },
{ 'J9U', 8189, p.j9uLink, '', '987007305652505171', link=':en:J9U (identifier)' },
{ 'MA', 6366, p.maLink, "その他", "123456789", link = ":en:MA (identifier)"},
{ 'MBA', 434, p.mbaLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz'}, --special cat name
{ 'Joconde', 347, p.jocondeLink, '', '12345678901', link=':en:Joconde (identifier)' },
{ 'KULTURNAV', 1248, p.kulturnavLink, '', '12345678-1234-1234-1234-1234567890AB', displayname='KulturNav', link=':en:KulturNav (identifier)' },
{ 'MBAREA', 982, p.mbareaLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz地域' }, --special cat name
{ 'MBI', 1330, p.mbiLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz楽器' }, --special cat name
{ 'LCCN', 244, p.lccnLink, '', 'n78039510' },
{ 'MBL', 966, p.mblLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainzレーベル' }, --special cat name
{ 'LIR', 886, p.lirLink, '', '1' },
{ 'MBP', 1004, p.mbpLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz場所' }, --special cat name
{ 'LNB', 1368, p.lnbLink, '', '123456789', link=':en:LNB (identifier)' },
{ 'MBRG', 436, p.mbrgLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainzリリース・グループ' }, --special cat name
{ 'Léonore', 640, p.leonoreLink, '', 'LH//1/1', link=':en:Léonore (identifier)' },
{ 'MBS', 1407, p.mbsLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainzシリーズ' }, --special cat name
{ 'MATHSN', 4955, p.mathsnLink, '', '175270', link=':en:MATHSN (identifier)' },
{ 'MBA', 434, p.mbaLink, '', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz' }, --special cat name
{ 'MBW', 435, p.mbwLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz作品' }, --special cat name
{ 'MGP', 549, p.mgpLink, "科学データベース", "123456"},
{ 'MBAREA', 982, p.mbareaLink, '', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz地域' }, --special cat name
{ 'NARA', 1225, p.naraLink, "その他", "12345678"},
{ 'MBI', 1330, p.mbiLink, '', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz楽器' }, --special cat name
{ 'NCL', 1048, p.nclLink, "国立図書館", "1081436"},
{ 'MBL', 966, p.mblLink, '', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainzレーベル' }, --special cat name
{ 'NDL', 349, p.ndlLink, "国立図書館", "012345678"},
{ 'MBP', 1004, p.mbpLink, '', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz場所' }, --special cat name
{ 'NGV', 2041, p.ngvLink, "美術館と博物館", "12354"},
{ 'MBRG', 436, p.mbrgLink, '', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainzリリース・グループ' }, --special cat name
{ 'NKC', 691, p.nkcLink, "国立図書館", "abcd12345678901234", link = ":en:NKC (identifier)"},
{ 'MBS', 1407, p.mbsLink, '', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainzシリーズ' }, --special cat name
{ 'NLA', 409, p.nlaLink, "国立図書館", "123456789012"},
{ 'MBW', 435, p.mbwLink, '', '12345678-1234-1234-1234-1234567890AB', category = 'MusicBrainz作品' }, --special cat name
{ 'MGP', 549, p.mgpLink, '', '123456' },
{ 'NLG', 3348, p.nlgLink, "国立図書館", "12345678", link = ":en:NLG (identifier)"},
{ 'NARA', 1225, p.naraLink, '', '12345678' },
{ 'NLI', 949, p.nliLink, "国立図書館", "123456789"},
{ 'NCL', 1048, p.nclLink, '', '1081436' },
{ 'NLK', 5034, p.nlkLink, "国立図書館", "KAB197000000"},
{ 'NDL', 349, p.ndlLink, '', '012345678' },
{ 'NLP', 1695, p.nlpLink, "国立図書館", "9810123456789012345"},
{ 'NLR', 1003, p.nlrLink, "国立図書館", "123456789"},
{ 'NGA', 3563, p.ngaLink, '', '114-5592', link=':en:NGA (identifier)' },
{ 'NSK', 1375, p.nskLink, "国立図書館", "123456789", link = ":en:NSK (identifier)"},
{ 'NGV', 2041, p.ngvLink, '', '12354' },
{ 'NKC', 691, p.nkcLink, '', 'abcd12345678901234', link=':en:NKC (identifier)' },
{ 'NTA', 1006, p.ntaLink, "国立図書館", "12345678X", link = ":en:NTA (identifier)"},
{ 'ORCID', 496, p.orcidLink, "全般", "0000-0002-7398-5483", prefix = '[[ORCID (識別子)|ORCID]]'},
{ 'NLA', 409, p.nlaLink, '', '123456789012' },
{ 'NLG', 3348, p.nlgLink, '', '12345678', link=':en:NLG (identifier)' },
{ 'PIC', 2750, p.picLink, "美術研究組織", "1", link = ":en:PIC (identifier)"},
{ 'NLI', 949, p.nliLink, '', '123456789' },
{ 'PLWABN', 7293, p.plwabnLink, "国立図書館", "9812345678905606"},
{ 'Publons', 3829, p.publonsLink, "科学データベース", "2776255", link = ":en:Publons (identifier)"},
{ 'NLK', 5034, p.nlkLink, '', 'KAB197000000' },
{ 'NLP', 1695, p.nlpLink, '', '9810123456789012345' },
{ 'RID', 1053, p.ridLink, "科学データベース", "A-1234-1934"},
{ 'RISM', 5504, p.rismLink, "その他", "pe1", prefix = '[[:en:RISM (identifier)|RISM(フランス)]]'},
{ 'NLR', 1003, p.nlrLink, '', '123456789' },
{ 'NSK', 1375, p.nskLink, '', '123456789', link=':en:NSK (identifier)' },
{ 'RERO', 3065, p.reroLink, "その他", "02-A012345678", prefix = '[[:en:RERO (identifier)|RERO(スイス)]]'},
{ 'RKDartists', 650, p.rkdartistsLink, "美術研究組織", "123456"},
{ 'NTA', 1006, p.ntaLink, '', '12345678X', link=':en:NTA (identifier)' },
{ 'ORCID', 496, p.orcidLink, '', '0000-0002-7398-5483' },
{ 'RKDID', 350, p.rkdidLink, "美術研究組織", "123456"},
{ 'PIC', 2750, p.picLink, '', '1', link=':en:PIC (identifier)' },
{ 'RSL', 947, p.rslLink, "国立図書館", "123456789"},
{ 'SELIBR', 906, p.selibrLink, "国立図書館", "123456", link = ":en:SELIBR (identifier)"},
{ 'PLWABN', 7293, p.plwabnLink, '', '9812345678905606' },
{ 'Publons', 3829, p.publonsLink, '', '2776255', link=':en:Publons (identifier)' },
{ 'SIKART', 781, p.sikartLink, "美術研究組織", '123456789', link = ":en:SIKART (identifier)"},
{ 'SNAC-ID', 3430, p.snacLink, "その他", "A"},
{ 'RERO', 3065, p.reroLink, '', '02-A012345678', link=':en:RERO (identifier)' },
{ 'SUDOC', 269, p.sudocLink, "その他", "026927608", prefix = '[[SUDOC (識別子)|SUDOC(フランス)]]'},
{ 'RID', 1053, p.ridLink, '', 'A-1234-1934', displayname='ResearcherID' },
{ 'RISM', 5504, p.rismLink, '', 'pe1', link=':en:RISM (identifier)' },
{ 'S2AuthorId', 4012, p.s2authoridLink, "科学データベース", "1796130", category = 'Semantic Scholar著者', link = ":en:S2AuthorId (identifier)" }, --special cat name
{ 'TA98', 1323, p.ta98Link, "科学データベース", "A12.3.45.678", link = ":en:TA98 (identifier)"},
{ 'RKDartists', 650, p.rkdartistsLink, '', '123456', displayname='RKD' },
{ 'TDVİA', 7314, p.tdviaLink, "その他", "asim-b-behdele", link = ":en:TDVİA (identifier)"},
{ 'RKDID', 350, p.rkdidLink, '', '123456', displayname='RKDimages ID' },
{ 'RSL', 947, p.rslLink, '', '123456789' },
{ 'TePapa', 3544, p.tepapaLink, "美術館と博物館", "1"},
{ 'Scopus', 1153, p.scopusLink, '', '7005487412', link=':en:Scopus (identifier)' },
{ 'TLS', 1362, p.tlsLink, "その他", "Abcd", link = ":en:TLS (identifier)"},
{ 'SELIBR', 906, p.selibrLink, '', '123456', link=':en:SELIBR (identifier)' },
{ 'Trove', 1315, p.troveLink, "その他", "12345678", prefix = '[[:en:Trove (identifier)|Trove(オーストラリア)]]'}, --formerly NLA-person
{ 'UKPARL', 6213, p.ukparlLink, "その他", "AQUupyiR"},
{ 'SIKART', 781, p.sikartLink, '', '123456789', link=':en:SIKART (identifier)' },
{ 'ULAN', 245, p.ulanLink, "美術研究組織", "500123456", link = ":en:ULAN (identifier)"},
{ 'SNAC-ID', 3430, p.snacLink, '', 'A', displayname='SNAC' },
{ 'USCongress', 1157, p.uscongressLink, "その他", "A000123", link = ":en:US Congress (identifier)"},
{ 'SUDOC', 269, p.sudocLink, '', '026927608' },
{ 'VcBA', 8034, p.vcbaLink, "国立図書館", "494/9793"},
{ 'TA98', 1323, p.ta98Link, '', 'A12.3.45.678', link=':en:TA98 (identifier)' },
{ 'TDVİA', 7314, p.tdviaLink, '', 'asim-b-behdele', link=':en:TDVİA (identifier)' },
{ 'VIAF', 214, p.viafLink, "全般", "123456789", prefix = "[[VIAF (識別子)|VIAF]]"},
{ 'WORLDCATID', 7859, nil, "全般", nil, link = "WorldCat Identities (識別子)"},
{ 'TePapa', 3544, p.tepapaLink, '', '1' },
{ 'TLS', 1362, p.tlsLink, '', 'Abcd', link=':en:TLS (identifier)' },
{ 'Trove', 1315, p.troveLink, '', '12345678', link=':en:Trove (identifier)' }, --formerly NLA-person
{ 'UKPARL', 6213, p.ukparlLink, '', 'AQUupyiR', displayname='英議会' },
{ 'ULAN', 245, p.ulanLink, '', '500123456', link=':en:ULAN (identifier)' },
{ 'USCG', 3723, p.uscgLink, '', '6-0695', link=':en:USCG (identifier)' },
{ 'USCongress', 1157, p.uscongressLink, '', 'A000123', link=':en:US Congress (identifier)', displayname='米議会' },
{ 'VcBA', 8034, p.vcbaLink, '', '494/9793' },
{ 'VIAF', 214, p.viafLink, '', '123456789' },
{ 'WORLDCATID', 7859, p.worldcatidLink, '', 'lccn-n78-95332', link='WorldCat Identities (識別子)', displayname='WorldCat Identities' },
{ 'ZBMATH', 1556, p.zbmathLink, '', 'turing.alan-m', link=':en:ZBMATH (identifier)' },
}
}


1,171行目: 1,084行目:
}
}


-- Deprecated aliases to p.conf; tracked in [[Category:Articles with deprecated authority control identifiers]]
-- Deprecated aliases to p.conf; tracked in [[Category:Wikipedia articles with deprecated authority control identifiers]]
-- Format: { 'deprecated parameter name', 'replacement parameter name in p.conf' }
-- Format: { 'deprecated parameter name', 'replacement parameter name in p.conf' }
p.deprecated = {
p.deprecated = {
1,187行目: 1,100行目:


function p.authorityControl( frame )
function p.authorityControl( frame )
local resolveEntity = require( 'Module:ResolveEntityId' )
local resolveEntity = require( "Module:ResolveEntityId" )
local parentArgs = frame:getParent().args --WD IDs added here later
local parentArgs = frame:getParent().args --WD IDs added here later
local iParentArgs = 0 --count original/manual parent args only later
local iParentArgs = 0 --count original/manual parent args only later
local elements = {} --create/insert rows later
local worldcatCat = ''
local worldcatCat = ''
local elementsCat = ''
local multipleIdCat = ''
local multipleIdCat = ''
local suppressedIdCat = ''
local suppressedIdCat = ''
local suppressedIdCatArts = ''
local deprecatedIdCat = ''
local deprecatedIdCat = ''
local differentOnWDCat = ''
local differentOnWDCat = ''
local sameOnWDCat = ''
local sameOnWDCat = ''
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
local alias, param = a[1], a[2]
local alias, param = a[1], a[2]
1,209行目: 1,118行目:
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
local dep, param = d[1], d[2]
local dep, param = d[1], d[2]
1,220行目: 1,129行目:
end
end
--use QID= parameter for testing/example purposes only
--Use QID= parameter for testing/example purposes only
local itemId = nil
local itemId = nil
if namespace ~= 0 then
if namespace ~= 0 then
1,234行目: 1,143行目:
--Wikidata fallback if available
--Wikidata fallback if available
if itemId then
if itemId then
local suppressedIdCount = 0
local iMatches = 0
local iMatches = 0
for _, params in ipairs( p.conf ) do
for _, params in ipairs( p.conf ) do
1,243行目: 1,151行目:
if wikidataIds[1] then
if wikidataIds[1] then
if val == '' and (namespace == 0 or testcases) then
if val == '' and (namespace == 0 or testcases) then
suppressedIdCount = suppressedIdCount + 1
suppressedIdCat = '[[Category:抑制された典拠管理識別子がある記事|'..params[1]..']]'
suppressedIdCat = '[[Category:抑制された典拠管理識別子がある記事|'..params[1]..']]'
else
else
1,265行目: 1,172行目:
if iMatches > 0 and iMatches == iParentArgs then
if iMatches > 0 and iMatches == iParentArgs then
sameOnWDCat = '[[Category:ウィキデータと同じ典拠管理識別子をパラメータで指定しているページ]]'
sameOnWDCat = '[[Category:ウィキデータと同じ典拠管理識別子をパラメータで指定しているページ]]'
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
end
end
--Configured rows
--configure rows
local rct = 0
local rct = 0
local sectionOrder = {"全般","国立図書館","美術館と博物館",
--don't show NLI if J9U is present, since they both go to the National Library of Israel
"美術研究組織","人名辞典","科学データベース",
--and the library has deprecated NLI IDs in favor of J9U IDs
"その他"}
if parentArgs.J9U or parentArgs.j9u then
local sections = {
parentArgs.NLI = ''
parentArgs.nli = ''
["全般"] = {},
["国立図書館"] = {},
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
["人名辞典"] = {},
["科学データベース"] = {},
["その他"] = {}
}
-- 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
if parentArgs.PLWABN or parentArgs.plwabn then
parentArgs.NLP = ''
parentArgs.NLP = ''
1,295行目: 1,199行目:
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
table.insert( tlinks, params[3]( val ) )
table.insert( tlinks, params[3]( val ) )
1,319行目: 1,223行目:
--assemble
--assemble
if tval[1] then
if tval[1] then
local elementLink = '[['..(params.link or params[1]..' (識別子)')..'|'..(params.displayname or params[1])..']]: '
table.insert( sections[params[4]], p.createRow( params[1], tval, nil, tlinks, true, params.category, params.prefix) )
table.insert( elements, p.createRow( params[1], elementLink, tval, nil, tlinks, true, params.category, params.prefix ) )
rct = rct + 1
rct = rct + 1
if tval[2] then
if tval[2] then
1,328行目: 1,231行目:
end
end
--WorldCat-VIAF & WorldCat-LCCN
--WorldCat
local worldcatId = parentArgs['worldcatid'] or parentArgs['WORLDCATID']
local worldcatId = parentArgs['worldcatid'] or parentArgs['WORLDCATID']
if worldcatId == nil then --if WORLDCATID absent but unsuppressed
if worldcatId and worldcatId ~= '' then --if WORLDCATID present & unsuppressed
table.insert( sections["全般"], p.createRow( 'WORLDCATID', worldcatId, '[https://www.worldcat.org/identities/'..mw.uri.encode(worldcatId, 'PATH')..' WorldCat]', nil, false ) ) --Validation?
worldcatCat = p.getCatForId( 'WORLDCATID' )
rct = rct + 1
elseif worldcatId == nil then --if WORLDCATID absent but unsuppressed
local viafId = parentArgs['viaf'] or parentArgs['VIAF']
local viafId = parentArgs['viaf'] or parentArgs['VIAF']
local lccnId = parentArgs['lccn'] or parentArgs['LCCN']
local lccnId = parentArgs['lccn'] or parentArgs['LCCN']
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( elements, p.createRow( 'VIAF', '[[WorldCat Identities (識別子)|WorldCat Identities]](VIAF経由):', viafId, '[https://www.worldcat.org/identities/containsVIAFID/'..viafId..' '..viafId..']', nil, false ) )
table.insert( sections["全般"], p.createRow( 'VIAF', viafId, '[https://www.worldcat.org/identities/containsVIAFID/'..viafId..' WorldCat(VIAF経由)]', nil, false ) )
if namespace == 0 then
if namespace == 0 then
worldcatCat = '[[Category:WorldCat-VIAF識別子が指定されている記事]]'
worldcatCat = '[[Category:WorldCat-VIAF識別子が指定されている記事]]'
end
end
rct = rct + 1
elseif lccnId and lccnId ~= '' and p.lccnLink( lccnId ) then --LCCN must be present, unsuppressed, & validated
elseif lccnId and lccnId ~= '' and p.lccnLink( lccnId ) then --LCCN must be present, unsuppressed, & validated
local lccnParts = p.splitLccn( lccnId )
local lccnParts = p.splitLccn( lccnId )
if lccnParts and lccnParts[1] ~= 'sh' then
if lccnParts and lccnParts[1] ~= 'sh' then
local lccnIdFmtd = lccnParts[1]..lccnParts[2]..'-'..lccnParts[3]
local lccnIdFmtd = lccnParts[1]..lccnParts[2]..'-'..lccnParts[3]
table.insert( elements, p.createRow( 'LCCN', '[[WorldCat Identities (識別子)|WorldCat Identities]](LCCN経由):', lccnId, '[https://www.worldcat.org/identities/lccn-'..lccnIdFmtd..' '..lccnIdFmtd..']', nil, false ) )
table.insert( sections["全般"], p.createRow( 'LCCN', lccnId, '[https://www.worldcat.org/identities/lccn-'..lccnIdFmtd..' WorldCat(アメリカ国会図書館経由)]', nil, false ) )
if namespace == 0 then
if namespace == 0 then
worldcatCat = '[[Category:WorldCat-LCCN識別子が指定されている記事]]'
worldcatCat = '[[Category:WorldCat-LCCN識別子が指定されている記事]]'
end
end
end
end
rct = rct + 1
end
end
elseif worldcatId == '' then --if WORLDCATID suppressed
suppressedIdCat = '[[Category:抑制された典拠管理識別子がある記事|WORLDCATID]]'
end
end
local Navbox = require('Module:Navbox')
--configure Navbox
local outString = ''
local elementsCat = ''
if rct == 0 or rct >= 25 then
local extrap = true
local eCat = rct..'種類以上の識別子があるページ'
local extra = parentArgs.extralist
--elementsCat = '[[Category:'..eCat..']]'..p.redCatLink(eCat)
if extra == nil or extra == '' then
elementsCat = '' --25種類以上の識別子が指定された場合、追跡カテゴリをつけるという機能は日本語版では導入されていない
extrap = false
end
end
if rct > 0 or extrap then
local Navbox = require('Module:Navbox')
local outString = ''
if rct > 0 then
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 = { pid = 'identifiers', qid = itemId } end --expensive
if testcases and itemId then args = { pid = 'identifiers', qid = itemId } end --expensive
local pencil = frame:expandTemplate{ title = 'EditAtWikidata', args = args}
local pencil = frame:expandTemplate{ title = 'EditAtWikidata', args = args}
local navboxArgs = {
outString = Navbox._navbox( {
name = 'Normdaten',
name = 'Normdaten',
navboxclass = 'authority-control',
navboxclass = 'authority-control',
bodyclass = 'hlist',
bodyclass = 'hlist',
state = parentArgs.state,
state = parentArgs.state or 'autocollapse',
group1 = '[[Help:典拠管理|典拠管理]]'..pencil,
list1 = table.concat( elements ),
navbar = 'off'
navbar = 'off'
} )
}
for _, sectName in ipairs(sectionOrder) do
end
if #sections[sectName] ~= 0 then
navboxArgs["group" .. sectionID] = sectName
--auxCats
navboxArgs["list" .. sectionID] = table.concat(sections[sectName])
if rct == 0 or rct >= 25 then
sectionID = sectionID + 1
local eCat = rct..'種類以上の識別子があるページ'
end
--elementsCat = addCat(eCat)
elementsCat = '' --25種類以上の識別子が指定された場合、追跡カテゴリをつけるという機能は日本語版では導入されていない
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
if navboxArgs.group2 then
navboxArgs.title = "[[Help:典拠管理|典拠管理]]" .. pencil
else
local sect = navboxArgs.group1
if sect == "全般" or sect == "その他" 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:典拠管理|典拠管理]]" .. pencil
else
navboxArgs.group1 = "[[Help:典拠管理|典拠管理:" .. sect .. "]] " .. pencil
end
end
outString = Navbox._navbox(navboxArgs)
end
end
local auxCats = worldcatCat..elementsCat..multipleIdCat..suppressedIdCat..suppressedIdCatArts..
local auxCats = worldcatCat .. elementsCat .. multipleIdCat .. suppressedIdCat ..
deprecatedIdCat..differentOnWDCat..sameOnWDCat..stateCat
deprecatedIdCat .. differentOnWDCat .. sameOnWDCat
if testcases then
if testcases then
auxCats = mw.ustring.gsub(auxCats, '(%[%[)(Category)', '%1:%2') --for easier checking
auxCats = mw.ustring.gsub(auxCats, '(%[%[)(Category)', '%1:%2') --for easier checking
end
end
outString = outString .. auxCats
--out
outString = outString..auxCats
if namespace ~= 0 then
if namespace ~= 0 then
outString = mw.ustring.gsub(outString, '(%[%[)(Category:[^%]]*記事)', '%1:%2') --by definition
outString = mw.ustring.gsub(outString, '(%[%[)(Category:[^%]]*記事)', '%1:%2') --by definition

2022年10月25日 (火) 13:44時点における版

モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]

{{Normdaten}}のコードを生成しているモジュールです。

識別子、ウィキデータプロパティと追跡カテゴリ

Lua エラー モジュール:No_globals 内、1 行目: このモジュールはモジュール‐ノート:No globalsでの議論を経て廃止されました。今後は<code>require('strict')</code>をご利用ください。

require('Module:No globals')

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

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

function p.getCatForId( id )
	local catName = ''
	if namespace == 0 then
		catName = id..'識別子が指定されている記事'
	elseif namespace == 2 and not title.isSubpage then
		catName = id..'識別子が指定されている利用者ページ'
	else
		catName = id..'識別子が指定されているその他のページ'
	end
	return '[[Category:'..catName..']]'..p.redCatLink(catName)
end

function p.redCatLink( catName ) --catName == 'Blah' (not 'Category:Blah', not '[[Category:Blah]]')
	if catName and catName ~= '' and
	   testcases == false and
	   mw.title.new(catName, 14).exists == false
	then
		return '[[Category:赤リンクの典拠情報カテゴリがあるページ]]'
	end
	return ''
end

function p.createRow( id, rawValues, link, links, withUid, specialCat, prefix )
	local catName = '誤った'..(specialCat or id)..'識別子が指定されている記事'
	if links then -- all links[] use withUid = false; no check needed
		local row = ''
		if prefix then
			row = row .. '*' .. prefix
		end
		local totlen = 0
		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">'..id..'識別子の値'..rawValues[i]..'は正しくありません。</span>[[Category:'..catName..']]'..p.redCatLink(catName)
			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">'..id..'識別子の値'..rawValues..'は正しくありません。</span>[[Category:'..catName..']]'..p.redCatLink(catName)..'\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 'オークランド')..']'..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 '計算機協会')..']'..p.getCatForId( 'ACM-DL' )
end

function p.adbLink( id, label )
	--P1907's format regex: [a-z][-a-z]+-([1-2]\d|[1-9])\d{0,3} (e.g. barton-sir-edmund-toby-71)
	if not id:match( '^[a-z][-a-z]+-[1-2]%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 'オーストラリア')..']'..p.getCatForId( 'ADB' )
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 '南オーストラリア')..']'..p.getCatForId( 'AGSA' )
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 'ウルグアイ')..']'..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 'ノルウェー')..']'..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(ドイツ)')..']'..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 'チリ')..']'..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 'スペイン')..']'..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 'フランス')..'] [https://data.bnf.fr/ark:/12148/'..id..' (データ)]'..p.getCatForId( 'BNF' )
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 'オランダ')..']'..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 'カタルーニャ')..']'..p.getCatForId( 'CANTIC' ) --no https as of 10/2019
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(日本)')..']'..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 'コモンウェルス戦争墓地委員会')..']'..p.getCatForId( 'CWGC' )
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 'オーストラリアのアーティスト')..']'..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(コンピュータ科学)')..']'..p.getCatForId( 'DBLP' )
end

function p.dibLink( id, label )
	--P6829's format regex: a\d{4}\d?(-[A-D])? (e.g. a1953)
	if not id:match( '^a%d%d%d%d%d?%-?[A-D]?$' ) then
		return false
	end
	return '[https://dib.cambridge.org/viewReadPage.do?articleId='..id..' '..(label or 'アイルランド')..']'..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 '科学画家')..']'..p.getCatForId( 'DSI' )
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 'ニュージーランドのアーティスト')..']'..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 '統合典拠ファイル(ドイツ)')..']'..p.getCatForId( 'GND' )
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 'スイス歴史辞典')..']'..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 'ワールドアスレティックス')..']'..p.getCatForId( 'IAAF' )
end

function p.iccuLink( id, label )
	--P396's format regex: IT\\ICCU\\(\d{10}|\D\D[\D\d]\D\\\d{6}) (e.g. IT\ICCU\CFIV\000163)
	if not id:match( '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and
	   not id:match( '^IT\\ICCU\\%u%u[%u%d]%u\\%d%d%d%d%d%d$' ) then --legacy: %u used here instead of %D (but the faulty ID cat is empty, out of ~12k uses)
	   	return false
	   end
	return '[https://opac.sbn.it/opacsbn/opac/iccu/scheda_authority.jsp?bid='..id..' '..(label or 'イタリア')..']'..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(イスラエル)')..']'..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 'ウクライナ・インターネット百科事典')..']'..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.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(フランス)')..']'..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(ノルウェー)')..']'..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 'アメリカ')..']'..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(スイス)')..']'..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 'ラトビア')..']'..p.getCatForId( 'LNB' )
end

function p.leonoreLink( id, label )
	--P640's format regex: LH/\d{1,4}/\d{1,3}|19800035/\d{1,4}/\d{1,5}(Bis)?|C/0/\d{1,2} (e.g. LH/2064/18)
	if not id:match( '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and             --IDs from       LH/1/1 to         LH/2794/54 (legionaries)
	   not id:match( '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) and --IDs from 19800035/1/1 to 19800035/385/51670 (legionnaires who died 1954-1977 & some who died < 1954)
	   not id:match( '^C/0/%d%d?$' ) then                          --IDs from        C/0/1 to             C/0/84 (84 famous legionaries)
		return false
	end
	return '[http://www.culture.gouv.fr/public/mistral/leonore_fr?ACTION=CHERCHER&FIELD_1=COTE&VALUE_1='..id..' '..(label or 'Léonore(フランス)')..']'..p.getCatForId( 'Léonore' ) --no https as of 9/2019
end

function p.maLink( id, label )
	--P6366's format regex: [1-9]\d{4,9} (e.g. 1498221862)
	if not id:match( '^[1-9]%d%d%d%d%d?%d?%d?%d?%d?$' ) then
		return false
	end
	return '[https://academic.microsoft.com/v2/detail/'..id..' '..(label or 'マイクロソフト・アカデミック')..']'..p.getCatForId( 'MA' )
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 (識別子)|MusicBrainz]] [' .. url .. ' アーティスト]' .. 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地域' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MBAREA (識別子)|MusicBrainz]] [' .. url .. ' 地域]' .. 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楽器' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MBI (識別子)|MusicBrainz]] [' .. url .. ' 楽器]' .. 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レーベル' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MBL (識別子)|MusicBrainz]] [' .. url .. ' レーベル]' .. 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場所' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MBP (識別子)|MusicBrainz]] [' .. url .. ' 場所]' .. 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リリース・グループ' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MBRG (識別子)|MusicBrainz]] [' .. url .. ' リリース・グループ]' .. 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シリーズ' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MBS (識別子)|MusicBrainz]] [' .. url .. ' シリーズ]' .. 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作品' )--special cat name
	if label then
		return '['..url..' '..label..']'..cat
	else
		return '[[MBW (識別子)|MusicBrainz]] [' .. url .. ' 作品]' .. 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://genealogy.math.ndsu.nodak.edu/id.php?id='..id..' '..(label or 'Mathematics Genealogy Project')..']'..p.getCatForId( 'MGP' )
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 '公文書館(アメリカ)')..']'..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 '台湾')..']'..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 '日本')..']'..p.getCatForId( 'NDL' )
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 'ヴィクトリア')..']'..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 'チェコ')..']'..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 'オーストラリア')..']'..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 'ギリシャ')..']'..p.getCatForId( 'NLG' )
end

function p.nliLink( id, label )
	--P949'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://uli.nli.org.il/F/?func=direct&doc_number='..id..'&local_base=nlx10'..' '..(label or 'イスラエル')..']'..p.getCatForId( 'NLI' )
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 '韓国')..']'..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 'ポーランド')..']'..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 'ルーマニア')..']'..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 'クロアチア')..']'..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 'オランダ')..']'..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 'ポーランド')..']'..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(研究者)')..']'..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(フランス)')..']'..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(スイス)')..']'..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アーティスト(オランダ)')..']'..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(オランダ)')..']'..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 'ロシア')..']'..p.getCatForId( 'RSL' ) --no https as of 9/2019
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 'スウェーデン')..']'..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(スイス)')..']'..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(フランス)')..']'..p.getCatForId( 'SUDOC' )
end

function p.s2authoridLink( id, label )
	--P4012's format regex: [1-9]\d* (e.g. 1796130)
	if not id:match( '^[1-9]%d*$' ) then
		return false
	end
	return '[https://www.semanticscholar.org/author/'..id..' '..(label or 'Semantic Scholar')..']'..p.getCatForId( 'Semantic Scholar著者' ) --special cat name
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
	return '[http://tools.wmflabs.org/wikidata-externalid-url/?p=1323&url_prefix=https:%2F%2Fwww.unifr.ch%2Fifaa%2FPublic%2FEntryPage%2FTA98%20Tree%2FEntity%20TA98%20EN%2F&url_suffix=%20Entity%20TA98%20EN.htm&id='..id..' '..(label or 'Terminologia Anatomica')..']'..p.getCatForId( 'TA98' )
end

function p.tdviaLink( id, label )
	--P7314's format regex: [a-z/-]+] (e.g. barkan-omer-lutfi)
	if not id:match( '^[a-z/-]+$' ) then
		return false
	end
	return '[https://islamansiklopedisi.org.tr/'..id..' '..(label or 'イスラーム百科事典(トルコ)')..']'..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(ニュージーランド)')..']'..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(スイス)')..']'..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(オーストラリア)')..']'..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 '英議会')..']'..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 'アーティスト名(ゲティ)')..']'..p.getCatForId( 'ULAN' )
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 '米議会')..']'..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 'バチカン')..']'..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), 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

--[[=========================== 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 = {}
	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

-- 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 = '{| class="wikitable sortable"\n'..
					  '! rowspan=2 | 識別子\n'..
					  '! rowspan=2 | グループ\n'..
					  '! rowspan=2 | 表示名\n'..
					  '! rowspan=2; data-sort-type=number | ウィキデータのプロパティ\n'..
					  '! colspan=4 | 追跡カテゴリのページ数\n'..
					  '|-\n'..
					  '! [[:Category:典拠管理情報がある記事|'..                '記事]]\n'..
					  '! [[:Category:典拠管理情報がある利用者ページ|'..        '利用者ページ]]\n'..
					  '! [[:Category:典拠管理情報があるその他のページ|'..      'その他のページ]]\n'..
					  '! [[:Category:誤った典拠管理情報が指定されている記事|'..'誤った識別子]]\n'..
					  '|-\n'
	local lang = mw.getContentLanguage()
	for _, conf in pairs( p.conf ) do
		local param, pid, section = conf[1], conf[2], conf[4]
		local appearsAs
		if param == "WORLDCATID" then
			-- WorldCat is special
			appearsAs = "[https://www.worldcat.org/identities/lccn-n78039510 WorldCat]"
		elseif conf.prefix then
			appearsAs = conf.prefix
		else
			appearsAs = conf[3](conf[5])
		end
		local link = conf.link or param .. ' (識別子)'
		local category = conf.category or param
		local args = { id = 'f', pid }
		local wpl = frame:expandTemplate{ title = 'Wikidata property link', args = args }
		--cats
		local articleCat = category..'識別子が指定されている記事'
		local userCat =    category..'識別子が指定されている利用者ページ'
		local miscCat =    category..'識別子が指定されているその他のページ'
		local faultyCat =  '誤った'..category..'識別子が指定されている記事'
		--counts
		local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') )
		local userCount =    lang:formatNum( mw.site.stats.pagesInCategory(userCat, 'pages') )
		local miscCount =    lang:formatNum( mw.site.stats.pagesInCategory(miscCat, 'pages') )
		local faultyCount =  lang:formatNum( mw.site.stats.pagesInCategory(faultyCat, 'pages') )
		
		--concat
		wikiTable = wikiTable..'\n'..
					'|-\n'..
					'||[['..link..'|'..param..']]'..
					'||'..section..
					'||'..appearsAs..
					'||data-sort-value='..pid..'|'..wpl..
					'||style="text-align: right;"|[[:Category:'..articleCat..'|'..articleCount..']]'..
					'||style="text-align: right;"|[[:Category:'..   userCat..'|'..   userCount..']]'..
					'||style="text-align: right;"|[[:Category:'..   miscCat..'|'..   miscCount..']]'..
					'||style="text-align: right;"|[[:Category:'.. faultyCat..'|'.. faultyCount..']]'
	end
	
	--append derivative WorldCat cats
	local wcd = { 'WorldCat-LCCN', 'WorldCat-VIAF' }
	for _, w in pairs(wcd) do
		local articleCat = 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(アメリカ議会図書館経由)]"
		else
			appearsAs = "[https://www.worldcat.org/identities/containsVIAFID/12345789 WorldCat(VIAF経由)]"
		end
		wikiTable = wikiTable..'\n'..
					'|-\n'..
					'||'..'—'..
					'||全般'..
					'||'..appearsAs..
					'||data-sort-value='..w..'|'..'—'..
					'||style="text-align: right;"|[[:Category:'..articleCat..'|'..articleCount..']]'..
					'||style="text-align: right;"|—'..
					'||style="text-align: right;"|—'..
					'||style="text-align: right;"|—'
	end
	
	return require("Module:Suppress categories").main(wikiTable)..'\n|}'
end

--[[==========================================================================]]
--[[                              Configuration                               ]]
--[[==========================================================================]]

-- If a specific "(identifier) redirect" exists for an identifier, please route through this particular redirect rather than linking directly to the target page. This reduces clutter in "What links here" and improves reverse lookup of articles where a manifestation of this particular identifier is used.


-- Parameter format: { 'parameter name', propertyId # in Wikidata, formatting/validation function, section, example ID for documentation }
-- 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 parameter),
-- prefix to include a prefix (usually a wikilink explaining what the identifier is) before the external link itself
p.conf = {
	{ 'AAG', 3372, p.aagLink, "美術館と博物館", "1", link = ":en:AAG (identifier)"},
	{ 'ACM-DL', 864, p.acmLink, "科学データベース", "12345678901", link="ACM DL (識別子)"},
	{ 'ADB', 1907, p.adbLink, "人名辞典", "barton-sir-edmund-toby-71", link = ":en:ADB (identifier)"},
	{ 'AGSA', 6804, p.agsaLink, "美術館と博物館", "3625"},
	{ 'autores.uy', 2558, p.autoresuyLink, "人名辞典", "12345"},
	{ 'AWR', 4186, p.awrLink, "人名辞典", "PR00768b", link = ":en:AWR (identifier)"},
	{ 'BIBSYS', 1015, p.bibsysLink, "国立図書館", "1234567890123", link = ":en:BIBSYS (identifier)"},
	{ 'Bildindex', 2092, p.bildLink, "美術研究組織", "1", link = ":en:Bildindex (identifier)"},
	{ 'BNC', 1890, p.bncLink, "国立図書館", "123456789", link = ":en:BNC (identifier)"},
	{ 'BNE', 950, p.bneLink, "国立図書館", "XX1234567"},
	{ 'BNF', 268, p.bnfLink, "国立図書館", "123456789"},
	{ 'Botanist', 428, p.botanistLink , "科学データベース", "L."},
	{ 'BPN', 651, p.bpnLink , "人名辞典", "12345678", link = ":en:BPN (identifier)"},
	{ 'CANTIC', 1273, p.canticLink, "国立図書館", "a12345678", link = ":en:CANTIC (identifier)"},
	{ 'CINII', 271, p.ciniiLink, "科学データベース", "DA12345678", link = "CiNii (識別子)"},
	{ 'CWGC', 1908, p.cwgcLink, "その他", "1234567"},
	{ 'DAAO', 1707, p.daaoLink, "美術研究組織", "rolf-harris", link = ":en:DAAO (identifier)"},
	{ 'DBLP', 2456, p.dblpLink, "科学データベース", "123/123"},
	{ 'DIB',  6829, p.dibLink, "人名辞典", "a1234", link = ":en:DIB (identifier)"},
	{ 'DSI', 2349, p.dsiLink, "美術研究組織", "1538", link = ":en:DSI (identifier)"},
	{ 'FAST', 2163, p.fastLink, "その他", "1", link = ":en:FAST (identifier)"},
	{ 'FNZA', 6792, p.fnzaLink, "美術研究組織", "12", link = ":en:FNZA (identifier)"},
	{ 'GND', 227, p.gndLink, "全般", "4079154-3"},
	{ 'HDS', 902, p.hdsLink, "その他", "050123"},
	{ 'IAAF', 1146, p.iaafLink, "その他", "123"},
	{ 'ICCU', 396, p.iccuLink, "国立図書館", "IT\\ICCU\\CFIV\\000163", link = ":en:ICCU (identifier)"}, --formerly SBN
	{ 'ICIA', 1736, p.iciaLink, "美術研究組織", "1", link = ":en:ICIA (identifier)"},
	{ 'IEU', 9070, p.ieuLink, "その他", "N\\A\\NationalAcademyofArtandArchitecture", link = ":en:IEU (identifier)"},
	{ 'ISNI', 213, p.isniLink, "全般", "0000-0000-6653-4145", prefix = '[[ISNI (識別子)|ISNI]]'},
	{ 'Joconde', 347, p.jocondeLink, "美術研究組織", "12345678901", link = ":en:Joconde (identifier)"},
	{ 'KULTURNAV', 1248, p.kulturnavLink, "美術研究組織", "12345678-1234-1234-1234-1234567890AB", link=":en:KulturNav (identifier)"},
	{ 'LCCN', 244, p.lccnLink, "国立図書館", "n78039510"},
	{ 'LIR', 886, p.lirLink, "その他", "1"},
	{ 'LNB', 1368, p.lnbLink, "国立図書館", "123456789", link = ":en:LNB (identifier)"},
	{ 'Léonore', 640, p.leonoreLink, "その他", "LH/1/1", prefix = "[[:en:Léonore (identifier)|Léonore(フランス)]]"},
	{ 'MA', 6366, p.maLink, "その他", "123456789", link = ":en:MA (identifier)"},
	{ 'MBA', 434, p.mbaLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz'}, --special cat name
	{ 'MBAREA', 982, p.mbareaLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz地域' }, --special cat name
	{ 'MBI', 1330, p.mbiLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz楽器' }, --special cat name
	{ 'MBL', 966, p.mblLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainzレーベル' }, --special cat name
	{ 'MBP', 1004, p.mbpLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz場所' }, --special cat name
	{ 'MBRG', 436, p.mbrgLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainzリリース・グループ' }, --special cat name
	{ 'MBS', 1407, p.mbsLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainzシリーズ' }, --special cat name
	{ 'MBW',  435, p.mbwLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz作品' }, --special cat name
	{ 'MGP', 549, p.mgpLink, "科学データベース", "123456"},
	{ 'NARA', 1225, p.naraLink, "その他", "12345678"},
	{ 'NCL', 1048, p.nclLink, "国立図書館", "1081436"},
	{ 'NDL', 349, p.ndlLink, "国立図書館", "012345678"},
	{ 'NGV', 2041, p.ngvLink, "美術館と博物館", "12354"},
	{ 'NKC', 691, p.nkcLink, "国立図書館", "abcd12345678901234", link = ":en:NKC (identifier)"},
	{ 'NLA', 409, p.nlaLink, "国立図書館", "123456789012"},
	{ 'NLG', 3348, p.nlgLink, "国立図書館", "12345678", link = ":en:NLG (identifier)"},
	{ 'NLI', 949, p.nliLink, "国立図書館", "123456789"},
	{ 'NLK', 5034, p.nlkLink, "国立図書館", "KAB197000000"},
	{ 'NLP', 1695, p.nlpLink, "国立図書館", "9810123456789012345"},
	{ 'NLR', 1003, p.nlrLink, "国立図書館", "123456789"},
	{ 'NSK', 1375, p.nskLink, "国立図書館", "123456789", link = ":en:NSK (identifier)"},
	{ 'NTA', 1006, p.ntaLink, "国立図書館", "12345678X", link = ":en:NTA (identifier)"},
	{ 'ORCID', 496, p.orcidLink, "全般", "0000-0002-7398-5483", prefix = '[[ORCID (識別子)|ORCID]]'},
	{ 'PIC', 2750, p.picLink, "美術研究組織", "1", link = ":en:PIC (identifier)"},
	{ 'PLWABN',  7293, p.plwabnLink, "国立図書館", "9812345678905606"},
	{ 'Publons', 3829, p.publonsLink, "科学データベース", "2776255", link = ":en:Publons (identifier)"},
	{ 'RID', 1053, p.ridLink, "科学データベース", "A-1234-1934"},
	{ 'RISM', 5504, p.rismLink, "その他", "pe1",  prefix = '[[:en:RISM (identifier)|RISM(フランス)]]'},
	{ 'RERO', 3065, p.reroLink, "その他", "02-A012345678", prefix = '[[:en:RERO (identifier)|RERO(スイス)]]'},
	{ 'RKDartists', 650, p.rkdartistsLink, "美術研究組織", "123456"},
	{ 'RKDID', 350, p.rkdidLink, "美術研究組織", "123456"},
	{ 'RSL', 947, p.rslLink, "国立図書館", "123456789"},
	{ 'SELIBR', 906, p.selibrLink, "国立図書館", "123456", link = ":en:SELIBR (identifier)"},
	{ 'SIKART', 781, p.sikartLink, "美術研究組織", '123456789', link = ":en:SIKART (identifier)"},
	{ 'SNAC-ID', 3430, p.snacLink, "その他", "A"},
	{ 'SUDOC', 269, p.sudocLink, "その他", "026927608", prefix = '[[SUDOC (識別子)|SUDOC(フランス)]]'},
	{ 'S2AuthorId', 4012, p.s2authoridLink, "科学データベース", "1796130", category = 'Semantic Scholar著者', link = ":en:S2AuthorId (identifier)" }, --special cat name
	{ 'TA98', 1323, p.ta98Link, "科学データベース", "A12.3.45.678", link = ":en:TA98 (identifier)"},
	{ 'TDVİA', 7314, p.tdviaLink, "その他", "asim-b-behdele", link = ":en:TDVİA (identifier)"},
	{ 'TePapa', 3544, p.tepapaLink, "美術館と博物館", "1"},
	{ 'TLS',  1362, p.tlsLink, "その他", "Abcd", link = ":en:TLS (identifier)"},
	{ 'Trove', 1315, p.troveLink, "その他", "12345678", prefix = '[[:en:Trove (identifier)|Trove(オーストラリア)]]'}, --formerly NLA-person
	{ 'UKPARL', 6213, p.ukparlLink, "その他", "AQUupyiR"},
	{ 'ULAN', 245, p.ulanLink, "美術研究組織", "500123456", link = ":en:ULAN (identifier)"},
	{ 'USCongress', 1157, p.uscongressLink, "その他", "A000123", link = ":en:US Congress (identifier)"},
	{ 'VcBA', 8034, p.vcbaLink, "国立図書館", "494/9793"},
	{ 'VIAF', 214, p.viafLink, "全般", "123456789", prefix = "[[VIAF (識別子)|VIAF]]"},
	{ 'WORLDCATID', 7859, nil, "全般", nil, link = "WorldCat Identities (識別子)"},
}

-- Legitimate aliases to p.conf, for convenience
-- Format: { 'alias', 'parameter name in p.conf' }
p.aliases = {
	{ 'DNB', 'GND' }, --Deutsche Nationalbibliothek -> Gemeinsame Normdatei
	{ 'Leonore', 'Léonore' }, --alias name without diacritics
	{ 'leonore', 'Léonore' }, --lowercase variant without diacritics
	{ '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:Wikipedia 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 multipleIdCat = ''
	local suppressedIdCat = ''
	local deprecatedIdCat = ''
	local differentOnWDCat = ''
	local sameOnWDCat = ''
	
	--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:非推奨の典拠管理識別子が指定されている記事|'..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
	else
		itemId = mw.wikibase.getEntityIdForCurrentPage()
	end
	
	--Wikidata fallback if available
	if itemId then
		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
							suppressedIdCat = '[[Category:抑制された典拠管理識別子がある記事|'..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:ウィキデータと異なる典拠管理識別子をパラメータで指定しているページ|'..params[1]..']]'
		end	end	end	end	end
		if iMatches > 0 and iMatches == iParentArgs then
			sameOnWDCat = '[[Category:ウィキデータと同じ典拠管理識別子をパラメータで指定しているページ]]'
		end
	end
	--Configured rows
	local rct = 0
	local sectionOrder = {"全般","国立図書館","美術館と博物館",
						"美術研究組織","人名辞典","科学データベース",
						"その他"}
	local sections = {
		["全般"] = {},
		["国立図書館"] = {},
		["美術館と博物館"] = {},
		["美術研究組織"] = {},
		["人名辞典"] = {},
		["科学データベース"] = {},
		["その他"] = {}
	}
	-- 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
	local worldcatId = parentArgs['worldcatid'] or parentArgs['WORLDCATID']
	if worldcatId and worldcatId ~= '' then --if WORLDCATID present & unsuppressed
		table.insert( sections["全般"], p.createRow( 'WORLDCATID', worldcatId, '[https://www.worldcat.org/identities/'..mw.uri.encode(worldcatId, 'PATH')..' WorldCat]', nil, false ) ) --Validation?
		worldcatCat = p.getCatForId( 'WORLDCATID' )
		rct = rct + 1
	elseif 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["全般"], p.createRow( 'VIAF', viafId, '[https://www.worldcat.org/identities/containsVIAFID/'..viafId..' WorldCat(VIAF経由)]', nil, false ) )
			if namespace == 0 then
				worldcatCat = '[[Category: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["全般"], p.createRow( 'LCCN', lccnId, '[https://www.worldcat.org/identities/lccn-'..lccnIdFmtd..' WorldCat(アメリカ国会図書館経由)]', nil, false ) )
				if namespace == 0 then 
					worldcatCat = '[[Category:WorldCat-LCCN識別子が指定されている記事]]'
				end
			end
			rct = rct + 1
		end
	elseif worldcatId == '' then --if WORLDCATID suppressed
		suppressedIdCat = '[[Category:抑制された典拠管理識別子がある記事|WORLDCATID]]'
	end
	
	local Navbox = require('Module:Navbox')
	local elementsCat = ''
	if rct == 0 or rct >= 25 then
		local eCat = rct..'種類以上の識別子があるページ'
		--elementsCat  = '[[Category:'..eCat..']]'..p.redCatLink(eCat)
		elementsCat  = '' --25種類以上の識別子が指定された場合、追跡カテゴリをつけるという機能は日本語版では導入されていない
	end
	
	local outString = ''
	if rct > 0 then
		local sectionID = 1
		local args = { pid = 'identifiers' } -- #target the list of identifiers
		if testcases and itemId then args = { pid = 'identifiers', qid = itemId } end --expensive
		local pencil = frame:expandTemplate{ title = 'EditAtWikidata', args = args}
		local navboxArgs = {
			name  = 'Normdaten',
			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 navboxArgs.group2 then
			navboxArgs.title = "[[Help:典拠管理|典拠管理]]" .. pencil
		else
			local sect = navboxArgs.group1
			if sect == "全般" or sect == "その他" 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:典拠管理|典拠管理]]" .. pencil
			else
				navboxArgs.group1 = "[[Help:典拠管理|典拠管理:" .. sect .. "]] " .. pencil
			end
		end
		outString = Navbox._navbox(navboxArgs)
	end
	
	local auxCats = worldcatCat .. elementsCat .. multipleIdCat .. suppressedIdCat .. 
					deprecatedIdCat .. differentOnWDCat .. sameOnWDCat
	if testcases then
		auxCats = mw.ustring.gsub(auxCats, '(%[%[)(Category)', '%1:%2') --for easier checking
	end
	outString = outString .. auxCats
	if namespace ~= 0 then
		outString = mw.ustring.gsub(outString, '(%[%[)(Category:[^%]]*記事)', '%1:%2') --by definition
	end
	
	return outString
end

return p