Modifica di Modulo:Citation/CS1/Identifiers
Vai alla navigazione
Vai alla ricerca
Questa modifica può essere annullata. Controlla le differenze mostrate sotto fra le due versioni per essere certo che il contenuto corrisponda a quanto desiderato, e quindi pubblicare le modifiche per completare la procedura di annullamento.
Versione attuale | Il tuo testo | ||
Riga 1: | Riga 1: | ||
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >-------------------------------------- | --[[--------------------------< F O R W A R D D E C L A R A T I O N S >-------------------------------------- | ||
]] | ]] | ||
Riga 179: | Riga 180: | ||
This function does not work if it is fed month names for languages other than English. Wikimedia #time: parser | This function does not work if it is fed month names for languages other than English. Wikimedia #time: parser | ||
apparently doesn't understand non-English date month names. This function will always return false when the date | apparently doesn't understand non-English date month names. This function will always return false when the date | ||
contains a non-English month name because good1 is false after the call to | contains a non-English month name because good1 is false after the call to lang.formatDate(). To get around that | ||
around that call this function with | call this function with YYYY-MM-DD format dates. | ||
]=] | ]=] | ||
local function is_valid_biorxiv_date ( | local function is_valid_biorxiv_date (biorxiv_date) | ||
local good1, good2; | local good1, good2; | ||
local biorxiv_ts, tomorrow_ts; -- to hold Unix timestamps representing the dates | local biorxiv_ts, tomorrow_ts; -- to hold Unix timestamps representing the dates | ||
Riga 260: | Riga 260: | ||
Returns a normalized LCCN for lccn() to validate. There is no error checking (step 3.b.1) performed in this function. | Returns a normalized LCCN for lccn() to validate. There is no error checking (step 3.b.1) performed in this function. | ||
]] | ]] | ||
Riga 312: | Riga 311: | ||
<date code> and <version> are as defined for 0704-1412 | <date code> and <version> are as defined for 0704-1412 | ||
<number> is a five-digit number | <number> is a five-digit number | ||
]] | ]] | ||
Riga 320: | Riga 318: | ||
local handler = options.handler; | local handler = options.handler; | ||
local year, month, version; | local year, month, version; | ||
local | local err_cat = false; -- assume no error message | ||
local text; -- output text | local text; -- output text | ||
Riga 329: | Riga 327: | ||
if ((not (90 < year or 8 > year)) or (1 > month or 12 < month)) or -- if invalid year or invalid month | if ((not (90 < year or 8 > year)) or (1 > month or 12 < month)) or -- if invalid year or invalid month | ||
((91 == year and 7 > month) or (7 == year and 3 < month)) then -- if years ok, are starting and ending months ok? | ((91 == year and 7 > month) or (7 == year and 3 < month)) then -- if years ok, are starting and ending months ok? | ||
err_cat = true; -- flag for error message | |||
end | end | ||
Riga 338: | Riga 336: | ||
if ((7 > year) or (14 < year) or (1 > month or 12 < month)) or -- is year invalid or is month invalid? (doesn't test for future years) | if ((7 > year) or (14 < year) or (1 > month or 12 < month)) or -- is year invalid or is month invalid? (doesn't test for future years) | ||
((7 == year) and (4 > month)) then -- when year is 07, is month invalid (before April)? | ((7 == year) and (4 > month)) then -- when year is 07, is month invalid (before April)? | ||
err_cat = true; -- flag for error message | |||
end | end | ||
Riga 346: | Riga 344: | ||
month = tonumber (month); | month = tonumber (month); | ||
if ((15 > year) or (1 > month or 12 < month)) then -- is year invalid or is month invalid? (doesn't test for future years) | if ((15 > year) or (1 > month or 12 < month)) then -- is year invalid or is month invalid? (doesn't test for future years) | ||
err_cat = true; -- flag for error message | |||
end | end | ||
else | else | ||
err_cat = true; -- not a recognized format; flag for error message | |||
end | end | ||
if | if err_cat then | ||
options.coins_list_t['ARXIV'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['ARXIV'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
err_cat = err_cat and table.concat ({' ', set_message ('err_bad_arxiv')}) or ''; -- set error message if flag is true | |||
text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access}) .. err_cat; | ||
if is_set (class) then | if is_set (class) then | ||
Riga 369: | Riga 364: | ||
text = table.concat ({text, ' [[//arxiv.org/archive/', class, ' ', class, ']]'}); -- external link within square brackets, not wikilink | text = table.concat ({text, ' [[//arxiv.org/archive/', class, ' ', class, ']]'}); -- external link within square brackets, not wikilink | ||
else | else | ||
set_message ('err_class_ignored'); | text = table.concat ({text, ' ', set_message ('err_class_ignored')}); | ||
end | end | ||
end | end | ||
return text; | return text; | ||
end | end | ||
Riga 400: | Riga 395: | ||
local handler = options.handler; | local handler = options.handler; | ||
local err_type; | local err_type; | ||
local year; | local year; | ||
Riga 426: | Riga 420: | ||
if is_set (err_type) then -- if there was an error detected | if is_set (err_type) then -- if there was an error detected | ||
set_message ('err_bad_bibcode', {err_type}); | text = text .. ' ' .. set_message ('err_bad_bibcode', {err_type}); | ||
options.coins_list_t['BIBCODE'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['BIBCODE'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return text; | return text; | ||
end | end | ||
Riga 453: | Riga 446: | ||
local id = options.id; | local id = options.id; | ||
local handler = options.handler; | local handler = options.handler; | ||
local | local err_cat = true; -- flag; assume that there will be an error | ||
local patterns = { | local patterns = { | ||
Riga 466: | Riga 459: | ||
if m then -- m is nil when id is the six-digit form | if m then -- m is nil when id is the six-digit form | ||
if not is_valid_biorxiv_date (y | if not is_valid_biorxiv_date (y .. '-' .. m .. '-' .. d) then -- validate the encoded date; TODO: don't ignore leap-year and actual month lengths ({{#time:}} is a poor date validator) | ||
break; -- date fail; break out early so we don't unset the error message | break; -- date fail; break out early so we don't unset the error message | ||
end | end | ||
end | end | ||
err_cat = nil; -- we found a match so unset the error message | |||
break; -- and done | break; -- and done | ||
end | end | ||
end -- err_cat remains set here when no match | end -- err_cat remains set here when no match | ||
if | if err_cat then | ||
options.coins_list_t['BIORXIV'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['BIORXIV'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, | prefix = handler.prefix, id = id, separator = handler.separator, | ||
encode = handler.encode, access = handler.access}); | encode = handler.encode, access = handler.access}) .. (err_cat and (' ' .. set_message ('err_bad_biorxiv')) or ''); | ||
end | end | ||
Riga 491: | Riga 483: | ||
The description of the structure of this identifier can be found at Help_talk:Citation_Style_1/Archive_26#CiteSeerX_id_structure | The description of the structure of this identifier can be found at Help_talk:Citation_Style_1/Archive_26#CiteSeerX_id_structure | ||
]] | ]] | ||
Riga 498: | Riga 489: | ||
local handler = options.handler; | local handler = options.handler; | ||
local matched; | local matched; | ||
local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, | ||
Riga 505: | Riga 496: | ||
matched = id:match ("^10%.1%.1%.[1-9]%d?%d?%d?%.[1-9]%d?%d?%d?$"); | matched = id:match ("^10%.1%.1%.[1-9]%d?%d?%d?%.[1-9]%d?%d?%d?$"); | ||
if not matched then | if not matched then | ||
set_message ('err_bad_citeseerx' ); | text = text .. ' ' .. set_message ('err_bad_citeseerx' ); | ||
options.coins_list_t['CITESEERX'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['CITESEERX'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return text; | return text; | ||
end | end | ||
Riga 539: | Riga 529: | ||
local ignore_invalid = options.accept; | local ignore_invalid = options.accept; | ||
local handler = options.handler; | local handler = options.handler; | ||
local | local err_cat; | ||
local text; | local text; | ||
Riga 568: | Riga 558: | ||
end | end | ||
local registrant = | local registrant = id:match ('^10%.([^/]+)/[^%s–]-[^%.,]$'); -- registrant set when DOI has the proper basic form | ||
local registrant_err_patterns = { -- these patterns are for code ranges that are not supported | local registrant_err_patterns = { -- these patterns are for code ranges that are not supported | ||
'^[^1-3]%d%d%d%d%.%d%d*$', -- 5 digits with subcode (0xxxx, 40000+); accepts: 10000–39999 | '^[^1-3]%d%d%d%d%.%d%d*$', -- 5 digits with subcode (0xxxx, 40000+); accepts: 10000–39999 | ||
Riga 586: | Riga 576: | ||
for i, pattern in ipairs (registrant_err_patterns) do -- spin through error patterns | for i, pattern in ipairs (registrant_err_patterns) do -- spin through error patterns | ||
if registrant:match (pattern) then -- to validate registrant codes | if registrant:match (pattern) then -- to validate registrant codes | ||
err_cat = ' ' .. set_message ('err_bad_doi'); -- when found, mark this DOI as bad | |||
break; -- and done | break; -- and done | ||
end | end | ||
end | end | ||
else | else | ||
err_cat = ' ' .. set_message ('err_bad_doi'); -- invalid directory or malformed | |||
end | end | ||
else | else | ||
Riga 597: | Riga 587: | ||
end | end | ||
if | if err_cat then | ||
options.coins_list_t['DOI'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['DOI'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
Riga 603: | Riga 593: | ||
text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access, | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access, | ||
auto_link = not ( | auto_link = not (err_cat or is_set (inactive) or ignore_invalid) and 'doi' or nil -- do not auto-link when |doi-broken-date= has a value or when there is a DOI error or (to play it safe, after all, auto-linking is not essential) when invalid DOIs are ignored | ||
}) .. (inactive or ''); | }) .. (inactive or ''); | ||
return text; | return text .. (err_cat and err_cat or ''); -- parentheses required | ||
end | end | ||
Riga 669: | Riga 659: | ||
if nil == id:match("^[^%s–]-/[^%s–]-[^%.,]$") then -- HDL must contain a forward slash, must not contain spaces, endashes, and must not end with period or comma | if nil == id:match("^[^%s–]-/[^%s–]-[^%.,]$") then -- HDL must contain a forward slash, must not contain spaces, endashes, and must not end with period or comma | ||
set_message ('err_bad_hdl' ); | text = text .. ' ' .. set_message ('err_bad_hdl' ); | ||
options.coins_list_t['HDL'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['HDL'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return text; | return text; | ||
end | end | ||
Riga 696: | Riga 685: | ||
if not check then -- and there is an error | if not check then -- and there is an error | ||
options.coins_list_t['ISBN'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['ISBN'] = nil; -- when error, unset so not included in COinS | ||
set_message ('err_bad_isbn', err_type); | return ISBN .. set_message ('err_bad_isbn', {err_type}, false, ' '); -- display an error message | ||
end | end | ||
end | end | ||
return ISBN; | return ISBN; | ||
end | end | ||
Riga 759: | Riga 747: | ||
local domain = options.ASINTLD; | local domain = options.ASINTLD; | ||
local | local err_cat = '' | ||
if not id:match("^[%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u]$") then | if not id:match("^[%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u]$") then | ||
err_cat = ' ' .. set_message ('err_bad_asin'); -- ASIN is not a mix of 10 uppercase alpha and numeric characters | |||
else | else | ||
if id:match("^%d%d%d%d%d%d%d%d%d[%dX]$") then -- if 10-digit numeric (or 9 digits with terminal X) | if id:match("^%d%d%d%d%d%d%d%d%d[%dX]$") then -- if 10-digit numeric (or 9 digits with terminal X) | ||
if is_valid_isxn (id, 10) then -- see if ASIN value is or validates as ISBN-10 | if is_valid_isxn (id, 10) then -- see if ASIN value is or validates as ISBN-10 | ||
if not id:find ('^63[01]') then -- 630xxxxxxx and 631xxxxxxx are (apparently) not a valid isbn prefixes but are used by amazon as a numeric identifier | if not id:find ('^63[01]') then -- 630xxxxxxx and 631xxxxxxx are (apparently) not a valid isbn prefixes but are used by amazon as a numeric identifier | ||
err_cat = ' ' .. set_message ('err_bad_asin'); -- ASIN has ISBN-10 form but begins with something other than 630/1 so probably an isbn | |||
end | end | ||
elseif not is_set ( | elseif not is_set (err_cat) then | ||
err_cat = ' ' .. set_message ('err_bad_asin'); -- ASIN is not ISBN-10 | |||
end | end | ||
elseif not id:match("^%u[%d%u]+$") then | elseif not id:match("^%u[%d%u]+$") then | ||
err_cat = ' ' .. set_message ('err_bad_asin'); -- asin doesn't begin with uppercase alpha | |||
end | end | ||
end | end | ||
Riga 785: | Riga 773: | ||
domain = "com." .. domain; | domain = "com." .. domain; | ||
elseif not in_array (domain, {'ae', 'ca', 'cn', 'de', 'es', 'fr', 'in', 'it', 'nl', 'pl', 'sa', 'se', 'co.jp', 'co.uk', 'com', 'com.au', 'com.br', 'com.mx', 'com.sg', 'com.tr'}) then -- Arabic Emirates, Canada, China, Germany, Spain, France, Indonesia, Italy, Netherlands, Poland, Saudi Arabia, Sweden (as of 2021-03 Austria (.at), Liechtenstein (.li) and Switzerland (.ch) still redirect to the German site (.de) with special settings, so don't maintain local ASINs for them) | elseif not in_array (domain, {'ae', 'ca', 'cn', 'de', 'es', 'fr', 'in', 'it', 'nl', 'pl', 'sa', 'se', 'co.jp', 'co.uk', 'com', 'com.au', 'com.br', 'com.mx', 'com.sg', 'com.tr'}) then -- Arabic Emirates, Canada, China, Germany, Spain, France, Indonesia, Italy, Netherlands, Poland, Saudi Arabia, Sweden (as of 2021-03 Austria (.at), Liechtenstein (.li) and Switzerland (.ch) still redirect to the German site (.de) with special settings, so don't maintain local ASINs for them) | ||
err_cat = ' ' .. set_message ('err_bad_asin_tld'); -- unsupported asin-tld value | |||
end | end | ||
local handler = options.handler; | local handler = options.handler; | ||
if not is_set ( | if not is_set (err_cat) then | ||
options.coins_list_t['ASIN'] = handler.prefix .. domain .. "/dp/" .. id; -- asin | options.coins_list_t['ASIN'] = handler.prefix .. domain .. "/dp/" .. id; -- experiment for asin coins | ||
else | else | ||
options.coins_list_t['ASIN'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['ASIN'] = nil; -- when error, unset so not included in COinS | ||
Riga 797: | Riga 785: | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix .. domain .. "/dp/", | prefix = handler.prefix .. domain .. "/dp/", | ||
id = id, encode = handler.encode, separator = handler.separator}) | id = id, encode = handler.encode, separator = handler.separator}) .. err_cat; | ||
end | end | ||
Riga 840: | Riga 828: | ||
if false == valid_ismn then | if false == valid_ismn then | ||
options.coins_list_t['ISMN'] = nil; -- when error, unset so not included in COinS; not really necessary here because ismn not made part of COinS | options.coins_list_t['ISMN'] = nil; -- when error, unset so not included in COinS; not really necessary here because ismn not made part of COinS | ||
set_message ('err_bad_ismn') | text = text .. ' ' .. set_message ('err_bad_ismn' ) -- add an error message if the ISMN is invalid | ||
end | end | ||
Riga 893: | Riga 881: | ||
if false == valid_issn then | if false == valid_issn then | ||
options.coins_list_t['ISSN'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['ISSN'] = nil; -- when error, unset so not included in COinS | ||
set_message ('err_bad_issn', (options.hkey == 'EISSN') and 'e' or ''); -- | text = text .. ' ' .. set_message ('err_bad_issn', (options.hkey == 'EISSN') and 'e' or ''); -- add an error message if the ISSN is invalid | ||
end | end | ||
end | end | ||
return text | return text | ||
end | end | ||
Riga 911: | Riga 899: | ||
local handler = options.handler; | local handler = options.handler; | ||
local id_num; | local id_num; | ||
local err_cat = ''; | |||
id_num = id:match ('^[Jj][Ff][Mm](.*)$'); -- identifier with jfm prefix; extract identifier | id_num = id:match ('^[Jj][Ff][Mm](.*)$'); -- identifier with jfm prefix; extract identifier | ||
Riga 923: | Riga 912: | ||
id = id_num; -- jfm matches pattern | id = id_num; -- jfm matches pattern | ||
else | else | ||
set_message ('err_bad_jfm' ); | err_cat = ' ' .. set_message ('err_bad_jfm' ); -- set an error message | ||
options.coins_list_t['JFM'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['JFM'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}) .. err_cat; | ||
end | end | ||
Riga 942: | Riga 931: | ||
local access = options.access; | local access = options.access; | ||
local handler = options.handler; | local handler = options.handler; | ||
local err_msg = ''; | |||
if id:find ('[Jj][Ss][Tt][Oo][Rr]') or id:find ('^https?://') or id:find ('%s') then | if id:find ('[Jj][Ss][Tt][Oo][Rr]') or id:find ('^https?://') or id:find ('%s') then | ||
set_message ('err_bad_jstor'); | err_msg = ' ' .. set_message ('err_bad_jstor'); -- set an error message | ||
options.coins_list_t['JSTOR'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['JSTOR'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access}) .. err_msg; | ||
end | end | ||
Riga 970: | Riga 960: | ||
local lccn = options.id; | local lccn = options.id; | ||
local handler = options.handler; | local handler = options.handler; | ||
local | local err_cat = ''; -- presume that LCCN is valid | ||
local id = lccn; -- local copy of the LCCN | local id = lccn; -- local copy of the LCCN | ||
Riga 978: | Riga 968: | ||
if 8 == len then | if 8 == len then | ||
if id:match("[^%d]") then -- if LCCN has anything but digits (nil if only digits) | if id:match("[^%d]") then -- if LCCN has anything but digits (nil if only digits) | ||
err_cat = ' ' .. set_message ('err_bad_lccn'); -- set an error message | |||
end | end | ||
elseif 9 == len then -- LCCN should be adddddddd | elseif 9 == len then -- LCCN should be adddddddd | ||
if nil == id:match("%l%d%d%d%d%d%d%d%d") then -- does it match our pattern? | if nil == id:match("%l%d%d%d%d%d%d%d%d") then -- does it match our pattern? | ||
err_cat = ' ' .. set_message ('err_bad_lccn'); -- set an error message | |||
end | end | ||
elseif 10 == len then -- LCCN should be aadddddddd or dddddddddd | elseif 10 == len then -- LCCN should be aadddddddd or dddddddddd | ||
if id:match("[^%d]") then -- if LCCN has anything but digits (nil if only digits) ... | if id:match("[^%d]") then -- if LCCN has anything but digits (nil if only digits) ... | ||
if nil == id:match("^%l%l%d%d%d%d%d%d%d%d") then -- ... see if it matches our pattern | if nil == id:match("^%l%l%d%d%d%d%d%d%d%d") then -- ... see if it matches our pattern | ||
err_cat = ' ' .. set_message ('err_bad_lccn'); -- no match, set an error message | |||
end | end | ||
end | end | ||
elseif 11 == len then -- LCCN should be aaadddddddd or adddddddddd | elseif 11 == len then -- LCCN should be aaadddddddd or adddddddddd | ||
if not (id:match("^%l%l%l%d%d%d%d%d%d%d%d") or id:match("^%l%d%d%d%d%d%d%d%d%d%d")) then -- see if it matches one of our patterns | if not (id:match("^%l%l%l%d%d%d%d%d%d%d%d") or id:match("^%l%d%d%d%d%d%d%d%d%d%d")) then -- see if it matches one of our patterns | ||
err_cat = ' ' .. set_message ('err_bad_lccn'); -- no match, set an error message | |||
end | end | ||
elseif 12 == len then -- LCCN should be aadddddddddd | elseif 12 == len then -- LCCN should be aadddddddddd | ||
if not id:match("^%l%l%d%d%d%d%d%d%d%d%d%d") then -- see if it matches our pattern | if not id:match("^%l%l%d%d%d%d%d%d%d%d%d%d") then -- see if it matches our pattern | ||
err_cat = ' ' .. set_message ('err_bad_lccn'); -- no match, set an error message | |||
end | end | ||
else | else | ||
err_cat = ' ' .. set_message ('err_bad_lccn'); -- wrong length, set an error message | |||
end | end | ||
if not is_set ( | if not is_set (err_cat) and nil ~= lccn:find ('%s') then | ||
err_cat = ' ' .. set_message ('err_bad_lccn'); -- lccn contains a space, set an error message | |||
end | end | ||
if is_set ( | if is_set (err_cat) then | ||
options.coins_list_t['LCCN'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['LCCN'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = lccn, separator = handler.separator, encode = handler.encode}); | prefix = handler.prefix, id = lccn, separator = handler.separator, encode = handler.encode}) .. err_cat; | ||
end | end | ||
Riga 1 026: | Riga 1 016: | ||
local id_num; | local id_num; | ||
local id_len; | local id_len; | ||
local err_cat = ''; | |||
id_num = id:match ('^[Mm][Rr](%d+)$'); -- identifier with mr prefix | id_num = id:match ('^[Mm][Rr](%d+)$'); -- identifier with mr prefix | ||
Riga 1 039: | Riga 1 030: | ||
id = string.rep ('0', 7-id_len) .. id_num; -- zero-fill leading digits | id = string.rep ('0', 7-id_len) .. id_num; -- zero-fill leading digits | ||
else | else | ||
set_message ('err_bad_mr'); | err_cat = ' ' .. set_message ('err_bad_mr'); -- set an error message | ||
options.coins_list_t['MR'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['MR'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}) .. err_cat; | ||
end | end | ||
Riga 1 059: | Riga 1 050: | ||
local handler = options.handler; | local handler = options.handler; | ||
local number; | local number; | ||
local err_msg = ''; -- empty string for concatenation | |||
if id:match('^ocm%d%d%d%d%d%d%d%d$') then -- ocm prefix and 8 digits; 001 field (12 characters) | if id:match('^ocm%d%d%d%d%d%d%d%d$') then -- ocm prefix and 8 digits; 001 field (12 characters) | ||
number = id:match('ocm(%d+)'); -- get the number | number = id:match('ocm(%d+)'); -- get the number | ||
Riga 1 081: | Riga 1 073: | ||
id = number; -- exclude prefix, if any, from external link | id = number; -- exclude prefix, if any, from external link | ||
else | else | ||
set_message ('err_bad_oclc') | err_msg = ' ' .. set_message ('err_bad_oclc') -- add an error message if the id is malformed | ||
options.coins_list_t['OCLC'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['OCLC'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | |||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}) .. err_msg; | ||
return text; | |||
end | end | ||
Riga 1 101: | Riga 1 095: | ||
local handler = options.handler; | local handler = options.handler; | ||
local ident, code = id:gsub('^OL', ''):match("^(%d+([AMW]))$"); -- strip optional OL prefix followed immediately by digits followed by 'A', 'M', or 'W'; | local ident, code = id:gsub('^OL', ''):match("^(%d+([AMW]))$"); -- strip optional OL prefix followed immediately by digits followed by 'A', 'M', or 'W'; | ||
local | local error_msg = ''; | ||
local prefix = { -- these are appended to the handler.prefix according to code | local prefix = { -- these are appended to the handler.prefix according to code | ||
['A']='authors/OL', | ['A']='authors/OL', | ||
Riga 1 112: | Riga 1 106: | ||
code = 'X'; -- no code or id completely invalid | code = 'X'; -- no code or id completely invalid | ||
ident = id; -- copy id to ident so that we display the flawed identifier | ident = id; -- copy id to ident so that we display the flawed identifier | ||
error_msg = ' ' .. set_message ('err_bad_ol'); | |||
end | end | ||
if not is_set ( | if not is_set (error_msg) then | ||
options.coins_list_t['OL'] = handler.prefix .. prefix[code] .. ident; -- experiment for ol coins | options.coins_list_t['OL'] = handler.prefix .. prefix[code] .. ident; -- experiment for ol coins | ||
else | else | ||
Riga 1 124: | Riga 1 118: | ||
prefix = handler.prefix .. prefix[code], | prefix = handler.prefix .. prefix[code], | ||
id = ident, separator = handler.separator, encode = handler.encode, | id = ident, separator = handler.separator, encode = handler.encode, | ||
access = access}); | access = access}) .. error_msg; | ||
end | end | ||
Riga 1 142: | Riga 1 136: | ||
local access = options.access; | local access = options.access; | ||
local handler = options.handler; | local handler = options.handler; | ||
local err_cat = ''; -- presume that OSTI is valid | |||
if id:match("[^%d]") then -- if OSTI has anything but digits | if id:match("[^%d]") then -- if OSTI has anything but digits | ||
set_message ('err_bad_osti'); | err_cat = ' ' .. set_message ('err_bad_osti'); -- set an error message | ||
options.coins_list_t['OSTI'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['OSTI'] = nil; -- when error, unset so not included in COinS | ||
else -- OSTI is only digits | else -- OSTI is only digits | ||
local id_num = tonumber (id); -- convert id to a number for range testing | local id_num = tonumber (id); -- convert id to a number for range testing | ||
if 1018 > id_num or handler.id_limit < id_num then -- if OSTI is outside test limit boundaries | if 1018 > id_num or handler.id_limit < id_num then -- if OSTI is outside test limit boundaries | ||
set_message ('err_bad_osti'); | err_cat = ' ' .. set_message ('err_bad_osti'); -- set an error message | ||
options.coins_list_t['OSTI'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['OSTI'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
Riga 1 155: | Riga 1 150: | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access}) .. err_cat; | ||
end | end | ||
Riga 1 180: | Riga 1 175: | ||
local embargo = options.Embargo; -- TODO: lowercase? | local embargo = options.Embargo; -- TODO: lowercase? | ||
local handler = options.handler; | local handler = options.handler; | ||
local | local err_cat; | ||
local id_num; | local id_num; | ||
local text; | local text; | ||
Riga 1 195: | Riga 1 190: | ||
id_num = tonumber (id_num); -- convert id_num to a number for range testing | id_num = tonumber (id_num); -- convert id_num to a number for range testing | ||
if 1 > id_num or handler.id_limit < id_num then -- if PMC is outside test limit boundaries | if 1 > id_num or handler.id_limit < id_num then -- if PMC is outside test limit boundaries | ||
err_cat = ' ' .. set_message ('err_bad_pmc'); -- set an error message | |||
else | else | ||
id = tostring (id_num); -- make sure id is a string | id = tostring (id_num); -- make sure id is a string | ||
end | end | ||
else -- when id format incorrect | else -- when id format incorrect | ||
err_cat = ' ' .. set_message ('err_bad_pmc'); -- set an error message | |||
end | end | ||
Riga 1 209: | Riga 1 204: | ||
handler.separator, | handler.separator, | ||
id, | id, | ||
(err_cat and err_cat or '') -- parens required | |||
}); | }); | ||
else | else | ||
text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, -- no embargo date or embargo has expired, ok to link to article | text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, -- no embargo date or embargo has expired, ok to link to article | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access, | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access, | ||
auto_link = not | auto_link = not err_cat and 'pmc' or nil -- do not auto-link when PMC has error | ||
}); | }) .. (err_cat and err_cat or ''); -- parentheses required | ||
end | end | ||
if | if err_cat then | ||
options.coins_list_t['PMC'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['PMC'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
Riga 1 236: | Riga 1 232: | ||
local id = options.id; | local id = options.id; | ||
local handler = options.handler; | local handler = options.handler; | ||
local err_cat = ''; -- presume that PMID is valid | |||
if id:match("[^%d]") then -- if PMID has anything but digits | if id:match("[^%d]") then -- if PMID has anything but digits | ||
set_message ('err_bad_pmid'); | err_cat = ' ' .. set_message ('err_bad_pmid'); -- set an error message | ||
options.coins_list_t['PMID'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['PMID'] = nil; -- when error, unset so not included in COinS | ||
else -- PMID is only digits | else -- PMID is only digits | ||
local id_num = tonumber (id); -- convert id to a number for range testing | local id_num = tonumber (id); -- convert id to a number for range testing | ||
if 1 > id_num or handler.id_limit < id_num then -- if PMID is outside test limit boundaries | if 1 > id_num or handler.id_limit < id_num then -- if PMID is outside test limit boundaries | ||
set_message ('err_bad_pmid'); | err_cat = ' ' .. set_message ('err_bad_pmid'); -- set an error message | ||
options.coins_list_t['PMID'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['PMID'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
Riga 1 249: | Riga 1 246: | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}) .. err_cat; | ||
end | end | ||
Riga 1 266: | Riga 1 263: | ||
local id = options.id; | local id = options.id; | ||
local handler = options.handler; | local handler = options.handler; | ||
local err_cat = ''; -- presume that RFC is valid | |||
if id:match("[^%d]") then -- if RFC has anything but digits | if id:match("[^%d]") then -- if RFC has anything but digits | ||
set_message ('err_bad_rfc'); | err_cat = ' ' .. set_message ('err_bad_rfc'); -- set an error message | ||
options.coins_list_t['RFC'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['RFC'] = nil; -- when error, unset so not included in COinS | ||
else -- RFC is only digits | else -- RFC is only digits | ||
local id_num = tonumber (id); -- convert id to a number for range testing | local id_num = tonumber (id); -- convert id to a number for range testing | ||
if 1 > id_num or handler.id_limit < id_num then -- if RFC is outside test limit boundaries | if 1 > id_num or handler.id_limit < id_num then -- if RFC is outside test limit boundaries | ||
set_message ('err_bad_rfc'); | err_cat = ' ' .. set_message ('err_bad_rfc'); -- set an error message | ||
options.coins_list_t['RFC'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['RFC'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
Riga 1 279: | Riga 1 277: | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access}) .. err_cat; | ||
end | end | ||
Riga 1 297: | Riga 1 295: | ||
local access = options.access; | local access = options.access; | ||
local handler = options.handler; | local handler = options.handler; | ||
local err_cat = ''; -- presume that S2CID is valid | |||
local id_num; | local id_num; | ||
local text; | local text; | ||
Riga 1 305: | Riga 1 304: | ||
id_num = tonumber (id_num); -- convert id_num to a number for range testing | id_num = tonumber (id_num); -- convert id_num to a number for range testing | ||
if handler.id_limit < id_num then -- if S2CID is outside test limit boundaries | if handler.id_limit < id_num then -- if S2CID is outside test limit boundaries | ||
set_message ('err_bad_s2cid'); | err_cat = ' ' .. set_message ('err_bad_s2cid'); -- set an error message | ||
options.coins_list_t['S2CID'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['S2CID'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
else -- when id format incorrect | else -- when id format incorrect | ||
set_message ('err_bad_s2cid'); | err_cat = ' ' .. set_message ('err_bad_s2cid'); -- set an error message | ||
options.coins_list_t['S2CID'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['S2CID'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access}) .. err_cat; | ||
return text; | return text; | ||
Riga 1 333: | Riga 1 333: | ||
local ignore_invalid = options.accept; | local ignore_invalid = options.accept; | ||
local handler = options.handler; | local handler = options.handler; | ||
local function return_result (check, err_type) | local function return_result (check, err_type) -- local function to handle the various returns | ||
local SBN = internal_link_id ({link = handler.link, label = handler.label, redirect = handler.redirect, | local SBN = internal_link_id ({link = handler.link, label = handler.label, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator}); | prefix = handler.prefix, id = id, separator = handler.separator}); | ||
if not ignore_invalid then | if not ignore_invalid then -- if not ignoring SBN errors | ||
if not check then | if not check then | ||
options.coins_list_t['SBN'] = nil; -- when error, unset so not included in COinS; not really necessary here because sbn not made part of COinS | options.coins_list_t['SBN'] = nil; -- when error, unset so not included in COinS; not really necessary here because sbn not made part of COinS | ||
set_message ('err_bad_sbn', {err_type}); | return SBN .. set_message ('err_bad_sbn', {err_type}, false, ' '); -- display an error message | ||
end | end | ||
else | else | ||
Riga 1 379: | Riga 1 378: | ||
local id = options.id; | local id = options.id; | ||
local handler = options.handler; | local handler = options.handler; | ||
local err_cat = ''; -- presume that SSRN is valid | |||
local id_num; | local id_num; | ||
local text; | local text; | ||
Riga 1 387: | Riga 1 387: | ||
id_num = tonumber (id_num); -- convert id_num to a number for range testing | id_num = tonumber (id_num); -- convert id_num to a number for range testing | ||
if 100 > id_num or handler.id_limit < id_num then -- if SSRN is outside test limit boundaries | if 100 > id_num or handler.id_limit < id_num then -- if SSRN is outside test limit boundaries | ||
set_message ('err_bad_ssrn'); | err_cat = ' ' .. set_message ('err_bad_ssrn'); -- set an error message | ||
options.coins_list_t['SSRN'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['SSRN'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
else -- when id format incorrect | else -- when id format incorrect | ||
set_message ('err_bad_ssrn'); | err_cat = ' ' .. set_message ('err_bad_ssrn'); -- set an error message | ||
options.coins_list_t['SSRN'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['SSRN'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access}) .. err_cat; | ||
return text; | return text; | ||
Riga 1 417: | Riga 1 417: | ||
if not id:match('^.+@.+$') or not id:match('^[^<].*[^>]$') then -- doesn't have '@' or has one or first or last character is '< or '>' | if not id:match('^.+@.+$') or not id:match('^[^<].*[^>]$') then -- doesn't have '@' or has one or first or last character is '< or '>' | ||
set_message ('err_bad_usenet_id') | text = text .. ' ' .. set_message ('err_bad_usenet_id') -- add an error message if the message id is invalid | ||
options.coins_list_t['USENETID'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['USENETID'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return text | return text | ||
end | end | ||
Riga 1 438: | Riga 1 438: | ||
local id = options.id; | local id = options.id; | ||
local handler = options.handler; | local handler = options.handler; | ||
local err_cat = ''; | |||
if id:match('^%d%d%d%d%d%d%d%d$') then -- is this identifier using temporary format? | if id:match('^%d%d%d%d%d%d%d%d$') then -- is this identifier using temporary format? | ||
set_message ('maint_zbl'); -- yes, add maint cat | set_message ('maint_zbl'); -- yes, add maint cat | ||
elseif not id:match('^%d?%d?%d?%d%.%d%d%d%d%d$') then -- not temporary, is it normal format? | elseif not id:match('^%d?%d?%d?%d%.%d%d%d%d%d$') then -- not temporary, is it normal format? | ||
set_message ('err_bad_zbl'); | err_cat = ' ' .. set_message ('err_bad_zbl'); -- no, set an error message | ||
options.coins_list_t['ZBL'] = nil; -- when error, unset so not included in COinS | options.coins_list_t['ZBL'] = nil; -- when error, unset so not included in COinS | ||
end | end | ||
return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect, | ||
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}); | prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode}) .. err_cat; | ||
end | end | ||
Riga 1 490: | Riga 1 491: | ||
if is_set (access_level) then | if is_set (access_level) then | ||
if not in_array (access_level, cfg.keywords_lists['id-access']) then -- exact match required | if not in_array (access_level, cfg.keywords_lists['id-access']) then -- exact match required | ||
set_message ('err_invalid_param_val', {access_param, access_level}); | table.insert (z.message_tail, { set_message ('err_invalid_param_val', {access_param, access_level}, true) } ); | ||
access_level = nil; -- invalid so unset | access_level = nil; -- invalid so unset | ||
end | end | ||
if not is_set (id_list[k]) then -- identifier access-level must have a matching identifier | if not is_set (id_list[k]) then -- identifier access-level must have a matching identifier | ||
set_message ('err_param_access_requires_param', {k:lower()}); -- parameter name is uppercase in cfg.id_handlers (k); lowercase for error message | table.insert (z.message_tail, { set_message ('err_param_access_requires_param', {k:lower()}, true) } ); -- parameter name is uppercase in cfg.id_handlers (k); lowercase for error message | ||
end | end | ||
id_accesses_list[k] = cfg.keywords_xlate[access_level]; -- get translated keyword | id_accesses_list[k] = cfg.keywords_xlate[access_level]; -- get translated keyword | ||
Riga 1 558: | Riga 1 559: | ||
options_t.handler = cfg.id_handlers[hkey]; | options_t.handler = cfg.id_handlers[hkey]; | ||
options_t.coins_list_t = ID_list_coins_t; -- pointer to ID_list_coins_t; for |asin= and |ol=; also to keep erroneous values out of the citation's metadata | options_t.coins_list_t = ID_list_coins_t; -- pointer to ID_list_coins_t; for |asin= and |ol=; also to keep erroneous values out of the citation's metadata | ||
if func_map[hkey] then | if func_map[hkey] then | ||
table.insert (ID_list_t, {hkey, func_map[hkey] (options_t)}); -- call the function and add the results to the output sequence table | |||
else | else | ||
error (cfg.messages['unknown_ID_key'] .. hkey); | error (cfg.messages['unknown_ID_key'] .. ' ' .. hkey); -- here when func_map doesn't have a function for hkey | ||
end | end | ||
end | end | ||
Riga 1 603: | Riga 1 598: | ||
for _, v in ipairs (ID_support_t) do | for _, v in ipairs (ID_support_t) do | ||
if is_set (v[1]) and not ID_list_coins_t[v[2]] then -- when support parameter has a value but matching identifier parameter is missing or empty | if is_set (v[1]) and not ID_list_coins_t[v[2]] then -- when support parameter has a value but matching identifier parameter is missing or empty | ||
set_message (v[3], (v[4])); | table.insert (z.message_tail, {set_message (v[3], (v[4]))}); -- emit the appropriate error message | ||
end | end | ||
end | end | ||
Riga 1 617: | Riga 1 612: | ||
]] | ]] | ||
local function identifier_lists_get ( | local function identifier_lists_get (args, options_t, ID_support_t) | ||
local ID_list_coins_t = extract_ids ( | local ID_list_coins_t = extract_ids (args); -- get a table of identifiers and their values for use locally and for use in COinS | ||
options_check (ID_list_coins_t, ID_support_t); -- ID support parameters must have matching identifier parameters | options_check (ID_list_coins_t, ID_support_t); -- ID support parameters must have matching identifier parameters | ||
local ID_access_levels_t = extract_id_access_levels ( | local ID_access_levels_t = extract_id_access_levels (args, ID_list_coins_t); -- get a table of identifier access levels | ||
local ID_list_t = build_id_list (ID_list_coins_t, options_t, ID_access_levels_t); -- get a sequence table of rendered identifier strings | local ID_list_t = build_id_list (ID_list_coins_t, options_t, ID_access_levels_t); -- get a sequence table of rendered identifier strings | ||
Riga 1 654: | Riga 1 649: | ||
auto_link_urls = auto_link_urls, -- table of identifier URLs to be used when auto-linking |title= | auto_link_urls = auto_link_urls, -- table of identifier URLs to be used when auto-linking |title= | ||
identifier_lists_get = identifier_lists_get, -- experiment to replace individual calls to build_id_list | identifier_lists_get = identifier_lists_get, -- experiment to replace individual calls to build_id_list, extract_ids, extract_id_access_levels | ||
is_embargoed = is_embargoed; | is_embargoed = is_embargoed; | ||
set_selected_modules = set_selected_modules; | set_selected_modules = set_selected_modules; | ||
} | } |