Almost nothing is known about Habakkuk, aside from what few facts are stated within the book of the Bible bearing his name, or those inferences that may be drawn from that book. His name appears in the Bible only in Habakkuk 1:1 and 3:1, with no biographical details provided other than his title "the prophet." Even the origin of his name is uncertain.
For almost every other prophet, more information is given, such as the name of the prophet's hometown, his occupation, or information concerning his parentage or tribe. For Habakkuk, however, there is no reliable account of any of these. Although his home is not identified, scholars conclude that Habakkuk lived in Jerusalem at the time he wrote his prophecy. Further analysis has provided an approximate date for his prophecy and possibilities concerning his activities and background.
Beyond the Bible, considerable conjecture has been put forward over the centuries in the form of Christian and Rabbinic tradition, but such accounts are dismissed by modern scholars as speculative and apocryphal.
Because the final chapter of his book is a song, it is sometimes assumed that he was a member of the tribe of Levi, which served as musicians in Solomon's Temple.
The etymology of the name is not clear, and its form has no parallel in Hebrew.[14] The name is possibly related to the Akkadian khabbaququ, the name of a fragrant plant, or the Hebrew root , meaning "embrace".
(2 Kings 4:16) And he said, About this season, according to the time of life, thou shalt embrace (חבקת – hoveket, therefore Habakkuk) a son. And she said, Nay, my lord, [thou] man of God, do not lie unto thine handmaid.
The only work attributed to Habakkuk is the short book of the Bible that bears his name. The book of Habbakuk consists of five oracles about the Chaldeans (Babylonians) and a song of praise to God.
The style of the book has been praised by many scholars, suggesting that its author was a man of great literary talent. The entire book follows the structure of a chiasmus in which parallelism of thought is used to bracket sections of the text.
Habakkuk is unique among the prophets in that he openly questions the working of God (1:3a, 1:13b). In the first part of the second chapter, the Prophet sees the injustice among his people and asks why God does not take action: "1:2 Yahweh, how long will I cry, and you will not hear? I cry out to you 'Violence!' and will you not save?" (World English Bible).
The final resting place of Habakkuk has been claimed at multiple locations. The fifth-century Christian historian Sozomen claimed that the relics of Habakkuk were found at Cela, when God revealed their location to Zebennus, bishop of Eleutheropolis, in a dream. Currently, one location in Israel and one in Iran lay claim to being the burial site of the prophet.
The burial place of Habakkuk is identified by Jewish tradition as a hillside in the Upper Galilee region of northern Israel, close to the villages Kadarim and Hukok, about six miles southwest of Safed and twelve miles north of Mount Tabor. A small stone building, erected during the 20th century, protects the tomb. Tradition dating as early as the 12th century AD holds that Habakkuk's tomb is at this location, but the tomb may also be of a local sheikh of Yaquq, a name related to the biblical place named "Hukkok" (mentioned in Joshua 19:34), whose pronunciation and spelling in Hebrew are close to "Habakkuk". Archaeological findings in this location include several burial places dated to the Second Temple period.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
require('Module:No globals')
local function getCatForId( id )
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
if namespace == 0 then
return ''
elseif namespace == 2 and not title.isSubpage then
return ''
else
return ''
end
end
local function viafLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'VIAF' )
end
local function kulturnavLink( id )
return '.. id .. ' id'
end
local function sikartLink( id )
return '.. id .. '&lng=en ' .. id .. ''
end
local function tlsLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)
return '.. id2 .. ' ' .. id .. ''
end
local function ciniiLink( id )
return '.. id .. '?l=en ' .. id .. ''
end
local function bneLink( id )
return '.. id .. ' ' .. id .. ''
end
local function uscongressLink( id )
return '.. id .. ' ' .. id .. ''
end
local function narapersonLink( id )
return '.. id .. ' ' .. id .. ''
end
local function naraorganizationLink( id )
return '.. id .. ' ' .. id .. ''
end
local function botanistLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
return '.. id2 .. ' ' .. id .. ''
end
local function mgpLink( id )
-- TODO Implement some sanity checking regex
return '.. id .. ' ' .. id .. ''
end
local function rslLink( id )
-- TODO Implement some sanity checking regex
return '.. id .. '&CON_LNG=ENG ' .. id .. ''
end
local function leonoreLink( id ) -- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires) -- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres) -- Identifiants allant de 19800035/1/1 à 19800035/385/51670 (légionnaires décédés entre 1954 et 1977, et quelques dossiers de légionnaires décédés avant 1954)
if not string.match( id, '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
not string.match( id, '^C/0/%d%d?$' ) and
not string.match( id, '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) then
return false
end
return '.. id .. ' ' .. id .. ''
end
local function sbnLink( id )
if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'SBN' )
end
local function nkcLink( id ) return '.. id .. '&CON_LNG=ENG ' .. id .. '' end
local function nclLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. '&CON_LNG=ENG ' .. id .. ''
end
local function ndlLink( id ) return '.. id .. ' ' .. id .. '' end
local function sudocLink( id )
if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
return false
end
return '.. id .. ' ' .. id .. ''
end
local function hlsLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. '.php ' .. id .. ''
end
local function lirLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. '.450.0.html ' .. id .. ''
end
local 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
local function append(str, c, length)
while str:len() < length do
str = c .. str
end
return str
end
local function lccnLink( id )
local parts = splitLccn( id )
if not parts then
return false
end
local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
id = parts[1] .. parts[2] .. append( parts[3], '0', 6 )
return '.. lccnType .. '/' .. id .. ' ' .. id .. '' .. getCatForId( 'LCCN' )
end
local function mbLink( id )
-- TODO Implement some sanity checking regex
return '.. id .. ' ' .. id .. '' .. getCatForId( 'MusicBrainz' )
end
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits local 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
--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 local 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
local function isniLink( id )
id = validateIsni( id )
if not id then
return false
end
return '.. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' ' .. id:sub( 9, 12 ) .. ' ' .. id:sub( 13, 16 ) .. '' .. getCatForId( 'ISNI' )
end
local 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 '.. id .. ' ' .. id .. '' .. getCatForId( 'ORCID' )
end
local function gndLink( id )
return '.. id .. ' ' .. id .. '' .. getCatForId( 'GND' )
end
local function selibrLink( id ) if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'SELIBR' )
end
local function bnfLink( id )
--Add cb prefix if it has been removed
if not string.match( id, '^cb.+$' ) then
id = 'cb' .. id
end
return '.. id .. ' ' .. id .. ' .. id .. ' (data)' .. getCatForId( 'BNF' )
end
local function bpnLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'BPN' )
end
local function ridLink( id )
return '.. id .. ' ' .. id .. '' .. getCatForId( 'RID' )
end
local function bibsysLink( id )
return '.. id .. '&feltselect=bs.autid ' .. id .. '' .. getCatForId( 'BIBSYS' )
end
local function ulanLink( id )
return '.. id .. ' ' .. id .. '' .. getCatForId( 'ULAN' )
end
local function nlaLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'NLA' ) end
local function rkdartistsLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'RKDartists' ) end
local function getIdsFromWikidata( item, property )
local ids = {}
if not item.claims[property] then
return ids
end
for _, statement in pairs( item.claims[property] ) do
if statement.mainsnak.datavalue then
table.insert( ids, statement.mainsnak.datavalue.value )
end
end
return ids
end
local 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
local function createRow( id, label, rawValue, link, withUid )
if link then
if withUid then
return '* ' .. label .. ' ' .. link .. '\n'
else
return '* ' .. label .. ' ' .. link .. '\n'
end
else
return '* \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', 'SELIBR', 906, selibrLink },
{ 'SUDOC', 'SUDOC', 269, sudocLink },
{ 'BNF', 'BNF', 268, bnfLink },
{ 'BPN', 'BPN', 651, bpnLink },
{ 'RID', 'ResearcherID', 1053, ridLink },
{ 'BIBSYS', 'BIBSYS', 1015, bibsysLink },
{ 'ULAN', 'ULAN', 245, ulanLink },
{ 'HDS', 'HDS', 902, hlsLink },
{ 'LIR', 'LIR', 886, lirLink },
{ 'MBA', 'MusicBrainz', 434, mbLink },
{ 'MGP', 'MGP', 549, mgpLink },
{ 'NLA', 'NLA', 409, nlaLink },
{ 'NDL', 'NDL', 349, ndlLink },
{ 'NCL', 'NCL', 1048, nclLink },
{ 'NKC', 'NKC', 691, nkcLink },
{ 'Léonore', 'Léonore', 640, leonoreLink },
{ 'SBN', 'ICCU', 396, sbnLink },
{ 'RLS', 'RLS', 947, rslLink },
{ 'Botanist', '[[Author ci
-
-
-
-
-
require('Module:No globals')
local function getCatForId( id )
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
if namespace == 0 then
return ''
elseif namespace == 2 and not title.isSubpage then
return ''
else
return ''
end
end
local function viafLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'VIAF' )
end
local function kulturnavLink( id )
return '.. id .. ' id'
end
local function sikartLink( id )
return '.. id .. '&lng=en ' .. id .. ''
end
local function tlsLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)
return '.. id2 .. ' ' .. id .. ''
end
local function ciniiLink( id )
return '.. id .. '?l=en ' .. id .. ''
end
local function bneLink( id )
return '.. id .. ' ' .. id .. ''
end
local function uscongressLink( id )
return '.. id .. ' ' .. id .. ''
end
local function narapersonLink( id )
return '.. id .. ' ' .. id .. ''
end
local function naraorganizationLink( id )
return '.. id .. ' ' .. id .. ''
end
local function botanistLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
return '.. id2 .. ' ' .. id .. ''
end
local function mgpLink( id )
-- TODO Implement some sanity checking regex
return '.. id .. ' ' .. id .. ''
end
local function rslLink( id )
-- TODO Implement some sanity checking regex
return '.. id .. '&CON_LNG=ENG ' .. id .. ''
end
local function leonoreLink( id ) -- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires) -- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres) -- Identifiants allant de 19800035/1/1 à 19800035/385/51670 (légionnaires décédés entre 1954 et 1977, et quelques dossiers de légionnaires décédés avant 1954)
if not string.match( id, '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
not string.match( id, '^C/0/%d%d?$' ) and
not string.match( id, '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) then
return false
end
return '.. id .. ' ' .. id .. ''
end
local function sbnLink( id )
if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'SBN' )
end
local function nkcLink( id ) return '.. id .. '&CON_LNG=ENG ' .. id .. '' end
local function nclLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. '&CON_LNG=ENG ' .. id .. ''
end
local function ndlLink( id ) return '.. id .. ' ' .. id .. '' end
local function sudocLink( id )
if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
return false
end
return '.. id .. ' ' .. id .. ''
end
local function hlsLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. '.php ' .. id .. ''
end
local function lirLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. '.450.0.html ' .. id .. ''
end
local 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
local function append(str, c, length)
while str:len() < length do
str = c .. str
end
return str
end
local function lccnLink( id )
local parts = splitLccn( id )
if not parts then
return false
end
local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
id = parts[1] .. parts[2] .. append( parts[3], '0', 6 )
return '.. lccnType .. '/' .. id .. ' ' .. id .. '' .. getCatForId( 'LCCN' )
end
local function mbLink( id )
-- TODO Implement some sanity checking regex
return '.. id .. ' ' .. id .. '' .. getCatForId( 'MusicBrainz' )
end
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits local 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
--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 local 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
local function isniLink( id )
id = validateIsni( id )
if not id then
return false
end
return '.. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' ' .. id:sub( 9, 12 ) .. ' ' .. id:sub( 13, 16 ) .. '' .. getCatForId( 'ISNI' )
end
local 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 '.. id .. ' ' .. id .. '' .. getCatForId( 'ORCID' )
end
local function gndLink( id )
return '.. id .. ' ' .. id .. '' .. getCatForId( 'GND' )
end
local function selibrLink( id ) if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'SELIBR' )
end
local function bnfLink( id )
--Add cb prefix if it has been removed
if not string.match( id, '^cb.+$' ) then
id = 'cb' .. id
end
return '.. id .. ' ' .. id .. ' .. id .. ' (data)' .. getCatForId( 'BNF' )
end
local function bpnLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'BPN' )
end
local function ridLink( id )
return '.. id .. ' ' .. id .. '' .. getCatForId( 'RID' )
end
local function bibsysLink( id )
return '.. id .. '&feltselect=bs.autid ' .. id .. '' .. getCatForId( 'BIBSYS' )
end
local function ulanLink( id )
return '.. id .. ' ' .. id .. '' .. getCatForId( 'ULAN' )
end
local function nlaLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'NLA' ) end
local function rkdartistsLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'RKDartists' ) end
local function getIdsFromWikidata( item, property )
local ids = {}
if not item.claims[property] then
return ids
end
for _, statement in pairs( item.claims[property] ) do
if statement.mainsnak.datavalue then
table.insert( ids, statement.mainsnak.datavalue.value )
end
end
return ids
end
local 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
local function createRow( id, label, rawValue, link, withUid )
if link then
if withUid then
return '* ' .. label .. ' ' .. link .. '\n'
else
return '* ' .. label .. ' ' .. link .. '\n'
end
else
return '* \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', 'SELIBR', 906, selibrLink },
{ 'SUDOC', 'SUDOC', 269, sudocLink },
{ 'BNF', 'BNF', 268, bnfLink },
{ 'BPN', 'BPN', 651, bpnLink },
{ 'RID', 'ResearcherID', 1053, ridLink },
{ 'BIBSYS', 'BIBSYS', 1015, bibsysLink },
{ 'ULAN', 'ULAN', 245, ulanLink },
{ 'HDS', 'HDS', 902, hlsLink },
{ 'LIR', 'LIR', 886, lirLink },
{ 'MBA', 'MusicBrainz', 434, mbLink },
{ 'MGP', 'MGP', 549, mgpLink },
{ 'NLA', 'NLA', 409, nlaLink },
{ 'NDL', 'NDL', 349, ndlLink },
{ 'NCL', 'NCL', 1048, nclLink },
{ 'NKC', 'NKC', 691, nkcLink },
{ 'Léonore', 'Léonore', 640, leonoreLink },
{ 'SBN', 'ICCU', 396, sbnLink },
{ 'RLS', 'RLS', 947, rslLink },
{ 'Botanist', '[[Author ci
-
-
-
-
-
-
require('Module:No globals')
local function getCatForId( id )
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
if namespace == 0 then
return ''
elseif namespace == 2 and not title.isSubpage then
return ''
else
return ''
end
end
local function viafLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'VIAF' )
end
local function kulturnavLink( id )
return '.. id .. ' id'
end
local function sikartLink( id )
return '.. id .. '&lng=en ' .. id .. ''
end
local function tlsLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)
return '.. id2 .. ' ' .. id .. ''
end
local function ciniiLink( id )
return '.. id .. '?l=en ' .. id .. ''
end
local function bneLink( id )
return '.. id .. ' ' .. id .. ''
end
local function uscongressLink( id )
return '.. id .. ' ' .. id .. ''
end
local function narapersonLink( id )
return '.. id .. ' ' .. id .. ''
end
local function naraorganizationLink( id )
return '.. id .. ' ' .. id .. ''
end
local function botanistLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
return '.. id2 .. ' ' .. id .. ''
end
local function mgpLink( id )
-- TODO Implement some sanity checking regex
return '.. id .. ' ' .. id .. ''
end
local function rslLink( id )
-- TODO Implement some sanity checking regex
return '.. id .. '&CON_LNG=ENG ' .. id .. ''
end
local function leonoreLink( id ) -- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires) -- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres) -- Identifiants allant de 19800035/1/1 à 19800035/385/51670 (légionnaires décédés entre 1954 et 1977, et quelques dossiers de légionnaires décédés avant 1954)
if not string.match( id, '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
not string.match( id, '^C/0/%d%d?$' ) and
not string.match( id, '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) then
return false
end
return '.. id .. ' ' .. id .. ''
end
local function sbnLink( id )
if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'SBN' )
end
local function nkcLink( id ) return '.. id .. '&CON_LNG=ENG ' .. id .. '' end
local function nclLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. '&CON_LNG=ENG ' .. id .. ''
end
local function ndlLink( id ) return '.. id .. ' ' .. id .. '' end
local function sudocLink( id )
if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
return false
end
return '.. id .. ' ' .. id .. ''
end
local function hlsLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. '.php ' .. id .. ''
end
local function lirLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. '.450.0.html ' .. id .. ''
end
local 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
local function append(str, c, length)
while str:len() < length do
str = c .. str
end
return str
end
local function lccnLink( id )
local parts = splitLccn( id )
if not parts then
return false
end
local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
id = parts[1] .. parts[2] .. append( parts[3], '0', 6 )
return '.. lccnType .. '/' .. id .. ' ' .. id .. '' .. getCatForId( 'LCCN' )
end
local function mbLink( id )
-- TODO Implement some sanity checking regex
return '.. id .. ' ' .. id .. '' .. getCatForId( 'MusicBrainz' )
end
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits local 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
--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 local 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
local function isniLink( id )
id = validateIsni( id )
if not id then
return false
end
return '.. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' ' .. id:sub( 9, 12 ) .. ' ' .. id:sub( 13, 16 ) .. '' .. getCatForId( 'ISNI' )
end
local 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 '.. id .. ' ' .. id .. '' .. getCatForId( 'ORCID' )
end
local function gndLink( id )
return '.. id .. ' ' .. id .. '' .. getCatForId( 'GND' )
end
local function selibrLink( id ) if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'SELIBR' )
end
local function bnfLink( id )
--Add cb prefix if it has been removed
if not string.match( id, '^cb.+$' ) then
id = 'cb' .. id
end
return '.. id .. ' ' .. id .. ' .. id .. ' (data)' .. getCatForId( 'BNF' )
end
local function bpnLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '.. id .. ' ' .. id .. '' .. getCatForId( 'BPN' )
end
local function ridLink( id )
return '.. id .. ' ' .. id .. '' .. getCatForId( 'RID' )
end
local function bibsysLink( id )
return '.. id .. '&feltselect=bs.autid ' .. id .. '' .. getCatForId( 'BIBSYS' )
end
local function ulanLink( id )
return '.. id .. ' ' .. id .. '' .. getCatForId( 'ULAN' )
end
local function nlaLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'NLA' ) end
local function rkdartistsLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'RKDartists' ) end
local function getIdsFromWikidata( item, property )
local ids = {}
if not item.claims[property] then
return ids
end
for _, statement in pairs( item.claims[property] ) do
if statement.mainsnak.datavalue then
table.insert( ids, statement.mainsnak.datavalue.value )
end
end
return ids
end
local 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
local function createRow( id, label, rawValue, link, withUid )
if link then
if withUid then
return '* ' .. label .. ' ' .. link .. '\n'
else
return '* ' .. label .. ' ' .. link .. '\n'
end
else
return '* \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', 'SELIBR', 906, selibrLink },
{ 'SUDOC', 'SUDOC', 269, sudocLink },
{ 'BNF', 'BNF', 268, bnfLink },
{ 'BPN', 'BPN', 651, bpnLink },
{ 'RID', 'ResearcherID', 1053, ridLink },
{ 'BIBSYS', 'BIBSYS', 1015, bibsysLink },
{ 'ULAN', 'ULAN', 245, ulanLink },
{ 'HDS', 'HDS', 902, hlsLink },
{ 'LIR', 'LIR', 886, lirLink },
{ 'MBA', 'MusicBrainz', 434, mbLink },
{ 'MGP', 'MGP', 549, mgpLink },
{ 'NLA', 'NLA', 409, nlaLink },
{ 'NDL', 'NDL', 349, ndlLink },
{ 'NCL', 'NCL', 1048, nclLink },
{ 'NKC', 'NKC', 691, nkcLink },
{ 'Léonore', 'Léonore', 640, leonoreLink },
{ 'SBN', 'ICCU', 396, sbnLink },
{ 'RLS', 'RLS', 947, rslLink },
{ 'Botanist', '[[Author ci