コンテンツにスキップ

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

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

削除された内容 追加された内容
en:Module:Authority control oldid=1030024367 より更新
 
(同じ利用者による、間の31版が非表示)
1行目: 1行目:
require('Module:No globals')
require('strict')

local p = {}
local p = {}
local frame = mw.getCurrentFrame()
local config_file = frame.args.config and frame.args.config~='' and ('/' .. frame.args.config) or ''
local config = mw.loadData('Module:Authority control/config' .. config_file)
local title = mw.title.getCurrentTitle()
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
local namespace = title.namespace
local testcases = (string.sub(title.subpageText,1,9) == 'testcases')
local testcases = title.subpageText == config.i18n.testcases


local wikilink = function(target, label)
--[[==========================================================================]]
return label and '[[' .. target .. '|' .. label .. ']]' or '[[' .. target .. ']]'
--[[ 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
end


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


local addCat = function(cat, sortkey)
function p.createRow( id, rawValues, link, links, withUid, specialCat, prefix )
if cat and cat~='' and (namespace==0 or namespace==14 or testcases) then
local catName = '誤った'..(specialCat or id)..'識別子が指定されている記事'
local redlinkcat = ''
if links then -- all links[] use withUid = false; no check needed
if testcases==false then
local row = ''
local success, exists = pcall(function() return mw.title.new(cat, 14).exists end)
if prefix then
row = row .. '*' .. prefix
if success and not exists then
redlinkcat = needsAttention('N')
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
end
end
return wikilink(config.i18n.category..':'..cat, sortkey and sortkey..title.text) .. redlinkcat
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
else
return ''
return '[[MBA (識別子)|MusicBrainz]] [' .. url .. ' アーティスト]' .. cat
end
end
end
end


function p.mbareaLink( id, label )
local tooltip = function(text, label)
if label and label~='' then
--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)
return frame:expandTemplate{
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
title = 'Tooltip',
return false
args = {text, label}
end
}
local url = 'https://musicbrainz.org/area/'..id
local cat = p.getCatForId( 'MusicBrainz地域' )--special cat name
if label then
return '['..url..' '..label..']'..cat
else
else
return text
return '[[MBAREA (識別子)|MusicBrainz]] [' .. url .. ' 地域]' .. cat
end
end
end
end


local _makelink = function(id, val, additional, qid) --validate values and create a link
function p.mbiLink( id, label )
local link = mw.html.create('span'):addClass('uid')
--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 additional and id.prefix then --show prefix on primary value
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
link:wikitext(id.prefix .. ': ')
return false
end
end
local valid_value = false
local url = 'https://musicbrainz.org/instrument/'..id
if id.customlink then -- use function to validate and generate link
local cat = p.getCatForId( 'MusicBrainz楽器' )--special cat name
local newlink = require(config.auxiliary)[id.customlink](val.id, additional)
if label then
if newlink then
return '['..url..' '..label..']'..cat
link:wikitext(newlink)
valid_value = true
end
else
else
if id.pattern then -- check pattern to determine validity
return '[[MBI (識別子)|MusicBrainz]] [' .. url .. ' 楽器]' .. cat
valid_value = string.match(val.id, '^' .. id.pattern .. '$')
elseif id.patterns then -- check multiple patterns to determine validity
for _, pattern in ipairs(id.patterns) do
valid_value = val.id:match('^' .. pattern .. '$')
if valid_value then break end
end
elseif id.valid then -- use function to determine validity
valid_value = require(config.auxiliary)[id.valid](val.id)
else -- no validation possible
valid_value = val.id
end
if valid_value then
local label = id.label
if not label or additional then
label = tostring(additional)
end
local newlink
if id.link then
valid_value = valid_value:gsub('%%', '%%%%')
newlink = '[' .. mw.ustring.gsub(id.link, '%$1', valid_value) .. ' ' .. label .. ']'
else
newlink = valid_value
end
link:wikitext(tooltip(newlink, val.name))
end
end
end
if valid_value then
end
local cat = id.category and string.format(config.i18n.cat, id.category)

link:wikitext(addCat(cat))
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
else
local wdlink = qid and wikilink(':wikidata:' .. qid .. '#P' .. id.property) or ''
return '[[MBL (識別子)|MusicBrainz]] [' .. url .. ' レーベル]' .. cat
local name = mw.wikibase.getLabel('P' .. id.property) or ''
local tooltip = string.format(
config.i18n.idnotvalid,
name,
val.id
)
local cat = id.category and string.format(
config.i18n.cat,
config.i18n.faulty .. ' ' .. id.category
)
link:wikitext(wikilink('File:' .. config.i18n.warningicon .. '|20px|frameless|link=' .. wdlink, tooltip .. '.'))
:wikitext(addCat(cat))
:wikitext(addCat(config.i18n.allfaultycat, name))
end
end
return link
end
end


local _makelinks = function(id, qid)
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)
--[[ Make links ]]
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
local getquals = function(statement, qualid)
end
if statement.qualifiers and statement.qualifiers['P'..qualid] then
local url = 'https://musicbrainz.org/place/'..id
return mw.wikibase.renderSnak(statement.qualifiers['P'..qualid][1])
local cat = p.getCatForId( 'MusicBrainz場所' )--special cat name
if label then
return '['..url..' '..label..']'..cat
else
return '[[MBP (識別子)|MusicBrainz]] [' .. url .. ' 場所]' .. cat
end
end
end
end
local ids = {}

if qid then
function p.mbrgLink( id, label )
for _, statement in ipairs(mw.wikibase.getBestStatements(qid, 'P'..id.property)) do
--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 statement.mainsnak.datavalue 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
local val = statement.mainsnak.datavalue.value
return false
if val then
end
local namedas = getquals(statement, 1810) or getquals(statement, 742) or ''
local url = 'https://musicbrainz.org/release-group/'..id
table.insert(ids, {id=val, name=namedas})
local cat = p.getCatForId( 'MusicBrainzリリース・グループ' )--special cat name
end end end end
if label then
local links
return '['..url..' '..label..']'..cat
if ids[1] then
else
links = mw.html.create('li'):node(_makelink(id, ids[1], false, qid))
return '[[MBRG (識別子)|MusicBrainz]] [' .. url .. ' リリース・グループ]' .. cat
if ids[2] then
local sublinks = mw.html.create('ul')
for n = 2, #ids do
sublinks:tag('li'):node(_makelink(id, ids[n], n, qid)):done()
end
links:node(sublinks)
end
end
end
end
return links

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
end


