모듈:Authority control 편집하기

귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
1번째 줄: 1번째 줄:
require('Module:No globals')
require('Module:No globals')


local p = {}
local function getCatForId( id )
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,3) == '시험장')
    if namespace == 0 then
 
        return '[[분류:' .. id .. ' 식별자를 포함한 위키백과 문서]]'
--[[==========================================================================]]
    elseif namespace == 2 and not title.isSubpage then
--[[                            Category functions                            ]]
        return '[[분류:' .. id .. ' 식별자를 포함한 사용자 문서]]'
--[[==========================================================================]]
    else
 
        return '[[분류:' .. id .. ' 식별자를 포함한 기타 문서]]'
function p.getCatForId( id )
    end
local catName = ''
if namespace == 0 then
catName = id..' 식별자를 포함한 위키백과 문서'
elseif namespace == 2 and not title.isSubpage then
catName = id..' 식별자를 포함한 사용자 문서'
else
catName = id..' 식별자를 포함한 기타 문서'
end
return '[[분류:'..catName..']]'..p.redCatLink(catName)
end
end


function p.redCatLink( catName ) --catName == 'Blah', not 'Category:Blah', not '[[Category:Blah]]'
local function viafLink( id )
if catName and catName ~= '' and
    if not string.match( id, '^%d+$' ) then
  testcases == false and
        return false
  mw.title.new(catName, 14).exists == false
    end
then
    return '[https://viaf.org/viaf/' .. id .. ' ' .. id .. ']' .. getCatForId( 'VIAF' )
return '[[분류:깨진 전거 통제 분류를 포함한 문서]]'
end
return ''
end
end


--[[==========================================================================]]
local function kulturnavLink( id )
--[[                      Property formatting functions                      ]]
    return '[http://kulturnav.org/language/en/' .. id .. ' id]'  
--[[==========================================================================]]
 
function p.aagLink( id )
--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..'/ '..id..']'..p.getCatForId( 'AAG' )
end
end


function p.acmLink( id )
local function sikartLink( id )
--P864's format regex: \d{11} (e.g. 12345678901)
    return '[http://www.sikart.ch/KuenstlerInnen.aspx?id=' .. id .. '&lng=en ' .. id .. ']'  
if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d$' ) then
return false
end
return '[https://dl.acm.org/author_page.cfm?id='..id..' '..id..']'..p.getCatForId( 'ACM-DL' )
end
end


function p.adbLink( id )
local function tlsLink( id )
--P1907's format regex: [a-z][-a-z]+-([1-2]\d|[1-9])\d{0,3} (e.g. barton-sir-edmund-toby-71)
local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)
if not id:match( '^[a-z][-a-z]+-[1-2]%d%d?%d?%d?$' ) and
    return '[http://tls.theaterwissenschaft.ch/wiki/' .. id2 .. ' ' .. id .. ']'  
  not id:match( '^[a-z][-a-z]+-[1-9]%d?%d?%d?$' ) then
return false
end
return '[http://adb.anu.edu.au/biography/'..id..' '..id..']'..p.getCatForId( 'ADB' )
end
end


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


function p.autoresuyLink( id )
local function ciniiLink( id )
--P2558's format regex: [1-9]\d{0,4} (e.g. 12345)
    return '[http://ci.nii.ac.jp/author/' .. id .. '?l=en ' .. id .. ']'  
if not id:match( '^[1-9]%d?%d?%d?%d?$' ) then
return false
end
return '[https://autores.uy/autor/'..id..' '..id..']'..p.getCatForId( 'autores.uy' )
end
end


function p.awrLink( id )
local function bneLink( id )
--P4186's format regex: (([A-Z]{3}\d{4})|([A-Z]{2}\d{5}))[a-z] (e.g. PR00768b)
    return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id=' .. id .. ' ' .. id .. ']'  
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 '..id..']'..p.getCatForId( 'AWR' )
end
end


function p.balatLink( id )
--P3293's format regex: \d+ (e.g. 1)
if not id:match( '^%d+$' ) then
return false
end
return '[http://balat.kikirpa.be/object/104257'..id..' '..id..']'..p.getCatForId( 'BALaT' ) --no https as of 9/2019
end


function p.bibsysLink( id )
local function uscongressLink( id )
--P1015's format regex: [1-9]\d* or [1-9](\d{0,8}|\d{12}) (e.g. 1234567890123)
    return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index=' .. id .. ' ' .. id .. ']'  
--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..' '..id..']'..p.getCatForId( 'BIBSYS' )
end
end


function p.bildLink( id )
local function narapersonLink( id )
--P2092's format regex: \d+ (e.g. 1)
    return '[http://research.archives.gov/person/' .. id .. ' ' .. id .. ']'  
if not id:match( '^%d+$' ) then
return false
end
return '[https://www.bildindex.de/document/obj'..id..' '..id..']'..p.getCatForId( 'Bildindex' )
end
end


function p.bncLink( id )
local function naraorganizationLink( id )
--P1890's format regex: \d{9} (e.g. 123456789)
    return '[http://research.archives.gov/organization/' .. id .. ' ' .. id .. ']'  
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..' '..id..']'..p.getCatForId( 'BNC' )
end
end


function p.bneLink( id )
local function botanistLink( id )
--P950's format regex: (XX|FF|a)\d{4,7}|(bima|bimo|bica|bis[eo]|bivi|Mise|Mimo|Mima)\d{10} (e.g. XX1234567)
local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
if not id:match( '^[XF][XF]%d%d%d%d%d?%d?%d?$' ) and
    return '[http://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation=' .. id2 .. ' ' .. id .. ']'  
  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..' '..id..']'..p.getCatForId( 'BNE' ) --no https as of 9/2019
end
end


function p.bnfLink( id )
local function mgpLink( id )
--P268's format regex: \d{8}[0-9bcdfghjkmnpqrstvwxz] (e.g. 123456789)
    -- TODO Implement some sanity checking regex
if not id:match( '^c?b?%d%d%d%d%d%d%d%d[0-9bcdfghjkmnpqrstvwxz]$' ) then
    return '[http://www.genealogy.ams.org/id.php?id=' .. id .. ' ' .. id .. ']'  
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..' '..id..'] [https://data.bnf.fr/ark:/12148/'..id..' (data)]'..p.getCatForId( 'BNF' )
end
end


function p.botanistLink( id )
local function rslLink( id )
--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.)
    -- TODO Implement some sanity checking regex
--not easily/meaningfully implementable in Lua's regex since "(this)?" is not allowed...
    return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request=' .. id .. '&CON_LNG=ENG ' .. id .. ']'
