Module:Citation/CS1/Identifiers: Difference between revisions
Synch from sandbox;
m>Trappist the monk (Synch from sandbox;) |
m>Trappist the monk (Synch from sandbox;) |
||
Line 677: | Line 677: | ||
prefix=handler.prefix, id=id, separator=handler.separator, encode=handler.encode}) .. err_msg; | prefix=handler.prefix, id=id, separator=handler.separator, encode=handler.encode}) .. err_msg; | ||
return text; | |||
end | |||
--[[--------------------------< B I B C O D E >-------------------------------------------------------------------- | |||
Validates (sort of) and formats a bibcode id. | |||
Format for bibcodes is specified here: http://adsabs.harvard.edu/abs_doc/help_pages/data.html#bibcodes | |||
But, this: 2015arXiv151206696F is apparently valid so apparently, the only things that really matter are length, 19 characters | |||
and first four digits must be a year. This function makes these tests: | |||
length must be 19 characters | |||
characters in position | |||
1–4 must be digits and must represent a year in the range of 1000 – next year | |||
5 must be a letter | |||
6–8 must be letter, ampersand, or dot (ampersand cannot directly precede a dot; &. | |||
9 must be letter or dot | |||
10–18 must be letter, digit, or dot | |||
19 must be a letter or dot | |||
]] | |||
local function bibcode (id) | |||
local handler = cfg.id_handlers['BIBCODE']; | |||
local err_type; | |||
local year; | |||
local text = external_link_id({link=handler.link, label=handler.label, | |||
prefix=handler.prefix, id=id, separator=handler.separator, encode=handler.encode}); | |||
if 19 ~= id:len() then | |||
err_type = 'length'; | |||
else | |||
year = id:match ("^(%d%d%d%d)[%a][%a&%.][%a&%.][%a&%.][%a%.][%a%d%.]+[%a%.]$") -- | |||
if not year then -- if nil then no pattern match | |||
err_type = 'value'; -- so value error | |||
else | |||
local next_year = tonumber(os.date ('%Y'))+1; -- get the current year as a number and add one for next year | |||
year = tonumber (year); -- convert year portion of bibcode to a number | |||
if (1000 > year) or (year > next_year) then | |||
err_type = 'year'; -- year out of bounds | |||
end | |||
if id:find('&%.') then | |||
err_type = 'journal'; -- journal abbreviation must not have '&.' (if it does its missing a letter) | |||
end | |||
end | |||
end | |||
if is_set (err_type) then -- if there was an error detected | |||
text = text .. ' ' .. set_error( 'bad_bibcode', {err_type}); | |||
end | |||
return text; | return text; | ||
end | end | ||
Line 699: | Line 751: | ||
-- fallback to read-only cfg | -- fallback to read-only cfg | ||
handler = setmetatable( { ['id'] = v }, fallback(k) ); | handler = setmetatable( { ['id'] = v }, fallback(k) ); | ||
if handler.mode == 'external' then | if handler.mode == 'external' then | ||
table.insert( new_list, {handler.label, external_link_id( handler ) } ); | table.insert( new_list, {handler.label, external_link_id( handler ) } ); | ||
Line 706: | Line 758: | ||
elseif handler.mode ~= 'manual' then | elseif handler.mode ~= 'manual' then | ||
error( cfg.messages['unknown_ID_mode'] ); | error( cfg.messages['unknown_ID_mode'] ); | ||
elseif k == 'BIBCODE' then | |||
table.insert( new_list, {handler.label, bibcode( v ) } ); | |||
elseif k == 'DOI' then | elseif k == 'DOI' then | ||
table.insert( new_list, {handler.label, doi( v, options.DoiBroken ) } ); | table.insert( new_list, {handler.label, doi( v, options.DoiBroken ) } ); |