p.authorityControl = function(frame)
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)
--[[ Main ]]
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
local resolveQID = function(qid)
end
if qid then
local url = 'https://musicbrainz.org/work/'..id
qid = 'Q' .. mw.ustring.gsub(qid, '^[Qq]', '')
local cat = p.getCatForId( 'MusicBrainz作品' )--special cat name
if mw.wikibase.isValidEntityId(qid) and mw.wikibase.entityExists(qid) then
if label then
local sitelink = mw.wikibase.getSitelink(qid)
return '['..url..' '..label..']'..cat
if sitelink then
else
return mw.wikibase.getEntityIdForTitle(sitelink) or mw.wikibase.getEntity(qid).id
return '[[MBW (識別子)|MusicBrainz]] [' .. url .. ' 作品]' .. cat
end
end
return mw.wikibase.getEntity(qid).id
end end end
local conf = config.config
local parentArgs = frame:getParent().args
local auxCats = ''
local rct = false -- boolean to track if there are any links to be returned
local qid, topic
if namespace==0 then
qid = mw.wikibase.getEntityIdForCurrentPage()
end
end
if qid then -- article is connected to a Wikidata item

if parentArgs.qid and resolveQID(parentArgs.qid)~=qid then -- non-matching qid parameter
function p.mgpLink( id, label )
auxCats = auxCats .. needsAttention('D')
--P549's format regex: \d{1,6} (e.g. 123456)
if not id:match( '^%d%d?%d?%d?%d?%d?$' ) then
return false
end
end
else -- page is not connected to any Wikidata item
return '[https://genealogy.math.ndsu.nodak.edu/id.php?id='..id..' '..(label or 'Mathematics Genealogy Project')..']'..p.getCatForId( 'MGP' )
qid = resolveQID(parentArgs.qid) -- check qid parameter if no wikidata item is connected
end
if qid then -- qid parameter is valid, set topic to display

topic = mw.wikibase.getLabel(qid)
function p.naraLink( id, label )
if topic then
--P1225's format regex: ^([1-9]\d{0,8})$ (e.g. 123456789)
if mw.ustring.lower(title.subpageText)==mw.ustring.lower(topic) then -- suppress topic display if subpagename equals topic up to case change
if not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?$' ) then
topic = nil
return false
end
if topic and mw.wikibase.getSitelink(qid) then -- make wikilink to article
topic = wikilink(mw.wikibase.getSitelink(qid), topic)
end
else
auxCats = auxCats .. needsAttention('L')
end
elseif parentArgs.qid and parentArgs.qid~='' then -- invalid qid has been supplied, add to tracking cat
auxCats = auxCats .. needsAttention('Q')
end
end
return '[https://catalog.archives.gov/id/'..id..' '..(label or '公文書館(アメリカ)')..']'..p.getCatForId( 'NARA' )
end
end
local qids = {} -- setup any additional QIDs

if parentArgs.additional=='auto' and qid then -- check P527 for parts to add additional qids
function p.nclLink( id, label )
local checkparts = function(property)
--P1048's format regex: \d+ (e.g. 1081436)
local parts = mw.wikibase.getBestStatements(qid, property)
if not id:match( '^%d+$' ) then
if parts then
return false
for _, part in ipairs(parts) do
if part.mainsnak.datavalue and part.mainsnak.datavalue.value.id then
local resolvedqid = resolveQID(part.mainsnak.datavalue.value.id)
if resolvedqid then
table.insert(qids,resolvedqid)
end end end end end
for _, part in ipairs(config.auto_additional) do
checkparts('P' .. part)
end
end
elseif parentArgs.additional and parentArgs.additional~='' then
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
for _, v in ipairs(mw.text.split(parentArgs.additional, '%s*,%s*')) do
end
v = resolveQID(v)

if v then
function p.ndlLink( id, label )
if v==qid then -- duplicate of qid parameter
--P349's format regex: 0?\d{8} (e.g. 012345678)
auxCats = auxCats .. needsAttention('R')
if not id:match( '^0?%d%d%d%d%d%d%d%d$' ) then
end
return false
table.insert(qids, v)
else -- invalid QID specified
auxCats = auxCats .. needsAttention('A')
end
end
end
return '[https://id.ndl.go.jp/auth/ndlna/'..id..' '..(label or '日本')..']'..p.getCatForId( 'NDL' )
end
end
local numsections, sections = 0, {}

for _, _ in ipairs(config.sections) do -- count number of regular sections
function p.ngvLink( id, label )
numsections = numsections + 1
--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
end
for _ = 1, #qids+numsections do

table.insert(sections, {})
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
end


-- check which identifiers to show/suppress in template
function p.nlaLink( id, label )
local show, show_all_unsuppressed = {}, true
--P409's format regex: [1-9][0-9]{0,11} (e.g. 123456789012)
local stripP = function(pid) --strip P from property number
if not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?$' ) then
if pid:match('^[Pp]%d+$') then
return false
pid = mw.ustring.gsub(pid, '[Pp]', '')
end
end
if pid:match('^%d+$') then
return '[https://nla.gov.au/anbd.aut-an'..id..' '..(label or 'オーストラリア')..']'..p.getCatForId( 'NLA' )
return tonumber(pid)
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
end
return '[https://data.nlg.gr/resource/authority/record'..id..' '..(label or 'ギリシャ')..']'..p.getCatForId( 'NLG' )
end
end
local addshowlist = function(list)

if list and list~='' then
function p.nliLink( id, label )
for _, v in ipairs(mw.text.split(string.lower(list), '%s*,%s*')) do
--P949's format regex: \d{9} (e.g. 123456789)
local vprop = stripP(v)
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then
if vprop then -- e.g. show=P214 to show one particular property
return false
show[vprop] = true
else -- e.g. show=arts to use whitelist
if config.whitelists[v] then
for _, w in ipairs(config.whitelists[v].properties) do
show[w] = true
end end end end
show_all_unsuppressed = false
end end
addshowlist(frame.args.show) -- check show parameter on wrapper template
addshowlist(parentArgs.show) -- check show parameter on article
addshowlist(parentArgs.country) -- check country parameter on article
if parentArgs.suppress then
local suppresslist = mw.text.split(parentArgs.suppress, '%s*,%s*') -- split parameter by comma
for _, v in ipairs(suppresslist) do
v = stripP(v)
if v then
show[v] = false
auxCats = auxCats .. wikilink(config.i18n.category .. ':' .. config.i18n.suppressedcat)
else
auxCats = auxCats .. needsAttention('P')
end
end
end
return '[http://uli.nli.org.il/F/?func=direct&doc_number='..id..'&local_base=nlx10'..' '..(label or 'イスラエル')..']'..p.getCatForId( 'NLI' )
end
end