if not mw.ustring.match( id, "^[%u%l%d%. '-]+$" ) then --better than nothing
return false
end
local id2 = id:gsub(' +', '%%20')
return '[https://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation='..id2..' '..id..']'..p.getCatForId( 'Botanist' )
end
end


function p.bpnLink( id )
local function leonoreLink( id )
--P651's format regex: \d{6,8} (e.g. 00123456)
-- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires)
if not id:match( '^%d%d%d%d%d%d%d%d$' ) and --original format regex, changed 8/2019 to
-- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres)
  not id:match( '^0?%d%d%d%d%d%d%d$' ) and --allow 1-2 leading 0s, allowed by the website
-- Identifiants allant de 19800035/1/1 à 19800035/385/51670 (légionnaires décédés entre 1954 et 1977, et quelques dossiers de légionnaires décédés avant 1954)
  not id:match( '^0?0?%d%d%d%d%d%d$' ) then
    if not string.match( id, '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
return false
      not string.match( id, '^C/0/%d%d?$' ) and
end
  not string.match( id, '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) then
return '[http://www.biografischportaal.nl/en/persoon/'..id..' '..id..']'..p.getCatForId( 'BPN' ) --no https as of 9/2019
        return false
    end
    return '[//www.culture.gouv.fr/public/mistral/leonore_fr?ACTION=CHERCHER&FIELD_1=COTE&VALUE_1=' .. id .. ' ' .. id .. ']'  
end
end


function p.canticLink( id )
local function sbnLink( id )
--P1273's format regex: a\d{7}[0-9x] (e.g. a10640745)
    if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then
if not id:match( '^a%d%d%d%d%d%d%d[%dx]$' ) then
        return false
return false
    end
end
    return '[http://opac.sbn.it/opacsbn/opac/iccu/scheda_authority.jsp?bid=' .. id .. ' ' .. id .. ']'
return '[http://cantic.bnc.cat/registres/CUCId/'..id..' '..id..']'..p.getCatForId( 'CANTIC' ) --no https as of 10/2019
end
end


function p.ciniiLink( id )
local function nkcLink( id )
--P271's format regex: DA\d{7}[\dX] (e.g. DA12345678)
return '[http://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica=' .. id .. '&CON_LNG=ENG ' .. id .. ']'  
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 '..id..']'..p.getCatForId( 'CINII' )
end
end


function p.daaoLink( id )
local function nclLink( id )
--P1707's format regex: [a-z\-]+\d* (e.g. rolf-harris)
    if not string.match( id, '^%d+$' ) then
if not id:match( '^[a-z%-]+%d*$' ) then
        return false
return false
    end
end
    return '[http://aleweb.ncl.edu.tw/F/?func=accref&acc_sequence=' .. id .. '&CON_LNG=ENG ' .. id .. ']'  
return '[https://www.daao.org.au/bio/'..id..' '..id..']'..p.getCatForId( 'DAAO' )
end
end


function p.dblpLink( id )
local function ndlLink( id )
--P2456's format regex: \d{2,3} /\d+(-\d+)?|[a-z] /[a-zA-Z][0-9A-Za-z]*(-\d+)? (e.g. 123/123)
return '[http://id.ndl.go.jp/auth/ndlna/' .. id .. ' ' .. id .. ']'  
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..' '..id..']'..p.getCatForId( 'DBLP' )
end
end


function p.dsiLink( id )
local function sudocLink( id )
--P2349's format regex: [1-9]\d* (e.g. 1538)
    if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
if not id:match( '^[1-9]%d*$' ) then
        return false
return false
    end
end
    return '[http://www.idref.fr/' .. id .. ' ' .. id .. ']'  
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' )
end
end


function p.fnzaLink( id )
local function hlsLink( id )
--P6792's format regex: [1-9]\d* (e.g. 9785)
    if not string.match( id, '^%d+$' ) then
if not id:match( '^[1-9]%d*$' ) then
        return false
return false
    end
end
    return '[http://www.hls-dhs-dss.ch/textes/f/F' .. id .. '.php ' .. id .. ']'
return '[https://findnzartists.org.nz/artist/'..id..'/ '..id..']'..p.getCatForId( 'FNZA' )
end
end


function p.gndLink( id )                
local function lirLink( id )
--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 string.match( id, '^%d+$' ) then
if not id:match( '^1[012]?%d%d%d%d%d%d%d[0-9X]$' ) and
        return false
  not id:match( '^[47]%d%d%d%d%d%d%-%d$' ) and
    end
  not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%-[0-9X]$' ) and
    return '[http://www.e-lir.ch/e-LIR___Lexicon.' .. id .. '.450.0.html ' .. id .. ']'
  not id:match( '^3%d%d%d%d%d%d%d[0-9X]$' ) then
return false
end
return '[https://d-nb.info/gnd/'..id..' '..id..']'..p.getCatForId( 'GND' )
end
end


function p.hdsLink( id )
local function splitLccn( id )
--P902's format regex: \d{6} (e.g. 050123)
    if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then
if not id:match( '^%d%d%d%d%d%d$' ) then
        id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' )
return false
    end
end
    if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then
return '[https://hls-dhs-dss.ch/fr/articles/'..id..' '..id..']'..p.getCatForId( 'HDS' )
        return mw.text.split( id, '/' )
end
    end
 
    return false
function p.iaafLink( id )
--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..' '..id..']'..p.getCatForId( 'IAAF' )
end
end


function p.iciaLink( id )
local function append(str, c, length)
--P1736's format regex: \d+ (e.g. 1)
    while str:len() < length do
if not id:match( '^%d+$' ) then
        str = c .. str
return false
    end
end
    return str
return '[https://www.imj.org.il/artcenter/newsite/en/?artist='..id..' '..id..']'..p.getCatForId( 'ICIA' )
end
end


function p.isniLink( id )
local function lccnLink( id )
id = p.validateIsni( id ) --e.g. 0000-0000-6653-4145
    local parts = splitLccn( id )
if not id then
    if not parts then
return false
        return false
end
    end
return '[http://isni.org/isni/'..id..' '..id:sub( 1, 4 )..' '..id:sub( 5, 8 )..' '..id:sub( 9, 12 )..' '..id:sub( 13, 16 )..']'..p.getCatForId( 'ISNI' ) --no https as of 9/2019
    local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
    id = parts[1] .. parts[2] .. append( parts[3], '0', 6 )
    return '[http://id.loc.gov/authorities/' .. lccnType .. '/' .. id .. ' ' .. id .. ']' .. getCatForId( 'LCCN' )
end
end


function p.jocondeLink( id )
local function mbLink( id )
--P347's format regex: [\-0-9A-Za-z]{11} (e.g. 12345678901)
    -- TODO Implement some sanity checking regex
local regex = '^'..string.rep('[%-0-9A-Za-z]', 11)..'$'
    return '[//musicbrainz.org/artist/' .. id .. ' ' .. id .. ']' .. getCatForId( 'MusicBrainz' )
if not id:match( regex ) then
return false
end
return '[https://www.pop.culture.gouv.fr/notice/joconde/'..id..' '..id..']'..p.getCatForId( 'Joconde' )
end
end


function p.kulturnavLink( id )
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits
--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)
local function getIsniCheckDigit( isni )
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 total = 0
return false
    for i = 1, 15 do
