Module:Authority control/auxiliary: Difference between revisions
From The Goon Show Depository
en>MSGJ (add customlink function for ccg) |
No edit summary |
||
(6 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
require('strict') | -- require('strict') | ||
local p = {} | local p = {} | ||
--[[======================================================]] | --[[======================================================]] | ||
--[[ Format validation functions ]] | --[[ Format validation functions ]] | ||
--[[======================================================]] | --[[======================================================]] | ||
p.botanistV | function p.botanistV(id) | ||
return mw.ustring.match(id,"^[%u%l%d%. '-]+$") | return mw.ustring.match(id,"^[%u%l%d%. '-]+$") | ||
end | end | ||
p. | -- NCDA: NOID Check Digit Algorithm; see [[wikipedia:Check digit#NCDA]] | ||
local ncda -- leave this as a local since NCDA is commonly used among ARK identifiers and could be useful for validating other identifiers later | |||
do -- initialize these constants only once but scope them in a block so local namespace doesn't get cluttered with these | |||
local r29s = [[0123456789bcdfghjkmnpqrstvwxz]] -- radix 29 "betanumeric" digit string | |||
local r29n = r29s:len() | |||
local r29v2d, r29d2v = {}, {} | |||
for i = 1, r29n do | |||
local v, d = i-1, r29s:sub(i, i) | |||
r29v2d[v], r29d2v[d] = d, v | |||
end | |||
function ncda(sid) | |||
local n, sum = sid:len(), 0 | |||
for i = 1, n do | |||
sum = sum + i * (r29d2v[sid:sub(i, i)] or 0) | |||
end | |||
return r29v2d[sum % r29n] | |||
end | |||
end | |||
function p.validateBNF(id) | |||
local FRBNF = id:sub(1, -2) | |||
return FRBNF:match('^%d%d%d%d%d%d%d%d$') ~= nil and ncda('cb'..FRBNF) == id:sub(-1) and id | |||
end | |||
function p.validateIsni(id) --Validate ISNI (and ORCID) and returns 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 | |||
id = id:gsub( '[ %-]', '' ):upper() | 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 | if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then | ||
Line 32: | Line 55: | ||
end | end | ||
function p.orcidV(id) | |||
p.orcidV | |||
id = p.validateIsni(id) | id = p.validateIsni(id) | ||
if not id then | if not id then | ||
Line 65: | Line 63: | ||
end | end | ||
p.tlsV | function p.tlsV(id) | ||
id = id:gsub(' +', '_') | id = id:gsub(' +', '_') | ||
local idlen = mw.ustring.len(id) | local idlen = mw.ustring.len(id) | ||
Line 76: | Line 74: | ||
end | end | ||
return id | return id | ||
end | end | ||
Line 98: | Line 79: | ||
--[[ Custom link functions ]] | --[[ Custom link functions ]] | ||
--[[======================================================]] | --[[======================================================]] | ||
p.ISILlink | function p.ISILlink(id,label) | ||
if not id:match('^%D%D?%D?%D?%-.+$') then | if not id:match('^%D%D?%D?%D?%-.+$') then | ||
return false | return false | ||
end | end | ||
for _,prefix in ipairs({'AT','AU','BE','CA','CH','DE','FI','FR','IT','KR','NZ','US','ZDB'}) do | for _, prefix in ipairs({'AT', 'AU', 'BE', 'CA', 'CH', 'DE', 'FI', 'FR', 'IT', 'KR', 'NZ', 'US', 'ZDB'}) do | ||
if id:match('^'..prefix..'%-') then | if id:match('^'..prefix..'%-') then | ||
return ' | return '[https://w3id.org/isil/'..id..' ' .. (label or 'ISIL') .. ']' | ||
end | end | ||
end | end | ||
return '[[International Standard Identifier for Libraries and Related Organizations|ISIL]] | return '[[International Standard Identifier for Libraries and Related Organizations|ISIL]]: ' .. id | ||
end | end | ||
p.uscgLink | function p.uscgLink(id) | ||
local id2 = id:match( '^[1-7]%-%d%d?%d?%d?%d?$' ) or id:match( '^[1-7]%-%d%d?%d?%d?%d?%.%d*[1-9]$' ) | local id2 = id:match( '^[1-7]%-%d%d?%d?%d?%d?$' ) or id:match( '^[1-7]%-%d%d?%d?%d?%d?%.%d*[1-9]$' ) | ||
if id2 then | if id2 then | ||
return ' | return '[https://www.navcen.uscg.gov/pdf/lightlists/LightList%20V'..mw.ustring.sub(id2,1,1)..'.pdf '..id2..']' | ||
else | else | ||
return false | return false | ||
Line 119: | Line 100: | ||
end | end | ||
p.ccg | function p.ccg(id) | ||
id = id:match('^[NAIP]?[1-9]%d*$') or id:match('^[NAIP]?[1-9]%d*%.%d+$') | id = id:match('^[NAIP]?[1-9]%d*$') or id:match('^[NAIP]?[1-9]%d*%.%d+$') | ||
if not id then return false end | if not id then return false end | ||
Line 128: | Line 109: | ||
local v | local v | ||
if prefix=='N' then | if prefix=='N' then | ||
local int = interval({1,7.5,14.4,100,121,173,211,235,269.99,326,396,450.1,471.7,499,n=suffix}) | local int = interval({1, 7.5, 14.4, 100, 121, 173, 211, 235, 269.99, 326, 396, 450.1, 471.7, 499, n=suffix}) | ||
if int=='1-2' then v = 1 | if int=='1-2' then v = 1 | ||
elseif int=='2-3' then v = 75 | elseif int=='2-3' then v = 75 | ||
Line 146: | Line 127: | ||
link = link .. 'publications/list-lights/newfoundland/n' .. v .. '-en' | link = link .. 'publications/list-lights/newfoundland/n' .. v .. '-en' | ||
elseif prefix=='A' then | elseif prefix=='A' then | ||
local int = interval({5,114.5,145,163,268,271,301.5,327,686.5,704.85,883.2,942,1085,1169.1,1584.5,1773,1823.55,2190,2369,2389,n=suffix}) | local int = interval({5, 114.5, 145, 163, 268, 271, 301.5, 327, 686.5, 704.85, 883.2, 942, 1085, 1169.1, 1584.5, 1773, 1823.55, 2190, 2369, 2389, n=suffix}) | ||
if int=='1-2' then v = 5 | if int=='1-2' then v = 5 | ||
elseif int=='2-3' then v = 1145 | elseif int=='2-3' then v = 1145 | ||
elseif int=='3-4' then v = 145 | elseif int=='3-4' then v = 145 | ||
elseif int=='4-5' then v = 162 | elseif int=='4-5' then v = 162 | ||
elseif int=='5-6' then v = | elseif int=='5-6' then v = 268 | ||
elseif int=='6-7' then v = | elseif int=='6-7' then v = 271 | ||
elseif int=='7-8' then v = | elseif int=='7-8' then v = 3015 | ||
elseif int=='8-9' then v = | elseif int=='8-9' then v = 327 | ||
elseif int=='9-10' then v = | elseif int=='9-10' then v = 6865 | ||
elseif int=='10-11' then v = | elseif int=='10-11' then v = 7048 | ||
elseif int=='11-12' then v = | elseif int=='11-12' then v = 883 | ||
elseif int=='12-13' then v = | elseif int=='12-13' then v = 942 | ||
elseif int=='13-14' then v = | elseif int=='13-14' then v = 1085 | ||
elseif int=='14-15' then v = | elseif int=='14-15' then v = 11691 | ||
elseif int=='15-16' then v = | elseif int=='15-16' then v = 15845 | ||
elseif int=='16-17' then v = | elseif int=='16-17' then v = 1773 | ||
elseif int=='17-18' then v = | elseif int=='17-18' then v = 182355 | ||
elseif int=='18-19' then v = | elseif int=='18-19' then v = 2190 | ||
elseif int=='19-20' then v = 2389 | elseif int=='19-20' then v = 2369 | ||
elseif int=='20-21' then v = 2389 | |||
end | end | ||
link = link .. 'publications/list-lights/atl/a' .. v .. '-en' | link = link .. 'publications/list-lights/atl/a' .. v .. '-en' | ||
elseif prefix=='I' then | elseif prefix=='I' then | ||
local int = interval({0.05,401.1,403.4,551.06,552,624,708,731.2,768,814,983,1046,1059.6,1082,1162,1204.7,1233.3,1328,1330,1346.2,1377.8,1408,1410,1420,1445,1470,1520,1534,1540.6,1554,1557.7,1558.8,1563.1,1625.5,1671.7,1716.96,2545,n=suffix}) | local int = interval({0.05, 401.1, 403.4, 551.06, 552, 624, 708, 731.2, 768, 814, 983, 1046, 1059.6, 1082, 1162, 1204.7, 1233.3, 1328, 1330, 1346.2, 1377.8, 1408, 1410, 1420, 1445, 1470, 1520, 1534, 1540.6, 1554, 1557.7, 1558.8, 1563.1, 1625.5, 1671.7, 1716.96, 2545, n=suffix}) | ||
if int=='1-2' then v = '01' | if int=='1-2' then v = '01' | ||
elseif int=='2-3' then v = 4011 | elseif int=='2-3' then v = 4011 | ||
Line 214: | Line 196: | ||
link = link .. 'list-lights' | link = link .. 'list-lights' | ||
end | end | ||
return '[[CCG (identifier)|CCG]] | return '[[CCG (identifier)|CCG]]: [' .. link .. ' ' .. id .. ']' | ||
end | end | ||
return p | return p |
Latest revision as of 07:12, 27 August 2024
-- require('strict')
local p = {}
--[[======================================================]]
--[[ Format validation functions ]]
--[[======================================================]]
function p.botanistV(id)
return mw.ustring.match(id,"^[%u%l%d%. '-]+$")
end
-- NCDA: NOID Check Digit Algorithm; see [[wikipedia:Check digit#NCDA]]
local ncda -- leave this as a local since NCDA is commonly used among ARK identifiers and could be useful for validating other identifiers later
do -- initialize these constants only once but scope them in a block so local namespace doesn't get cluttered with these
local r29s = [[0123456789bcdfghjkmnpqrstvwxz]] -- radix 29 "betanumeric" digit string
local r29n = r29s:len()
local r29v2d, r29d2v = {}, {}
for i = 1, r29n do
local v, d = i-1, r29s:sub(i, i)
r29v2d[v], r29d2v[d] = d, v
end
function ncda(sid)
local n, sum = sid:len(), 0
for i = 1, n do
sum = sum + i * (r29d2v[sid:sub(i, i)] or 0)
end
return r29v2d[sum % r29n]
end
end
function p.validateBNF(id)
local FRBNF = id:sub(1, -2)
return FRBNF:match('^%d%d%d%d%d%d%d%d$') ~= nil and ncda('cb'..FRBNF) == id:sub(-1) and id
end
function p.validateIsni(id) --Validate ISNI (and ORCID) and returns 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
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
local total = 0
for i = 1, 15 do
local digit = id:byte( i ) - 48 --Get integer value
total = (total + digit) * 2
end
local remainder = total % 11
local result = (12 - remainder) % 11
local checkdigit
if result == 10 then
checkdigit = 'X'
else
checkdigit=tostring( result )
end
if checkdigit ~= string.char( id:byte( 16 ) ) then
return false
end
return id
end
function p.orcidV(id)
id = p.validateIsni(id)
if not id then
return false
end
return id:sub( 1, 4 )..'-'..id:sub( 5, 8 )..'-'..id:sub( 9, 12 )..'-'..id:sub( 13, 16 )
end
function p.tlsV(id)
id = id:gsub(' +', '_')
local idlen = mw.ustring.len(id)
if idlen < 4 or idlen > 90 then
return false
end
local regex = '^%u'..string.rep("[%w_',%.%-%(%)%*%/–&]", idlen - 1)..'$'
if not mw.ustring.match(id,regex ) then
return false
end
return id
end
--[[======================================================]]
--[[ Custom link functions ]]
--[[======================================================]]
function p.ISILlink(id,label)
if not id:match('^%D%D?%D?%D?%-.+$') then
return false
end
for _, prefix in ipairs({'AT', 'AU', 'BE', 'CA', 'CH', 'DE', 'FI', 'FR', 'IT', 'KR', 'NZ', 'US', 'ZDB'}) do
if id:match('^'..prefix..'%-') then
return '[https://w3id.org/isil/'..id..' ' .. (label or 'ISIL') .. ']'
end
end
return '[[International Standard Identifier for Libraries and Related Organizations|ISIL]]: ' .. id
end
function p.uscgLink(id)
local id2 = id:match( '^[1-7]%-%d%d?%d?%d?%d?$' ) or id:match( '^[1-7]%-%d%d?%d?%d?%d?%.%d*[1-9]$' )
if id2 then
return '[https://www.navcen.uscg.gov/pdf/lightlists/LightList%20V'..mw.ustring.sub(id2,1,1)..'.pdf '..id2..']'
else
return false
end
end
function p.ccg(id)
id = id:match('^[NAIP]?[1-9]%d*$') or id:match('^[NAIP]?[1-9]%d*%.%d+$')
if not id then return false end
local link = 'https://www.notmar.gc.ca/'
local prefix = string.sub(id, 1, 1) -- get first character of id
local suffix = string.sub(id, 2) -- remove first character of id
local interval = require('Module:Interval')._main
local v
if prefix=='N' then
local int = interval({1, 7.5, 14.4, 100, 121, 173, 211, 235, 269.99, 326, 396, 450.1, 471.7, 499, n=suffix})
if int=='1-2' then v = 1
elseif int=='2-3' then v = 75
elseif int=='3-4' then v = 144
elseif int=='4-5' then v = 100
elseif int=='5-6' then v = 121
elseif int=='6-7' then v = 173
elseif int=='7-8' then v = 211
elseif int=='8-9' then v = 235
elseif int=='9-10' then v = 26999
elseif int=='10-11' then v = 326
elseif int=='11-12' then v = 396
elseif int=='12-13' then v = 4501
elseif int=='13-14' then v = 4717
elseif int=='14-15' then v = 499
end
link = link .. 'publications/list-lights/newfoundland/n' .. v .. '-en'
elseif prefix=='A' then
local int = interval({5, 114.5, 145, 163, 268, 271, 301.5, 327, 686.5, 704.85, 883.2, 942, 1085, 1169.1, 1584.5, 1773, 1823.55, 2190, 2369, 2389, n=suffix})
if int=='1-2' then v = 5
elseif int=='2-3' then v = 1145
elseif int=='3-4' then v = 145
elseif int=='4-5' then v = 162
elseif int=='5-6' then v = 268
elseif int=='6-7' then v = 271
elseif int=='7-8' then v = 3015
elseif int=='8-9' then v = 327
elseif int=='9-10' then v = 6865
elseif int=='10-11' then v = 7048
elseif int=='11-12' then v = 883
elseif int=='12-13' then v = 942
elseif int=='13-14' then v = 1085
elseif int=='14-15' then v = 11691
elseif int=='15-16' then v = 15845
elseif int=='16-17' then v = 1773
elseif int=='17-18' then v = 182355
elseif int=='18-19' then v = 2190
elseif int=='19-20' then v = 2369
elseif int=='20-21' then v = 2389
end
link = link .. 'publications/list-lights/atl/a' .. v .. '-en'
elseif prefix=='I' then
local int = interval({0.05, 401.1, 403.4, 551.06, 552, 624, 708, 731.2, 768, 814, 983, 1046, 1059.6, 1082, 1162, 1204.7, 1233.3, 1328, 1330, 1346.2, 1377.8, 1408, 1410, 1420, 1445, 1470, 1520, 1534, 1540.6, 1554, 1557.7, 1558.8, 1563.1, 1625.5, 1671.7, 1716.96, 2545, n=suffix})
if int=='1-2' then v = '01'
elseif int=='2-3' then v = 4011
elseif int=='3-4' then v = 4034
elseif int=='4-5' then v = 55106
elseif int=='5-6' then v = 552
elseif int=='6-7' then v = 624
elseif int=='7-8' then v = 708
elseif int=='8-9' then v = 7312
elseif int=='9-10' then v = 768
elseif int=='10-11' then v = 814
elseif int=='11-12' then v = 983
elseif int=='12-13' then v = 1046
elseif int=='13-14' then v = 10596
elseif int=='14-15' then v = 1082
elseif int=='15-16' then v = 1162
elseif int=='16-17' then v = 12047
elseif int=='17-18' then v = 12333
elseif int=='18-19' then v = 1328
elseif int=='19-20' then v = 1330
elseif int=='20-21' then v = 13462
elseif int=='21-22' then v = 13778
elseif int=='22-23' then v = 1408
elseif int=='23-24' then v = 1410
elseif int=='24-25' then v = 1420
elseif int=='25-26' then v = 1445
elseif int=='26-27' then v = 1470
elseif int=='27-28' then v = 1520
elseif int=='28-29' then v = 1534
elseif int=='29-30' then v = 15406
elseif int=='30-31' then v = 1554
elseif int=='31-32' then v = 15577
elseif int=='32-33' then v = 15588
elseif int=='33-34' then v = 1562
elseif int=='34-35' then v = 16255
elseif int=='35-36' then v = 16717
elseif int=='36-37' then v = 171696
elseif int=='37-38' then v = 2545
end
link = link .. 'publications/list-lights/inland-waters/i' .. v .. '-en'
elseif prefix=='P' then
link = link .. 'publications/list-lights/pac/p'
else
link = link .. 'list-lights'
end
return '[[CCG (identifier)|CCG]]: [' .. link .. ' ' .. id .. ']'
end
return p