local makeSections = function(qid, addit)
function p.nlkLink( id, label )
for _, id in ipairs(conf) do
--P5034's format regex: KA.(19|20).{7} (e.g. KAC201501465)
if id.suppressedbyproperty then
if not id:match( '^KA.19.......$' ) and
for _, property in ipairs(id.suppressedbyproperty) do
not id:match( '^KA.20.......$' ) then
if show[property]=='used' then -- property is in use
return false
show[id.property] = false -- suppressed by another property
end
end end end
return '[https://nl.go.kr/authorities/resource/'..id..' '..(label or '韓国')..']'..p.getCatForId( 'NLK' )
if show[id.property]==nil then
end
show[id.property] = show_all_unsuppressed

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,59} (e.g. Abcd)
local class = "[%a%d_',%.%-%(%)%*/–]"
local regex = "^%u"..string.rep(class, 3)..string.rep(class.."?", 56).."$"
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
if show[id.property] then
local links = _makelinks(id, qid)
if links then
table.insert(
sections[addit or id.section],
links
)
show[id.property] = 'used'
rct = true
end end end end
local pencil = function(qid)
if qid then
return require('Module:EditAtWikidata')._showMessage{
pid = 'identifiers',
qid = qid
}
else
return ''
end
end
return ids
end
end
makeSections(qid, false)

for c = 1, #qids do
-- Creates a human-readable standalone wikitable version of p.conf, and tracking categories with page counts, for use in the documentation
makeSections(qids[c], numsections+c)
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
end


--configure Navbox
--[[==========================================================================]]
local outString = ''
--[[ Configuration ]]
if rct then -- there is at least one link to display
--[[==========================================================================]]
local Navbox = require('Module:Navbox')