end
        local digit = isni:byte( i ) - 48 --Get integer value
return '[http://kulturnav.org/'..id..' '..id..']'..p.getCatForId( 'KULTURNAV' ) --no https as of 9/2019
        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
end


function p.lccnLink( id )
--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid
local parts = p.splitLccn( id ) --e.g. n78039510
--See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier
if not parts then
local function validateIsni( id )
return false
    id = id:gsub( '[ %-]', '' ):upper()
end
    if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then
local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
        return false
id = parts[1] .. parts[2] .. p.append( parts[3], '0', 6 )
    end
return '[https://id.loc.gov/authorities/'..lccnType..'/'..id..' '..id..']'..p.getCatForId( 'LCCN' )
    if getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then
end
        return false
 
    end
function p.lirLink( id )
    return id
--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 '..id..']'..p.getCatForId( 'LIR' ) --no https as of 9/2019
end
 
function p.lnbLink( id )
--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 '..id..']'..p.getCatForId( 'LNB' )
end
 
function p.leonoreLink( id )
--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..' '..id..']'..p.getCatForId( 'Léonore' ) --no https as of 9/2019
end
 
function p.mbaLink( id )
--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
return '[https://musicbrainz.org/artist/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz' ) --special category name
end
 
function p.mbareaLink( id )
--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
return '[https://musicbrainz.org/area/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz area' ) --special category name
end
 
function p.mbiLink( id )
--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
return '[https://musicbrainz.org/instrument/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz instrument' ) --special category name
end
 
function p.mblLink( id )
--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
return '[https://musicbrainz.org/label/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz label' ) --special category name
end
 
function p.mbpLink( id )
--P1004's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)
if not 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 '[https://musicbrainz.org/place/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz place' ) --special category name
end
 
function p.mbrgLink( id )
--P436's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)
if not 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 '[https://musicbrainz.org/release-group/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz release group' ) --special category name
end
 
function p.mbsLink( id )
--P1407's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)
if not 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 '[https://musicbrainz.org/series/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz series' ) --special category name
end
 
function p.mbwLink( id )
--P435's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)
if not 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 '[https://musicbrainz.org/work/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz work' ) --special category name
end
 
function p.mgpLink( id )
--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..' '..id..']'..p.getCatForId( 'MGP' )
end
 
function p.naraLink( id )
--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..' '..id..']'..p.getCatForId( 'NARA' )
end
 
function p.nclLink( id )
--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 '..id..']'..p.getCatForId( 'NCL' ) --no https as of 9/2019
end
 
function p.ndlLink( id )
--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..' '..id..']'..p.getCatForId( 'NDL' )
end
 
function p.ngvLink( id )
--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..'/ '..id..']'..p.getCatForId( 'NGV' )
end
 
function p.nkcLink( id )
--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 '..id..']'..p.getCatForId( 'NKC' )
end
 
function p.nlaLink( id )
--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..' '..id..']'..p.getCatForId( 'NLA' )
end
 
function p.nlgLink( id )
--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..' '..id..']'..p.getCatForId( 'NLG' )
end
 
function p.nliLink( id )
--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'..' '..id..']'..p.getCatForId( 'NLI' )
end
 
function p.nlkLink( id )
--P5034's format regex: KA.(19|20).{7} (e.g. KAC201501465)
if not id:match( '^KA.19.......$' ) and
  not id:match( '^KA.20.......$' ) then
return false
end
return '[https://nl.go.kr/authorities/resource/'..id..' '..id..']'..p.getCatForId( 'NLK' )
end
 
function p.nlpLink( id )
--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..' '..id..']'..p.getCatForId( 'NLP' )
end
 
function p.nlrLink( id )
--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://alephnew.bibnat.ro:8991/F?func=find-b&request='..id..'&find_code=SYS&adjacent=Y&local_base=NLR10 '..id..']'..p.getCatForId( 'NLR' )
end
 
function p.nskLink( id )
--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 '..id..']'..p.getCatForId( 'NSK' ) --no https as of 9/2019
end
 
function p.ntaLink( id )
--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..' '..id..']'..p.getCatForId( 'NTA' )
end
 
function p.orcidLink( id )
id = p.validateIsni( id ) --e.g. 0000-0002-7398-5483
if not id then
return false
end
id = id:sub( 1, 4 )..'-'..id:sub( 5, 8 )..'-'..id:sub( 9, 12 )..'-'..id:sub( 13, 16 )
return '[https://orcid.org/'..id..' '..id..']'..p.getCatForId( 'ORCID' )
end
 
function p.picLink( id )
--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..' '..id..']'..p.getCatForId( 'PIC' )
end
 
function p.ridLink( id )
--P1053's format regex: [A-Z]-\d{4}-(19|20)\d\d (e.g. A-1234-1934)
if not id:match( '^[A-Z]%-%d%d%d%d%-19%d%d$' ) and
  not id:match( '^[A-Z]%-%d%d%d%d%-20%d%d$' ) then
return false
end
return '[https://www.researcherid.com/rid/'..id..' '..id..']'..p.getCatForId( 'RID' )
end
 
function p.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
 
function p.rkdartistsLink( id )
--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..' '..id..']'..p.getCatForId( 'RKDartists' )
end
end


function p.rkdidLink( id )
local function isniLink( id )
--P350's format regex: [1-9]\d{0,5} (e.g. 123456)
    id = validateIsni( id )
if not id:match( '^[1-9]%d?%d?%d?%d?%d?$' ) then
    if not id then
return false
        return false
end
    end
