「モジュール:Authority control」の版間の差分
追加された内容 削除された内容
(同じ利用者による、間の3版が非表示) | |||
1行目: | 1行目: | ||
require(' |
require('strict') |
||
local p = {} |
local p = {} |
||
local configfile = 'Module:Authority control/config' -- default configuation module |
|||
local arg = mw.getCurrentFrame().args.config |
|||
if arg and arg~='' then |
|||
configfile = 'Module:Authority control/config/' .. arg |
|||
end |
|||
local config |
|||
if mw.title.new(configfile).exists then |
|||
config = mw.loadData(configfile) |
|||
else |
|||
return error('Invalid configuration file',0) |
|||
end |
|||
local title = mw.title.getCurrentTitle() |
local title = mw.title.getCurrentTitle() |
||
local namespace = title.namespace |
local namespace = title.namespace |
||
local testcases = |
local testcases = title.subpageText == config.i18n.testcases |
||
local function needsAttention(sortkey) |
|||
--[[==========================================================================]] |
|||
return '[[' .. config.i18n.category .. ':' .. config.i18n.attentioncat .. '|' .. sortkey .. title.text .. ']]' |
|||
--[[ 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 function addCat(cat,sortkey) |
|||
function p.redCatLink( catName ) --catName == 'Blah' (not 'Category:Blah', not '[[Category:Blah]]') |
|||
if |
if cat and cat ~= '' and (namespace == 0 or namespace == 14 or testcases) then |
||
local redlinkcat = '' |
|||
testcases == false and |
|||
mw.title.new( |
if testcases == false and mw.title.new(cat, 14).exists == false then |
||
redlinkcat = needsAttention('N') |
|||
then |
|||
return '[[Category:赤リンクの典拠情報カテゴリがあるページ]]' |
|||
end |
|||
return '' |
|||
end |
|||
function p.createRow( id, rawValues, link, links, withUid, specialCat, prefix ) |
|||
local catName = '誤った'..(specialCat or id)..'識別子が指定されている記事' |
|||
if links then -- all links[] use withUid = false; no check needed |
|||
local row = '' |
|||
if prefix then |
|||
row = row .. '*' .. prefix |
|||
end |
end |
||
if sortkey then |
|||
local totlen = 0 |
|||
cat = '[[' .. config.i18n.category .. ':'..cat..'|' .. sortkey .. title.text .. ']]' |
|||
for i, l in ipairs( links ) do |
|||
else |
|||
if i == 1 and not prefix then row = row..'*' |
|||
cat = '[[' .. config.i18n.category .. ':'..cat..']]' |
|||
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 |
||
cat = cat .. redlinkcat |
|||
return row..'\n' |
|||
return cat |
|||
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 |
local function getCatForId(id,faulty) |
||
local cat = string.format( |
|||
--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) |
|||
config.i18n.cat, |
|||
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 |
|||
faulty and config.i18n.faulty..id or id |
|||
return false |
|||
) |
|||
return addCat(cat) |
|||
local url = 'https://musicbrainz.org/area/'..id |
|||
local cat = p.getCatForId( 'MusicBrainz地域' )--special cat name |
|||
if label then |
|||
return '['..url..' '..label..']'..cat |
|||
else |
|||
return '[[MBAREA (識別子)|MusicBrainz]] [' .. url .. ' 地域]' .. cat |
|||
end |
|||
end |
end |
||
function |
local function getIdsFromWikidata(qid,property) |
||
local function getquals(statement,qualid) |
|||
--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 statement.qualifiers and statement.qualifiers['P'..qualid] then |
|||
if not id:match( '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return mw.wikibase.renderSnak(statement.qualifiers['P'..qualid][1]) |
|||
return false |
|||
else |
|||
return false |
|||
end |
|||
end |
end |
||
local ids = {} |
|||
local url = 'https://musicbrainz.org/instrument/'..id |
|||
if qid then |
|||
local cat = p.getCatForId( 'MusicBrainz楽器' )--special cat name |
|||
for _, statement in ipairs(mw.wikibase.getBestStatements(qid,property)) do |
|||
if label then |
|||
if statement.mainsnak.datavalue then |
|||
return '['..url..' '..label..']'..cat |
|||
local val = statement.mainsnak.datavalue.value |
|||
else |
|||
if val then |
|||
return '[[MBI (識別子)|MusicBrainz]] [' .. url .. ' 楽器]' .. cat |
|||
local namedas = getquals(statement,1810) or getquals(statement,742) or '' |
|||
table.insert(ids,{id=val,name=namedas}) |
|||
end |
|||
end |
|||
end |
|||
end |
end |
||
return ids |
|||
end |
end |
||
local _makelink = function(conf,val,nextid,qid) --validate values and create a link |
|||
function p.mblLink( id, label ) |
|||
local function tooltip(text,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 label and label~='' then |
|||
if not id:match( '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return mw.getCurrentFrame():expandTemplate{title = "Tooltip", args = {text,label}} |
|||
return false |
|||
else |
|||
return text |
|||
end |
|||
end |
end |
||
local link |
|||
local url = 'https://musicbrainz.org/label/'..id |
|||
if nextid==1 then |
|||
local cat = p.getCatForId( 'MusicBrainzレーベル' )--special cat name |
|||
if conf.prefix then |
|||
link = '*' .. conf.prefix .. '\n**' |
|||
else |
|||
link = '*' |
|||
end |
|||
else |
else |
||
link = '\n**' |
|||
return '[[MBL (識別子)|MusicBrainz]] [' .. url .. ' レーベル]' .. cat |
|||
end |
end |
||
local valid_value = false |
|||
end |
|||
if conf.customlink then -- use function to validate and generate link |
|||
local label = nextid>1 and nextid |
|||
function p.mbpLink( id, label ) |
|||
local newlink= require(config.auxiliary)[conf.customlink](val.id,label) |
|||
--P1004's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if newlink 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 |
|||
link = link .. newlink |
|||
return false |
|||
valid_value = true |
|||
end |
|||
end |
|||
local url = 'https://musicbrainz.org/place/'..id |
|||
local cat = p.getCatForId( 'MusicBrainz場所' )--special cat name |
|||
if label then |
|||
return '['..url..' '..label..']'..cat |
|||
else |
else |
||
if conf.pattern then -- use pattern to determine validity if defined |
|||
return '[[MBP (識別子)|MusicBrainz]] [' .. url .. ' 場所]' .. cat |
|||
valid_value = string.match(val.id,'^'..conf.pattern..'$') |
|||
elseif conf.patterns then |
|||
for _,pattern in ipairs(conf.patterns) do |
|||
valid_value = val.id:match('^'..pattern..'$') |
|||
if valid_value then break end |
|||
end |
|||
elseif conf.valid then -- otherwise use function to determine validity |
|||
valid_value = require(config.auxiliary)[conf.valid](val.id) |
|||
else -- no validation possible |
|||
valid_value = val.id |
|||
end |
|||
if valid_value then |
|||
local newlink |
|||
local label = conf.label |
|||
if not label or nextid>1 then |
|||
label = tostring(nextid) |
|||
end |
|||
if conf.link then |
|||
valid_value = valid_value:gsub('%%', '%%%%') |
|||
newlink = '[' .. mw.ustring.gsub(conf.link,'%$1',valid_value) .. ' ' .. label .. ']' |
|||
else |
|||
newlink = valid_value |
|||
end |
|||
link = link .. '<span class="uid">'..tooltip(newlink,val.name)..'</span>' |
|||
end |
|||
end |
end |
||
if valid_value then |
|||
end |
|||
link = link .. getCatForId(conf.category or conf[1]) |
|||
function p.mbrgLink( id, label ) |
|||
--P436's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if not id:match( '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
|||
local url = 'https://musicbrainz.org/release-group/'..id |
|||
local cat = p.getCatForId( 'MusicBrainzリリース・グループ' )--special cat name |
|||
if label then |
|||
return '['..url..' '..label..']'..cat |
|||
else |
else |
||
--local preview = require("Module:If preview") |
|||
return '[[MBRG (識別子)|MusicBrainz]] [' .. url .. ' リリース・グループ]' .. cat |
|||
local wdlink = qid and '[[:wikidata:' .. qid .. '#P' .. conf.property .. ']]' or '' |
|||
local tooltip = string.format( |
|||
config.i18n.idnotvalid, |
|||
conf[1], |
|||
val.id |
|||
) |
|||
link = link .. '[[File:' .. config.i18n.warningicon .. '|20px|frameless|link=' .. wdlink .. '|' .. tooltip .. ']]' |
|||
if conf.errorcat then |
|||
link = link .. addCat(conf.errorcat) |
|||
else |
|||
link = link .. getCatForId(conf.category or conf[1],true) |
|||
end |
|||
link = link .. addCat(config.i18n.allfaultycat,conf[1])-- .. preview._warning({'The '..conf[1]..' id '..val..' is not valid.'}) |
|||
end |
end |
||
return link |
|||
end |
|||
function p.mbsLink( id, label ) |
|||
--P1407's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if not id:match( '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
|||
local url = 'https://musicbrainz.org/series/'..id |
|||
local cat = p.getCatForId( 'MusicBrainzシリーズ' )--special cat name |
|||
if label then |
|||
return '['..url..' '..label..']'..cat |
|||
else |
|||
return '[[MBS (識別子)|MusicBrainz]] [' .. url .. ' シリーズ]' .. cat |
|||
end |
|||
end |
|||
function p.mbwLink( id, label ) |
|||
--P435's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB) |
|||
if not id:match( '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then |
|||
return false |
|||
end |
|||
local url = 'https://musicbrainz.org/work/'..id |
|||
local cat = p.getCatForId( 'MusicBrainz作品' )--special cat name |
|||
if label then |
|||
return '['..url..' '..label..']'..cat |
|||
else |
|||
return '[[MBW (識別子)|MusicBrainz]] [' .. url .. ' 作品]' .. cat |
|||
end |
|||
end |
|||
function p.mgpLink( id, label ) |
|||
--P549's format regex: \d{1,6} (e.g. 123456) |
|||
if not id:match( '^%d%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://genealogy.math.ndsu.nodak.edu/id.php?id='..id..' '..(label or 'Mathematics Genealogy Project')..']'..p.getCatForId( 'MGP' ) |
|||
end |
|||
function p.naraLink( id, label ) |
|||
--P1225's format regex: ^([1-9]\d{0,8})$ (e.g. 123456789) |
|||
if not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://catalog.archives.gov/id/'..id..' '..(label or '公文書館(アメリカ)')..']'..p.getCatForId( 'NARA' ) |
|||
end |
|||
function p.nclLink( id, label ) |
|||
--P1048's format regex: \d+ (e.g. 1081436) |
|||
if not id:match( '^%d+$' ) then |
|||
return false |
|||
end |
|||
return '[http://aleweb.ncl.edu.tw/F/?func=accref&acc_sequence='..id..'&CON_LNG=ENG '..(label or '台湾')..']'..p.getCatForId( 'NCL' ) --no https as of 9/2019 |
|||
end |
|||
function p.ndlLink( id, label ) |
|||
--P349's format regex: 0?\d{8} (e.g. 012345678) |
|||
if not id:match( '^0?%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[https://id.ndl.go.jp/auth/ndlna/'..id..' '..(label or '日本')..']'..p.getCatForId( 'NDL' ) |
|||
end |
|||
function p.ngvLink( id, label ) |
|||
--P2041's format regex: \d+ (e.g. 12354) |
|||
if not id:match( '^%d+$' ) then |
|||
return false |
|||
end |
|||
return '[https://www.ngv.vic.gov.au/explore/collection/artist/'..id..'/ '..(label or 'ヴィクトリア')..']'..p.getCatForId( 'NGV' ) |
|||
end |
|||
function p.nkcLink( id, label ) |
|||
--P691's format regex: [a-z]{2,4}[0-9]{2,14} (e.g. abcd12345678901234) |
|||
if not id:match( '^[a-z][a-z][a-z]?[a-z]?%d%d%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica='..id..'&CON_LNG=ENG '..(label or 'チェコ')..']'..p.getCatForId( 'NKC' ) |
|||
end |
|||
function p.nlaLink( id, label ) |
|||
--P409's format regex: [1-9][0-9]{0,11} (e.g. 123456789012) |
|||
if not id:match( '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://nla.gov.au/anbd.aut-an'..id..' '..(label or 'オーストラリア')..']'..p.getCatForId( 'NLA' ) |
|||
end |
|||
function p.nlgLink( id, label ) |
|||
--P3348's format regex: [1-9]\d* (e.g. 1) |
|||
if not id:match( '^[1-9]%d*$' ) then |
|||
return false |
|||
end |
|||
return '[https://data.nlg.gr/resource/authority/record'..id..' '..(label or 'ギリシャ')..']'..p.getCatForId( 'NLG' ) |
|||
end |
|||
function p.nliLink( id, label ) |
|||
--P949's format regex: \d{9} (e.g. 123456789) |
|||
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[http://uli.nli.org.il/F/?func=direct&doc_number='..id..'&local_base=nlx10'..' '..(label or 'イスラエル')..']'..p.getCatForId( 'NLI' ) |
|||
end |
|||
function p.nlkLink( id, label ) |
|||
--P5034's format regex: (KAB|KAC|KSH)([0-9]{4}|[0-9]{4}[a-zA-Z])[0-9]{4,6} (e.g. KAC201501465) |
|||
if not id:match( '^KAB%d%d%d%d%a?%d%d%d%d%d?%d?$' ) and |
|||
not id:match( '^KAC%d%d%d%d%a?%d%d%d%d%d?%d?$' ) and |
|||
not id:match( '^KSH%d%d%d%d%a?%d%d%d%d%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://lod.nl.go.kr/resource/'..id..' '..(label or '韓国')..']'..p.getCatForId( 'NLK' ) |
|||
end |
|||
function p.nlpLink( id, label ) |
|||
--P1695's format regex: 9810[0-9]\d* or A[0-9]{7}[0-9X] (e.g. 9810123456789012345 or A10414836) |
|||
if not id:match( '^9810%d+$' ) and |
|||
not id:match( '^A%d%d%d%d%d%d%d[%dX]$' ) then |
|||
return false |
|||
end |
|||
return '[https://tools.wmflabs.org/wikidata-externalid-url?p=1695&id='..id..' '..(label or 'ポーランド')..']'..p.getCatForId( 'NLP' ) |
|||
end |
|||
function p.nlrLink( id, label ) |
|||
--P1003's format regex: \d{9} (e.g. 123456789) |
|||
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[http://aleph.bibnat.ro:8991/F/?func=direct&local_base=NLR10&doc_number='..id..' '..(label or 'ルーマニア')..']'..p.getCatForId( 'NLR' ) |
|||
end |
|||
function p.nskLink( id, label ) |
|||
--P1375's format regex: \d{9} (e.g. 123456789) |
|||
if not id:match( '^%d%d%d%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[http://katalog.nsk.hr/F/?func=direct&doc_number='..id..'&local_base=nsk10 '..(label or 'クロアチア')..']'..p.getCatForId( 'NSK' ) --no https as of 9/2019 |
|||
end |
|||
function p.ntaLink( id, label ) |
|||
--P1006's format regex: \d{8}[\dX] (e.g. 12345678X) |
|||
if not id:match( '^%d%d%d%d%d%d%d%d[%dX]$' ) then |
|||
return false |
|||
end |
|||
return '[http://data.bibliotheken.nl/id/thes/p'..id..' '..(label or 'オランダ')..']'..p.getCatForId( 'NTA' ) |
|||
end |
|||
function p.orcidLink( id, label ) |
|||
id = p.validateIsni( id ) --e.g. 0000-0002-7398-5483 |
|||
if not id then |
|||
return false |
|||
end |
|||
id = id:sub( 1, 4 )..'-'..id:sub( 5, 8 )..'-'..id:sub( 9, 12 )..'-'..id:sub( 13, 16 ) |
|||
return '[https://orcid.org/'..id..' '..(label or 'ORCID')..']'..p.getCatForId( 'ORCID' ) |
|||
end |
|||
function p.picLink( id, label ) |
|||
--P2750's format regex: [1-9]\d* (e.g. 1) |
|||
if not id:match( '^[1-9]%d*$' ) then |
|||
return false |
|||
end |
|||
return '[https://pic.nypl.org/constituents/'..id..' '..(label or 'Photographers\' Identities')..']'..p.getCatForId( 'PIC' ) |
|||
end |
|||
function p.plwabnLink( id, label ) |
|||
--P7293's format regex: 981[0-9]{8}05606 (e.g. 9810696457305606) |
|||
if not id:match( '^981%d%d%d%d%d%d%d%d05606*$' ) then |
|||
return false |
|||
end |
|||
return '[http://mak.bn.org.pl/cgi-bin/KHW/makwww.exe?BM=1&NU=1&IM=4&WI='..id..' '..(label or 'ポーランド')..']'..p.getCatForId( 'PLWABN' ) |
|||
end |
|||
function p.publonsLink( id, label ) |
|||
--P3829's format regex: \d+ (e.g. 654601) |
|||
if not id:match( '^%d+$' ) then |
|||
return false |
|||
end |
|||
return '[https://publons.com/author/'..id..'/ '..(label or 'Publons(研究者)')..']'..p.getCatForId( 'Publons' ) |
|||
end |
|||
function p.ridLink( id, label ) |
|||
--P1053's format regex: [A-Z]{1,3}-\d{4}-(19|20)\d\d (e.g. AAS-5150-2020) |
|||
if not id:match( '^[A-Z][A-Z]?[A-Z]?%-%d%d%d%d%-19%d%d$' ) and |
|||
not id:match( '^[A-Z][A-Z]?[A-Z]?%-%d%d%d%d%-20%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[https://www.researcherid.com/rid/'..id..' '..(label or 'ResearcherID')..']'..p.getCatForId( 'RID' ) |
|||
end |
|||
function p.rismLink( id, label ) |
|||
--P5504's format regex: (pe|ks)?\[1-9]d* (e.g. pe30006410) |
|||
if not id:match( '^pe[1-9]%d*$' ) and --99% start with 'pe' |
|||
not id:match( '^ks[1-9]%d*$' ) and |
|||
not id:match( '^[1-9]%d*$' ) then |
|||
return false |
|||
end |
|||
return '[https://opac.rism.info/search?id='..id..' '..(label or 'RISM(フランス)')..']'..p.getCatForId( 'RISM' ) |
|||
end |
|||
function p.reroLink( id, label ) |
|||
--P3065's format regex: 0[1-2]-[A-Z0-9]{1,10} (e.g. 02-A012345678) |
|||
if not id:match( '^0[1-2]%-[A-Z%d][A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?$' ) then |
|||
return false |
|||
end |
|||
return '[http://data.rero.ch/'..id..' '..(label or 'RERO(スイス)')..']'..p.getCatForId( 'RERO' ) |
|||
end |
|||
function p.rkdartistsLink( id, label ) |
|||
--P650's format regex: [1-9]\d{0,5} (e.g. 123456) |
|||
if not id:match( '^[1-9]%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://rkd.nl/en/explore/artists/'..id..' '..(label or 'RKDアーティスト(オランダ)')..']'..p.getCatForId( 'RKDartists' ) |
|||
end |
|||
function p.rkdidLink( id, label ) |
|||
--P350's format regex: [1-9]\d{0,5} (e.g. 123456) |
|||
if not id:match( '^[1-9]%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://rkd.nl/nl/explore/images/'..id..' '..(label or 'RKD ID(オランダ)')..']'..p.getCatForId( 'RKDID' ) |
|||
end |
|||
function p.rslLink( id, label ) |
|||
--P947's format regex: \d{1,9} (e.g. 123456789) |
|||
if not id:match( '^%d%d?%d?%d?%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request='..id..'&CON_LNG=ENG '..(label or 'ロシア')..']'..p.getCatForId( 'RSL' ) --no https as of 9/2019 |
|||
end |
|||
function p.selibrLink( id, label ) |
|||
--P906's format regex: [1-9]\d{4,5} (e.g. 123456) |
|||
if not id:match( '^[1-9]%d%d%d%d%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://libris.kb.se/auth/'..id..' '..(label or 'スウェーデン')..']'..p.getCatForId( 'SELIBR' ) |
|||
end |
|||
function p.sikartLink( id, label ) |
|||
--P781's format regex: \d{7,9} (e.g. 123456789) |
|||
if not id:match( '^%d%d%d%d%d%d%d%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[http://www.sikart.ch/KuenstlerInnen.aspx?id='..id..'&lng=en '..(label or 'SIKART(スイス)')..']'..p.getCatForId( 'SIKART' ) --no https as of 9/2019 |
|||
end |
|||
function p.snacLink( id, label ) |
|||
--P3430's format regex: \d*[A-Za-z][0-9A-Za-z]* (e.g. A) |
|||
if not id:match( '^%d*[A-Za-z][0-9A-Za-z]*$' ) then |
|||
return false |
|||
end |
|||
return '[https://snaccooperative.org/ark:/99166/'..id..' '..(label or 'Social Networks and Archival Context')..']'..p.getCatForId( 'SNAC-ID' ) |
|||
end |
|||
function p.sudocLink( id, label ) |
|||
--P269's format regex: (\d{8}[\dX]|) (e.g. 026927608) |
|||
if not id:match( '^%d%d%d%d%d%d%d%d[%dxX]$' ) then --legacy: allow lowercase 'x' |
|||
return false |
|||
end |
|||
return '[https://www.idref.fr/'..id..' '..(label or 'SUDOC(フランス)')..']'..p.getCatForId( 'SUDOC' ) |
|||
end |
|||
function p.s2authoridLink( id, label ) |
|||
--P4012's format regex: [1-9]\d* (e.g. 1796130) |
|||
if not id:match( '^[1-9]%d*$' ) then |
|||
return false |
|||
end |
|||
return '[https://www.semanticscholar.org/author/'..id..' '..(label or 'Semantic Scholar')..']'..p.getCatForId( 'Semantic Scholar著者' ) --special cat name |
|||
end |
|||
function p.ta98Link( id, label ) |
|||
--P1323's format regex: A\d{2}\.\d\.\d{2}\.\d{3}[FM]? (e.g. A12.3.45.678) |
|||
if not id:match( '^A%d%d%.%d%.%d%d%.%d%d%d[FM]?$' ) then |
|||
return false |
|||
end |
|||
return '[http://tools.wmflabs.org/wikidata-externalid-url/?p=1323&url_prefix=https:%2F%2Fwww.unifr.ch%2Fifaa%2FPublic%2FEntryPage%2FTA98%20Tree%2FEntity%20TA98%20EN%2F&url_suffix=%20Entity%20TA98%20EN.htm&id='..id..' '..(label or 'Terminologia Anatomica')..']'..p.getCatForId( 'TA98' ) |
|||
end |
|||
function p.tdviaLink( id, label ) |
|||
--P7314's format regex: [a-z/-]+] (e.g. barkan-omer-lutfi) |
|||
if not id:match( '^[a-z/-]+$' ) then |
|||
return false |
|||
end |
|||
return '[https://islamansiklopedisi.org.tr/'..id..' '..(label or 'イスラーム百科事典(トルコ)')..']'..p.getCatForId( 'TDVİA' ) |
|||
end |
|||
function p.tepapaLink( id, label ) |
|||
--P3544's format regex: \d+ (e.g. 1) |
|||
if not id:match( '^%d+$' ) then |
|||
return false |
|||
end |
|||
return '[https://collections.tepapa.govt.nz/agent/'..id..' '..(label or 'Te Papa(ニュージーランド)')..']'..p.getCatForId( 'TePapa' ) |
|||
end |
|||
function p.tlsLink( id, label ) |
|||
id = id:gsub(' +', '_') |
|||
--P1362's format regex: \p{Lu}[\p{L}\d_',\.\-\(\)\*\/–&]{3,89} (e.g. Abcd) |
|||
--Mediawiki page title partial URL so consider validation with mw.title or "[^#<>%[%] {|}]" |
|||
local class = "[%w_',%.%-%(%)%*%/–&]" |
|||
local idlen = mw.ustring.len (id) |
|||
if idlen < 4 or idlen > 90 then |
|||
return false |
|||
end |
|||
local regex = '^%u'..string.rep(class, idlen - 1)..'$' |
|||
if not mw.ustring.match( id, regex ) then |
|||
return false |
|||
end |
|||
return '[http://tls.theaterwissenschaft.ch/wiki/'..id..' '..(label or 'Theaterlexikon(スイス)')..']'..p.getCatForId( 'TLS' ) --no https as of 9/2019 |
|||
end |
|||
function p.troveLink( id, label ) |
|||
--P1315's format regex: [1-9]\d{5,7} (e.g. 12345678) |
|||
if not id:match( '^[1-9]%d%d%d%d%d%d?%d?$' ) then |
|||
return false |
|||
end |
|||
return '[https://trove.nla.gov.au/people/'..id..' '..(label or 'Trove(オーストラリア)')..']'..p.getCatForId( 'Trove' ) |
|||
end |
|||
function p.ukparlLink( id, label ) |
|||
--P6213's format regex: [a-zA-Z\d]{8} (e.g. AQUupyiR) |
|||
if not id:match( '^[a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d][a-zA-Z%d]$' ) then |
|||
return false |
|||
end |
|||
return '[https://id.parliament.uk/'..id..' '..(label or '英議会')..']'..p.getCatForId( 'UKPARL' ) |
|||
end |
|||
function p.ulanLink( id, label ) |
|||
--P245's format regex: 500\d{6} (e.g. 500123456) |
|||
if not id:match( '^500%d%d%d%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[https://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid='..id..' '..(label or 'アーティスト名(ゲティ)')..']'..p.getCatForId( 'ULAN' ) |
|||
end |
|||
function p.uscongressLink( id, label ) |
|||
--P1157's format regex: [A-Z]00[01]\d{3} (e.g. A000123) |
|||
if not id:match( '^[A-Z]00[01]%d%d%d$' ) then |
|||
return false |
|||
end |
|||
return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index='..id..' '..(label or '米議会')..']'..p.getCatForId( 'USCongress' ) --no https as of 9/2019 |
|||
end |
|||
function p.vcbaLink( id, label ) |
|||
--P8034's format regex: \d{3}\/[1-9]\d{0,5} (e.g. 494/9793) |
|||
if not id:match( '^%d%d%d\/[1-9]%d?%d?%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
id = id:gsub('\/', '_') |
|||
return '[https://opac.vatlib.it/auth/detail/'..id..' '..(label or 'バチカン')..']'..p.getCatForId( 'VcBA' ) |
|||
end |
|||
function p.viafLink( id, label ) |
|||
--P214's format regex: [1-9]\d(\d{0,7}|\d{17,20}) (e.g. 123456789, 1234567890123456789012) |
|||
if not id:match( '^[1-9]%d%d?%d?%d?%d?%d?%d?%d?$' ) and |
|||
not id:match( '^[1-9]%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d?%d?%d?$' ) then |
|||
return false |
|||
end |
|||
-- If the "VIAF" entry at [[:m:Interwiki map]] would resolve to "https://viaf.org/viaf/$1" (rather than "http://viaf.org/viaf/$1", as it currently still does), the code below could change from '[https://viaf.org/viaf/'..id..' '..id..']' to '[[:VIAF:'..id..'|'..id..']]'. |
|||
return '[https://viaf.org/viaf/'..id..' '..(label or 'VIAF')..']'..p.getCatForId( 'VIAF' ) |
|||
end |
|||
--[[=========================== Helper functions =============================]] |
|||
function p.append(str, c, length) |
|||
while str:len() < length do |
|||
str = c .. str |
|||
end |
|||
return str |
|||
end |
|||
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits, e.g. 0000000066534145 |
|||
function p.getIsniCheckDigit( isni ) |
|||
local total = 0 |
|||
for i = 1, 15 do |
|||
local digit = isni:byte( i ) - 48 --Get integer value |
|||
total = (total + digit) * 2 |
|||
end |
|||
local remainder = total % 11 |
|||
local result = (12 - remainder) % 11 |
|||
if result == 10 then |
|||
return "X" |
|||
end |
|||
return tostring( result ) |
|||
end |
|||
--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid |
|||
--See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier |
|||
function p.validateIsni( id ) |
|||
--P213 (ISNI) format regex: [0-9]{4} [0-9]{4} [0-9]{4} [0-9]{3}[0-9X] (e.g. 0000-0000-6653-4145) |
|||
--P496 (ORCID) format regex: 0000-000(1-[5-9]|2-[0-9]|3-[0-4])\d{3}-\d{3}[\dX] (e.g. 0000-0002-7398-5483) |
|||
id = id:gsub( '[ %-]', '' ):upper() |
|||
if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then |
|||
return false |
|||
end |
|||
if p.getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then |
|||
return false |
|||
end |
|||
return id |
|||
end |
|||
function p.splitLccn( id ) |
|||
--P244's format regex: (n|nb|nr|no|ns|sh)([4-9][0-9]|00|20[0-1][0-9])[0-9]{6} (e.g. n78039510) |
|||
if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then |
|||
id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' ) |
|||
end |
|||
if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then |
|||
return mw.text.split( id, '/' ) |
|||
end |
|||
return false |
|||
end |
end |
||
--[[==========================================================================]] |
--[[==========================================================================]] |
||
--[[ |
--[[ Main ]] |
||
--[[==========================================================================]] |
--[[==========================================================================]] |
||
function p.authorityControl(frame) |
|||
local function resolveQID(qid) |
|||
function p.getIdsFromWikidata( itemId, property ) |
|||
if qid then |
|||
local ids = {} |
|||
qid = 'Q'..mw.ustring.gsub(qid, '^[Qq]', '') |
|||
local statements = mw.wikibase.getBestStatements( itemId, property ) |
|||
if mw.wikibase.isValidEntityId(qid) and mw.wikibase.entityExists(qid) then |
|||
if statements then |
|||
local sitelink = mw.wikibase.getSitelink(qid) |
|||
for _, statement in ipairs( statements ) do |
|||
if |
if sitelink then |
||
return mw.wikibase.getEntityIdForTitle(sitelink) or mw.wikibase.getEntity(qid).id |
|||
table.insert( ids, statement.mainsnak.datavalue.value ) |
|||
end |
|||
return mw.wikibase.getEntity(qid).id |
|||
end |
end |
||
end |
end |
||
end |
end |
||
local conf = config.config |
|||
return ids |
|||
local parentArgs = frame:getParent().args |
|||
end |
|||
local auxCats = '' |
|||
local rct = false -- boolean to track if there are any links to be returned |
|||
-- Creates a human-readable standalone wikitable version of p.conf, and tracking categories with page counts, for use in the documentation |
|||
local qid,topic |
|||
function p.docConfTable( frame ) |
|||
local wikilink = function(qid,hideifequal) |
|||
local wikiTable = '{| class="wikitable sortable"\n'.. |
|||
local label,sitelink = mw.wikibase.getLabel(qid),mw.wikibase.getSitelink(qid) |
|||
'! rowspan=2 | 識別子\n'.. |
|||
if label then |
|||
'! rowspan=2 | グループ\n'.. |
|||
if sitelink then |
|||
'! rowspan=2 | 表示名\n'.. |
|||
local target = mw.title.new(sitelink) |
|||
'! rowspan=2; data-sort-type=number | ウィキデータのプロパティ\n'.. |
|||
if target==title or (target.isRedirect and target.redirectTarget==title) then -- do not link |
|||
'! colspan=4 | 追跡カテゴリのページ数\n'.. |
|||
return label |
|||
else -- make wikilink to article |
|||
'! [[:Category:典拠管理情報がある記事|'.. '記事]]\n'.. |
|||
return '[[' .. sitelink .. '|' .. label .. ']]' |
|||
'! [[:Category:典拠管理情報がある利用者ページ|'.. '利用者ページ]]\n'.. |
|||
end |
|||
'! [[:Category:典拠管理情報があるその他のページ|'.. 'その他のページ]]\n'.. |
|||
else |
|||
'! [[:Category:誤った典拠管理情報が指定されている記事|'..'誤った識別子]]\n'.. |
|||
return label |
|||
end |
|||
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 |
else |
||
auxCats = auxCats .. needsAttention('L') |
|||
appearsAs = conf[3](conf[5]) |
|||
return qid |
|||
end |
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 |
end |
||
if namespace == 0 then |
|||
qid = mw.wikibase.getEntityIdForCurrentPage() |
|||
--append derivative WorldCat cats |
|||
end |
|||
local wcd = { 'WorldCat-LCCN', 'WorldCat-VIAF' } |
|||
if qid then -- article is connected to Wikidata item |
|||
for _, w in pairs(wcd) do |
|||
if parentArgs.qid and (resolveQID(parentArgs.qid) ~= qid) then -- non-matching qid parameter |
|||
local articleCat = w..'識別子が指定されている記事' |
|||
auxCats = auxCats .. needsAttention('D') |
|||
local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') ) |
|||
end |
|||
local appearsAs |
|||
else -- page is not connected to any Wikidata item |
|||
if w == "WorldCat-LCCN" then |
|||
qid = resolveQID(parentArgs.qid) -- check qid parameter if no wikidata item is connected |
|||
appearsAs = "[https://www.worldcat.org/identities/lccn-n79-113947 WorldCat(アメリカ議会図書館経由)]" |
|||
if qid then -- qid parameter is valid, set topic to display |
|||
else |
|||
topic = mw.wikibase.getLabel(qid) |
|||
appearsAs = "[https://www.worldcat.org/identities/containsVIAFID/12345789 WorldCat(VIAF経由)]" |
|||
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 = '[[' .. 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'..tostring(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 |
||
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 |
end |
||
return require("Module:Suppress categories").main(wikiTable)..'\n|}' |
|||
end |
|||
local sections = {} |
|||
--[[==========================================================================]] |
|||
local localparams = false |
|||
--[[ Configuration ]] |
|||
local numsections = 0 |
|||
--[[==========================================================================]] |
|||
for _,_ in ipairs(config.sections) do numsections = numsections + 1 end |
|||
for _ = 1,#qids+numsections do table.insert(sections,{}) end |
|||
local qslink = '' -- setup link to add using QuickStatements |
|||
-- check which identifiers to show/suppress in template |
|||
-- 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 show = {} -- setup list |
|||
local showall = true |
|||
local function stripP(pid) |
|||
-- Parameter format: { 'parameter name', propertyId # in Wikidata, formatting/validation function, section, example ID for documentation } |
|||
if pid:match("^[Pp]%d+$") then |
|||
-- Optional named parameters: `link` to override the link in the documentation (defaults to parameter + (identifer)), |
|||
pid = mw.ustring.gsub(pid,'[Pp]','') --strip P from property number |
|||
-- category to override the ID in category names (defaults to parameter), |
|||
end |
|||
-- prefix to include a prefix (usually a wikilink explaining what the identifier is) before the external link itself |
|||
if pid:match("^%d+$") then |
|||
p.conf = { |
|||
return tonumber(pid) |
|||
{ 'AAG', 3372, p.aagLink, "美術館と博物館", "1", link = ":en:AAG (identifier)"}, |
|||
{ 'ACM-DL', 864, p.acmLink, "科学データベース", "12345678901", link="ACM DL (識別子)"}, |
|||
{ 'ADB', 1907, p.adbLink, "人名辞典", "barton-sir-edmund-toby-71", link = ":en:ADB (identifier)"}, |
|||
{ 'AGSA', 6804, p.agsaLink, "美術館と博物館", "3625"}, |
|||
{ 'autores.uy', 2558, p.autoresuyLink, "人名辞典", "12345"}, |
|||
{ 'AWR', 4186, p.awrLink, "人名辞典", "PR00768b", link = ":en:AWR (identifier)"}, |
|||
{ 'BIBSYS', 1015, p.bibsysLink, "国立図書館", "1234567890123", link = ":en:BIBSYS (identifier)"}, |
|||
{ 'Bildindex', 2092, p.bildLink, "美術研究組織", "1", link = ":en:Bildindex (identifier)"}, |
|||
{ 'BNC', 1890, p.bncLink, "国立図書館", "123456789", link = ":en:BNC (identifier)"}, |
|||
{ 'BNE', 950, p.bneLink, "国立図書館", "XX1234567"}, |
|||
{ 'BNF', 268, p.bnfLink, "国立図書館", "123456789"}, |
|||
{ 'Botanist', 428, p.botanistLink , "科学データベース", "L."}, |
|||
{ 'BPN', 651, p.bpnLink , "人名辞典", "12345678", link = ":en:BPN (identifier)"}, |
|||
{ 'CANTIC', 1273, p.canticLink, "国立図書館", "a12345678", link = ":en:CANTIC (identifier)"}, |
|||
{ 'CINII', 271, p.ciniiLink, "科学データベース", "DA12345678", link = "CiNii (識別子)"}, |
|||
{ 'CWGC', 1908, p.cwgcLink, "その他", "1234567"}, |
|||
{ 'DAAO', 1707, p.daaoLink, "美術研究組織", "rolf-harris", link = ":en:DAAO (identifier)"}, |
|||
{ 'DBLP', 2456, p.dblpLink, "科学データベース", "123/123"}, |
|||
{ 'DIB', 6829, p.dibLink, "人名辞典", "a1234", link = ":en:DIB (identifier)"}, |
|||
{ 'DSI', 2349, p.dsiLink, "美術研究組織", "1538", link = ":en:DSI (identifier)"}, |
|||
{ 'FAST', 2163, p.fastLink, "その他", "1", link = ":en:FAST (identifier)"}, |
|||
{ 'FNZA', 6792, p.fnzaLink, "美術研究組織", "12", link = ":en:FNZA (identifier)"}, |
|||
{ 'GND', 227, p.gndLink, "全般", "4079154-3"}, |
|||
{ 'HDS', 902, p.hdsLink, "その他", "050123"}, |
|||
{ 'IAAF', 1146, p.iaafLink, "その他", "123"}, |
|||
{ 'ICCU', 396, p.iccuLink, "国立図書館", "IT\\ICCU\\CFIV\\000163", link = ":en:ICCU (identifier)"}, --formerly SBN |
|||
{ 'ICIA', 1736, p.iciaLink, "美術研究組織", "1", link = ":en:ICIA (identifier)"}, |
|||
{ 'IEU', 9070, p.ieuLink, "その他", "N\\A\\NationalAcademyofArtandArchitecture", link = ":en:IEU (identifier)"}, |
|||
{ 'ISNI', 213, p.isniLink, "全般", "0000-0000-6653-4145", prefix = '[[ISNI (識別子)|ISNI]]'}, |
|||
{ 'Joconde', 347, p.jocondeLink, "美術研究組織", "12345678901", link = ":en:Joconde (identifier)"}, |
|||
{ 'KULTURNAV', 1248, p.kulturnavLink, "美術研究組織", "12345678-1234-1234-1234-1234567890AB", link=":en:KulturNav (identifier)"}, |
|||
{ 'LCCN', 244, p.lccnLink, "国立図書館", "n78039510"}, |
|||
{ 'LIR', 886, p.lirLink, "その他", "1"}, |
|||
{ 'LNB', 1368, p.lnbLink, "国立図書館", "123456789", link = ":en:LNB (identifier)"}, |
|||
{ 'Léonore', 640, p.leonoreLink, "その他", "LH/1/1", prefix = "[[:en:Léonore (identifier)|Léonore(フランス)]]"}, |
|||
{ 'MA', 6366, p.maLink, "その他", "123456789", link = ":en:MA (identifier)"}, |
|||
{ 'MBA', 434, p.mbaLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz'}, --special cat name |
|||
{ 'MBAREA', 982, p.mbareaLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz地域' }, --special cat name |
|||
{ 'MBI', 1330, p.mbiLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz楽器' }, --special cat name |
|||
{ 'MBL', 966, p.mblLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainzレーベル' }, --special cat name |
|||
{ 'MBP', 1004, p.mbpLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz場所' }, --special cat name |
|||
{ 'MBRG', 436, p.mbrgLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainzリリース・グループ' }, --special cat name |
|||
{ 'MBS', 1407, p.mbsLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainzシリーズ' }, --special cat name |
|||
{ 'MBW', 435, p.mbwLink, "その他", "12345678-1234-1234-1234-1234567890AB", category = 'MusicBrainz作品' }, --special cat name |
|||
{ 'MGP', 549, p.mgpLink, "科学データベース", "123456"}, |
|||
{ 'NARA', 1225, p.naraLink, "その他", "12345678"}, |
|||
{ 'NCL', 1048, p.nclLink, "国立図書館", "1081436"}, |
|||
{ 'NDL', 349, p.ndlLink, "国立図書館", "012345678"}, |
|||
{ 'NGV', 2041, p.ngvLink, "美術館と博物館", "12354"}, |
|||
{ 'NKC', 691, p.nkcLink, "国立図書館", "abcd12345678901234", link = ":en:NKC (identifier)"}, |
|||
{ 'NLA', 409, p.nlaLink, "国立図書館", "123456789012"}, |
|||
{ 'NLG', 3348, p.nlgLink, "国立図書館", "12345678", link = ":en:NLG (identifier)"}, |
|||
{ 'NLI', 949, p.nliLink, "国立図書館", "123456789"}, |
|||
{ 'NLK', 5034, p.nlkLink, "国立図書館", "KAB197000000"}, |
|||
{ 'NLP', 1695, p.nlpLink, "国立図書館", "9810123456789012345"}, |
|||
{ 'NLR', 1003, p.nlrLink, "国立図書館", "123456789"}, |
|||
{ 'NSK', 1375, p.nskLink, "国立図書館", "123456789", link = ":en:NSK (identifier)"}, |
|||
{ 'NTA', 1006, p.ntaLink, "国立図書館", "12345678X", link = ":en:NTA (identifier)"}, |
|||
{ 'ORCID', 496, p.orcidLink, "全般", "0000-0002-7398-5483", prefix = '[[ORCID (識別子)|ORCID]]'}, |
|||
{ 'PIC', 2750, p.picLink, "美術研究組織", "1", link = ":en:PIC (identifier)"}, |
|||
{ 'PLWABN', 7293, p.plwabnLink, "国立図書館", "9812345678905606"}, |
|||
{ 'Publons', 3829, p.publonsLink, "科学データベース", "2776255", link = ":en:Publons (identifier)"}, |
|||
{ 'RID', 1053, p.ridLink, "科学データベース", "A-1234-1934"}, |
|||
{ 'RISM', 5504, p.rismLink, "その他", "pe1", prefix = '[[:en:RISM (identifier)|RISM(フランス)]]'}, |
|||
{ 'RERO', 3065, p.reroLink, "その他", "02-A012345678", prefix = '[[:en:RERO (identifier)|RERO(スイス)]]'}, |
|||
{ 'RKDartists', 650, p.rkdartistsLink, "美術研究組織", "123456"}, |
|||
{ 'RKDID', 350, p.rkdidLink, "美術研究組織", "123456"}, |
|||
{ 'RSL', 947, p.rslLink, "国立図書館", "123456789"}, |
|||
{ 'SELIBR', 906, p.selibrLink, "国立図書館", "123456", link = ":en:SELIBR (identifier)"}, |
|||
{ 'SIKART', 781, p.sikartLink, "美術研究組織", '123456789', link = ":en:SIKART (identifier)"}, |
|||
{ 'SNAC-ID', 3430, p.snacLink, "その他", "A"}, |
|||
{ 'SUDOC', 269, p.sudocLink, "その他", "026927608", prefix = '[[SUDOC (識別子)|SUDOC(フランス)]]'}, |
|||
{ 'S2AuthorId', 4012, p.s2authoridLink, "科学データベース", "1796130", category = 'Semantic Scholar著者', link = ":en:S2AuthorId (identifier)" }, --special cat name |
|||
{ 'TA98', 1323, p.ta98Link, "科学データベース", "A12.3.45.678", link = ":en:TA98 (identifier)"}, |
|||
{ 'TDVİA', 7314, p.tdviaLink, "その他", "asim-b-behdele", link = ":en:TDVİA (identifier)"}, |
|||
{ 'TePapa', 3544, p.tepapaLink, "美術館と博物館", "1"}, |
|||
{ 'TLS', 1362, p.tlsLink, "その他", "Abcd", link = ":en:TLS (identifier)"}, |
|||
{ 'Trove', 1315, p.troveLink, "その他", "12345678", prefix = '[[:en:Trove (identifier)|Trove(オーストラリア)]]'}, --formerly NLA-person |
|||
{ 'UKPARL', 6213, p.ukparlLink, "その他", "AQUupyiR"}, |
|||
{ 'ULAN', 245, p.ulanLink, "美術研究組織", "500123456", link = ":en:ULAN (identifier)"}, |
|||
{ 'USCongress', 1157, p.uscongressLink, "その他", "A000123", link = ":en:US Congress (identifier)"}, |
|||
{ 'VcBA', 8034, p.vcbaLink, "国立図書館", "494/9793"}, |
|||
{ 'VIAF', 214, p.viafLink, "全般", "123456789", prefix = "[[VIAF (識別子)|VIAF]]"}, |
|||
{ 'WORLDCATID', 7859, nil, "全般", nil, link = "WorldCat Identities (識別子)"}, |
|||
} |
|||
-- Legitimate aliases to p.conf, for convenience |
|||
-- Format: { 'alias', 'parameter name in p.conf' } |
|||
p.aliases = { |
|||
{ 'DNB', 'GND' }, --Deutsche Nationalbibliothek -> Gemeinsame Normdatei |
|||
{ 'Leonore', 'Léonore' }, --alias name without diacritics |
|||
{ 'leonore', 'Léonore' }, --lowercase variant without diacritics |
|||
{ 'MusicBrainz', 'MBA' }, |
|||
{ 'MusicBrainz artist', 'MBA' }, |
|||
{ 'MusicBrainz label', 'MBL' }, |
|||
{ 'MusicBrainz release group', 'MBRG' }, |
|||
{ 'MusicBrainz work', 'MBW' }, |
|||
{ 'SBN', 'ICCU' }, --SBN alias to be deprecated at a later stage |
|||
{ 'TDVIA', 'TDVİA' }, --alias name without diacritics |
|||
{ 'tdvia', 'TDVİA' }, --lowercase variant without diacritics |
|||
} |
|||
-- Deprecated aliases to p.conf; tracked in [[Category:Wikipedia articles with deprecated authority control identifiers]] |
|||
-- Format: { 'deprecated parameter name', 'replacement parameter name in p.conf' } |
|||
p.deprecated = { |
|||
{ 'GKD', 'GND' }, |
|||
{ 'PND', 'GND' }, |
|||
{ 'RLS', 'RSL' }, |
|||
{ 'SWD', 'GND' }, |
|||
{ 'NARA-organization', 'NARA' }, |
|||
{ 'NARA-person', 'NARA' }, |
|||
} |
|||
--[[==========================================================================]] |
|||
--[[ Main ]] |
|||
--[[==========================================================================]] |
|||
function p.authorityControl( frame ) |
|||
local resolveEntity = require( "Module:ResolveEntityId" ) |
|||
local parentArgs = frame:getParent().args --WD IDs added here later |
|||
local iParentArgs = 0 --count original/manual parent args only later |
|||
local worldcatCat = '' |
|||
local multipleIdCat = '' |
|||
local suppressedIdCat = '' |
|||
local deprecatedIdCat = '' |
|||
local differentOnWDCat = '' |
|||
local sameOnWDCat = '' |
|||
--Redirect aliases to proper parameter names |
|||
for _, a in pairs( p.aliases ) do |
|||
local alias, param = a[1], a[2] |
|||
if (parentArgs[param] == nil or parentArgs[param] == '') and parentArgs[alias] then |
|||
parentArgs[param] = parentArgs[alias] |
|||
end |
end |
||
end |
end |
||
local function addshowlist(list) |
|||
if list and list ~= '' then |
|||
--Redirect deprecated parameters to proper parameter names, and assign tracking cat |
|||
for _,v in ipairs(mw.text.split(string.lower(list),"%s*,%s*")) do |
|||
local |
local vprop = stripP(v) |
||
if vprop then -- e.g. show=P214 to show one particular property |
|||
if (parentArgs[param] == nil or parentArgs[param] == '') and parentArgs[dep] then |
|||
show[vprop] = true |
|||
else -- e.g. show=arts to use whitelist |
|||
if namespace == 0 then |
|||
if config.whitelists[v] then |
|||
deprecatedIdCat = '[[Category:非推奨の典拠管理識別子が指定されている記事|'..dep..']]' |
|||
for _,w in ipairs(config.whitelists[v].properties) do |
|||
show[w] = true |
|||
end |
|||
end |
|||
end |
|||
end |
end |
||
showall = false |
|||
end |
end |
||
end |
end |
||
addshowlist(frame.args.show) -- check show= parameter on wrapper template |
|||
addshowlist(parentArgs.show or parentArgs.country) -- check show parameter on article template |
|||
--Use QID= parameter for testing/example purposes only |
|||
if parentArgs.suppress then |
|||
local itemId = nil |
|||
local suppresslist = mw.text.split(parentArgs.suppress,"%s*,%s*") -- split parameter by comma |
|||
if namespace ~= 0 then |
|||
for _,v in ipairs(suppresslist) do |
|||
local qid = parentArgs['qid'] or parentArgs['QID'] |
|||
v = stripP(string.upper(v)) |
|||
if qid then |
|||
if v then |
|||
itemId = 'Q'..mw.ustring.gsub(qid, '^[Qq]', '') |
|||
show[v] = false |
|||
itemId = resolveEntity._id(itemId) --nil if unresolvable |
|||
auxCats = auxCats .. '[[' .. config.i18n.category .. ':' .. config.i18n.suppressedcat .. ']]' |
|||
else |
|||
auxCats = auxCats .. needsAttention('P') |
|||
end |
|||
end |
end |
||
else |
|||
itemId = mw.wikibase.getEntityIdForCurrentPage() |
|||
end |
end |
||
local function makeSections(qid,addit) |
|||
--Wikidata fallback if available |
|||
local tval = {} |
|||
if itemId then |
|||
local |
local function parameter_is_used(property) |
||
local used = false |
|||
for _, params in ipairs( p.conf ) do |
|||
if |
if property then |
||
if tval[property] then |
|||
if tval[property][1] then |
|||
used = true |
|||
end |
|||
elseif tval[property] == false then -- property has been manually suppressed |
|||
used = true |
|||
end |
|||
end |
|||
return used |
|||
end |
|||
for _, params in ipairs(conf) do |
|||
tval[params.property] = getIdsFromWikidata(qid, 'P' .. params.property) -- setup table for values with property number as key |
|||
local showb = true |
|||
if (show[params.property] == nil) and (show[string.upper(params[1])] == nil ) then |
|||
showb = showall -- if not specified then depends on showall |
|||
elseif (show[params.property] == false) or (show[string.upper(params[1])] == false) then -- if either are false then id will be suppressed |
|||
showb = false |
|||
end |
|||
if not showb then |
|||
tval[params.property] = false -- indicates the identifier is suppressed |
|||
elseif not addit then |
|||
local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]] |
local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]] |
||
if val |
if val and val~='' then -- add local parameter to list if not already in |
||
localparams = true |
|||
local wikidataIds = p.getIdsFromWikidata( itemId, 'P'..params[2] ) |
|||
local bnew = true |
|||
for _, w in pairs(tval[params.property]) do |
|||
if val == '' and (namespace == 0 or testcases) then |
|||
if val == w.id then |
|||
suppressedIdCat = '[[Category:抑制された典拠管理識別子がある記事|'..params[1]..']]' |
|||
bnew = false |
|||
parentArgs[params[1]] = wikidataIds[1] --add ID from WD |
|||
end |
end |
||
end |
end |
||
if bnew then -- add new value to table |
|||
else |
|||
if qid then |
|||
iParentArgs = iParentArgs + 1 |
|||
-- 末尾はQ328(英語版ウィキペディア)ではなくQ177837(日本語版ウィキペディア)とする |
|||
local wikidataIds = p.getIdsFromWikidata( itemId, 'P'..params[2] ) |
|||
qslink = qslink .. '%7C%7C' .. qid .. '%7CP' .. params.property .. '%7C%22' .. mw.uri.encode(val,"PATH") .. '%22%7CS143%7CQ177837' |
|||
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 |
end |
||
table.insert(tval[params.property],{id=val,name=''}) |
|||
if bMatch == false then |
|||
end |
|||
differentOnWDCat = '[[Category:ウィキデータと異なる典拠管理識別子をパラメータで指定しているページ|'..params[1]..']]' |
|||
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 |
||
local suppress = false |
|||
end |
|||
if params.suppressedbyproperty then |
|||
--collect other unique vals (IDs) from WD, if present |
|||
for _,sc in ipairs(params.suppressedbyproperty) do |
|||
if itemId and tval[1] then |
|||
if parameter_is_used(sc) then |
|||
local nextIdVal = 2 |
|||
suppress = true |
|||
local wikidataIds = p.getIdsFromWikidata( itemId, 'P'..params[2] ) |
|||
end |
|||
for _, v in pairs( wikidataIds ) do |
|||
local bnew = true |
|||
for _, w in pairs( tval ) do |
|||
if v == w then bnew = false end |
|||
end |
end |
||
end |
|||
if bnew then |
|||
if tval[params.property] ~= false and not suppress then |
|||
table.insert( tval, v ) |
|||
local tlinks = {} -- setup table for links |
|||
local nextIdVal = 1 |
|||
local row = '' |
|||
for _,val in ipairs(tval[params.property]) do |
|||
local link = _makelink(params,val,nextIdVal,qid) |
|||
row = row .. link |
|||
table.insert(tlinks,link) |
|||
nextIdVal = nextIdVal + 1 |
nextIdVal = nextIdVal + 1 |
||
end |
end |
||
if nextIdVal>=2 then |
|||
end |
|||
row = row .. '\n' |
|||
end |
|||
table.insert(sections[addit or params.section],row) |
|||
--assemble |
|||
rct = true |
|||
if tval[1] then |
|||
end |
|||
table.insert( sections[params[4]], p.createRow( params[1], tval, nil, tlinks, true, params.category, params.prefix) ) |
|||
rct = rct + 1 |
|||
if tval[2] then |
|||
--multipleIdCat = p.getCatForId( 'multiple' ) -- 日本語版でのカテゴリ導入は様子を見てから |
|||
end |
end |
||
end |
end |
||
end |
end |
||
local function pencil(qid) |
|||
if not qid then |
|||
--WorldCat |
|||
return '' |
|||
local worldcatId = parentArgs['worldcatid'] or parentArgs['WORLDCATID'] |
|||
if worldcatId and worldcatId ~= '' then --if WORLDCATID present & unsuppressed |
|||
table.insert( sections["全般"], p.createRow( 'WORLDCATID', worldcatId, '[https://www.worldcat.org/identities/'..mw.uri.encode(worldcatId, 'PATH')..' WorldCat]', nil, false ) ) --Validation? |
|||
worldcatCat = p.getCatForId( 'WORLDCATID' ) |
|||
rct = rct + 1 |
|||
elseif worldcatId == nil then --if WORLDCATID absent but unsuppressed |
|||
local viafId = parentArgs['viaf'] or parentArgs['VIAF'] |
|||
local lccnId = parentArgs['lccn'] or parentArgs['LCCN'] |
|||
if viafId and viafId ~= '' and p.viafLink( viafId ) then --VIAF must be present, unsuppressed, & validated |
|||
table.insert( sections["全般"], p.createRow( 'VIAF', viafId, '[https://www.worldcat.org/identities/containsVIAFID/'..viafId..' WorldCat(VIAF経由)]', nil, false ) ) |
|||
if namespace == 0 then |
|||
worldcatCat = '[[Category:WorldCat-VIAF識別子が指定されている記事]]' |
|||
end |
|||
rct = rct + 1 |
|||
elseif lccnId and lccnId ~= '' and p.lccnLink( lccnId ) then --LCCN must be present, unsuppressed, & validated |
|||
local lccnParts = p.splitLccn( lccnId ) |
|||
if lccnParts and lccnParts[1] ~= 'sh' then |
|||
local lccnIdFmtd = lccnParts[1]..lccnParts[2]..'-'..lccnParts[3] |
|||
table.insert( sections["全般"], p.createRow( 'LCCN', lccnId, '[https://www.worldcat.org/identities/lccn-'..lccnIdFmtd..' WorldCat(アメリカ国会図書館経由)]', nil, false ) ) |
|||
if namespace == 0 then |
|||
worldcatCat = '[[Category:WorldCat-LCCN識別子が指定されている記事]]' |
|||
end |
|||
end |
|||
rct = rct + 1 |
|||
end |
end |
||
local args = { pid = 'identifiers' } -- #target the list of identifiers |
|||
elseif worldcatId == '' then --if WORLDCATID suppressed |
|||
args.qid = qid |
|||
suppressedIdCat = '[[Category:抑制された典拠管理識別子がある記事|WORLDCATID]]' |
|||
return require('Module:EditAtWikidata')._showMessage(args) |
|||
end |
end |
||
makeSections(qid,false) |
|||
local Navbox = require('Module:Navbox') |
|||
for c = 1,#qids do |
|||
local elementsCat = '' |
|||
makeSections(qids[c],numsections+c) |
|||
if rct == 0 or rct >= 25 then |
|||
local eCat = rct..'種類以上の識別子があるページ' |
|||
--elementsCat = '[[Category:'..eCat..']]'..p.redCatLink(eCat) |
|||
elementsCat = '' --25種類以上の識別子が指定された場合、追跡カテゴリをつけるという機能は日本語版では導入されていない |
|||
end |
end |
||
--configure Navbox |
|||
local outString = '' |
local outString = '' |
||
if rct |
if rct or localparams then -- there is at least one link to display |
||
local |
local Navbox = require('Module:Navbox') |
||
local sect,lastsect = 0,0 |
|||
local args = { pid = 'identifiers' } -- #target the list of identifiers |
|||
if testcases and itemId then args = { pid = 'identifiers', qid = itemId } end --expensive |
|||
local pencil = frame:expandTemplate{ title = 'EditAtWikidata', args = args} |
|||
local navboxArgs = { |
local navboxArgs = { |
||
name = ' |
name = 'Authority control', |
||
navboxclass = 'authority-control', |
navboxclass = 'authority-control', |
||
bodyclass = 'hlist', |
bodyclass = 'hlist', |
||
state = parentArgs.state or |
state = parentArgs.state or config.i18n.autocollapse, |
||
navbar = 'off' |
navbar = 'off' |
||
} |
} |
||
for |
for c=1,numsections+#qids do |
||
if #sections[ |
if #sections[c] ~= 0 then -- section is non-empty |
||
sect = sect + 1 |
|||
navboxArgs["group" .. sectionID] = sectName |
|||
lastsect = c |
|||
navboxArgs["list" .. sectionID] = table.concat(sections[sectName]) |
|||
local sectname |
|||
sectionID = sectionID + 1 |
|||
if c <= numsections then -- regular section |
|||
sectname = config.sections[c].name |
|||
else -- section from additional qid |
|||
local qid = qids[c-numsections] |
|||
sectname = wikilink(qid) .. pencil(qid) |
|||
end |
|||
navboxArgs['group' .. c] = sectname |
|||
navboxArgs['list' .. c] = table.concat(sections[c]) |
|||
end |
end |
||
end |
end |
||
if |
if localparams then |
||
lastsect = lastsect + 1 |
|||
navboxArgs.title = "[[Help:典拠管理|典拠管理]]" .. pencil |
|||
sect = sect + 1 |
|||
else |
|||
navboxArgs['group' .. lastsect] = config.i18n.warning |
|||
local sect = navboxArgs.group1 |
|||
local warning = frame:expandTemplate{title = config.i18n.errortemplate, args = {config.i18n.localparams}} |
|||
if sect == "全般" or sect == "その他" then |
|||
if qslink ~= '' then |
|||
-- Just say "Authority control" with no label if only general or only other IDs are present |
|||
warning = warning .. ' ' .. config.i18n.movetowd .. '<span class="qs autoconfirmed-show"> [[File:Commons to Wikidata QuickStatements.svg|20px|link=https://quickstatements.toolforge.org/#/v1=' .. qslink .. '|' .. config.i18n.addtowd .. ']]</span>' |
|||
-- since "general" is redundant and "other" is silly when there's nothing to contrast it with |
|||
elseif not qid then |
|||
navboxArgs.group1 = "[[Help:典拠管理|典拠管理]]" .. pencil |
|||
if namespace == 0 then |
|||
else |
|||
warning = warning .. ' ' .. config.i18n.connecttowd |
|||
navboxArgs.group1 = "[[Help:典拠管理|典拠管理:" .. sect .. "]] " .. pencil |
|||
elseif namespace==14 or namespace==2 or namespace==118 then |
|||
warning = warning .. ' ' .. config.i18n.qidcode |
|||
end |
|||
end |
end |
||
navboxArgs['list' .. lastsect] = warning |
|||
end |
|||
if topic then -- display in expanded form with topic |
|||
navboxArgs.title = config.i18n.aclink .. ' – ' .. 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 |
end |
||
outString = Navbox._navbox(navboxArgs) |
outString = Navbox._navbox(navboxArgs) |
||
else -- 典拠管理識別子が1つもない |
|||
if namespace == 0 or testcases then |
|||
auxCats = auxCats .. addCat('典拠管理識別子が1つもない記事') |
|||
end |
|||
end |
end |
||
if parentArgs.state |
|||
local auxCats = worldcatCat .. elementsCat .. multipleIdCat .. suppressedIdCat .. |
|||
and parentArgs.state~='' |
|||
deprecatedIdCat .. differentOnWDCat .. sameOnWDCat |
|||
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 |
if testcases then |
||
auxCats = mw.ustring.gsub(auxCats, '(%[%[)( |
auxCats = mw.ustring.gsub(auxCats, '(%[%[)(' .. config.i18n.category .. ')', '%1:%2') --for easier checking |
||
end |
end |
||
outString = outString .. auxCats |
|||
--out |
|||
outString = outString..auxCats |
|||
if namespace ~= 0 then |
if namespace ~= 0 then |
||
-- 日本語版独自の変更あり |
|||
outString = mw.ustring.gsub(outString, '(%[%[)(Category:[^%]]*記事)', '%1:%2') --by definition |
|||
outString = mw.ustring.gsub(outString,'(%[%[)(' .. config.i18n.category .. ':)([^%|%]]+' .. config.i18n.Articles .. ')%|?[^%|%]]*(%]%])','%1:%2%3%4') |
|||
end |
end |
||
local check = require('Module:Check for unknown parameters')._check |
|||
local sortkey |
|||
if namespace == 0 then |
|||
sortkey = '*' .. title.text |
|||
else |
|||
sortkey = title.fullText |
|||
end |
|||
outString = outString .. check({ |
|||
['unknown'] = '[[' .. config.i18n.category .. ':' .. config.i18n.pageswithparams .. '|' .. sortkey .. ']]', |
|||
['preview'] = config.i18n.previewwarning, 'show', 'country', 'suppress', 'additional', 'qid', 'state' |
|||
}, parentArgs) |
|||
return outString |
return outString |
||
end |
|||
p.makelink = function(conf,val,nextid,qid) |
|||
return _makelink(conf,val,nextid,qid) |
|||
end |
end |
||
2023年8月31日 (木) 12:46時点における最新版
このモジュールについての説明文ページを モジュール:Authority control/doc に作成できます
require('strict')
local p = {}
local configfile = 'Module:Authority control/config' -- default configuation module
local arg = mw.getCurrentFrame().args.config
if arg and arg~='' then
configfile = 'Module:Authority control/config/' .. arg
end
local config
if mw.title.new(configfile).exists then
config = mw.loadData(configfile)
else
return error('Invalid configuration file',0)
end
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
local testcases = title.subpageText == config.i18n.testcases
local function needsAttention(sortkey)
return '[[' .. config.i18n.category .. ':' .. config.i18n.attentioncat .. '|' .. sortkey .. title.text .. ']]'
end
local function addCat(cat,sortkey)
if cat and cat ~= '' and (namespace == 0 or namespace == 14 or testcases) then
local redlinkcat = ''
if testcases == false and mw.title.new(cat, 14).exists == false then
redlinkcat = needsAttention('N')
end
if sortkey then
cat = '[[' .. config.i18n.category .. ':'..cat..'|' .. sortkey .. title.text .. ']]'
else
cat = '[[' .. config.i18n.category .. ':'..cat..']]'
end
cat = cat .. redlinkcat
return cat
else
return ''
end
end
local function getCatForId(id,faulty)
local cat = string.format(
config.i18n.cat,
faulty and config.i18n.faulty..id or id
)
return addCat(cat)
end
local function getIdsFromWikidata(qid,property)
local function getquals(statement,qualid)
if statement.qualifiers and statement.qualifiers['P'..qualid] then
return mw.wikibase.renderSnak(statement.qualifiers['P'..qualid][1])
else
return false
end
end
local ids = {}
if qid then
for _, statement in ipairs(mw.wikibase.getBestStatements(qid,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
return ids
end
local _makelink = function(conf,val,nextid,qid) --validate values and create a link
local function tooltip(text,label)
if label and label~='' then
return mw.getCurrentFrame():expandTemplate{title = "Tooltip", args = {text,label}}
else
return text
end
end
local link
if nextid==1 then
if conf.prefix then
link = '*' .. conf.prefix .. '\n**'
else
link = '*'
end
else
link = '\n**'
end
local valid_value = false
if conf.customlink then -- use function to validate and generate link
local label = nextid>1 and nextid
local newlink= require(config.auxiliary)[conf.customlink](val.id,label)
if newlink then
link = link .. newlink
valid_value = true
end
else
if conf.pattern then -- use pattern to determine validity if defined
valid_value = string.match(val.id,'^'..conf.pattern..'$')
elseif conf.patterns then
for _,pattern in ipairs(conf.patterns) do
valid_value = val.id:match('^'..pattern..'$')
if valid_value then break end
end
elseif conf.valid then -- otherwise use function to determine validity
valid_value = require(config.auxiliary)[conf.valid](val.id)
else -- no validation possible
valid_value = val.id
end
if valid_value then
local newlink
local label = conf.label
if not label or nextid>1 then
label = tostring(nextid)
end
if conf.link then
valid_value = valid_value:gsub('%%', '%%%%')
newlink = '[' .. mw.ustring.gsub(conf.link,'%$1',valid_value) .. ' ' .. label .. ']'
else
newlink = valid_value
end
link = link .. '<span class="uid">'..tooltip(newlink,val.name)..'</span>'
end
end
if valid_value then
link = link .. getCatForId(conf.category or conf[1])
else
--local preview = require("Module:If preview")
local wdlink = qid and '[[:wikidata:' .. qid .. '#P' .. conf.property .. ']]' or ''
local tooltip = string.format(
config.i18n.idnotvalid,
conf[1],
val.id
)
link = link .. '[[File:' .. config.i18n.warningicon .. '|20px|frameless|link=' .. wdlink .. '|' .. tooltip .. ']]'
if conf.errorcat then
link = link .. addCat(conf.errorcat)
else
link = link .. getCatForId(conf.category or conf[1],true)
end
link = link .. addCat(config.i18n.allfaultycat,conf[1])-- .. preview._warning({'The '..conf[1]..' id '..val..' is not valid.'})
end
return link
end
--[[==========================================================================]]
--[[ Main ]]
--[[==========================================================================]]
function p.authorityControl(frame)
local function resolveQID(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
local wikilink = function(qid,hideifequal)
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
return label
else -- make wikilink to article
return '[[' .. sitelink .. '|' .. label .. ']]'
end
else
return label
end
else
auxCats = auxCats .. needsAttention('L')
return qid
end
end
if namespace == 0 then
qid = mw.wikibase.getEntityIdForCurrentPage()
end
if qid then -- article is connected to 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 = '[[' .. 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'..tostring(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 sections = {}
local localparams = false
local numsections = 0
for _,_ in ipairs(config.sections) do numsections = numsections + 1 end
for _ = 1,#qids+numsections do table.insert(sections,{}) end
local qslink = '' -- setup link to add using QuickStatements
-- check which identifiers to show/suppress in template
local show = {} -- setup list
local showall = true
local function stripP(pid)
if pid:match("^[Pp]%d+$") then
pid = mw.ustring.gsub(pid,'[Pp]','') --strip P from property number
end
if pid:match("^%d+$") then
return tonumber(pid)
end
end
local function addshowlist(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
showall = false
end
end
addshowlist(frame.args.show) -- check show= parameter on wrapper template
addshowlist(parentArgs.show or parentArgs.country) -- check show parameter on article template
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(string.upper(v))
if v then
show[v] = false
auxCats = auxCats .. '[[' .. config.i18n.category .. ':' .. config.i18n.suppressedcat .. ']]'
else
auxCats = auxCats .. needsAttention('P')
end
end
end
local function makeSections(qid,addit)
local tval = {}
local function parameter_is_used(property)
local used = false
if property then
if tval[property] then
if tval[property][1] then
used = true
end
elseif tval[property] == false then -- property has been manually suppressed
used = true
end
end
return used
end
for _, params in ipairs(conf) do
tval[params.property] = getIdsFromWikidata(qid, 'P' .. params.property) -- setup table for values with property number as key
local showb = true
if (show[params.property] == nil) and (show[string.upper(params[1])] == nil ) then
showb = showall -- if not specified then depends on showall
elseif (show[params.property] == false) or (show[string.upper(params[1])] == false) then -- if either are false then id will be suppressed
showb = false
end
if not showb then
tval[params.property] = false -- indicates the identifier is suppressed
elseif not addit then
local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]]
if val and val~='' then -- add local parameter to list if not already in
localparams = true
local bnew = true
for _, w in pairs(tval[params.property]) do
if val == w.id then
bnew = false
end
end
if bnew then -- add new value to table
if qid then
-- 末尾はQ328(英語版ウィキペディア)ではなくQ177837(日本語版ウィキペディア)とする
qslink = qslink .. '%7C%7C' .. qid .. '%7CP' .. params.property .. '%7C%22' .. mw.uri.encode(val,"PATH") .. '%22%7CS143%7CQ177837'
end
table.insert(tval[params.property],{id=val,name=''})
end
end
end
local suppress = false
if params.suppressedbyproperty then
for _,sc in ipairs(params.suppressedbyproperty) do
if parameter_is_used(sc) then
suppress = true
end
end
end
if tval[params.property] ~= false and not suppress then
local tlinks = {} -- setup table for links
local nextIdVal = 1
local row = ''
for _,val in ipairs(tval[params.property]) do
local link = _makelink(params,val,nextIdVal,qid)
row = row .. link
table.insert(tlinks,link)
nextIdVal = nextIdVal + 1
end
if nextIdVal>=2 then
row = row .. '\n'
table.insert(sections[addit or params.section],row)
rct = true
end
end
end
end
local function pencil(qid)
if not qid then
return ''
end
local args = { pid = 'identifiers' } -- #target the list of identifiers
args.qid = qid
return require('Module:EditAtWikidata')._showMessage(args)
end
makeSections(qid,false)
for c = 1,#qids do
makeSections(qids[c],numsections+c)
end
--configure Navbox
local outString = ''
if rct or localparams 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]
sectname = wikilink(qid) .. pencil(qid)
end
navboxArgs['group' .. c] = sectname
navboxArgs['list' .. c] = table.concat(sections[c])
end
end
if localparams then
lastsect = lastsect + 1
sect = sect + 1
navboxArgs['group' .. lastsect] = config.i18n.warning
local warning = frame:expandTemplate{title = config.i18n.errortemplate, args = {config.i18n.localparams}}
if qslink ~= '' then
warning = warning .. ' ' .. config.i18n.movetowd .. '<span class="qs autoconfirmed-show"> [[File:Commons to Wikidata QuickStatements.svg|20px|link=https://quickstatements.toolforge.org/#/v1=' .. qslink .. '|' .. config.i18n.addtowd .. ']]</span>'
elseif not qid then
if namespace == 0 then
warning = warning .. ' ' .. config.i18n.connecttowd
elseif namespace==14 or namespace==2 or namespace==118 then
warning = warning .. ' ' .. config.i18n.qidcode
end
end
navboxArgs['list' .. lastsect] = warning
end
if topic then -- display in expanded form with topic
navboxArgs.title = config.i18n.aclink .. ' – ' .. 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)
else -- 典拠管理識別子が1つもない
if namespace == 0 or testcases then
auxCats = auxCats .. addCat('典拠管理識別子が1つもない記事')
end
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')._check
local sortkey
if namespace == 0 then
sortkey = '*' .. title.text
else
sortkey = title.fullText
end
outString = outString .. check({
['unknown'] = '[[' .. config.i18n.category .. ':' .. config.i18n.pageswithparams .. '|' .. sortkey .. ']]',
['preview'] = config.i18n.previewwarning, 'show', 'country', 'suppress', 'additional', 'qid', 'state'
}, parentArgs)
return outString
end
p.makelink = function(conf,val,nextid,qid)
return _makelink(conf,val,nextid,qid)
end
return p