Changes

update per RfC;
Line 1: Line 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 >--------------------------------------
 
]]
 
]]
Line 180: Line 179:  
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 lang.formatDate().  To get around that
+
contains a non-English month name because good1 is false after the call to lang_object.formatDate().  To get
call this function with YYYY-MM-DD format dates.
+
around that call this function with date parts and create a YYYY-MM-DD format date.
    
]=]
 
]=]
   −
local function is_valid_biorxiv_date (biorxiv_date)
+
local function is_valid_biorxiv_date (y, m, d)
 +
local biorxiv_date = table.concat ({y, m, d}, '-'); -- make ymd 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
Line 260: Line 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.
 +
 
]]
 
]]
   Line 311: Line 312:  
<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
 +
 
]]
 
]]
   Line 318: Line 320:  
local handler = options.handler;
 
local handler = options.handler;
 
local year, month, version;
 
local year, month, version;
local err_cat = false; -- assume no error message
+
local err_msg = false; -- assume no error message
 
local text; -- output text
 
local text; -- output text
 
 
Line 327: Line 329:  
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
+
err_msg = true; -- flag for error message
 
end
 
end
   Line 336: Line 338:  
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
+
err_msg = true; -- flag for error message
 
end
 
end
   Line 344: Line 346:  
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
+
err_msg = true; -- flag for error message
 
end
 
end
    
else
 
else
err_cat = true; -- not a recognized format; flag for error message
+
err_msg = true; -- not a recognized format; flag for error message
 
end
 
end
   −
if err_cat then
+
if err_msg 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
+
local err_msg_t = {};
+
if err_msg then
 +
set_message ('err_bad_arxiv');
 +
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 = handler.access}) .. err_cat;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access});
    
if is_set (class) then
 
if is_set (class) then
Line 364: Line 369:  
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
text = table.concat ({text, ' ', set_message ('err_class_ignored')});
+
set_message ('err_class_ignored');
 
end
 
end
 
end
 
end
   −
return text;
+
return text;
 
end
 
end
   Line 395: Line 400:  
local handler = options.handler;
 
local handler = options.handler;
 
local err_type;
 
local err_type;
 +
local err_msg = '';
 
local year;
 
local year;
   Line 420: Line 426:     
if is_set (err_type) then -- if there was an error detected
 
if is_set (err_type) then -- if there was an error detected
text = text .. ' ' .. set_message ('err_bad_bibcode', {err_type});
+
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
Line 446: Line 453:  
local id = options.id;
 
local id = options.id;
 
local handler = options.handler;
 
local handler = options.handler;
local err_cat = true; -- flag; assume that there will be an error
+
local err_msg = true; -- flag; assume that there will be an error
 
 
 
local patterns = {
 
local patterns = {
Line 459: Line 466:     
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 .. '-' .. m .. '-' .. d) then -- validate the encoded date; TODO: don't ignore leap-year and actual month lengths ({{#time:}} is a poor date validator)
+
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
+
err_msg = 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 err_cat then
+
if err_msg 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
 +
set_message ('err_bad_biorxiv'); -- and set the error message
 
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}) .. (err_cat and (' ' .. set_message ('err_bad_biorxiv')) or '');
+
encode = handler.encode, access = handler.access});
 
end
 
end
   Line 483: Line 491:     
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
 +
 
]]
 
]]
   Line 489: Line 498:  
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,
Line 496: Line 505:  
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
text = text .. ' ' .. set_message ('err_bad_citeseerx' );
+
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
Line 526: Line 536:  
local ignore_invalid = options.accept;
 
local ignore_invalid = options.accept;
 
local handler = options.handler;
 
local handler = options.handler;
local err_cat;
+
local err_flag;
    
local text;
 
local text;
Line 555: Line 565:  
end
 
end
   −
local registrant = id:match ('^10%.([^/]+)/[^%s–]-[^%.,]$'); -- registrant set when DOI has the proper basic form
+
local registrant = mw.ustring.match (id, '^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
Line 572: Line 582:  
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
+
err_flag = 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
+
err_flag = set_message ('err_bad_doi'); -- invalid directory or malformed
 
end
 
end
 
else
 
else
Line 583: Line 593:  
end
 
end
   −
if err_cat then
+
if err_flag 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
Line 589: Line 599:  
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 (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
+
auto_link = not (err_flag 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 .. (err_cat and err_cat or ''); -- parentheses required
+
return text;
 
end
 
end
   Line 655: Line 665:     
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
text = text .. ' ' .. set_message ('err_bad_hdl' );
+
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
Line 681: Line 692:  
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
return ISBN .. set_message ('err_bad_isbn', {err_type}, false, ' '); -- display an error message
+
set_message ('err_bad_isbn', err_type); -- set an error message
 +
return ISBN; -- return id text
 
end
 
end
 
end
 
end
return ISBN;
+
return ISBN; -- return id text
 
end
 
end
   Line 743: Line 755:  
local domain = options.ASINTLD;
 
local domain = options.ASINTLD;
 
 
local err_cat = ''
+
local err_flag;
    
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
+
err_flag = 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  
+
err_flag = 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 (err_cat) then
+
elseif not is_set (err_flag) then
err_cat = ' ' .. set_message ('err_bad_asin'); -- ASIN is not ISBN-10
+
err_flag = 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
+
err_flag = set_message ('err_bad_asin'); -- asin doesn't begin with uppercase alpha
 
end
 
end
 
end
 
end
Line 769: Line 781:  
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
+
err_flag = set_message ('err_bad_asin_tld'); -- unsupported asin-tld value
 
end
 
end
 
local handler = options.handler;
 
local handler = options.handler;
   −
if not is_set (err_cat) then
+
if not is_set (err_flag) then
options.coins_list_t['ASIN'] = handler.prefix .. domain .. "/dp/" .. id; -- experiment for asin coins
+
options.coins_list_t['ASIN'] = handler.prefix .. domain .. "/dp/" .. id; -- asin for 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
Line 781: Line 793:  
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}) .. err_cat;
+
id = id, encode = handler.encode, separator = handler.separator})
 