return '[https://rkd.nl/nl/explore/images/'..id..' '..id..']'..p.getCatForId( 'RKDID' )
    return '[http://isni-url.oclc.nl/isni/' .. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' '  .. id:sub( 9, 12 ) .. ' '  .. id:sub( 13, 16 ) .. ']' .. getCatForId( 'ISNI' )
end
end


function p.rslLink( id )
local function orcidLink( id )
--P947's format regex: \d{1,9} (e.g. 123456789)
    id = validateIsni( id )
if not id:match( '^%d%d?%d?%d?%d?%d?%d?%d?%d?$' ) then
    if not id 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
    id = id:sub( 1, 4 ) .. '-' .. id:sub( 5, 8 ) .. '-' .. id:sub( 9, 12 ) .. '-' .. id:sub( 13, 16 )
end
    return '[http://orcid.org/' .. id .. ' ' .. id .. ']' .. getCatForId( 'ORCID' )
 
function p.sbnLink( id )
--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..' '..id..']'..p.getCatForId( 'SBN' )
end
 
function p.selibrLink( id )
--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..' '..id..']'..p.getCatForId( 'SELIBR' )
end
 
function p.sikartLink( id )
--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 '..id..']'..p.getCatForId( 'SIKART' ) --no https as of 9/2019
end
 
function p.snacLink( id )
--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..' '..id..']'..p.getCatForId( 'SNAC-ID' )
end
 
function p.sudocLink( id )
--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..' '..id..']'..p.getCatForId( 'SUDOC' )
end
 
function p.s2authoridLink( id )
--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..' '..id..']'..p.getCatForId( 'Semantic Scholar author' ) --special category name
end
 
function p.ta98Link( id )
--P1323's format regex: A\d{2}\.\d\.\d{2}\.\d{3}[FM]? (e.g. A12.3.45.678)
if not 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..' '..id..']'..p.getCatForId( 'TA98' )
end
 
function p.tdviaLink( id )
--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..' '..id..']'..p.getCatForId( 'TDVİA' )
end
 
function p.teLink( id )
--P1693's format regex: E[1-8]\.\d{1,2}\.\d{1,2}\.\d{1,2}\.\d{1}\.\d{1}\.\d{1,3} (e.g. E1.23.45.67.8.9.0)
local e1, e2 = id:match( '^E([1-8])%.(%d%d?)%.%d%d?%.%d%d?%.%d%.%d%.%d%d?%d?$' )
if not e1 then
return false
end
local TEnum = 'TEe0'..e1 --no formatter URL in WD, probably due to this complexity
if e1 == '5' or e1 == '7' then
if #e2 == 1 then e2 = '0'..e2 end
TEnum = TEnum..e2
end
return '[http://www.unifr.ch/ifaa/Public/EntryPage/ViewTE/'..TEnum..'.html '..id..']'..p.getCatForId( 'TE' )
end
 
function p.tepapaLink( id )
--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..' '..id..']'..p.getCatForId( 'TePapa' )
end
end


function p.thLink( id )
local function gndLink( id )
--P1694's format regex: H\d\.\d{2}\.\d{2}\.\d\.\d{5} (e.g. H1.23.45.6.78901)
    return '[http://d-nb.info/gnd/' .. id .. ' ' .. id .. ']' .. getCatForId( 'GND' )
local h1, h2 = id:match( '^H(%d)%.(%d%d)%.%d%d%.%d%.%d%d%d%d%d$' )
if not h1 then
return false
end
local THnum = 'THh'..h1..h2 --no formatter URL in WD, probably due to this complexity
return '[http://www.unifr.ch/ifaa/Public/EntryPage/ViewTH/'..THnum..'.html '..id..']'..p.getCatForId( 'TH' )
end
end


function p.tlsLink( id )
local function selibrLink( id )
local id2 = id:gsub(' +', '_')
if not string.match( id, '^%d+$' ) then
--P1362's format regex: \p{Lu}[\p{L}\d_',\.\-\(\)\*/–]{3,59} (e.g. Abcd)
        return false
local class = "[%a%d_',%.%-%(%)%*/–]"
    end
local regex = "^%u"..string.rep(class, 3)..string.rep(class.."?", 56).."$"
    return '[//libris.kb.se/auth/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SELIBR' )
if not mw.ustring.match( id2, regex ) then
return false
end
return '[http://tls.theaterwissenschaft.ch/wiki/'..id2..' '..id..']'..p.getCatForId( 'TLS' ) --no https as of 9/2019
end
end


function p.troveLink( id )
local function bnfLink( id )
--P1315's format regex: [1-9]\d{5,7} (e.g. 12345678)
    --Add cb prefix if it has been removed
if not id:match( '^[1-9]%d%d%d%d%d%d?%d?$' ) then
    if not string.match( id, '^cb.+$' ) then
return false
        id = 'cb' .. id
end
    end
return '[https://trove.nla.gov.au/people/'..id..' '..id..']'..p.getCatForId( 'Trove' )
end


function p.ulanLink( id )
    return '[http://catalogue.bnf.fr/ark:/12148/' .. id .. ' ' .. id .. '] [http://data.bnf.fr/ark:/12148/' .. id .. ' (데이터)]' .. getCatForId( 'BNF' )
--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..' '..id..']'..p.getCatForId( 'ULAN' )
end
end


function p.uscongressLink( id )
local function bpnLink( id )
--P1157's format regex: [A-Z]00[01]\d{3} (e.g. A000123)
    if not string.match( id, '^%d+$' ) then
if not id:match( '^[A-Z]00[01]%d%d%d$' ) then
        return false
return false
    end
end
    return '[http://www.biografischportaal.nl/en/persoon/' .. id .. ' ' .. id .. ']' .. getCatForId( 'BPN' )
return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index='..id..' '..id..']'..p.getCatForId( 'USCongress' ) --no https as of 9/2019
end
end


function p.viafLink( id )
local function ridLink( id )
--P214's format regex: [1-9]\d(\d{0,7}|\d{17,20}) (e.g. 123456789, 1234567890123456789012)
    return '[http://www.researcherid.com/rid/' .. id .. ' ' .. id .. ']' .. getCatForId( 'RID' )
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
return '[https://viaf.org/viaf/'..id..' '..id..']'..p.getCatForId( 'VIAF' )
end
end


--[[=========================== Helper functions =============================]]
local function bibsysLink( id )
 
    return '[http://ask.bibsys.no/ask/action/result?cmd=&kilde=biblio&cql=bs.autid+%3D+' .. id .. '&feltselect=bs.autid ' .. id .. ']' .. getCatForId( 'BIBSYS' )
