경고: 이 문서의 오래된 판을 편집하고 있습니다. 이것을 게시하면, 이 판 이후로 바뀐 모든 편집이 사라집니다. 귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!function getCatForId( id ) local title = mw.title.getCurrentTitle() local namespace = title.namespace if namespace == 0 then return '[[분류:' .. id .. ' 식별자를 포함한 위키백과 문서]]' elseif namespace == 2 and not title.isSubpage then return '[[분류:' .. id .. ' 식별자를 포함한 사용자 문서]]' else return '[[분류:' .. id .. ' 식별자를 포함한 기타 문서]]' end end function viafLink( id ) if not string.match( id, '^%d+$' ) then return false end return '[http://viaf.org/viaf/' .. id .. ' ' .. id .. ']' .. getCatForId( 'VIAF' ) end function lccnLink( id ) local parts = splitLccn( id ) if not parts then return false end id = parts[1] .. parts[2] .. append( parts[3], '0', 6 ) return '[http://id.loc.gov/authorities/names/' .. id .. ' ' .. id .. ']' .. getCatForId( 'LCCN' ) end function mbLink( id ) -- TODO Implement some sanity checking regex return '[//musicbrainz.org/artist/' .. id .. ' ' .. id .. ']' .. getCatForId( 'MusicBrainz' ) end function splitLccn( id ) 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 function append(str, c, length) while str:len() < length do str = c .. str end return str end function isniLink( id ) id = validateIsni( id ) if not id then return false end 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 --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 validateIsni( id ) 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 getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then return false end return id end --Returns the ISNI check digit isni must be a string where the 15 first elements are digits function 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 function orcidLink( id ) id = validateIsni( id ) 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 '[http://orcid.org/' .. id .. ' ' .. id .. ']' .. getCatForId( 'ORCID' ) end function gndLink( id ) return '[http://d-nb.info/gnd/' .. id .. ' ' .. id .. ']' .. getCatForId( 'GND' ) end function selibrLink( id ) if not string.match( id, '^%d+$' ) then return false end return '[http://libris.kb.se/auth/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SELIBR' ) end function bnfLink( id ) --Add cb prefix if it has been removed if not string.match( id, '^cb.+$' ) then id = 'cb' .. id end return '[http://catalogue.bnf.fr/ark:/12148/' .. id .. ' ' .. id .. ']' .. getCatForId( 'BNF' ) end function bpnLink( id ) if not string.match( id, '^%d+$' ) then return false end return '[http://www.biografischportaal.nl/persoon/' .. id .. ' ' .. id .. ']' .. getCatForId( 'BPN' ) end function ridLink( id ) return '[http://www.researcherid.com/rid/' .. id .. ' ' .. id .. ']' .. getCatForId( 'RID' ) end 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' ) end function ulanLink( id ) return '[http://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid=' .. id .. ' ' .. id .. ']' .. getCatForId( 'ULAN' ) end function nlaLink( id ) return '[http://nla.gov.au/anbd.aut-an' .. id .. ' ' .. id .. ']' .. getCatForId( 'NLA' ) end function ndlLink( id ) return '[http://id.ndl.go.jp/auth/ndlna/' .. id .. ' ' .. id .. ']' .. getCatForId( 'NDL' ) end function getIdsFromWikidata( item, property ) local ids = {} if not item.claims[property] then return ids end for _, statement in pairs( item.claims[property] ) do table.insert( ids, statement.mainsnak.datavalue.value ) end return ids end function matchesWikidataRequirements( item, reqs ) for _, group in pairs( reqs ) do local property = 'p' .. group[1] local qid = group[2] if item.claims[property] ~= nil then for _, statement in pairs ( item.claims[property] ) do if statement.mainsnak.datavalue ~= nil then if statement.mainsnak.datavalue.value['numeric-id'] == qid then return true end end end end end return false end function createRow( id, label, rawValue, link, withUid ) if link then if withUid then return '* ' .. label .. ' <span class="uid">' .. link .. '</span>\n' else return '* ' .. label .. ' ' .. link .. '\n' end else return '* <span class="error">' .. id .. ' id의 ' .. rawValue .. ' 는 유효하지 않습니다.</span>[[분류:잘못된 전거 통제 정보를 포함한 위키백과 문서]]\n' end end --In this order: name of the parameter, label, propertyId in Wikidata, formatting function local conf = { { 'VIAF', '[[가상 국제 전거 파일|VIAF]]', 214, viafLink }, { 'LCCN', '[[미국 의회도서관 제어 번호|LCCN]]', 244, lccnLink }, { 'ISNI', '[[국제 표준 명칭 식별자|ISNI]]', 213, isniLink }, { 'ORCID', '[[ORCID]]', 496, orcidLink }, { 'GND', '[[게마인사메 노름다타이|GND]]', 227, gndLink }, { 'SELIBR', '[[LIBRIS]]', 906, selibrLink }, { 'BNF', '[[프랑스 국립도서관|BNF]]', 268, bnfLink }, { 'BPN', '[[Biografisch Portaal|BPN]]', 651, bpnLink }, { 'RID', '[[ResearcherID]]', 0, ridLink }, { 'BIBSYS', '[[BIBSYS]]', 0, bibsysLink }, { 'ULAN', '[[Union List of Artist Names|ULAN]]', 245, ulanLink }, { 'MBA', '[[MusicBrainz]]', 434, mbLink }, { 'NLA', '[[오스트레일리아 국립도서관|NLA]]', 409, nlaLink }, { 'NDL', '[[국립국회도서관|NDL]]', 349, ndlLink }, } -- Check that the Wikidata item has this property-->value before adding it local reqs = {} reqs['MBA'] = { { 106, 177220 }, -- occupation -> singer { 31, 177220 }, -- instance of -> singer { 106, 13385019 }, -- occupation -> rapper { 31, 13385019 }, -- instance of -> rapper { 106, 639669 }, -- occupation -> musician { 31, 639669 }, -- instance of -> musician { 106, 36834 }, -- occupation -> composer { 31, 36834 }, -- instance of -> composer { 106, 488205 }, -- occupation -> singer-songwriter { 31, 488205 }, -- instance of -> singer-songwriter { 106, 183945 }, -- occupation -> record producer { 31, 183945 }, -- instance of -> record producer { 106, 10816969 }, -- occupation -> club DJ { 31, 10816969 }, -- instance of -> club DJ { 106, 130857 }, -- occupation -> DJ { 31, 130857 }, -- instance of -> DJ { 106, 158852 }, -- occupation -> conductor { 31, 158852 }, -- instance of -> conductor { 31, 215380 }, -- instance of -> band } local p = {} function p.authorityControl( frame ) local parentArgs = frame:getParent().args --Create rows local elements = {} --redirect PND to GND if (parentArgs.GND == nil or parentArgs.GND == '') and parentArgs.PND ~= nil and parentArgs.PND ~= '' then parentArgs.GND = parentArgs.PND end --Wikidata fallback if requested local item = mw.wikibase.getEntity() if item ~= nil and item.claims ~= nil then for _, params in pairs( conf ) do if params[3] ~= 0 then local val = parentArgs[params[1]] if not val or val == '' then 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 if parentArgs['WORLDCATID'] and parentArgs['WORLDCATID'] ~= '' then table.insert( elements, createRow( 'WORLDCATID', '', parentArgs['WORLDCATID'], '[http://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'], '[http://www.worldcat.org/identities/lccn-' .. lccnParts[1] .. lccnParts[2] .. '-' .. lccnParts[3] .. ' WorldCat]', false ) ) end end --Configured rows for k, params in pairs( conf ) do local val = parentArgs[params[1]] if val and val ~= '' then table.insert( elements, createRow( params[1], params[2] .. ':', val, params[4]( val ), true ) ) end end local Navbox = require('Module:Navbox') return Navbox._navbox( { name = 'Authority control', bodyclass = 'hlist', group1 = '[[전거 제어]]', list1 = table.concat( elements ) } ) end return p 편집 요약 가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 취소 편집 도움말 (새 창에서 열림) 이 문서에서 사용한 틀: 모듈:Authority control/설명문서 (편집)