end
 
end
   Line 824: Line 836:  
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
text = text .. ' ' .. set_message ('err_bad_ismn' ) -- add an error message if the ISMN is invalid
+
set_message ('err_bad_ismn'); -- create an error message if the ISMN is invalid
 
end  
 
end  
 
 
Line 877: Line 889:  
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
text = text .. ' ' .. set_message ('err_bad_issn', (options.hkey == 'EISSN') and 'e' or ''); -- add an error message if the ISSN is invalid
+
set_message ('err_bad_issn', (options.hkey == 'EISSN') and 'e' or ''); -- create an error message if the ISSN is invalid
 
end  
 
end  
 
end
 
end
 
 
return text
+
return text;
 
end
 
end
   Line 895: Line 907:  
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
   Line 908: Line 919:  
id = id_num; -- jfm matches pattern
 
id = id_num; -- jfm matches pattern
 
else
 
else
err_cat = ' ' .. set_message ('err_bad_jfm' ); -- set an error message
+
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}) .. err_cat;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});
 
end
 
end
   Line 927: Line 938:  
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
err_msg = ' ' .. set_message ('err_bad_jstor'); -- set an error message
+
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}) .. err_msg;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access});
 
end
 
end
   Line 956: Line 966:  
local lccn = options.id;
 
local lccn = options.id;
 
local handler = options.handler;
 
local handler = options.handler;
local err_cat = ''; -- presume that LCCN is valid
+
local err_flag; -- presume that LCCN is valid
 
local id = lccn; -- local copy of the LCCN
 
local id = lccn; -- local copy of the LCCN
   Line 964: Line 974:  
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
+
err_flag = 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
+
err_flag = 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
+
err_flag = 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
+
err_flag = 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
+
err_flag = 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
+
err_flag = set_message ('err_bad_lccn'); -- wrong length, set an error message
 
end
 
end
   −
if not is_set (err_cat) and nil ~= lccn:find ('%s') then
+
if not is_set (err_flag) and nil ~= lccn:find ('%s') then
err_cat = ' ' .. set_message ('err_bad_lccn'); -- lccn contains a space, set an error message
+
err_flag = set_message ('err_bad_lccn'); -- lccn contains a space, set an error message
 
end
 
end
   −
if is_set (err_cat) then
+
if is_set (err_flag) 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}) .. err_cat;
+
prefix = handler.prefix, id = lccn, separator = handler.separator, encode = handler.encode});
 
end
 
end
   Line 1,012: Line 1,022:  
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
   Line 1,026: Line 1,035:  
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
err_cat = ' ' .. set_message ('err_bad_mr'); -- set an error message
+
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}) .. err_cat;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});
 
end
 
end
   Line 1,046: Line 1,055:  
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
Line 1,069: Line 1,077:  
id = number; -- exclude prefix, if any, from external link
 
id = number; -- exclude prefix, if any, from external link
 
else
 
else
err_msg = ' ' .. set_message ('err_bad_oclc') -- add an error message if the id is malformed
+
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,
+
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}) .. err_msg;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});
 
  −
return text;
   
end
 
end
   Line 1,091: Line 1,097:  
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 error_msg = '';
+
local err_flag;
 
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',
Line 1,102: Line 1,108:  
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');
+
err_flag = set_message ('err_bad_ol');
 
end
 
end
   −
if not is_set (error_msg) then
+
if not is_set (err_flag) 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
Line 1,114: Line 1,120:  
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}) .. error_msg;
+
access = access});
 
end
 
end
   Line 1,132: Line 1,138:  
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
err_cat = ' ' .. set_message ('err_bad_osti'); -- set an error message
+
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
err_cat = ' ' .. set_message ('err_bad_osti'); -- set an error message
+
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
Line 1,146: Line 1,151:  
 
 
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}) .. err_cat;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access});
 
end
 
end
   Line 1,171: Line 1,176:  
local embargo = options.Embargo; -- TODO: lowercase?
 
local embargo = options.Embargo; -- TODO: lowercase?
 
local handler = options.handler;
 
local handler = options.handler;
local err_cat;
+
local err_flag;
 
local id_num;
 
local id_num;
 
local text;
 
local text;
Line 1,186: Line 1,191:  
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
+
err_flag = 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
+
err_flag = set_message ('err_bad_pmc'); -- set an error message
 
end
 
end
 
 
Line 1,200: Line 1,205:  
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 err_cat and 'pmc' or nil -- do not auto-link when PMC has error
+
auto_link = not err_flag and 'pmc' or nil -- do not auto-link when PMC has error
}) .. (err_cat and err_cat or ''); -- parentheses required
+
});
 
end
 
end
   −
if err_cat then
+
if err_flag 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
Line 1,228: Line 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
err_cat = ' ' .. set_message ('err_bad_pmid'); -- set an error message
+
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
err_cat = ' ' .. set_message ('err_bad_pmid'); -- set an error message
+
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
Line 1,242: Line 1,245:  
 
 
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}) .. err_cat;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});
 
end
 
end
   Line 1,259: Line 1,262:  
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
err_cat = ' ' .. set_message ('err_bad_rfc'); -- set an error message
+
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
err_cat = ' ' .. set_message ('err_bad_rfc'); -- set an error message
+
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
Line 1,273: Line 1,275:  
 
 
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}) .. err_cat;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access});
 
end
 
end
   Line 1,291: Line 1,293:  
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;
Line 1,300: Line 1,301:  
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
err_cat = ' ' .. set_message ('err_bad_s2cid'); -- set an error message
+
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
err_cat = ' ' .. set_message ('err_bad_s2cid'); -- set an error message
+
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}) .. err_cat;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access});
    
return text;
 
return text;
Line 1,329: Line 1,329:  
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 to handle the various returns
+
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 ignoring SBN errors
+
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
return SBN .. set_message ('err_bad_sbn', {err_type}, false, ' '); -- display an error message
+
set_message ('err_bad_sbn', {err_type}); -- display an error message
 +
return SBN;
 
end
 
end
 
else
 
else
Line 1,374: Line 1,375:  
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;
Line 1,383: Line 1,383:  
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
err_cat = ' ' .. set_message ('err_bad_ssrn'); -- set an error message
+
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
err_cat = ' ' .. set_message ('err_bad_ssrn'); -- set an error message
+
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 = handler.access}) .. err_cat;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = options.access});
    
return text;
 
return text;
Line 1,413: Line 1,413:  
   
 
   
 
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 '>'
text = text .. ' ' .. set_message ('err_bad_usenet_id') -- add an error message if the message id is invalid
+
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
   Line 1,434: Line 1,434:  
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?
err_cat = ' ' .. set_message ('err_bad_zbl'); -- no, set an error message
+
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}) .. err_cat;
+
prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});
 
end
 
end
   Line 1,487: Line 1,486:  
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
table.insert (z.message_tail, { set_message ('err_invalid_param_val', {access_param, access_level}, true) } );
+
set_message ('err_invalid_param_val', {access_param, access_level});
 
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
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
+
set_message ('err_param_access_requires_param', {k:lower()}); -- 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
Line 1,555: Line 1,554:  
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
 +
options_t.coins_list_t[hkey] = v; -- id value without accept-as-written markup for metadata
 
 
 +
if options_t.handler.access and not in_array (options_t.handler.access, cfg.keywords_lists['id-access']) then
 +
error (cfg.messages['unknown_ID_access'] .. options_t.handler.access); -- here when handler access key set to a value not listed in list of allowed id access keywords
 +
end
 +
 
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
+
local id_text = func_map[hkey] (options_t); -- call the function to get identifier text and any error message
 +
table.insert (ID_list_t, {hkey, id_text}); -- add identifier text to the output sequence table
 
else
 
else
error (cfg.messages['unknown_ID_key'] .. ' ' .. hkey); -- here when func_map doesn't have a function for hkey
+
error (cfg.messages['unknown_ID_key'] .. hkey); -- here when func_map doesn't have a function for hkey
 
end
 
end
 
end
 
end
Line 1,594: Line 1,599:  
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
table.insert (z.message_tail, {set_message (v[3], (v[4]))}); -- emit the appropriate error message
+
set_message (v[3], (v[4])); -- emit the appropriate error message
 
end
 
end
 
end
 
end
Line 1,608: Line 1,613:  
]]
 
]]
   −
local function identifier_lists_get (args, options_t, ID_support_t)
+
local function identifier_lists_get (args_t, options_t, ID_support_t)
local ID_list_coins_t = extract_ids (args); -- get a table of identifiers and their values for use locally and for use in COinS
+
local ID_list_coins_t = extract_ids (args_t); -- 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 (args, ID_list_coins_t); -- get a table of identifier access levels
+
local ID_access_levels_t = extract_id_access_levels (args_t, 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
   Line 1,645: Line 1,650:  
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, extract_ids, extract_id_access_levels
+
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;
 
}
 
}
Anonymous user