function p.append(str, c, length)
while str:len() < length do
str = c .. str
end
return str
end
end


--Returns the ISNI check digit isni must be a string where the 15 first elements are digits, e.g. 0000000066534145
local function ulanLink( id )
function p.getIsniCheckDigit( isni )
    return '[//www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid=' .. id .. ' ' .. id .. ']' .. getCatForId( 'ULAN' )
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
end


--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid
local function nlaLink( id )
--See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier
return '[//nla.gov.au/anbd.aut-an' .. id .. ' ' .. id .. ']' .. getCatForId( 'NLA' )
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
end


function p.splitLccn( id )
local function rkdartistsLink( 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)
return '[https://rkd.nl/en/explore/artists/' .. id .. ' ' .. id .. ']' .. getCatForId( 'RKDartists' )
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
end


--[[==========================================================================]]
local function getIdsFromWikidata( item, property )
--[[          Wikidata, navigation bar, and documentation functions          ]]
    local ids = {}
--[[==========================================================================]]
    if not item.claims[property] then
 
        return ids
function p.getIdsFromWikidata( itemId, property )
    end
local ids = {}
    for _, statement in pairs( item.claims[property] ) do
local statements = mw.wikibase.getBestStatements( itemId, property )
if statement.mainsnak.datavalue then
if statements then
table.insert( ids, statement.mainsnak.datavalue.value )
for _, statement in ipairs( statements ) do
if statement.mainsnak.datavalue then
table.insert( ids, statement.mainsnak.datavalue.value )
end
end
end
end
    end
return ids
    return ids
end
 
function p.matchesWikidataRequirements( itemId, reqs )
for _, group in ipairs( reqs ) do
local property = 'P'..group[1]
local qid = group[2]
local statements = mw.wikibase.getBestStatements( itemId, property )
if statements then
for _, statement in ipairs( statements ) do
if statement.mainsnak.datavalue then
if statement.mainsnak.datavalue.value['numeric-id'] == qid then
return true
end end end end end
return false
end
end


function p.createRow( id, label, rawValue, link, withUid, specialCat )
local function matchesWikidataRequirements( item, reqs )
if link then
    for _, group in pairs( reqs ) do
if withUid then
        local property = 'p' .. group[1]
return '*<span class="nowrap">'..label..' <span class="uid">'..link..'</span></span>\n'
        local qid = group[2]
end
        if item.claims[property] ~= nil then
return '*<span class="nowrap">'..label..' '..link..'</span>\n'
            for _, statement in pairs ( item.claims[property] ) do
end
            if statement.mainsnak.datavalue ~= nil then
 
                if statement.mainsnak.datavalue.value['numeric-id'] == qid then
local catName = '잘못된 '..(specialCat or id)..' 식별자를 포함한 위키백과 문서'
                    return true
return '* <span class="error">'..id..' id '..rawValue..' 값은 유효하지 않습니다.</span>[[분류:'..catName..']]'..p.redCatLink(catName)..'\n'
                end
            end
            end
        end
    end
    return false
end
end


-- Creates a human-readable standalone wikitable version of p.conf, and tracking categories with page counts, for use in the documentation
local function createRow( id, label, rawValue, link, withUid )
function p.docConfTable( frame )
    if link then
local wikiTable = '{| class="wikitable sortable"\n'..
        if withUid then
  '! rowspan=2 | 변수\n'..
            return '* ' .. label .. ' <span class="uid">' .. link .. '</span>\n'
  '! rowspan=2 | 레이블\n'..
        else
  '! rowspan=2; data-sort-type=number | 위키데이터 속성\n'..
            return '* ' .. label .. ' ' .. link .. '\n'
  '! colspan=4 | 추적용 분류와 문서 수\n'..
        end
  '|-\n'..
    else
  '! [[:분류:전거 통제 정보를 포함한 위키백과 문서|문서]]\n'..
        return '* <span class="error">' .. id .. ' id의 ' .. rawValue .. ' 는 유효하지 않습니다.</span>[[분류:잘못된 전거 통제 정보를 포함한 위키백과 문서]]\n'
  '! [[:분류:전거 통제 정보를 포함한 사용자 문서|사용자 문서]]\n'..
    end
  '! [[:분류:전거 통제 정보를 포함한 기타 문서|기타 문서]]\n'..
  '! [[:분류:잘못된 전거 통제 정보를 포함한 위키백과 문서|잘못된 ID]]\n'..
  '|-\n'