local sect, lastsect = 0, 0
-- 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.
local navboxArgs = {

name = 'Authority control',

navboxclass = 'authority-control',
-- Parameter format: { 'parameter name', propertyId # in Wikidata, formatting/validation function, section, example ID for documentation }
bodyclass = 'hlist',
-- Optional named parameters: `link` to override the link in the documentation (defaults to parameter + (identifer)),
state = parentArgs.state or config.i18n.autocollapse,
-- category to override the ID in category names (defaults to parameter),
navbar = 'off'
-- prefix to include a prefix (usually a wikilink explaining what the identifier is) before the external link itself
}
p.conf = {
for c = 1, numsections+#qids do
{ 'AAG', 3372, p.aagLink, "美術館と博物館", "1", link = ":en:AAG (identifier)"},
if #sections[c]>0 then -- section is non-empty
{ 'ACM-DL', 864, p.acmLink, "科学データベース", "12345678901", link="ACM DL (識別子)"},
sect = sect + 1
{ 'ADB', 1907, p.adbLink, "人名辞典", "barton-sir-edmund-toby-71", link = ":en:ADB (identifier)"},
lastsect = c
{ 'AGSA', 6804, p.agsaLink, "美術館と博物館", "3625"},
local sectname
{ 'autores.uy', 2558, p.autoresuyLink, "人名辞典", "12345"},
if c<=numsections then -- regular section
{ 'AWR', 4186, p.awrLink, "人名辞典", "PR00768b", link = ":en:AWR (identifier)"},
sectname = config.sections[c].name
{ 'BIBSYS', 1015, p.bibsysLink, "国立図書館", "1234567890123", link = ":en:BIBSYS (identifier)"},
else -- section from additional qid
{ 'Bildindex', 2092, p.bildLink, "美術研究組織", "1", link = ":en:Bildindex (identifier)"},
local qid = qids[c-numsections]
{ 'BNC', 1890, p.bncLink, "国立図書館", "123456789", link = ":en:BNC (identifier)"},
local label, sitelink = mw.wikibase.getLabel(qid), mw.wikibase.getSitelink(qid)
{ 'BNE', 950, p.bneLink, "国立図書館", "XX1234567"},
if label then
{ 'BNF', 268, p.bnfLink, "国立図書館", "123456789"},
if sitelink then
{ 'Botanist', 428, p.botanistLink , "科学データベース", "L."},
local target = mw.title.new(sitelink)
{ 'BPN', 651, p.bpnLink , "人名辞典", "12345678", link = ":en:BPN (identifier)"},
if target==title or (target.isRedirect and target.redirectTarget==title) then -- do not link
{ 'CANTIC', 1273, p.canticLink, "国立図書館", "a12345678", link = ":en:CANTIC (identifier)"},
sectname = label
{ 'CINII', 271, p.ciniiLink, "科学データベース", "DA12345678", link = "CiNii (識別子)"},
else -- make wikilink to article
{ 'CWGC', 1908, p.cwgcLink, "その他", "1234567"},
sectname = wikilink(sitelink, label)
{ '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
sectname = label
end
end
else
else
auxCats = auxCats .. needsAttention('L')
iParentArgs = iParentArgs + 1
sectname = qid
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
sectname = sectname .. pencil(qid)
end
end
navboxArgs['group' .. c] = sectname
end
local list = mw.html.create('ul')
--assemble
for _, link in ipairs(sections[c]) do
if tval[1] then
list:node(link)
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
navboxArgs['list' .. c] = tostring(list)
end
end
end
end
if topic then -- display in expanded form with topic
navboxArgs.title = config.i18n.aclink .. ' &ndash; ' .. topic .. pencil(qid)
--WorldCat
elseif sect==1 then -- special display when only one section
local worldcatId = parentArgs['worldcatid'] or parentArgs['WORLDCATID']
if lastsect<=numsections then
if worldcatId and worldcatId ~= '' then --if WORLDCATID present & unsuppressed
if config.sections[lastsect].hidelabelwhenalone then -- no special label when only general or other IDs are present
table.insert( sections["全般"], p.createRow( 'WORLDCATID', worldcatId, '[https://www.worldcat.org/identities/'..mw.uri.encode(worldcatId, 'PATH')..' WorldCat]', nil, false ) ) --Validation?
navboxArgs['group' .. lastsect] = config.i18n.aclink .. pencil(qid)
worldcatCat = p.getCatForId( 'WORLDCATID' )
else -- other regular section
rct = rct + 1
navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect] .. pencil(qid)
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
end
else -- section from additional qid
rct = rct + 1
navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect]
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
end
else -- add title to navbox
elseif worldcatId == '' then --if WORLDCATID suppressed
navboxArgs.title = config.i18n.aclink .. pencil(qid)
suppressedIdCat = '[[Category:抑制された典拠管理識別子がある記事|WORLDCATID]]'
end
end
outString = Navbox._navbox(navboxArgs)
end
local Navbox = require('Module:Navbox')

local elementsCat = ''
if parentArgs.state
if rct == 0 or rct >= 25 then
and parentArgs.state~=''
local eCat = rct..'種類以上の識別子があるページ'
and parentArgs.state~=config.i18n.collapsed
--elementsCat = '[[Category:'..eCat..']]'..p.redCatLink(eCat)
and parentArgs.state~=config.i18n.expanded
elementsCat = '' --25種類以上の識別子が指定された場合、追跡カテゴリをつけるという機能は日本語版では導入されていない
and parentArgs.state~=config.i18n.autocollapse then --invalid state parameter
end
auxCats = auxCats .. needsAttention('S')
end
local outString = ''
if rct > 0 then
if testcases then
auxCats = mw.ustring.gsub(auxCats, '(%[%[)(' .. config.i18n.category .. ')', '%1:%2') --for easier checking
local sectionID = 1
end
local args = { pid = 'identifiers' } -- #target the list of identifiers

if testcases and itemId then args = { pid = 'identifiers', qid = itemId } end --expensive
--out
local pencil = frame:expandTemplate{ title = 'EditAtWikidata', args = args}
outString = outString .. auxCats
local navboxArgs = {
if namespace~=0 then
name = 'Normdaten',
-- 日本語版独自の変更あり
navboxclass = 'authority-control',
outString = mw.ustring.gsub(outString,'(%[%[)(' .. config.i18n.category .. ':)([^%|%]]+' .. config.i18n.Articles .. ')%|?[^%|%]]*(%]%])','%1:%2%3%4')
bodyclass = 'hlist',
end
state = parentArgs.state or 'autocollapse',
local check = require('Module:Check for unknown parameters/sandbox')._check
navbar = 'off'
local sortkey
}
if namespace==0 then
for _, sectName in ipairs(sectionOrder) do
sortkey = '*' .. title.text
if #sections[sectName] ~= 0 then
else
navboxArgs["group" .. sectionID] = sectName
sortkey = title.fullText
navboxArgs["list" .. sectionID] = table.concat(sections[sectName])
end
sectionID = sectionID + 1
outString = outString .. check({
end
['unknown'] = wikilink(config.i18n.category .. ':' .. config.i18n.pageswithparams, sortkey),
end
['preview'] = config.i18n.previewwarning, 'show', 'country', 'suppress', 'additional', 'qid', 'state'
if navboxArgs.group2 then
}, parentArgs)
navboxArgs.title = "[[Help:典拠管理|典拠管理]]" .. pencil
return outString
else
end
local sect = navboxArgs.group1

if sect == "全般" or sect == "その他" then
p.makelink = function(id, qid)
-- Just say "Authority control" with no label if only general or only other IDs are present
return _makelinks(id, qid)
-- 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
end



2024年11月16日 (土) 07:44時点における最新版

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

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

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

[編集]
ウィキデータのプロパティ識別子分類表示例
ISNI (P213)国際標準名称識別子全般
Remarks:ISNI is a method for uniquely identifying the public identities of contributors to media content such as books, TV programmes, and newspaper articles. Please take care not to confuse ISNI and ORCID identifiers.
VIAF識別子 (P214)VIAF識別子全般
Remarks:International authority data from the Online Computer Library Center (OCLC)
GND識別子 (P227)GND識別子国立図書館
Remarks:Authority data on people, corporations and subjects from the German National Library (DNB)
アメリカ議会図書館典拠管理識別子 (P244)アメリカ議会図書館リンクデータサービス 国立図書館
Remarks:See Wikipedia:Authority control#LCCN for formatting instructions
ULAN (P245)美術人名ユニオン・リスト 芸術家
Remarks:ULAN is an online database using a controlled vocabulary currently containing around 293,000 names and other information about artists. Names in ULAN may include given names, pseudonyms, variant spellings, names in multiple languages, and names that have changed over time (e.g., married names).
フランス国立図書館識別子 (P268)フランス国立図書館国立図書館
Remarks:Authority data of people listed in the general catalogue of the National Library of France
フランス国立図書館識別子 (P268)フランス国立図書館国立図書館
IdRef識別子 (P269)IdRefその他
Remarks:Authority data of people listed in the general catalogue of the University Documentation System of France. Also available from English-speaking catalog (search author, click one book, click author name, take PPN= value of the URL)
NACSIS-CAT著者名典拠ID (P271)NACSIS-CAT著者名典拠ID学術データベース
Remarks:CiNii is a bibliographic database service for material in Japanese academic libraries. It is maintained by the National Institute of Informatics.
Joconde (P347)ジョコンデ その他
国立国会図書館典拠ID (P349)ウェブ版国立国会図書館典拠国立図書館
Remarks:Authority data listed in the catalog of the national library of Japan. Search also available via VIAF.
RKDimages (P350)RKD絵画データベース その他
メリメ識別子 (P380)フランス登録記念物 地理
イタリア国立図書館サービス著者識別子 (P396)国立図書館
Remarks:Central Institute for the Union Catalogue (ICCU: Istituto Centrale per il Catalogo Unico) is an Italian government agency created to build a single catalog of all the libraries in the nation. It manages National Library Service (Servizio bibliotecario nazionale).
オーストラリア図書館識別子 (P409)オーストラリア国立図書館典拠国立図書館
Remarks:NLA Trove's People and Organisation view allows the discovery of biographical and other contextual information about people and organisations. Search also available via VIAF.
植物学者の短縮名 (P428)International Plant Names Index学術データベース
Remarks:Author citation (botany): standard form (official abbreviation) of a personal name for use in an author citation (only for names of algae, fungi and plants). Links to page at International Plant Names Index (IPNI).
MusicBrainzアーティスト識別子 (P434)MusicBrainzアーティスト識別子 芸術家
Remarks:MusicBrainz is an open music encyclopedia that collects music metadata and makes it available to the public.
MusicBrainz作品ID (P435)その他
MusicBrainzリリース・グループ識別子 (P436)その他
Structurae (P454)Structurae地理
ORCID (P496)ORCID学術データベース
Remarks:Authority data on researchers, academics, etc. The ID range is a subset of the ISNI range. For free text links (for example when mentioning a person on page which is not about them), it is also possible to use {{ORCID}}. Authors—including Wikipedia editors—may obtain an ORCID by signing up at orcid.org/register. Please take care not to confuse ORCID and ISNI identifiers.
Mathematics Genealogy Project ID (P549)学術データベース
Remarks:Mathematics Genealogy Project is a web-based database for the academic genealogy of mathematicians.
RKDartists識別子 (P650)オランダ美術史研究所データベース芸術家
Remarks:RKDartists is an online database using a controlled vocabulary currently containing around 200,000+ names and other information about artists. Names in RKDartists may include given names, pseudonyms, variant spellings, names in multiple languages, and names that have changed over time (e.g., married names).
(P651)オランダ人物典拠管理データベース 人物
Remarks:Dutch project with material for 40,000 digitized biographies, including former colonies of the Netherlands.
チェコ国立図書館識別子 (P691)チェコ国立図書館典拠データベース国立図書館
Remarks:National Library of the Czech Republic (Národní knihovna České republiky) is the central library of the Czech Republic.
JPL小天体データベース SPK-ID (P716)JPL Small-Body Databaseその他
(P781)芸術家
Remarks:SIKART is a biographical dictionary and a database on visual art in Switzerland and Liechtenstein. It is published online by the Swiss Institute for Art Research (SIAR).
ISIL識別子 (P791)図書館及び関連組織のための国際標準識別子人物
Remarks:Libraries, museums and archives, decentralized national databases.
ACM電子図書館著者識別子 (P864)ACM電子図書館学術データベース
BMLO (P865)人物
Lexicon istoric retic識別子 (P886)Lexicon istoric reticその他
Remarks:Lexicon Istoric Retic (LIR) is a two volume version with a selection of articles published in Romansh.
スイス歴史事典識別子 (P902)スイス歴史事典その他
Remarks:Historical Dictionary of Switzerland is an encyclopedia on the history of Switzerland.
ロシア国立図書館 (モスクワ)人物識別子 (P947)ロシア国立図書館国立図書館
Remarks:Russian State Library (Российская государственная библиотека) is the national library of Russia.
スペイン国立図書館識別子 (P950)スペイン国立図書館識別子国立図書館
Remarks:National Library of Spain (BNE: Biblioteca Nacional de España) is a major public library, the largest in Spain.
MusicBrainzレーベルID (P966)その他
MusicBrainz地域ID (P982)地理
ルーマニア国立図書館識別子 (P1003)国立図書館
MusicBrainz 場所 ID (P1004)地理
PTBNP識別子 (P1005)国立図書館
NTA PPN識別子 (P1006)国立図書館
BIBSYS識別子 (P1015)国立図書館
Remarks:BIBSYS is a supplier of library and information systems for all Norwegian university Libraries, the National Library of Norway, college libraries, and a number of research libraries and institutions.
(P1045)国民議会議員 人物
国家図書館識別子 (P1048)国家図書館国立図書館
Remarks:National Central Library is the national library of Taiwan, Republic of China.
ResearcherID (P1053)ResearcherID学術データベース
Remarks:An identifying system for scientific authors. The system was introduced in January 2008 by Thomson Reuters. The combined use of the digital object identifier with the ResearcherID allows for a unique association of authors and scientific articles.
ワールド・アスレティックスID (P1146)ワールド・アスレティックス・データベース人物
Remarks:The IAAF athlete database lists information about sport of athletics competitors.
Scopus著者識別子 (P1153)Scopus学術データベース
Remarks:SciVerse Scopus is a bibliographic database containing abstracts and citations for academic journal articles. It covers nearly 19,500 titles from over 5,000 international publishers, of which 16,500 are peer-reviewed journals in the scientific, technical, medical, and social sciences (including arts and humanities).
アメリカ国会識別子 (P1157)アメリカ国会人物識別子 人物
Remarks:Biographical Directory of the United States Congress is a biographical dictionary of all present and former members of the United States Congress and its predecessor, the Continental Congress. Also included are Delegates from territories and the District of Columbia and Resident Commissioners from the Philippines and Puerto Rico.
欧州議会議員データベースのID (P1186)欧州議会議員人物
アメリカ国立公文書記録管理局識別子 (P1225)国立公文書館識別子その他
Remarks:National Archives and Records Administration (NARA) is an independent agency of the United States government charged with preserving and documenting government and historical records.
(P1248)芸術家
Remarks:KulturNav is a Norwegian cloud-based software service, allowing users to create, manage and distribute name authorities and terminology, focusing on the needs of museums and other cultural heritage institutions. The software is developed by KulturIT ANS and the development project is funded by the Arts Council Norway.
NLAトローヴ人物識別子 (P1315)トローヴ 人物
Terminologia Anatomica 98 (P1323)Terminologia Anatomicaその他
MusicBrainz楽器ID (P1330)その他
(P1362)その他
Remarks:Theaterlexikon der Schweiz (TLS) is an encyclopedia about theatre in Switzerland. It was developed by the Institute of Theatre Studies of the University of Berne.
LNB識別子 (P1368)国立図書館
NSK識別子 (P1375)国立図書館
MusicBrainzシリーズID (P1407)その他
zbMATH著者識別子 (P1556)学術データベース
プレアデスID (P1584)プレアデス 地理
Remarks:Pleiades is a joint project of the Institute for the Study of the Ancient World at New York University and the Ancient World Mapping Center at the University of North Carolina at Chapel Hill.
(P1707)芸術家
(P1736)芸術家
GVP火山番号 (P1886)Global Volcanism Program地理
チリ書誌典拠収集目録識別子 (P1890)国立図書館
オーストラリア人名辞典ID (P1907)オーストラリア人名事典 人物
CWGC人物識別子 (P1908)コモンウェルス戦争墓地委員会データベース人物
Google Scholar著者識別子 (P1960)Google Scholar著者識別子学術データベース
イタリア人名事典識別子 (P1986)イタリア人名事典 人物
ビクトリア国立美術館芸術家ID (P2041)ヴィクトリア国立美術館芸術家
FAST識別子 (P2163)全般
ニューヨーク近代美術館 芸術家ID (P2174)芸術家
オルセー美術館 作者識別子 (P2268)芸術家
シュトゥットガルト科学イラストレーター・データベースID (P2349)芸術家
(P2418)Structurae人物
DBLP著者識別子 (P2456)DBLP学術データベース
NCES 学校ID (P2484)地理
autores.uy ID (P2558)Autores.uy人物
Remarks:autores.uy is an author's database, that focus on Uruguayan authors. It was created and maintained by the Uruguayan chapter of Creative Commons. It also provides access to digitized works of the authors in public domain.
写真家識別目録識別子 (P2750)写真家識別目録芸術家
Remarks:PIC is a photographer's database. It is maintained by the New York Public Library.
ARLHS灯台ID (P2980)ARLHS 灯台 ID 地理
(P3223)地理
(P3233)PhilPapers学術データベース
(P3326)地理
ギリシャ国立図書館識別子 (P3348)ギリシア国立図書館 国立図書館
オークランド美術館芸術家ID (P3372)オークランド美術館芸術家
(P3407)地理
SNAC ARK識別子 (P3430)SNACその他
テ・パパ代理識別子 (P3544)ニュージーランド国立博物館テ・パパ・トンガレワ収蔵物オンラインその他
英国水路部灯台番号 (P3562)英国水路部灯台番号地理
アメリカ国家地理空間情報局灯台識別子 (P3563)アメリカ国家地理空間情報局灯台識別子地理
マリントラフィック灯台識別子 (P3601)マリントラフィック灯台識別子地理
アメリカ沿岸警備隊灯台識別子 (P3723)アメリカ沿岸警備隊灯台識別子地理
(P3788)国立図書館
Publons著者識別子 (P3829)パブロンズ 学術データベース
イタリア海軍ビーコン識別子 (P3863)Fari e Segnalamenti地理
カナダ沿岸警備隊灯台識別子 (P3920)カナダ沿岸警備隊灯台識別子地理
Remarks:Identifier from one of 4 volumes of List of Lights, Buoys and Fog Signals issued by the Canadian Coast Guard.
(P3993)地理
  • アイスランド: 184
(P4038)地理
  • デンマーク: 4500
(P4055)地理
  • ノルウェー: 000100
ADK メンバーID (P4114)ベルリン芸術アカデミー芸術家
(P4143)地理
  • フィンランド: 7243
Australian Women's Register ID (P4186)人物
(P4423)地理
  • ポルトガル: 186
(P4457)歴史的録音の資料台帳 (アメリカ) 芸術家
(P4534)人物
(P4535)地理
シュテーデル美術館 芸術家ID (P4581)シュテーデル美術館芸術家
現代ウクライナ百科事典ID (P4613)現代ウクライナ百科事典 その他
MathSciNet著者識別子 (P4955)学術データベース
韓国国立中央図書館識別子 (P5034)韓国国立中央図書館典拠ファイル国立図書館
(P5226)芸術家
Remarks:Identifier of an artist in the B.R.A.H.M.S. (Base Relationnelle d'Articles Hypertextes sur la Musique du 20e Siècle database), by the IRCAM
(P5288)地理
(P5302)その他
Remarks:Identifier for a musical work in the B.R.A.H.M.S. (Base Relationnelle d'Articles Hypertextes sur la Musique du 20e Siècle database) database, by the IRCAM
(P5321)芸術家
(P5368)カナダ国立美術館芸術家
(P5504)その他
Libris-URI (P5587)LIBRIS 国立図書館
SELIBR識別子 (P906)LIBRIS 国立図書館
Remarks:Authority data from the National Library of Sweden
小惑星センター 天体ID (P5736)小惑星センター・データベース その他
(P5818)植物園自然保護国際機構地理
イギリス議会識別子 (P6213)イギリスの議会人物
Remarks:UK parliament member data
(P6792)芸術家
南オーストラリア美術館芸術家ID (P6804)南オーストラリア美術館芸術家
(P6829)アイルランド人名事典人物
ポーランド国立図書館識別子 (P7293)MAK国立図書館
ポーランド国立図書館識別子(旧) (P1695)ポーランド国立図書館国立図書館
グラミー賞芸術家識別子 (P7303)グラミー賞芸術家識別子芸術家
トルコ宗教財団イスラーム百科事典ID (P7314)トルコ宗教財団イスラーム百科事典 その他
ドイッチェ・ビオグラフィー識別子 (P7902)GND識別子人物
バチカン図書館VcBA識別子 (P8034)opac.vatlib.it国立図書館
Remarks:Vatican Library document data
イスラエル国立図書館J9U識別子 (P8189)イスラエル国立図書館名称・主題典拠ファイル国立図書館
(P8381)エミー賞芸術家
(P8671)その他
Remarks:Deutsche Bahn station code, identifier for train stations and other operating points used by Deutsche Bahn
KANTO ID (P8980)KANTO 国立図書館
ウクライナ・インターネット百科事典識別子 (P9070)IEU (識別子)その他
(P9692)芸術家
Remarks:Identifier for a musician in the Lexikon verfolgter Musiker und Musikerinnen der NS-Zeit
(P9725)地理
Remarks:Identifier for an entry in the castles inventory database EBIDAT
CANTIC識別子 (P9984)カタルーニャ名称・題名典拠ファイル 国立図書館
(P10020)人物
レオポルディーナ会員識別子(新) (P10299)www.leopoldina.org 学術データベース
WorldCat Entities識別子 (P10832)WorldCat Entities 全般
Remarks:WorldCat Entities for persons and works, by OCLC
ベルギー王立図書館 人物ID (P11249)ベルギー王立図書館オンライン・カタログ 国立図書館
CiNii Research ID (P11496)CiNii Research ID学術データベース
ドイッチェ・シンクロンカルテイ 人物ID (P11646)ドイッチェ・シンクロンカルテイ 人物
Remarks:Online database of voice actors in film and television productions
(P12204)その他
Remarks:Identifier for an entry in the Electronic Literature as a Model of Creativity and Innovation in Practice (ELNCIP) Knowledge Base
(P12754)その他
DDB 人物 (GND) ID (P13049)ドイツ電子図書館人物
Remarks:Deutsche Digitale Bibliothek
require('strict')
local p = {}
local frame = mw.getCurrentFrame()
local config_file = frame.args.config and frame.args.config~='' and ('/' .. frame.args.config) or ''
local config = mw.loadData('Module:Authority control/config' .. config_file)
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
local testcases = title.subpageText == config.i18n.testcases

local wikilink = function(target, label)
	return label and '[[' .. target .. '|' .. label .. ']]' or '[[' .. target .. ']]'
end

local needsAttention = function(sortkey)
	return wikilink(config.i18n.category .. ':' .. config.i18n.attentioncat, sortkey .. title.text)
end

local addCat = function(cat, sortkey)
	if cat and cat~='' and (namespace==0 or namespace==14 or testcases) then
		local redlinkcat = ''
		if testcases==false then
			local success, exists = pcall(function() return mw.title.new(cat, 14).exists end)
			if success and not exists then 
				redlinkcat = needsAttention('N')
			end
		end
		return wikilink(config.i18n.category..':'..cat, sortkey and sortkey..title.text) .. redlinkcat
	else
		return ''
	end
end

local tooltip = function(text, label)
	if label and label~='' then
		return frame:expandTemplate{
			title = 'Tooltip',
			args = {text, label}
		}
	else
		return text
	end
end

local _makelink = function(id, val, additional, qid) --validate values and create a link
	local link = mw.html.create('span'):addClass('uid')
	if not additional and id.prefix then --show prefix on primary value
		link:wikitext(id.prefix .. ': ')
	end
	local valid_value = false
	if id.customlink then -- use function to validate and generate link
		local newlink = require(config.auxiliary)[id.customlink](val.id, additional)
		if newlink then
			link:wikitext(newlink)
			valid_value = true
		end
	else
		if id.pattern then -- check pattern to determine validity
			valid_value = string.match(val.id, '^' .. id.pattern .. '$')
		elseif id.patterns then -- check multiple patterns to determine validity
			for _, pattern in ipairs(id.patterns) do
				valid_value = val.id:match('^' .. pattern .. '$')
				if valid_value then break end
			end
		elseif id.valid then -- use function to determine validity
			valid_value = require(config.auxiliary)[id.valid](val.id)
		else -- no validation possible
			valid_value = val.id
		end
		if valid_value then
			local label = id.label
			if not label or additional then
				label = tostring(additional)
			end
			local newlink
			if id.link then
				valid_value = valid_value:gsub('%%', '%%%%')
				newlink = '[' .. mw.ustring.gsub(id.link, '%$1', valid_value) .. ' ' .. label .. ']'
			else
				newlink = valid_value
			end
			link:wikitext(tooltip(newlink, val.name))
		end
	end
	if valid_value then
		local cat =  id.category and string.format(config.i18n.cat, id.category)
		link:wikitext(addCat(cat))
	else
		local wdlink = qid and wikilink(':wikidata:' .. qid .. '#P' .. id.property) or ''
		local name = mw.wikibase.getLabel('P' .. id.property) or ''
		local tooltip = string.format(
			config.i18n.idnotvalid,
			name,
			val.id
		)
		local cat = id.category and string.format(
			config.i18n.cat,
			config.i18n.faulty .. ' ' .. id.category
		)
		link:wikitext(wikilink('File:' .. config.i18n.warningicon .. '|20px|frameless|link=' .. wdlink, tooltip .. '.'))
			:wikitext(addCat(cat))
			:wikitext(addCat(config.i18n.allfaultycat, name))
	end
	return link
end

local _makelinks = function(id, qid)
--[[==================================]]
--[[            Make links            ]]
--[[==================================]]
local getquals = function(statement, qualid)
	if statement.qualifiers and statement.qualifiers['P'..qualid] then
		return mw.wikibase.renderSnak(statement.qualifiers['P'..qualid][1])
	end
end
local ids = {}
if qid then
	for _, statement in ipairs(mw.wikibase.getBestStatements(qid, 'P'..id.property)) do
		if statement.mainsnak.datavalue then
			local val = statement.mainsnak.datavalue.value
			if val then
				local namedas = getquals(statement, 1810) or getquals(statement, 742) or ''
				table.insert(ids, {id=val, name=namedas})
end end end end
local links
if ids[1] then
	links = mw.html.create('li'):node(_makelink(id, ids[1], false, qid))
	if ids[2] then
		local sublinks = mw.html.create('ul')
		for n = 2, #ids do
			sublinks:tag('li'):node(_makelink(id, ids[n], n, qid)):done()
		end
		links:node(sublinks)
	end
end
return links
end

p.authorityControl = function(frame)
--[[==================================]]
--[[               Main               ]]
--[[==================================]]
local resolveQID = function(qid)
	if qid then
		qid = 'Q' .. mw.ustring.gsub(qid, '^[Qq]', '')
		if mw.wikibase.isValidEntityId(qid) and mw.wikibase.entityExists(qid) then
			local sitelink = mw.wikibase.getSitelink(qid)
			if sitelink then
				return mw.wikibase.getEntityIdForTitle(sitelink) or mw.wikibase.getEntity(qid).id
			end
			return mw.wikibase.getEntity(qid).id
end end end
local conf = config.config
local parentArgs = frame:getParent().args
local auxCats = ''
local rct = false -- boolean to track if there are any links to be returned
local qid, topic
if namespace==0 then
	qid = mw.wikibase.getEntityIdForCurrentPage()
end
if qid then -- article is connected to a Wikidata item
	if parentArgs.qid and resolveQID(parentArgs.qid)~=qid then -- non-matching qid parameter
		auxCats = auxCats .. needsAttention('D')
	end
else -- page is not connected to any Wikidata item
	qid = resolveQID(parentArgs.qid) -- check qid parameter if no wikidata item is connected
	if qid then -- qid parameter is valid, set topic to display
		topic = mw.wikibase.getLabel(qid)
		if topic then
			if mw.ustring.lower(title.subpageText)==mw.ustring.lower(topic) then -- suppress topic display if subpagename equals topic up to case change
				topic = nil
			end
			if topic and mw.wikibase.getSitelink(qid) then -- make wikilink to article
				topic = wikilink(mw.wikibase.getSitelink(qid), topic)
			end
		else
			auxCats = auxCats .. needsAttention('L')
		end
	elseif parentArgs.qid and parentArgs.qid~='' then -- invalid qid has been supplied, add to tracking cat
		auxCats = auxCats .. needsAttention('Q')
	end
end
local qids = {} -- setup any additional QIDs
if parentArgs.additional=='auto' and qid then  -- check P527 for parts to add additional qids
	local checkparts = function(property)
		local parts = mw.wikibase.getBestStatements(qid, property)
		if parts then
			for _, part in ipairs(parts) do
				if part.mainsnak.datavalue and part.mainsnak.datavalue.value.id then
					local resolvedqid = resolveQID(part.mainsnak.datavalue.value.id)
					if resolvedqid then
						table.insert(qids,resolvedqid)
	end end end end end
	for _, part in ipairs(config.auto_additional) do
		checkparts('P' .. part)
	end
elseif parentArgs.additional and parentArgs.additional~='' then
	for _, v in ipairs(mw.text.split(parentArgs.additional, '%s*,%s*')) do
		v = resolveQID(v)
		if v then
			if v==qid then -- duplicate of qid parameter
				auxCats = auxCats .. needsAttention('R')
			end
			table.insert(qids, v)
		else -- invalid QID specified
			auxCats = auxCats .. needsAttention('A')
		end
	end
end
local numsections, sections = 0, {}
for _, _ in ipairs(config.sections) do -- count number of regular sections
	numsections = numsections + 1
end
for _ = 1, #qids+numsections do
	table.insert(sections, {})
end

-- check which identifiers to show/suppress in template
local show, show_all_unsuppressed = {}, true
local stripP = function(pid) --strip P from property number
	if pid:match('^[Pp]%d+$') then
		pid = mw.ustring.gsub(pid, '[Pp]', '')
	end
	if pid:match('^%d+$') then
		return tonumber(pid)
	end
end
local addshowlist = function(list)
	if list and list~='' then
		for _, v in ipairs(mw.text.split(string.lower(list), '%s*,%s*')) do
			local vprop = stripP(v)
			if vprop then -- e.g. show=P214 to show one particular property
				show[vprop] = true
			else -- e.g. show=arts to use whitelist
				if config.whitelists[v] then
					for _, w in ipairs(config.whitelists[v].properties) do
						show[w] = true
		end end end end
		show_all_unsuppressed = false
end end
addshowlist(frame.args.show) -- check show parameter on wrapper template
addshowlist(parentArgs.show) -- check show parameter on article
addshowlist(parentArgs.country) -- check country parameter on article
if parentArgs.suppress then
	local suppresslist = mw.text.split(parentArgs.suppress, '%s*,%s*') -- split parameter by comma
	for _, v in ipairs(suppresslist) do
		v = stripP(v)
		if v then
			show[v] = false
			auxCats = auxCats .. wikilink(config.i18n.category .. ':' .. config.i18n.suppressedcat)
		else
			auxCats = auxCats .. needsAttention('P')
		end
	end
end

local makeSections = function(qid, addit)
	for _, id in ipairs(conf) do
		if id.suppressedbyproperty then
			for _, property in ipairs(id.suppressedbyproperty) do
				if show[property]=='used' then -- property is in use
					show[id.property] = false -- suppressed by another property
		end end end
		if show[id.property]==nil then
			show[id.property] = show_all_unsuppressed
		end
		if show[id.property] then
			local links = _makelinks(id, qid)
			if links then
				table.insert(
					sections[addit or id.section],
					links
				)
				show[id.property] = 'used'
				rct = true
end end end end
local pencil = function(qid)
	if qid then
		return require('Module:EditAtWikidata')._showMessage{
			pid = 'identifiers',
			qid = qid
		}
	else
		return ''
	end
end
makeSections(qid, false)
for c = 1, #qids do
	makeSections(qids[c], numsections+c)
end

--configure Navbox
local outString = ''
if rct then -- there is at least one link to display
	local Navbox = require('Module:Navbox')
	local sect, lastsect = 0, 0
	local navboxArgs = {
		name  = 'Authority control',
		navboxclass = 'authority-control',
		bodyclass = 'hlist',
		state = parentArgs.state or config.i18n.autocollapse,
		navbar = 'off'
	}
	for c = 1, numsections+#qids do
		if #sections[c]>0 then -- section is non-empty
			sect = sect + 1
			lastsect = c
			local sectname
			if c<=numsections then -- regular section
				sectname = config.sections[c].name
			else -- section from additional qid
				local qid = qids[c-numsections]
				local label, sitelink = mw.wikibase.getLabel(qid), mw.wikibase.getSitelink(qid)
				if label then
					if sitelink then
						local target = mw.title.new(sitelink)
						if target==title or (target.isRedirect and target.redirectTarget==title) then -- do not link
							sectname = label
						else -- make wikilink to article
							sectname = wikilink(sitelink, label)
						end
					else
						sectname = label
					end
				else
					auxCats = auxCats .. needsAttention('L')
					sectname = qid
				end
				sectname = sectname .. pencil(qid)
			end
			navboxArgs['group' .. c] = sectname
			local list = mw.html.create('ul')
			for _, link in ipairs(sections[c]) do
				list:node(link)
			end
			navboxArgs['list' .. c] = tostring(list)
		end
	end
	if topic then -- display in expanded form with topic
		navboxArgs.title = config.i18n.aclink .. ' &ndash; ' .. topic .. pencil(qid)
	elseif sect==1 then -- special display when only one section
		if lastsect<=numsections then
			if config.sections[lastsect].hidelabelwhenalone then -- no special label when only general or other IDs are present
				navboxArgs['group' .. lastsect] = config.i18n.aclink .. pencil(qid)
			else -- other regular section
				navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect] .. pencil(qid)
			end
		else -- section from additional qid
			navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect]
		end
	else -- add title to navbox
		navboxArgs.title = config.i18n.aclink .. pencil(qid)
	end
	outString = Navbox._navbox(navboxArgs)
end

if parentArgs.state
	and parentArgs.state~=''
	and parentArgs.state~=config.i18n.collapsed
	and parentArgs.state~=config.i18n.expanded
	and parentArgs.state~=config.i18n.autocollapse then --invalid state parameter
	auxCats = auxCats .. needsAttention('S')
end
if testcases then
	auxCats = mw.ustring.gsub(auxCats, '(%[%[)(' .. config.i18n.category .. ')', '%1:%2') --for easier checking
end

--out
outString = outString .. auxCats
if namespace~=0 then
	-- 日本語版独自の変更あり
	outString = mw.ustring.gsub(outString,'(%[%[)(' .. config.i18n.category .. ':)([^%|%]]+' .. config.i18n.Articles .. ')%|?[^%|%]]*(%]%])','%1:%2%3%4')
end
local check = require('Module:Check for unknown parameters/sandbox')._check
local sortkey
if namespace==0 then
	sortkey = '*' .. title.text
else
	sortkey = title.fullText
end
outString = outString .. check({
	['unknown'] = wikilink(config.i18n.category .. ':' .. config.i18n.pageswithparams, sortkey),
	['preview'] = config.i18n.previewwarning, 'show', 'country', 'suppress', 'additional', 'qid', 'state'
	}, parentArgs)
return outString
end

p.makelink = function(id, qid)
	return _makelinks(id, qid)
end

return p