Changes
asin() calls isbn() so asin() must follow isbn();
]]
local is_set, in_array, set_error, select_one, add_maint_cat, substitute, make_wikilink; -- functions in Module:Citation/CS1/Utilities
local z; -- table of tables defined in Module:Citation/CS1/Utilities
local cfg; -- table of configuration tables that are defined in Module:Citation/CS1/Configuration
--============================<< H E L P E R F U N C T I O N S >>============================================
--[[--------------------------< E X T E R N A L _ L I N K _ I D >----------------------------------------------
end
return mwtable.ustring.formatconcat ({ make_wikilink ( '[[%s|%s]]%s%s', options.link, options.label), options.separator or "' "', ext_link });
end
local function internal_link_id(options)
return mwtable.ustring.formatconcat ( '[[%s|%s]]%s[[%s%s%s|%s]]', { make_wikilink (options.link, options.label), options.separator or "' "', make_wikilink ( table.concat ( { options.prefix, options.id, options.suffix or ""'' }), mw.text.nowiki(options.id) ); });end --[[--------------------------< I S _ E M B A R G O E D >------------------------------------------------------ Determines if a PMC identifier's online version is embargoed. Compares the date in |embargo= against today's date. If embargo date isin the future, returns the content of |embargo=; otherwise, returns and empty string because the embargo has expired or because|embargo= was not set in this cite. ]] local function is_embargoed (embargo) if is_set (embargo) then local lang = mw.getContentLanguage(); local good1, embargo_date, good2, todays_date; good1, embargo_date = pcall( lang.formatDate, lang, 'U', embargo ); good2, todays_date = pcall( lang.formatDate, lang, 'U' ); if good1 and good2 then -- if embargo date and today's date are good dates if tonumber( embargo_date ) >= tonumber( todays_date ) then -- is embargo date is in the future? return embargo; -- still embargoed else add_maint_cat ('embargo') return ''; -- unset because embargo has expired end end end return ''; -- |embargo= not set return empty string
end
ISBN-10 and ISSN validator code calculates checksum across all isbn/issn digits including the check digit.
ISBN-13 is checked in check_isbnisbn().
If the number is valid the result will be 0. Before calling this function, issbn/issn must be checked for length
local function is_valid_isxn (isxn_str, len)
local temp = 0;
isxn_str = { isxn_str:byte(1, len) }; -- make a table of byte values '0' → 0x30 .. '9' → 0x39, 'X' → 0x58
len = len+1; -- adjust to be a loop counter
for i, v in ipairs( isxn_str ) do -- loop through all of the bytes and calculate the checksum
--[[--------------------------< IS _ V A L I D _ I S X N _ 1 3 >-----------------------------------------------
ISBN-13 and ISMN validator code calculates checksum across all 13 isbn/ismn digits including the check digit.
local temp=0;
isxn_str = { isxn_str:byte(1, 13) }; -- make a table of byte values '0' → 0x30 .. '9' → 0x39
for i, v in ipairs( isxn_str ) do
temp = temp + (3 - 2*(i % 2)) * tonumber( string.char(v) ); -- multiply odd index digits by 1, even index digits by 3 and sum; includes check digit
--[[--------------------------< C H N O R M A L I Z E C K _ I S B L C C N >------------------------------------------------------------
Returns a normalized lccn for lccn() to validate. There is no error checking (step 3.b.1) performed in this function.
]]
local function check_isbnnormalize_lccn ( isbn_str lccn) if nil ~lccn = isbn_strlccn:matchgsub ("[^%s-0-9X]") then return false, 'invalid character'; -- fail if isbn_str contains anything but digits, hyphens, or the uppercase X end isbn_str = isbn_str:gsub( "-", "" ):gsub( " ", "" ); -- remove hyphens and spaces local len = isbn_str:len(); if len ~= 10 and len ~= 13 then return false, 'length'; -- fail if incorrect length end1. strip whitespace
if len nil ~== 10 then if isbn_str:matchstring.find ( "^%d*X?$" ) == nil then -- fail if isbn_str has 'X' anywhere but last position return falselccn, 'invalid form/'; end return is_valid_isxn(isbn_str, 10), 'checksum'; elsethen if isbn_strlccn = lccn:match( "^%d+$(.-)/" ) == nil then return false, 'invalid character'; -- fail if isbn13 is not 2. remove forward slash and all digits end if isbn_str:match( "^97[89]%d*$" ) == nil then return false, 'invalid prefix'; -- fail when isbn13 does not begin with 978 or 979 end return is_valid_isxn_13 (isbn_str), 'checksum';character to the right of it
end
local prefix
local suffix
prefix, suffix = lccn:match ("(.+)%-(.+)"); -- 3.a remove hyphen by splitting the string into prefix and suffix
end
return text;end --[[--------------------------< I S S N >---------------------------------------------------------------------- Validate and format an issn. This code fixes the case where an editor has included an ISSN in the citation buthas separated the two groups of four digits with a space. When that condition occurred, the resulting link lookedlike this: |issn=0819 4327 gives: [http://www.worldcat.org/issn/0819 4327 0819 4327] -- can't have spaces in an external link This code now prevents that by inserting a hyphen at the issn midpoint. It also validates the issn for lengthand makes sure that the checkdigit agrees with the calculated value. Incorrect length (8 digits), charactersother than 0-9 and X, or checkdigit / calculated value mismatch will all cause a check issn error message. Theissn is always displayed with a hyphen, even if the issn was given as a single group of 8 digits. ]] local function issn(id, e) local issn_copy = id; -- save a copy of unadulterated issn; use this version for display if issn does not validate local handler; local text; local valid_issn = true; if e then handler = cfg.id_handlers['EISSN']; else handler = cfg.id_handlers['ISSN']lccn;
end
--[[--------------------------< A R X I V >--------------------------------------------------------------------
--[[--------------------------< B I B C O R X I V D E >--------------------------------------------------------------------
]]
local function normalize_lccn bibcode (lccnid, access) lccn local handler = lccn:gsub ("%s", ""); -- 1cfg. strip whitespaceid_handlers['BIBCODE']; local err_type; local year;
end
end
end
if not is_set (err_cat) and nil ~= lccn:find ('%s'err_type) then -- if there was an error detected err_cat text = text .. ' ' .. set_error( 'bad_lccnbad_bibcode' , {err_type}); -- lccn contains a space, set an error message
end
return external_link_id({link = handler.link, label = handler.label, prefix=handler.prefix,id=lccn,separator=handler.separator, encode=handler.encode}) .. err_cattext;
end
--[[--------------------------< P M B I D O R X I V >----------------------------------------------------------------------
Format PMID bioRxiv id and do simple error checking. PMIDs BiorXiv ids are sequential numbers beginning at 1 and counting upexactly 6 digits. Thiscode checks the PMID to see that it contains only digits and The bioRxiv id is less than test_limit; the value number following the last slash in local variablethe bioRxiv-issued DOI:test_limit will need to be updated periodically as more PMIDs are issuedhttps://doi.org/10.1101/078733 -> 078733
]]
local function pmidbiorxiv(id) local test_limit = 30000000; -- update this value as PMIDs approach local handler = cfg.id_handlers['PMIDBIORXIV']; local err_cat = ''; -- presume that PMID bioRxiv id is valid
if nil == id:match("[^%d]%d%d%d%d%d$") then -- if PMID bioRxiv id has anything but six digits err_cat = ' ' .. set_error( 'bad_pmidbad_biorxiv' ); -- set an error message else -- PMID is only digits local id_num = tonumber(id); -- convert id to a number for range testing if 1 > id_num or test_limit < id_num then -- if PMID is outside test limit boundaries err_cat = ' ' .. set_error( 'bad_pmid' ); -- set an error message end
end
return external_link_id({link = handler.link, label = handler.label,
prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=handler.access}) .. err_cat;
end
--[[--------------------------< C I T E S _ E M B A R G O E D R X >------------------------------------------------------------
The description of the structure of this identifier can be found at Help_talk:Citation_Style_1/Archive_26#CiteSeerX_id_structure
]]
local function is_embargoed citeseerx (embargoid) if is_set (embargo) then local lang handler = mwcfg.getContentLanguage(); local good1, embargo_date, good2, todays_date; good1, embargo_date = pcall( lang.formatDate, lang, id_handlers['UCITESEERX', embargo )]; good2, todays_date = pcall( lang.formatDate, lang, 'U' ) local matched;
end
return text;
local text;
if is_set(inactive) then
local inactive_year = inactive:match("%d%d%d%d") or ''; -- try to get the year portion from the inactive date text = "[[" .. handler.link .. "|" .. handler.label .. "]]:" .. id;
if is_set(inactive_year) then
table.insert( z.error_categories, "Pages with DOIs inactive since " .. inactive_year );
else
table.insert( z.error_categories, "Pages with inactive DOIs" ); -- when inactive doesn't contain a recognizable year
end
inactive = " (" .. cfg.messages['inactive'] .. " " .. inactive .. ")"
end
text = external_link_id({link = handler.link, label = handler.label,
prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=access}) .. (inactive or '')
if nil == id:match("^10%.[^%s–]-/[^%s–]-[^%.,]$") then -- doi must begin with '10.', must contain a fwd slash, must not contain spaces or endashes, and must not end with period or comma
cat = ' ' .. set_error( 'bad_doi' );
end
return text .. inactive .. cat
end
--[[--------------------------< O P E N L I S B R A R Y N >----------------------------------------------------------------------
]]
local function openlibraryisbn(id, accessisbn_str ) local code if nil ~= idisbn_str:match("[^%d+([AMWs-0-9X])$")then return false, 'invalid character'; -- only fail if isbn_str contains anything but digits followed by 'A', 'M'hyphens, or 'W'the uppercase X end isbn_str = isbn_str:gsub( "-", "" ):gsub( " ", "" ); -- remove hyphens and spaces local handler len = cfg.id_handlers[isbn_str:len(); if len ~= 10 and len ~= 13 then return false, 'OLlength']; -- fail if incorrect length end
if ( code len == "A" ) 10 then return external_link_idif isbn_str:match({link"^%d*X?$" ) =handler.link, label=handler.label, prefix=handler.prefix .. nil then -- fail if isbn_str has 'authors/OLX',anywhere but last position id=id, separator=handler.separator, encode = handler.encode, access = access}) elseif ( code == "M" ) then return external_link_id({link=handler.linkfalse, label=handler.label, prefix=handler.prefix .. 'books/OLinvalid form',; id=id, separator=handler.separator, encode = handler.encode, access = access}) elseif ( code == "W" ) then end return external_link_idis_valid_isxn({link=handler.linkisbn_str, label=handler.label10), prefix=handler.prefix .. 'works/OLchecksum', id=id, separator=handler.separator, encode = handler.encode, access = access});
else
end
end
--[[--------------------------< A M E S S A G E _ I D Z O N >------------------------------------------------------------------
]]
local function message_id asin(id, domain) local handler err_cat = cfg.id_handlers['USENETID'];""
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_error ('bad_asin'); -- asin is not a mix of 10 uppercase alpha and numeric characters 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 isbn( id ) then -- see if asin value is isbn10 add_maint_cat ('ASIN'); elseif not is_set (err_cat) then err_cat = ' ' .. set_error ('bad_asin'); -- asin is not isbn10 end elseif not id:match("^%u[%d%u]+$") then err_cat = ' ' .. set_error ('bad_asin'); -- asin doesn't begin with uppercase alpha end end if not is_set(domain) then domain = "com"; elseif in_array (domain, {'jp', 'uk'}) then -- Japan, United Kingdom domain = "co." .. domain; elseif in_array (domain, {'au', 'br', 'mx'}) then -- Australia, Brazil, Mexico domain = "com." .. domain; end local handler = cfg.id_handlers['ASIN']; return external_link_id({link=handler.link, label=handler.label, prefix=handler.prefix .. domain .. "/dp/", id=id, encode=handler.encode, separator = handler.separator}) .. err_cat;end --[[--------------------------< I S M N >---------------------------------------------------------------------- Determines whether an ISMN string is valid. Similar to isbn-13, ismn is 13 digits begining 979-0-... and uses thesame check digit calculations. See http://www.ismn-international.org/download/Web_ISMN_Users_Manual_2008-6.pdfsection 2, pages 9–12. ]] local function ismn (id) local handler = cfg.id_handlers['ISMN']; local text; local valid_ismn = true; local id_copy; id_copy = id; -- save a copy because this testing is destructive id=id:gsub( "[%s-–]", "" ); -- strip spaces, hyphens, and endashes from the ismn if 13 ~= id:len() or id:match( "^9790%d*$" ) == nil then -- ismn must be 13 digits and begin 9790 valid_ismn = false; else valid_ismn=is_valid_isxn_13 (id); -- validate ismn end -- text = internal_link_id({link = handler.link, label = handler.label, -- use this (or external version) when there is some place to link to-- prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) text = table.concat ( { make_wikilink (handler.link, handler.label), handler.separator, id_copy }); -- because no place to link to yet if false == valid_ismn then text = text .. ' ' .. set_error( 'bad_ismn' ) -- add an error message if the ismn is invalid end return text;end --[[--------------------------< I S S N >---------------------------------------------------------------------- Validate and format an issn. This code fixes the case where an editor has included an ISSN in the citation buthas separated the two groups of four digits with a space. When that condition occurred, the resulting link lookedlike this: |issn=0819 4327 gives: [http://www.worldcat.org/issn/0819 4327 0819 4327] -- can't have spaces in an external link This code now prevents that by inserting a hyphen at the issn midpoint. It also validates the issn for lengthand makes sure that the checkdigit agrees with the calculated value. Incorrect length (8 digits), charactersother than 0-9 and X, or checkdigit / calculated value mismatch will all cause a check issn error message. Theissn is always displayed with a hyphen, even if the issn was given as a single group of 8 digits. ]] local function issn(id, e) local issn_copy = id; -- save a copy of unadulterated issn; use this version for display if issn does not validate local handler; local text; local valid_issn = true; if e then handler = cfg.id_handlers['EISSN']; else handler = cfg.id_handlers['ISSN']; end id=id:gsub( "[%s-–]", "" ); -- strip spaces, hyphens, and endashes from the issn if 8 ~= id:len() or nil == id:match( "^%d*X?$" ) then -- validate the issn: 8 digits long, containing only 0-9 or X in the last position valid_issn=false; -- wrong length or improper character else valid_issn=is_valid_isxn(id, 8); -- validate issn end if true == valid_issn then id = string.sub( id, 1, 4 ) .. "-" .. string.sub( id, 5 ); -- if valid, display correctly formatted version else id = issn_copy; -- if not valid, use the show the invalid issn with error message end text = external_link_id({link = handler.link, label = handler.label,
prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})
if not id:match('^.+@.+$') or not id:match('^[^<].*[^>]$')false == valid_issn then -- doesn't have '@' or has one or first or last character is '< or '>' text = text .. ' ' .. set_error( 'bad_message_idbad_issn', e and 'e' or '' ) -- add an error message if the message id issn is invalid
end
return text
end
--[[--------------------------< J F M >-----------------------------------------------------------------------
A numerical identifier in the form nn.nnnn.nn
]]
local function jfm (id)
local handler = cfg.id_handlers['JFM'];
local id_num;
local err_cat = '';
id_num = id:match ('^[Jj][Ff][Mm](.*)$'); -- identifier with jfm prefix; extract identifier
if is_set (id_num) then
add_maint_cat ('jfm_format');
else -- plain number without mr prefix
id_num = id; -- if here id does not have prefix
end
if id_num and id_num:match('^%d%d%.%d%d%d%d%.%d%d$') then
id = id_num; -- jfm matches pattern
else
err_cat = ' ' .. set_error( 'bad_jfm' ); -- set an error message
end
return external_link_id({link = handler.link, label = handler.label,
prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
end
--[[--------------------------< L C C N >----------------------------------------------------------------------
Format LCCN link and do simple error checking. LCCN is a character string 8-12 characters long. The length of
the LCCN dictates the character type of the first 1-3 characters; the rightmost eight are always digits.
http://info-uri.info/registry/OAIHandler?verb=GetRecord&metadataPrefix=reg&identifier=info:lccn/
length = 8 then all digits
length = 9 then lccn[1] is lower case alpha
length = 10 then lccn[1] and lccn[2] are both lower case alpha or both digits
length = 11 then lccn[1] is lower case alpha, lccn[2] and lccn[3] are both lower case alpha or both digits
length = 12 then lccn[1] and lccn[2] are both lower case alpha
]]
local function lccn(lccn)
local handler = cfg.id_handlers['LCCN'];
local err_cat = ''; -- presume that LCCN is valid
local id = lccn; -- local copy of the lccn
id = normalize_lccn (id); -- get canonical form (no whitespace, hyphens, forward slashes)
local len = id:len(); -- get the length of the lccn
if 8 == len then
if id:match("[^%d]") then -- if LCCN has anything but digits (nil if only digits)
err_cat = ' ' .. set_error( 'bad_lccn' ); -- set an error message
end
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?
err_cat = ' ' .. set_error( 'bad_lccn' ); -- set an error message
end
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 nil == id:match("^%l%l%d%d%d%d%d%d%d%d") then -- ... see if it matches our pattern
err_cat = ' ' .. set_error( 'bad_lccn' ); -- no match, set an error message
end
end
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
err_cat = ' ' .. set_error( 'bad_lccn' ); -- no match, set an error message
end
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
err_cat = ' ' .. set_error( 'bad_lccn' ); -- no match, set an error message
end
else
err_cat = ' ' .. set_error( 'bad_lccn' ); -- wrong length, set an error message
end
if not is_set (err_cat) and nil ~= lccn:find ('%s') then
err_cat = ' ' .. set_error( 'bad_lccn' ); -- lccn contains a space, set an error message
end
return external_link_id({link = handler.link, label = handler.label,
prefix=handler.prefix,id=lccn,separator=handler.separator, encode=handler.encode}) .. err_cat;
end
--[[--------------------------< M R >--------------------------------------------------------------------------
A seven digit number; if not seven digits, zero-fill leading digits to make seven digits.
]]
local function mr (id)
local handler = cfg.id_handlers['MR'];
local id_num;
local id_len;
local err_cat = '';
id_num = id:match ('^[Mm][Rr](%d+)$'); -- identifier with mr prefix
if is_set (id_num) then
add_maint_cat ('mr_format');
else -- plain number without mr prefix
id_num = id:match ('^%d+$'); -- if here id is all digits
end
id_len = id_num and id_num:len() or 0;
if (7 >= id_len) and (0 ~= id_len) then
id = string.rep ('0', 7-id_len ) .. id_num; -- zero-fill leading digits
else
err_cat = ' ' .. set_error( 'bad_mr' ); -- set an error message
end
return external_link_id({link = handler.link, label = handler.label,
prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
end
--[[--------------------------< B O P E N L I B C O D E R A R Y >--------------------------------------------------------------------
else
end
else -- when id format incorrect
err_cat = ' ' .. set_error( 'bad_pmc' ); -- set an error message
end
if is_set (err_typeembargo) then -- if there was an error detectedis PMC is still embargoed? text = text table.concat ( -- still embargoed so no external link { make_wikilink (handler. ' ' link, handler.label), handler. set_error( 'bad_bibcode'separator, id, err_cat }); else text = external_link_id({err_typelink = handler.link, label = handler.label, -- 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}).. err_cat;
end
return text;
--[[--------------------------< C P M I T E S E E R X D >----------------------------------------------------------------------
]]
local function citeseerx pmid(id) local test_limit = 32000000; -- update this value as PMIDs approach local handler = cfg.id_handlers['CITESEERXPMID']; local matchederr_cat = ''; -- presume that PMID is valid
end
local function ssrn (id)
local test_limit = 30000003500000; -- update this value as SSRNs approach
local handler = cfg.id_handlers['SSRN'];
local err_cat = ''; -- presume that SSRN is valid
local id_num;
local text;
end
--[[--------------------------< U S E N E T _ I D >------------------------------------------------------------
Validate and format a usenet message id. Simple error checking, looks for 'id-left@id-right' not enclosed in
'<' and/or '>' angle brackets.
]]
local function usenet_id (id)
local handler = cfg.id_handlers['USENETID'];
local text = external_link_id({link = handler.link, label = handler.label,
prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})
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_error( 'bad_usenet_id' ) -- add an error message if the message id is invalid
end
return text
end
--[[--------------------------< Z B L >-----------------------------------------------------------------------
A numerical identifier in the form nnnn.nnnnn - leading zeros in the first quartet optional
]]
local function zbl (id)
local handler = cfg.id_handlers['ZBL'];
local id_num;
local err_cat = '';
id_num = id:match ('^[Zz][Bb][Ll](.*)$'); -- identifier with zbl prefix; extract identifier
if is_set (id_num) then
add_maint_cat ('zbl_format');
else -- plain number without zbl prefix
id_num = id; -- if here id does not have prefix
end
if id_num:match('^%d?%d?%d?%d%.%d%d%d%d%d$') then
id = id_num; -- id matches pattern
else
err_cat = ' ' .. set_error( 'bad_zbl' ); -- set an error message
end
return external_link_id({link = handler.link, label = handler.label,
prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
end
--============================<< I N T E R F A C E F U N C T I O N S >>==========================================
--[[--------------------------< B U I L D _ I D _ L I S T >--------------------------------------------------------
for k, v in pairs( id_list ) do -- k is uc identifier name as index to cfg.id_handlers; e.g. cfg.id_handlers['ISBN'], v is a table
-- fallback to read-only cfg
handler = setmetatable( { ['id'] = v, ['access'] = options.IdAccessLevels[k] }, fallback(k) );
elseif handler.mode ~= 'manual' then
error( cfg.messages['unknown_ID_mode'] );
elseif k == 'ARXIV' then
table.insert( new_list, {handler.label, arxiv( v, options.Class ) } );
elseif k == 'ASIN' then
table.insert( new_list, {handler.label, asin( v, options.ASINTLD ) } );
elseif k == 'BIBCODE' then
table.insert( new_list, {handler.label, bibcode( v, handler.access ) } );
elseif k == 'DOI' then
table.insert( new_list, {handler.label, doi( v, options.DoiBroken, handler.access ) } );
elseif k == 'EISSN' then
table.insert( new_list, {handler.label, issn( v, true ) } ); -- true distinguishes eissn from issn
elseif k == 'HDL' then
table.insert( new_list, {handler.label, hdl( v, handler.access ) } );
elseif k == 'ISBN' then
local ISBN = internal_link_id( handler );
local check;
local err_type = '';
check, err_type = check_isbnisbn( v );
if not check then
if is_set(options.IgnoreISBN) then -- ISBN is invalid; if |ignore-isbn-error= set
end
elseif is_set(options.IgnoreISBN) then -- ISBN is OK; if |ignore-isbn-error= set
end
table.insert( new_list, {handler.label, ISBN } );
elseif k == 'ISMN' then
table.insert( new_list, {handler.label, ismn( v ) } );
elseif k == 'ISSN' then
table.insert( new_list, {handler.label, issn( v ) } );
elseif k == 'JFM' then
table.insert( new_list, {handler.label, jfm( v ) } );
elseif k == 'LCCN' then
table.insert( new_list, {handler.label, lccn( v ) } );
elseif k == 'MR' then
table.insert( new_list, {handler.label, mr( v ) } );
elseif k == 'OCLC' then
table.insert( new_list, {handler.label, oclc( v ) } );
elseif k == 'OL' or k == 'OLA' then
table.insert( new_list, {handler.label, openlibrary( v, handler.access ) } );
elseif k == 'PMC' then
table.insert( new_list, {handler.label, pmc( v, options.Embargo ) } );
elseif k == 'PMID' then
table.insert( new_list, {handler.label, pmid( v ) } );
elseif k == 'SSRN' then
table.insert( new_list, {handler.label, ssrn( v ) } );
elseif k == 'USENETID' then
table.insert( new_list, {handler.label, message_idusenet_id( v ) } ); elseif k == 'ZBL' then table.insert( new_list, {handler.label, zbl( v ) } );
else
error( cfg.messages['unknown_manual_ID'] );
local function comp( a, b ) -- used in following table.sort()
return a[1] :lower() < b[1]:lower();
end
add_maint_cat = utilities_page_ptr.add_maint_cat;
substitute = utilities_page_ptr.substitute;
make_wikilink = utilities_page_ptr.make_wikilink;
z = utilities_page_ptr.z; -- table of tables in Module:Citation/CS1/Utilities
Anonymous user