local lang = mw.getContentLanguage()
for _, conf in pairs( p.conf ) do
local param, link, pid = conf[1], conf[2], conf[3]
local category = conf.category or param
local args = { id = 'f', pid }
local wpl = frame:expandTemplate{ title = '위키데이터 속성 링크', 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'..
'||'..param..
'||'..link..
'||data-sort-value='..pid..'|'..wpl..
'||style="text-align: right;"|[[:분류:'..articleCat..'|'..articleCount..']]'..
'||style="text-align: right;"|[[:분류:'..  userCat..'|'..  userCount..']]'..
'||style="text-align: right;"|[[:분류:'..   miscCat..'|'..   miscCount..']]'..
'||style="text-align: right;"|[[:분류:'.. faultyCat..'|'.. faultyCount..']]'
end
return wikiTable..'\n|}'
end
end


--[[==========================================================================]]
--In this order: name of the parameter, label, propertyId in Wikidata, formatting function
--[[                             Configuration                              ]]
local conf = {
--[[==========================================================================]]
    { 'VIAF', '[[가상 국제 전거 파일|VIAF]]', 214, viafLink },
    { 'LCCN', '[[미국 의회도서관 제어 번호|LCCN]]', 244, lccnLink },
    { 'ISNI', '[[국제 표준 명칭 식별자|ISNI]]', 213, isniLink },
    { 'ORCID', '[[ORCID]]', 496, orcidLink },
    { 'GND', '[[게마인자메 노름다타이|GND]]', 227, gndLink },
    { 'SELIBR', '[[LIBRIS|SELIBR]]', 906, selibrLink },
    { 'SUDOC', '[[프랑스 대학도서관 종합목록|SUDOC]]', 269, sudocLink },   
    { 'BNF', '[[프랑스 국립도서관|BNF]]', 268, bnfLink },
    { 'BPN', '[[Biografisch Portaal|BPN]]', 651, bpnLink },
    { 'RID', '[[ResearcherID]]', 1053, ridLink },
    { 'BIBSYS', '[[BIBSYS]]', 1015, bibsysLink },
    { 'ULAN', '[[Union List of Artist Names|ULAN]]', 245, ulanLink },
    { 'HDS', '[[스위스 역사 사전|HDS]]', 902, hlsLink },
    { 'LIR', '[[스위스 역사 사전|LIR]]', 886, lirLink },
    { 'MBA', '[[뮤직브레인즈]]', 434, mbLink },
    { 'MGP', '[[수학 계보 프로젝트|MGP]]', 549, mgpLink },   
    { 'NLA', '[[오스트레일리아 국립도서관|NLA]]', 409, nlaLink },
    { 'NDL', '[[국립국회도서관|NDL]]', 349, ndlLink },
    { 'NCL', '[[국가도서관|NCL]]', 1048, nclLink },
    { 'NKC', '[[체코 국립도서관|NKC]]', 691, nkcLink },
    { 'Léonore', '[[:fr:Base Léonore|Léonore]]', 640, leonoreLink },
    { 'SBN', '[[Istituto Centrale per il Catalogo Unico|ICCU]]', 396, sbnLink },   
    { 'RLS', '[[러시아 국립도서관 (모스크바)|RLS]]', 947, rslLink },
    { 'Botanist', '[[Author citation (botany)|Botanist]]', 428, botanistLink },
    { 'NARA-person', '[[미국 국립문서기록관리청|NARA]]', 1222, narapersonLink },
    { 'NARA-organization', '[[미국 국립문서기록관리청|NARA]]', 1223, naraorganizationLink },
    { 'USCongress', '[[미국 의회 인명 사전|US Congress]]', 1157, uscongressLink },
    { 'BNE', '[[스페인 국립도서관|BNE]]', 950, bneLink },
    { 'CINII', '[[CiNii]]', 271, ciniiLink },
    { 'TLS', '[[Theaterlexikon der Schweiz|TLS]]', 1362, tlsLink },
    { 'SIKART', '[[SIKART]]', 781, sikartLink },
    { 'KULTURNAV', '[[KulturNav]]', 1248, kulturnavLink },
    { 'RKDartists', '[[Netherlands Institute for Art History#Online artist pages|RKD]]', 650, rkdartistsLink },
}


-- Check that the Wikidata item has this property-->value before adding it
-- Check that the Wikidata item has this property-->value before adding it
local reqs = {}
local reqs = {}


-- Parameter format: { parameter name, label, propertyId # in Wikidata, formatting/validation function }
local p = {}
p.conf = {
{ 'AAG', '[[:en:Auckland Art Gallery Toi o Tāmaki|AAG]]', 3372, p.aagLink },
{ 'ACM-DL', '[[ACM 디지털 라이브러리|ACM DL]]', 864, p.acmLink },
{ 'ADB', '[[:en:Australian Dictionary of Biography|ADB]]', 1907, p.adbLink },
{ 'AGSA', '[[:en:Art Gallery of South Australia|AGSA]]', 6804, p.agsaLink },
{ 'Autores.uy', '[[autores.uy]]', 2558, p.autoresuyLink }, -- 맨 앞이 소문자로 시작하는 경우 {{전거 통제 식별자를 포함한 문서}}가 동작하지 않아 우선 수정함 (autores.uy → Autores.uy)
{ 'AWR', '[[:en:Australian Women\'s Register|AWR]]', 4186, p.awrLink },
{ 'BALaT', '[[:en:Royal Institute for Cultural Heritage#Online artworks pages|BALaT]]', 3293, p.balatLink },
{ 'BIBSYS', '[[BIBSYS]]', 1015, p.bibsysLink },
{ 'Bildindex', '[[:en:Marburg Picture Index|Bildindex]]', 2092, p.bildLink },
{ 'BNC', '[[칠레 국립도서관|BNC]]', 1890, p.bncLink }, --initially commented due to excessive WD ID errors (many bad IDs since removed)
{ 'BNE', '[[스페인 국립도서관|BNE]]', 950, p.bneLink },
{ 'BNF', '[[프랑스 국립도서관|BNF]]', 268, p.bnfLink },
{ 'Botanist', '[[:en:Author citation (botany)|Botanist]]', 428, p.botanistLink },
{ 'BPN', '[[:en:Biografisch Portaal|BPN]]', 651, p.bpnLink },
{ 'CANTIC', '[[:en:Name and Title Authority File of Catalonia|CANTIC]]', 1273, p.canticLink },
{ 'CINII', '[[CiNii]]', 271, p.ciniiLink },
{ 'DAAO', '[[:en:Dictionary of Australian Artists|DAAO]]', 1707, p.daaoLink },
{ 'DBLP', '[[DBLP]]', 2456, p.dblpLink },
{ 'DSI', '[[:en:Stuttgart Database of Scientific Illustrators 1450–1950|DSI]]', 2349, p.dsiLink },
{ 'FNZA', '[[:d:Property:P6792|FNZA]]', 6792, p.fnzaLink },
{ 'GND', '[[게마인자메 노름다타이|GND]]', 227, p.gndLink },
{ 'HDS', '[[스위스 역사 사전|HDS]]', 902, p.hdsLink },
{ 'IAAF', '[[국제 육상 경기 연맹|IAAF]]', 1146, p.iaafLink },
{ 'ICIA', '[[:en:Information Center for Israeli Art|ICIA]]', 1736, p.iciaLink },
{ 'ISNI', '[[국제 표준 명칭 식별자|ISNI]]', 213, p.isniLink },
{ 'Joconde', '[[:en:Joconde|Joconde]]' , 347, p.jocondeLink },
{ 'KULTURNAV', '[[:en:KulturNav|KulturNav]]', 1248, p.kulturnavLink },
{ 'LCCN', '[[미국 의회도서관 제어 번호|LCCN]]', 244, p.lccnLink },
{ 'LIR', '[[스위스 역사 사전|LIR]]', 886, p.lirLink },
{ 'LNB', '[[National Library of Latvia|LNB]]', 1368, p.lnbLink },
{ 'Léonore', '[[:fr:Base Léonore|Léonore]]', 640, p.leonoreLink },
{ 'MBA', '[[뮤직브레인즈]]', 434, p.mbaLink, category = 'MusicBrainz' }, --special category name
{ 'MBAREA', '[[뮤직브레인즈]]', 982, p.mbareaLink, category = 'MusicBrainz area' }, --special category name
{ 'MBI', '[[뮤직브레인즈]]', 1330, p.mbiLink, category = 'MusicBrainz instrument' }, --special category name
{ 'MBL', '[[뮤직브레인즈]]', 966, p.mblLink, category = 'MusicBrainz label' }, --special category name
{ 'MBP', '[[뮤직브레인즈]]', 1004, p.mbpLink, category = 'MusicBrainz place' }, --special category name
{ 'MBRG', '[[뮤직브레인즈]] release group', 436, p.mbrgLink, category = 'MusicBrainz release group' }, --special category name
{ 'MBS', '[[뮤직브레인즈]]', 1407, p.mbsLink, category = 'MusicBrainz series' }, --special category name
{ 'MBW', '[[뮤직브레인즈]] work', 435, p.mbwLink, category = 'MusicBrainz work' }, --special category name
{ 'MGP', '[[수학 계보 프로젝트|MGP]]', 549, p.mgpLink },
{ 'NARA', '[[미국 국립문서기록관리청|NARA]]', 1225, p.naraLink },
{ 'NCL', '[[국가도서관|NCL]]', 1048, p.nclLink },
{ 'NDL', '[[일본 국립국회도서관|NDL]]', 349, p.ndlLink },
{ 'NGV', '[[:en:National Gallery of Victoria|NGV]]', 2041, p.ngvLink },
{ 'NKC', '[[체코 국립도서관|NKC]]', 691, p.nkcLink },
{ 'NLA', '[[오스트레일리아 국립도서관|NLA]]', 409, p.nlaLink },
{ 'NLG', '[[그리스 국립도서관|NLG]]', 3348, p.nlgLink },
{ 'NLI', '[[이스라엘 국립도서관|NLI]]', 949, p.nliLink },
    { 'NLK', '[[국립중앙도서관|NLK]]', 5034, p.nlkLink },
{ 'NLP', '[[폴란드 국립도서관|NLP]]', 1695, p.nlpLink },
{ 'NLR', '[[루마니아 국립도서관|NLR]]', 1003, p.nlrLink }, --initially commented due to excessive WD ID errors (conflated with National Library of Russia IDs)
{ 'NSK', '[[자그레브 국립 대학 도서관|NSK]]', 1375, p.nskLink },
{ 'NTA', '[[네덜란드 왕립도서관|NTA]]', 1006, p.ntaLink },
{ 'ORCID', '[[ORCID]]', 496, p.orcidLink },
{ 'PIC', '[[:d:Q23892012|PIC]]', 2750, p.picLink },
{ 'RID', '[[:en:ResearcherID|ResearcherID]]', 1053, p.ridLink },
{ 'RERO', '[[:en:RERO (Library Network of Western Switzerland)|RERO]]', 3065, p.reroLink }, --initially commented due to excessive WD ID errors (regex fixed/relaxed)
{ 'RKDartists', '[[:en:Netherlands Institute for Art History#Online artist pages|RKD]]', 650, p.rkdartistsLink },
{ 'RKDID', '[[:d:Q17299580|RKDimages ID]]', 350, p.rkdidLink },
{ 'RSL', '[[러시아 국립도서관 (모스크바)|RSL]]', 947, p.rslLink },
{ 'SBN', '[[:en:Istituto Centrale per il Catalogo Unico|ICCU]]', 396, p.sbnLink },
{ 'SELIBR', '[[LIBRIS|SELIBR]]', 906, p.selibrLink },
{ 'SIKART', '[[SIKART]]', 781, p.sikartLink },
{ 'SNAC-ID', '[[SNAC]]', 3430, p.snacLink },
{ 'SUDOC', '[[프랑스 대학도서관 종합목록|SUDOC]]', 269, p.sudocLink },
{ 'S2AuthorId', '[[:en:Semantic Scholar|S2AuthorId]]', 4012, p.s2authoridLink, category = 'Semantic Scholar author' }, --special category name
{ 'TA98', '[[:en:Terminologia Anatomica|TA98]]', 1323, p.ta98Link },
{ 'TDVİA', '[[:d:Q21527102|TDVİA]]', 7314, p.tdviaLink },
{ 'TE', '[[Terminologia Embryologica|TE]]', 1693, p.teLink },
{ 'TePapa', '[[:en:Museum of New Zealand Te Papa Tongarewa|TePapa]]', 3544, p.tepapaLink },
{ 'TH', '[[:en:Terminologia Histologica|TH]]', 1694, p.thLink },
{ 'TLS', '[[:en:Theaterlexikon der Schweiz|TLS]]', 1362, p.tlsLink },
{ 'Trove', '[[:en:Trove|Trove]]', 1315, p.troveLink }, --formerly NLA-person
{ 'ULAN', '[[:en:Union List of Artist Names|ULAN]]', 245, p.ulanLink },
{ 'USCongress', '[[미국 의회 인명사전|US Congress]]', 1157, p.uscongressLink },
{ 'VIAF', '[[가상 국제 전거 파일|VIAF]]', 214, p.viafLink },
{ 'WORLDCATID', '[[WorldCat Identities]]', 7859, nil },
}


-- Legitimate aliases to p.conf, for convenience
function p.authorityControl( frame )
-- Format: { 'alias', 'parameter name in p.conf' }
    local parentArgs = {}
p.aliases = {
    --Create rows
{ 'RLS', 'RSL' },
    local elements = {}
{ 'MusicBrainz', 'MBA' },
{ 'MusicBrainz artist', 'MBA' },
{ 'MusicBrainz label', 'MBL' },
{ 'MusicBrainz release group', 'MBRG' },
{ 'MusicBrainz work', 'MBW' },
{ 'Leonore', 'Léonore' },
{ 'TDVIA', 'TDVİA' },
}


-- Deprecated aliases to p.conf; tracked in [[Category:Wikipedia articles with deprecated authority control identifiers]]
    --Wikidata fallback if requested
-- Format: { 'deprecated parameter name', 'replacement parameter name in p.conf' }
    local item = mw.wikibase.getEntityObject()
p.deprecated = {
    if item ~= nil and item.claims ~= nil then
{ 'GKD', 'GND' },
        for _, params in pairs( conf ) do
{ 'PND', 'GND' },
            if params[3] ~= 0 then
{ 'SWD', 'GND' },
                local val = parentArgs[params[1]]
{ 'NARA-organization', 'NARA' },
                if not val or val == '' then
{ 'NARA-person', 'NARA' },
                local canUseWikidata = nil
}
                    if reqs[params[1]] ~= nil then
                        canUseWikidata = matchesWikidataRequirements( item, reqs[params[1]] )
                    else
                        canUseWikidata = true
                    end
                    if canUseWikidata then
                        local wikidataIds = getIdsFromWikidata( item, 'P' .. params[3] )
                        if wikidataIds[1] then
                            parentArgs[params[1]] = wikidataIds[1]
                        end
                    end
                end
            end
        end
    end


--[[==========================================================================]]
    --Worldcat
--[[                                   Main                                  ]]
    if parentArgs['WORLDCATID'] and parentArgs['WORLDCATID'] ~= '' then
--[[==========================================================================]]
        table.insert( elements, createRow( 'WORLDCATID', '', parentArgs['WORLDCATID'], '[//www.worldcat.org/identities/' .. parentArgs['WORLDCATID'] .. ' WorldCat]', false ) ) --Validation?
    elseif parentArgs['LCCN'] and parentArgs['LCCN'] ~= '' then
        local lccnParts = splitLccn( parentArgs['LCCN'] )
        if lccnParts then
            table.insert( elements, createRow( 'LCCN', '', parentArgs['LCCN'], '[//www.worldcat.org/identities/lccn-' .. lccnParts[1] .. lccnParts[2] .. '-' .. lccnParts[3] .. ' WorldCat]', false ) )
        end
    end


function p.authorityControl( frame )
    --Configured rows
local resolveEntity = require( "Module:ResolveEntityId" )
    local rct = 0
local parentArgs = frame:getParent().args
    for k, params in pairs( conf ) do
local elements = {} --create/insert rows later
        local val = parentArgs[params[1]]
local worldcatCat = ''
        if val and val ~= '' then
local suppressedIdCat = ''
            table.insert( elements, createRow( params[1], params[2] .. ':', val, params[4]( val ), true ) )
local deprecatedIdCat = ''
            rct = rct + 1
        end
--Redirect aliases to proper parameter names
    end
for _, a in pairs( p.aliases ) do
    local Navbox = require('Module:Navbox')
local alias, param = a[1], a[2]
    local elementscats = ''
if (parentArgs[param] == nil or parentArgs[param] == '') and parentArgs[alias] then
    if rct > 13 then
parentArgs[param] = parentArgs[alias]
    elementscats  = '[[분류:' .. rct .. ' 종류의 전거 통제 정보를 포함]]'
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 = '[[분류:구식의 전거 통제 식별자가 포함된 위키백과 문서|'..dep..']]'
end
end
end
end
--Use QID= parameter for testing/example purposes only
if #elements ~= 0 then
local itemId = nil
return Navbox._navbox( {
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 requested
if itemId then
for _, params in ipairs( p.conf ) do
if params[3] > 0 then
local val = parentArgs[params[1]]
if val == nil or val == '' then
local canUseWikidata = nil
if reqs[params[1]] then
canUseWikidata = p.matchesWikidataRequirements( itemId, reqs[params[1]] )
else
canUseWikidata = true
end
if canUseWikidata then
local wikidataIds = p.getIdsFromWikidata( itemId, 'P'..params[3] )
if wikidataIds[1] then
if val == '' and (namespace == 0 or testcases) then
suppressedIdCat = '[[분류:전거 통제 식별자가 생략된 위키백과 문서|'..params[1]..']]'
else
parentArgs[params[1]] = wikidataIds[1]
end end end end end end end
--Configured rows
local rct = 0
for _, params in ipairs( p.conf ) do
local val = parentArgs[params[1]]
if val and val ~= '' and type(params[4]) == 'function' then
table.insert( elements, p.createRow( params[1], params[2]..':', val, params[4]( val ), true, params.category ) )
rct = rct + 1
end
end
--WorldCat
local worldcatId = parentArgs['WORLDCATID']
if worldcatId and worldcatId ~= '' then --if present & unsuppressed
table.insert( elements, p.createRow( 'WORLDCATID', '', worldcatId, '[[WorldCat Identities]]: [https://www.worldcat.org/identities/'..mw.uri.encode(worldcatId, 'PATH')..' '..worldcatId..']', false ) ) --Validation?
worldcatCat = '[[분류:월드캣 식별자를 포함한 위키백과 문서]]'
elseif worldcatId == nil then --if absent & unsuppressed
local viafId = parentArgs['VIAF']
local lccnId = parentArgs['LCCN']
if viafId and viafId ~= '' and p.viafLink( viafId ) then --VIAF must be present, unsuppressed, & validated
table.insert( elements, p.createRow( 'VIAF', '', viafId, '[[WorldCat Identities]] (via VIAF): [https://www.worldcat.org/identities/containsVIAFID/'..viafId..' '..viafId..']', false ) )
if namespace == 0 then  
worldcatCat = '[[분류:월드캣-VIAF 식별자를 포함한 위키백과 문서]]'
end
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( elements, p.createRow( 'LCCN', '', lccnId, '[[WorldCat Identities]] (via LCCN): [https://www.worldcat.org/identities/lccn-'..lccnIdFmtd..' '..lccnIdFmtd..']', false ) )
if namespace == 0 then
worldcatCat = '[[분류:월드캣-LCCN 식별자를 포함한 위키백과 문서]]'
end
end
end
elseif worldcatId == '' then --if suppressed
suppressedIdCat = '[[분류:전거 통제 식별자가 생략된 위키백과 문서|WORLDCATID]]'
end
local Navbox = require('Module:Navbox')
local elementsCat = ''
if rct >= 25 then
local eCat = rct..'개의 요소가 포함된 전거 통제'
elementsCat  = '[[분류:'..eCat..']]'..p.redCatLink(eCat)
end
local outString = ''
if #elements > 0 then
local args = {}
if testcases and itemId then args = { qid = itemId } end --expensive
local pencil = frame:expandTemplate{ title = 'EditAtWikidata', args = args}
outString = Navbox._navbox( {
name  = 'Authority control',
name  = 'Authority control',
navboxclass = 'authority-control',
bodyclass = 'hlist',
bodyclass = 'hlist',
group1 = '[[전거 통제]]'..pencil,
group1 = '[[전거 통제]]' .. elementscats,
list1 = table.concat( elements )
list1 = table.concat( elements )
} )
} )
local auxCats = worldcatCat .. elementsCat .. suppressedIdCat .. deprecatedIdCat
else
if testcases then
return ""
auxCats = mw.ustring.gsub(auxCats, '(%[%[)(분류)', '%1:%2') --for easier checking
end
outString = outString .. auxCats
if namespace ~= 0 then
outString = mw.ustring.gsub(outString, '(%[%[)(분류:.*위키백과 문서)', '%1:%2') --by definition
end
end
end
return outString
end
end


return p
return p
가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소 편집 도움말 (새 창에서 열림)

이 문서에서 사용한 틀: