Module:Citation/CS1: Difference between revisions
Content added Content deleted
m (1 revision imported: Help:Footnotes) |
(Synch from sandbox;) |
||
Line 12: | Line 12: | ||
local z ={}; -- tables in Module:Citation/CS1/Utilities |
local z ={}; -- tables in Module:Citation/CS1/Utilities |
||
local extract_ids, build_id_list, is_embargoed; |
local extract_ids, extract_id_access_levels, build_id_list, is_embargoed; -- functions in Module:Citation/CS1/Identifiers |
||
local make_coins_title, get_coins_pages, COinS; -- functions in Module:Citation/CS1/COinS |
local make_coins_title, get_coins_pages, COinS; -- functions in Module:Citation/CS1/COinS |
||
Line 383: | Line 383: | ||
]] |
]] |
||
local function external_link( URL, label, source ) |
local function external_link( URL, label, source, access) |
||
local error_str = ""; |
local error_str = ""; |
||
local domain; |
local domain; |
||
local path; |
local path; |
||
local base_url; |
|||
if not is_set( label ) then |
if not is_set( label ) then |
||
Line 406: | Line 407: | ||
end |
end |
||
base_url = table.concat({ "[", URL, " ", safe_for_url( label ), "]" }); |
|||
if is_set(access) then -- access level (free, paywalled, ...) |
|||
base_url = substitute(cfg.presentation[access], base_url); |
|||
end |
|||
return table.concat({ base_url, error_str }); |
|||
end |
end |
||
Line 584: | Line 591: | ||
if is_set (chapterurl) then |
if is_set (chapterurl) then |
||
chapter = external_link (chapterurl, chapter, chapter_url_source); -- adds bare_url_missing_title error if appropriate |
chapter = external_link (chapterurl, chapter, chapter_url_source, nil); -- adds bare_url_missing_title error if appropriate |
||
end |
end |
||
Line 1,000: | Line 1,007: | ||
sep = ','; -- name-list separator between authors is a comma |
sep = ','; -- name-list separator between authors is a comma |
||
namesep = ' '; -- last/first separator is a space |
namesep = ' '; -- last/first separator is a space |
||
elseif 'mla' == control.mode then |
|||
sep = ','; -- name-list separator between authors is a comma |
|||
namesep = ', ' -- last/first separator is <comma><space> |
|||
else |
else |
||
sep = ';' -- name-list separator between authors is a semicolon |
sep = ';' -- name-list separator between authors is a semicolon |
||
Line 1,027: | Line 1,037: | ||
one = person.last |
one = person.last |
||
local first = person.first |
local first = person.first |
||
if is_set(first) then |
if is_set(first) then |
||
if |
if 'mla' == control.mode then |
||
if i == 1 then -- for mla |
|||
one = one:gsub ('%.', ''); -- remove periods from surnames (http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35029/) |
|||
one = one .. namesep .. first; -- first name last, first |
|||
else -- all other names |
|||
first = reduce_to_initials(first) -- attempt to convert first name(s) to initials |
|||
one = first .. ' ' .. one; -- first last |
|||
end |
end |
||
else |
|||
if ( "vanc" == format ) then -- if vancouver format |
|||
one = one:gsub ('%.', ''); -- remove periods from surnames (http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35029/) |
|||
if not person.corporate and is_good_vanc_name (one, first) then -- and name is all Latin characters; corporate authors not tested |
|||
first = reduce_to_initials(first) -- attempt to convert first name(s) to initials |
|||
end |
|||
end |
|||
one = one .. namesep .. first; |
|||
end |
end |
||
one = one .. namesep .. first |
|||
end |
end |
||
if is_set(person.link) and person.link ~= control.page_name then |
if is_set(person.link) and person.link ~= control.page_name then |
||
Line 1,048: | Line 1,066: | ||
if count > 0 then |
if count > 0 then |
||
if count > 1 and is_set(lastauthoramp) and not etal then |
if count > 1 and is_set(lastauthoramp) and not etal then |
||
if 'mla' == control.mode then |
|||
text[#text-2] = " & "; -- replace last separator with ampersand text |
|||
text[#text-2] = ", and "; -- replace last separator with ', and ' text |
|||
else |
|||
text[#text-2] = " & "; -- replace last separator with ampersand text |
|||
end |
|||
end |
end |
||
text[#text] = nil; -- erase the last separator |
text[#text] = nil; -- erase the last separator |
||
Line 1,134: | Line 1,156: | ||
if 1 < count then -- param could be |author= or |editor= so one separactor character is acceptable |
if 1 < count then -- param could be |author= or |editor= so one separactor character is acceptable |
||
add_maint_cat ('mult_names', list_name |
add_maint_cat ('mult_names', cfg.special_case_translation [list_name]); -- more than one separator indicates multiple names so add a maint cat for this template |
||
end |
end |
||
end |
end |
||
Line 1,177: | Line 1,199: | ||
last, etal = name_has_etal (last, etal, false); -- find and remove variations on et al. |
last, etal = name_has_etal (last, etal, false); -- find and remove variations on et al. |
||
first, etal = name_has_etal (first, etal, false); -- find and remove variations on et al. |
first, etal = name_has_etal (first, etal, false); -- find and remove variations on et al. |
||
last = name_has_mult_names (last, err_msg_list_name); -- check for multiple names in last and its aliases |
-- last = name_has_mult_names (last, err_msg_list_name); -- check for multiple names in last and its aliases |
||
last = name_has_mult_names (last, list_name); -- check for multiple names in last and its aliases |
|||
if first and not last then -- if there is a firstn without a matching lastn |
if first and not last then -- if there is a firstn without a matching lastn |
||
Line 1,310: | Line 1,333: | ||
end |
end |
||
return (" " .. wrap_msg ('language', name)); -- otherwise wrap with '(in ...)' |
return (" " .. wrap_msg ('language', name)); -- otherwise wrap with '(in ...)' |
||
--[[ TODO: should only return blank or name rather than full list |
|||
so we can clean up the bunched parenthetical elements Language, Type, Format |
|||
]] |
|||
end |
end |
||
Line 1,371: | Line 1,397: | ||
sep, ps, ref = set_cs2_style (ps, ref); |
sep, ps, ref = set_cs2_style (ps, ref); |
||
elseif 'cs1' == mode then -- if this template is to be rendered in CS1 (cite xxx) style |
elseif 'cs1' == mode then -- if this template is to be rendered in CS1 (cite xxx) style |
||
sep, ps = set_cs1_style (ps); |
|||
elseif 'mla' == mode then -- if this template is to be rendered in mla style use cs1 for bot cs1 & cs2 templates |
|||
sep, ps = set_cs1_style (ps); |
sep, ps = set_cs1_style (ps); |
||
else -- anything but cs1 or cs2 |
else -- anything but cs1 or cs2 |
||
Line 1,449: | Line 1,477: | ||
max = tonumber (max); -- make it a number |
max = tonumber (max); -- make it a number |
||
if max >= count then -- if |display-xxxxors= value greater than or equal to number of authors/editors |
if max >= count then -- if |display-xxxxors= value greater than or equal to number of authors/editors |
||
add_maint_cat ('disp_auth_ed', list_name); |
add_maint_cat ('disp_auth_ed', cfg.special_case_translation [list_name]); |
||
end |
end |
||
else -- not a valid keyword or number |
else -- not a valid keyword or number |
||
Line 1,657: | Line 1,685: | ||
]] |
]] |
||
local function is_valid_parameter_value (value, name, possible) |
local function is_valid_parameter_value (value, name, possible, cite_class) |
||
-- begin hack to limit |mode=mla to a specific set of templates |
|||
if ('mode' == name) and ('mla' == value) and not in_array (cite_class, {'book', 'journal', 'news'}) then |
|||
table.insert( z.message_tail, { set_error( 'invalid_param_val', {name, value}, true ) } ); -- not an allowed value so add error message |
|||
return false |
|||
end |
|||
-- end hack |
|||
if not is_set (value) then |
if not is_set (value) then |
||
return true; -- an empty parameter is ok |
return true; -- an empty parameter is ok |
||
Line 1,694: | Line 1,729: | ||
]] |
]] |
||
local function format_volume_issue (volume, issue, cite_class, origin, sepc, lower) |
local function format_volume_issue (volume, issue, cite_class, origin, sepc, lower, mode) |
||
if not is_set (volume) and not is_set (issue) then |
if not is_set (volume) and not is_set (issue) then |
||
return ''; |
return ''; |
||
end |
end |
||
if ('mla' == mode) and ('journal' == cite_class) then -- same as cs1 for magazines |
|||
lower = true; -- mla 8th edition; force these to lower case |
|||
if is_set (volume) and is_set (issue) then |
|||
return wrap_msg ('vol-no', {sepc, volume, issue}, lower); |
|||
elseif is_set (volume) then |
|||
return wrap_msg ('vol', {sepc, volume}, lower); |
|||
else |
|||
return ''; |
|||
end |
|||
end |
|||
if 'magazine' == cite_class or (in_array (cite_class, {'citation', 'map'}) and 'magazine' == origin) then |
if 'magazine' == cite_class or (in_array (cite_class, {'citation', 'map'}) and 'magazine' == origin) then |
||
if is_set (volume) and is_set (issue) then |
if is_set (volume) and is_set (issue) then |
||
Line 1,754: | Line 1,800: | ||
]] |
]] |
||
local function format_pages_sheets (page, pages, sheet, sheets, cite_class, origin, sepc, nopp, lower) |
local function format_pages_sheets (page, pages, sheet, sheets, cite_class, origin, sepc, nopp, lower, mode) |
||
if 'map' == cite_class then -- only cite map supports sheet(s) as in-source locators |
if 'map' == cite_class then -- only cite map supports sheet(s) as in-source locators |
||
if is_set (sheet) then |
if is_set (sheet) then |
||
Line 1,772: | Line 1,818: | ||
local is_journal = 'journal' == cite_class or (in_array (cite_class, {'citation', 'map'}) and 'journal' == origin); |
local is_journal = 'journal' == cite_class or (in_array (cite_class, {'citation', 'map'}) and 'journal' == origin); |
||
if is_journal and 'mla' == mode then |
|||
is_journal = false; -- mla always uses p & pp |
|||
end |
|||
if is_set (page) then |
if is_set (page) then |
||
Line 1,910: | Line 1,960: | ||
-- Pick out the relevant fields from the arguments. Different citation templates |
-- Pick out the relevant fields from the arguments. Different citation templates |
||
-- define different field names for the same underlying things. |
-- define different field names for the same underlying things. |
||
-- set default parameter values defined by |mode= parameter. If |mode= is empty or omitted, use CitationClass to set these values |
|||
local Mode = A['Mode']; |
|||
if not is_valid_parameter_value (Mode, 'mode', cfg.keywords['mode'], config.CitationClass) then |
|||
Mode = ''; |
|||
end |
|||
local author_etal; |
local author_etal; |
||
local a = {}; -- authors list from |lastn= / |firstn= pairs or |vauthors= |
local a = {}; -- authors list from |lastn= / |firstn= pairs or |vauthors= |
||
Line 1,957: | Line 2,014: | ||
local Translators; -- assembled translators name list |
local Translators; -- assembled translators name list |
||
t = extract_names (args, 'TranslatorList'); -- fetch translator list from |translatorn= / |translator-lastn=, -firstn=, -linkn=, -maskn= |
t = extract_names (args, 'TranslatorList'); -- fetch translator list from |translatorn= / |translator-lastn=, -firstn=, -linkn=, -maskn= |
||
local Interviewers = A['Interviewers'] |
|||
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs |
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs |
||
Line 2,036: | Line 2,095: | ||
local Pages; |
local Pages; |
||
local At; |
local At; |
||
-- previously conference books did not support volume |
|||
-- if in_array (config.CitationClass, cfg.templates_using_volume) and not ('conference' == config.CitationClass and not is_set (Periodical)) then |
|||
if in_array (config.CitationClass, cfg.templates_using_volume) then |
|||
Volume = A['Volume']; |
Volume = A['Volume']; |
||
end |
end |
||
-- conference & map books do not support issue |
|||
if in_array (config.CitationClass, cfg.templates_using_issue) and not (in_array (config.CitationClass, {'conference', 'map'}) and not is_set (Periodical))then |
if in_array (config.CitationClass, cfg.templates_using_issue) and not (in_array (config.CitationClass, {'conference', 'map'}) and not is_set (Periodical))then |
||
Issue = A['Issue']; |
Issue = A['Issue']; |
||
Line 2,063: | Line 2,124: | ||
SubscriptionRequired=nil; |
SubscriptionRequired=nil; |
||
end |
end |
||
local UrlAccess = A['UrlAccess']; |
|||
if not is_valid_parameter_value (UrlAccess, 'url-access', cfg.keywords ['url-access']) then |
|||
UrlAccess = nil; |
|||
end |
|||
if not is_set(URL) and is_set(UrlAccess) then |
|||
UrlAccess = nil; |
|||
table.insert( z.message_tail, { set_error( 'param_access_requires_param', {'url'}, true ) } ); |
|||
end |
|||
if is_set (UrlAccess) and is_set (SubscriptionRequired) then -- while not aliases, these are much the same so if both are set |
|||
table.insert( z.message_tail, { set_error( 'redundant_parameters', {wrap_style ('parameter', 'url-access') .. ' and ' .. wrap_style ('parameter', 'subscription')}, true ) } ); -- add error message |
|||
SubscriptionRequired = nil; -- unset; prefer |access= over |subscription= |
|||
end |
|||
if is_set (UrlAccess) and is_set (RegistrationRequired) then -- these are not the same but contradictory so if both are set |
|||
table.insert( z.message_tail, { set_error( 'redundant_parameters', {wrap_style ('parameter', 'url-access') .. ' and ' .. wrap_style ('parameter', 'registration')}, true ) } ); -- add error message |
|||
RegistrationRequired = nil; -- unset; prefer |access= over |registration= |
|||
end |
|||
local Via = A['Via']; |
local Via = A['Via']; |
||
Line 2,082: | Line 2,161: | ||
local ID_list = extract_ids( args ); |
local ID_list = extract_ids( args ); |
||
local ID_access_levels = extract_id_access_levels( args, ID_list ); |
|||
local Quote = A['Quote']; |
local Quote = A['Quote']; |
||
Line 2,095: | Line 2,175: | ||
local LastAuthorAmp = A['LastAuthorAmp']; |
local LastAuthorAmp = A['LastAuthorAmp']; |
||
if not is_valid_parameter_value (LastAuthorAmp, 'last-author-amp', cfg.keywords ['yes_true_y']) then |
if not is_valid_parameter_value (LastAuthorAmp, 'last-author-amp', cfg.keywords ['yes_true_y']) then |
||
LastAuthorAmp = nil; |
LastAuthorAmp = nil; -- set to empty string |
||
end |
|||
if 'mla' == Mode then |
|||
LastAuthorAmp = 'yes'; -- replaces last author/editor separator with ' and ' text |
|||
end |
end |
||
local no_tracking_cats = A['NoTracking']; |
local no_tracking_cats = A['NoTracking']; |
||
Line 2,102: | Line 2,185: | ||
end |
end |
||
--these are used by cite interview |
--these deprecated parameters are used by cite interview |
||
local Callsign = A['Callsign']; |
local Callsign = A['Callsign']; |
||
local City = A['City']; |
local City = A['City']; |
||
Line 2,118: | Line 2,201: | ||
end |
end |
||
-- set default parameter values defined by |mode= parameter. If |mode= is empty or omitted, use CitationClass to set these values |
|||
local Mode = A['Mode']; |
|||
if not is_valid_parameter_value (Mode, 'mode', cfg.keywords['mode']) then |
|||
Mode = ''; |
|||
end |
|||
local sepc; -- separator between citation elements for CS1 a period, for CS2, a comma |
local sepc; -- separator between citation elements for CS1 a period, for CS2, a comma |
||
local PostScript; |
local PostScript; |
||
Line 2,226: | Line 2,304: | ||
end |
end |
||
-- special case for cite interview |
-- special case for cite interview |
||
-- TODO: make cite interview not need any special cases |
|||
--[[ |
|||
Program, Callsign, City deprecated, so avoid using /Configuration |
|||
for reassignment, which would allow these parameters' use outside interview |
|||
]] |
|||
if (config.CitationClass == "interview") then |
if (config.CitationClass == "interview") then |
||
if is_set(Program) then |
if is_set(Program) then |
||
if not is_set(Periodical) then |
|||
ID = ' ' .. Program; |
|||
Periodical = Program; |
|||
end |
|||
end |
end |
||
if is_set(Callsign) then |
if is_set(Callsign) then |
||
if is_set( |
if not is_set(PublisherName) then |
||
PublisherName = Callsign; |
|||
else |
|||
ID = ' ' .. Callsign; |
|||
end |
end |
||
end |
end |
||
if is_set(City) then |
if is_set(City) then |
||
if is_set( |
if not is_set(PublicationPlace) then |
||
PublicationPlace = City; |
|||
else |
|||
ID = ' ' .. City; |
|||
end |
end |
||
end |
|||
if is_set(Others) then |
|||
if is_set(TitleType) then |
|||
Others = substitute (cfg.messages['interview-type'], {TitleType, Others}); |
|||
TitleType = ''; |
|||
else |
|||
Others = substitute (cfg.messages['interview'], Others) |
|||
end |
|||
else |
|||
Others = cfg.title_types ['interview']; |
|||
end |
end |
||
end |
end |
||
Line 2,399: | Line 2,469: | ||
-- handle type parameter for those CS1 citations that have default values |
-- handle type parameter for those CS1 citations that have default values |
||
if in_array(config.CitationClass, {"AV-media-notes", " |
if in_array(config.CitationClass, {"AV-media-notes", "interview", "mailinglist", "map", "podcast", "pressrelease", "report", "techreport", "thesis"}) then |
||
TitleType = set_titletype (config.CitationClass, TitleType); |
TitleType = set_titletype (config.CitationClass, TitleType); |
||
if is_set(Degree) and "Thesis" == TitleType then -- special case for cite thesis |
if is_set(Degree) and "Thesis" == TitleType then -- special case for cite thesis |
||
Line 2,407: | Line 2,477: | ||
if is_set(TitleType) then -- if type parameter is specified |
if is_set(TitleType) then -- if type parameter is specified |
||
TitleType = substitute( cfg.messages['type'], TitleType); -- display it in parentheses |
|||
-- TODO: Hack on TitleType to fix bunched parentheses problem |
|||
end |
end |
||
Line 2,561: | Line 2,632: | ||
if 'newsgroup' == config.CitationClass then |
if 'newsgroup' == config.CitationClass then |
||
if is_set (PublisherName) then |
if is_set (PublisherName) then |
||
PublisherName = substitute (cfg.messages['newsgroup'], external_link( 'news:' .. PublisherName, PublisherName, A:ORIGIN('PublisherName') )); |
PublisherName = substitute (cfg.messages['newsgroup'], external_link( 'news:' .. PublisherName, PublisherName, A:ORIGIN('PublisherName'), nil )); |
||
end |
end |
||
end |
end |
||
Line 2,577: | Line 2,648: | ||
maximum = nil, -- as if display-authors or display-editors not set |
maximum = nil, -- as if display-authors or display-editors not set |
||
lastauthoramp = LastAuthorAmp, |
lastauthoramp = LastAuthorAmp, |
||
page_name = this_page.text -- get current page name so that we don't wikilink to it via editorlinkn |
page_name = this_page.text, -- get current page name so that we don't wikilink to it via editorlinkn |
||
mode = Mode |
|||
}; |
}; |
||
Line 2,662: | Line 2,734: | ||
end |
end |
||
local OriginalURL, OriginalURLorigin, OriginalFormat; |
local OriginalURL, OriginalURLorigin, OriginalFormat, OriginalAccess; |
||
DeadURL = DeadURL:lower(); -- used later when assembling archived text |
DeadURL = DeadURL:lower(); -- used later when assembling archived text |
||
if is_set( ArchiveURL ) then |
if is_set( ArchiveURL ) then |
||
Line 2,677: | Line 2,749: | ||
OriginalURL = URL; -- save copy of original source URL |
OriginalURL = URL; -- save copy of original source URL |
||
OriginalURLorigin = URLorigin; -- name of url parameter for error messages |
OriginalURLorigin = URLorigin; -- name of url parameter for error messages |
||
OriginalFormat = Format; -- and original |format= |
OriginalFormat = Format; -- and original |format= |
||
OriginalAccess = UrlAccess; |
|||
if 'no' ~= DeadURL then -- if URL set then archive-url applies to it |
if 'no' ~= DeadURL then -- if URL set then archive-url applies to it |
||
URL = ArchiveURL -- swap-in the archive's url |
URL = ArchiveURL -- swap-in the archive's url |
||
URLorigin = A:ORIGIN('ArchiveURL') -- name of archive url parameter for error messages |
URLorigin = A:ORIGIN('ArchiveURL') -- name of archive url parameter for error messages |
||
Format = ArchiveFormat or ''; -- swap in archive's format |
Format = ArchiveFormat or ''; -- swap in archive's format |
||
UrlAccess = nil; -- restricted access levels do not make sense for archived urls |
|||
end |
end |
||
end |
end |
||
Line 2,734: | Line 2,808: | ||
end |
end |
||
if in_array(config.CitationClass, {'web','news','journal', 'magazine', 'pressrelease','podcast', 'newsgroup', 'mailinglist', 'arxiv'}) or |
if in_array(config.CitationClass, {'web','news','journal', 'magazine', 'pressrelease','podcast', 'newsgroup', 'mailinglist', 'arxiv', 'interview'}) or |
||
('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia)) or |
('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia)) or |
||
('map' == config.CitationClass and is_set (Periodical)) then -- special case for cite map when the map is in a periodical treat as an article |
('map' == config.CitationClass and is_set (Periodical)) then -- special case for cite map when the map is in a periodical treat as an article |
||
Line 2,763: | Line 2,837: | ||
if is_set(Title) then |
if is_set(Title) then |
||
if not is_set(TitleLink) and is_set(URL) then |
if not is_set(TitleLink) and is_set(URL) then |
||
Title = external_link( URL, Title, URLorigin ) .. TransError .. Format; |
|||
Title = external_link( URL, Title, URLorigin, UrlAccess ) .. TransError .. Format; |
|||
-- this experiment hidden 2016-04-10; see Help_talk:Citation_Style_1#Recycled_urls |
-- this experiment hidden 2016-04-10; see Help_talk:Citation_Style_1#Recycled_urls |
||
-- local temp_title = external_link( URL, Title, URLorigin ) .. TransError .. Format; -- do this so we get error message even if url is usurped no archive |
-- local temp_title = external_link( URL, Title, URLorigin ) .. TransError .. Format; -- do this so we get error message even if url is usurped no archive |
||
Line 2,789: | Line 2,864: | ||
if is_set (Conference) then |
if is_set (Conference) then |
||
if is_set (ConferenceURL) then |
if is_set (ConferenceURL) then |
||
Conference = external_link( ConferenceURL, Conference, ConferenceURLorigin ); |
Conference = external_link( ConferenceURL, Conference, ConferenceURLorigin, nil ); |
||
end |
end |
||
Conference = sepc .. " " .. Conference .. ConferenceFormat; |
Conference = sepc .. " " .. Conference .. ConferenceFormat; |
||
elseif is_set(ConferenceURL) then |
elseif is_set(ConferenceURL) then |
||
Conference = sepc .. " " .. external_link( ConferenceURL, nil, ConferenceURLorigin ); |
Conference = sepc .. " " .. external_link( ConferenceURL, nil, ConferenceURLorigin, nil ); |
||
end |
end |
||
Line 2,822: | Line 2,897: | ||
end |
end |
||
Page, Pages, Sheet, Sheets = format_pages_sheets (Page, Pages, Sheet, Sheets, config.CitationClass, Periodical_origin, sepc, NoPP, use_lowercase); |
Page, Pages, Sheet, Sheets = format_pages_sheets (Page, Pages, Sheet, Sheets, config.CitationClass, Periodical_origin, sepc, NoPP, use_lowercase, Mode); |
||
At = is_set(At) and (sepc .. " " .. At) or ""; |
At = is_set(At) and (sepc .. " " .. At) or ""; |
||
Line 2,847: | Line 2,922: | ||
else |
else |
||
Language=""; -- language not specified so make sure this is an empty string; |
Language=""; -- language not specified so make sure this is an empty string; |
||
--[[ TODO: need to extract the wrap_msg from language_parameter |
|||
so that we can solve parentheses bunching problem with Format/Language/TitleType |
|||
]] |
|||
end |
end |
||
Line 2,852: | Line 2,930: | ||
if is_set (Translators) then |
if is_set (Translators) then |
||
if 'mla' == Mode then |
|||
Others = sepc .. ' ' .. wrap_msg ('translated', Translators, use_lowercase) .. Others; |
|||
Others = sepc .. ' Trans. ' .. Translators .. Others; |
|||
else |
|||
Others = sepc .. ' ' .. wrap_msg ('translated', Translators, use_lowercase) .. Others; |
|||
end |
|||
end |
end |
||
if is_set (Interviewers) then |
|||
Others = sepc .. ' ' .. wrap_msg ('interview', Interviewers, use_lowercase) .. Others; |
|||
end |
|||
TitleNote = is_set(TitleNote) and (sepc .. " " .. TitleNote) or ""; |
TitleNote = is_set(TitleNote) and (sepc .. " " .. TitleNote) or ""; |
||
if is_set (Edition) then |
if is_set (Edition) then |
||
Line 2,860: | Line 2,945: | ||
add_maint_cat ('extra_text', 'edition'); |
add_maint_cat ('extra_text', 'edition'); |
||
end |
end |
||
if 'mla' == Mode then |
|||
Edition = " " .. wrap_msg ('edition', Edition); |
|||
Edition = '. ' .. Edition .. ' ed.'; |
|||
else |
|||
Edition = " " .. wrap_msg ('edition', Edition); |
|||
end |
|||
else |
else |
||
Edition = ''; |
Edition = ''; |
||
Line 2,866: | Line 2,955: | ||
Series = is_set(Series) and (sepc .. " " .. Series) or ""; |
Series = is_set(Series) and (sepc .. " " .. Series) or ""; |
||
if 'mla' == Mode then -- not in brackets for mla |
|||
OrigYear = is_set(OrigYear) and (" [" .. OrigYear .. "]") or ""; |
|||
OrigYear = is_set(OrigYear) and (". " .. OrigYear) or ""; |
|||
else |
|||
OrigYear = is_set(OrigYear) and (" [" .. OrigYear .. "]") or ""; |
|||
end |
|||
Agency = is_set(Agency) and (sepc .. " " .. Agency) or ""; |
Agency = is_set(Agency) and (sepc .. " " .. Agency) or ""; |
||
Volume = format_volume_issue (Volume, Issue, config.CitationClass, Periodical_origin, sepc, use_lowercase); |
Volume = format_volume_issue (Volume, Issue, config.CitationClass, Periodical_origin, sepc, use_lowercase, Mode); |
||
------------------------------------ totally unrelated data |
------------------------------------ totally unrelated data |
||
Line 2,893: | Line 2,986: | ||
AccessDate = nowrap_date (AccessDate); -- wrap in nowrap span if date in appropriate format |
AccessDate = nowrap_date (AccessDate); -- wrap in nowrap span if date in appropriate format |
||
if 'mla' == Mode then -- retrieved text not used in mla |
|||
if (sepc ~= ".") then retrv_text = retrv_text:lower() end -- if 'citation', lower case |
|||
AccessDate = |
AccessDate = ' ' .. AccessDate; |
||
else |
|||
-- neither of these work; don't know why; it seems that substitute() isn't being called |
|||
if (sepc ~= ".") then retrv_text = retrv_text:lower() end -- if mode is cs2, lower case |
|||
AccessDate = substitute (retrv_text, AccessDate); -- add retrieved text |
|||
end |
|||
AccessDate = substitute (cfg.presentation['accessdate'], {sepc, AccessDate}); -- allow editors to hide accessdates |
AccessDate = substitute (cfg.presentation['accessdate'], {sepc, AccessDate}); -- allow editors to hide accessdates |
||
end |
end |
||
Line 2,907: | Line 3,003: | ||
end |
end |
||
ID_list = build_id_list( ID_list, {DoiBroken = DoiBroken, ASINTLD = ASINTLD, IgnoreISBN = IgnoreISBN, Embargo=Embargo, Class = Class} ); |
ID_list = build_id_list( ID_list, {IdAccessLevels=ID_access_levels, DoiBroken = DoiBroken, ASINTLD = ASINTLD, IgnoreISBN = IgnoreISBN, Embargo=Embargo, Class = Class} ); |
||
if is_set(URL) then |
if is_set(URL) then |
||
URL = " " .. external_link( URL, nil, URLorigin ); |
URL = " " .. external_link( URL, nil, URLorigin, Access ); |
||
end |
end |
||
Line 2,930: | Line 3,026: | ||
if sepc ~= "." then arch_text = arch_text:lower() end |
if sepc ~= "." then arch_text = arch_text:lower() end |
||
Archived = sepc .. " " .. substitute( cfg.messages['archived-not-dead'], |
Archived = sepc .. " " .. substitute( cfg.messages['archived-not-dead'], |
||
{ external_link( ArchiveURL, arch_text, A:ORIGIN('ArchiveURL') ) .. ArchiveFormat, ArchiveDate } ); |
{ external_link( ArchiveURL, arch_text, A:ORIGIN('ArchiveURL'), nil ) .. ArchiveFormat, ArchiveDate } ); |
||
if not is_set(OriginalURL) then |
if not is_set(OriginalURL) then |
||
Archived = Archived .. " " .. set_error('archive_missing_url'); |
Archived = Archived .. " " .. set_error('archive_missing_url'); |
||
Line 2,946: | Line 3,042: | ||
else -- DeadURL is empty, 'yes', 'true', or 'y' |
else -- DeadURL is empty, 'yes', 'true', or 'y' |
||
Archived = sepc .. " " .. substitute( arch_text, |
Archived = sepc .. " " .. substitute( arch_text, |
||
{ external_link( OriginalURL, cfg.messages['original'], OriginalURLorigin ) .. OriginalFormat, ArchiveDate } ); -- format already styled |
{ external_link( OriginalURL, cfg.messages['original'], OriginalURLorigin, OriginalAccess ) .. OriginalFormat, ArchiveDate } ); -- format already styled |
||
end |
end |
||
else |
else |
||
Line 2,969: | Line 3,065: | ||
end |
end |
||
if sepc == '.' then |
if sepc == '.' then |
||
Lay = sepc .. " " .. external_link( LayURL, cfg.messages['lay summary'], A:ORIGIN('LayURL') ) .. LayFormat .. LaySource .. LayDate |
Lay = sepc .. " " .. external_link( LayURL, cfg.messages['lay summary'], A:ORIGIN('LayURL'), nil ) .. LayFormat .. LaySource .. LayDate |
||
else |
else |
||
Lay = sepc .. " " .. external_link( LayURL, cfg.messages['lay summary']:lower(), A:ORIGIN('LayURL') ) .. LayFormat .. LaySource .. LayDate |
Lay = sepc .. " " .. external_link( LayURL, cfg.messages['lay summary']:lower(), A:ORIGIN('LayURL'), nil ) .. LayFormat .. LaySource .. LayDate |
||
end |
end |
||
elseif is_set (LayFormat) then -- Test if |lay-format= is given without giving a |lay-url= |
elseif is_set (LayFormat) then -- Test if |lay-format= is given without giving a |lay-url= |
||
Line 2,979: | Line 3,075: | ||
if is_set(Transcript) then |
if is_set(Transcript) then |
||
if is_set(TranscriptURL) then |
if is_set(TranscriptURL) then |
||
Transcript = external_link( TranscriptURL, Transcript, TranscriptURLorigin ); |
Transcript = external_link( TranscriptURL, Transcript, TranscriptURLorigin, nil ); |
||
end |
end |
||
Transcript = sepc .. ' ' .. Transcript .. TranscriptFormat; |
Transcript = sepc .. ' ' .. Transcript .. TranscriptFormat; |
||
elseif is_set(TranscriptURL) then |
elseif is_set(TranscriptURL) then |
||
Transcript = external_link( TranscriptURL, nil, TranscriptURLorigin ); |
Transcript = external_link( TranscriptURL, nil, TranscriptURLorigin, nil ); |
||
end |
end |
||
Line 3,033: | Line 3,129: | ||
if in_array(config.CitationClass, {"journal","citation"}) and is_set(Periodical) then |
if in_array(config.CitationClass, {"journal","citation"}) and is_set(Periodical) then |
||
if is_set(Others) then Others = Others .. sepc .. " " end |
if is_set(Others) then Others = Others .. sepc .. " " end |
||
if 'mla' == Mode then |
|||
tcommon = safe_join( {Others, Title, TitleNote, Conference, Periodical, Format, TitleType, Series, |
|||
Language, Edition, Publisher, Agency, Volume}, sepc ); |
tcommon = safe_join( {Conference, Periodical, Format, TitleType, Series, Language, Edition, Publisher, Agency, Volume}, sepc ); |
||
else |
|||
tcommon = safe_join( {Others, Title, TitleNote, Conference, Periodical, Format, TitleType, Series, |
|||
Language, Edition, Publisher, Agency, Volume}, sepc ); |
|||
end |
|||
elseif in_array(config.CitationClass, {"book","citation"}) and not is_set(Periodical) then -- special cases for book cites |
elseif in_array(config.CitationClass, {"book","citation"}) and not is_set(Periodical) then -- special cases for book cites |
||
if is_set (Contributors) then -- when we are citing foreword, preface, introduction, etc |
if is_set (Contributors) then -- when we are citing foreword, preface, introduction, etc |
||
tcommon = safe_join( {Title, TitleNote}, sepc ); -- author and other stuff will come after this and before tcommon2 |
tcommon = safe_join( {Title, TitleNote}, sepc ); -- author and other stuff will come after this and before tcommon2 |
||
if 'mla' == Mode then |
|||
tcommon2 = safe_join( {Conference, Periodical, Format, TitleType, Series, Language, Volume, Others, Edition, Publisher, Agency}, sepc ); |
|||
tcommon2 = safe_join( {Conference, Periodical, Format, TitleType, Series, Language, Volume, Edition, Publisher, Agency}, sepc ); |
|||
else |
|||
tcommon2 = safe_join( {Conference, Periodical, Format, TitleType, Series, Language, Volume, Others, Edition, Publisher, Agency}, sepc ); |
|||
end |
|||
elseif 'mla' == Mode then |
|||
tcommon = safe_join( {TitleNote, Conference, Periodical, Format, TitleType, Series, Language, Volume, Publisher, Agency}, sepc ); |
|||
else |
else |
||
tcommon = safe_join( {Title, TitleNote, Conference, Periodical, Format, TitleType, Series, Language, Volume, Others, Edition, Publisher, Agency}, sepc ); |
tcommon = safe_join( {Title, TitleNote, Conference, Periodical, Format, TitleType, Series, Language, Volume, Others, Edition, Publisher, Agency}, sepc ); |
||
Line 3,055: | Line 3,160: | ||
elseif 'episode' == config.CitationClass then -- special case for cite episode |
elseif 'episode' == config.CitationClass then -- special case for cite episode |
||
tcommon = safe_join( {Title, TitleNote, TitleType, Series, Transcript, Language, Edition, Publisher}, sepc ); |
tcommon = safe_join( {Title, TitleNote, TitleType, Series, Transcript, Language, Edition, Publisher}, sepc ); |
||
elseif ('news' == config.CitationClass) and ('mla' == Mode) then -- special case for cite news in MLA mode |
|||
tcommon = safe_join( {Periodical, Format, TitleType, Series, Language, Edition, Agency}, sepc ); |
|||
elseif ('web' == config.CitationClass) and ('mla' == Mode) then -- special case for cite web in MLA mode |
|||
tcommon = safe_join( {Periodical, Format, TitleType, Series, Language, |
|||
Edition, Publisher, Agency}, sepc ); |
|||
else -- all other CS1 templates |
else -- all other CS1 templates |
||
tcommon = safe_join( {Title, TitleNote, Conference, Periodical, Format, TitleType, Series, Language, |
tcommon = safe_join( {Title, TitleNote, Conference, Periodical, Format, TitleType, Series, Language, |
||
Line 3,071: | Line 3,184: | ||
if is_set(Date) then |
if is_set(Date) then |
||
if ('mla' == Mode) then |
|||
if is_set (Authors) or is_set (Editors) then -- date follows authors or editors when authors not set |
|||
if in_array (config.CitationClass, {'book', 'news', 'web'}) then |
|||
Date = ', ' .. Date; -- origyear follows title in mla |
|||
elseif 'journal' == config.CitationClass then |
|||
Date = ', (' .. Date .. ')'; |
|||
end |
|||
elseif is_set (Authors) or is_set (Editors) then -- date follows authors or editors when authors not set |
|||
Date = " (" .. Date ..")" .. OrigYear .. sepc .. " "; -- in paranetheses |
Date = " (" .. Date ..")" .. OrigYear .. sepc .. " "; -- in paranetheses |
||
else -- neither of authors and editors set |
else -- neither of authors and editors set |
||
Line 3,089: | Line 3,208: | ||
end |
end |
||
end |
end |
||
if not is_set (Date) then |
if (not is_set (Date)) or ('mla' == Mode) then -- when date is set it's in parentheses; no Authors termination |
||
Authors = terminate_name_list (Authors, sepc); -- when no date, terminate with 0 or 1 sepc and a space |
Authors = terminate_name_list (Authors, sepc); -- when no date, terminate with 0 or 1 sepc and a space |
||
end |
end |
||
Line 3,095: | Line 3,214: | ||
local in_text = " "; |
local in_text = " "; |
||
local post_text = ""; |
local post_text = ""; |
||
if is_set(Chapter) and 0 == #c then |
if is_set(Chapter) and 0 == #c and 'mla' ~= Mode then |
||
in_text = in_text .. cfg.messages['in'] .. " " |
in_text = in_text .. cfg.messages['in'] .. " " |
||
if (sepc ~= '.') then in_text = in_text:lower() end -- lowercase for cs2 |
if (sepc ~= '.') then in_text = in_text:lower() end -- lowercase for cs2 |
||
elseif is_set(Chapter) and 'mla' == Mode then |
|||
if EditorCount <= 1 then |
|||
in_text = '. Ed. '; |
|||
else |
|||
in_text = '. Eds. '; |
|||
end |
|||
else |
else |
||
if EditorCount <= 1 then |
if EditorCount <= 1 then |
||
Line 3,111: | Line 3,236: | ||
if (sepc ~= '.') then by_text = by_text:lower() end -- lowercase for cs2 |
if (sepc ~= '.') then by_text = by_text:lower() end -- lowercase for cs2 |
||
Authors = by_text .. Authors; -- author follows title so tweak it here |
Authors = by_text .. Authors; -- author follows title so tweak it here |
||
if is_set (Editors) then -- when Editors make sure that Authors gets terminated |
if is_set (Editors) and ('mla' ~= Mode)then -- when Editors make sure that Authors gets terminated |
||
Authors = terminate_name_list (Authors, sepc); -- terminate with 0 or 1 sepc and a space |
Authors = terminate_name_list (Authors, sepc); -- terminate with 0 or 1 sepc and a space |
||
end |
end |
||
if not is_set (Date) then -- when date is set it's in parentheses; no Contributors termination |
if (not is_set (Date)) or ('mla' == Mode) then -- when date is set it's in parentheses; no Contributors termination |
||
Contributors = terminate_name_list (Contributors, sepc); -- terminate with 0 or 1 sepc and a space |
Contributors = terminate_name_list (Contributors, sepc); -- terminate with 0 or 1 sepc and a space |
||
end |
end |
||
if 'mla' == Mode then |
|||
text = safe_join( {Contributors, Date, Chapter, tcommon, Authors, Place, Editors, tcommon2, pgtext, idcommon }, sepc ); |
|||
text = safe_join( {Contributors, Chapter, tcommon, OrigYear, Authors, Place, Others, Editors, tcommon2, Date, pgtext, idcommon }, sepc ); |
|||
else |
|||
text = safe_join( {Contributors, Date, Chapter, tcommon, Authors, Place, Editors, tcommon2, pgtext, idcommon }, sepc ); |
|||
end |
|||
elseif 'mla' == Mode then |
|||
tcommon = tcommon .. Date; -- hack to avoid duplicate separators |
|||
text = safe_join( {Authors, Chapter, Title, OrigYear, Others, Editors, Edition, Place, tcommon, pgtext, idcommon }, sepc ); |
|||
else |
else |
||
text = safe_join( {Authors, Date, Chapter, Place, Editors, tcommon, pgtext, idcommon }, sepc ); |
text = safe_join( {Authors, Date, Chapter, Place, Editors, tcommon, pgtext, idcommon }, sepc ); |
||
Line 3,135: | Line 3,267: | ||
end |
end |
||
end |
end |
||
if 'mla' == Mode then |
|||
text = safe_join( {Editors, Date, Chapter, Place, tcommon, pgtext, idcommon}, sepc ); |
|||
if in_array(config.CitationClass, {'journal', 'news', 'web'}) and is_set(Periodical) then |
|||
text = safe_join( {Editors, Title, Place, tcommon, pgtext, Date, idcommon}, sepc ); |
|||
else |
|||
text = safe_join( {Editors, Chapter, Title, Place, tcommon, Date, pgtext, idcommon}, sepc ); |
|||
end |
|||
else |
|||
text = safe_join( {Editors, Date, Chapter, Place, tcommon, pgtext, idcommon}, sepc ); |
|||
end |
|||
elseif 'mla' == Mode then |
|||
if in_array(config.CitationClass, {'journal', 'news', 'web'}) and is_set(Periodical) then |
|||
text = safe_join( {Title, Place, tcommon, pgtext, Date, idcommon}, sepc ); |
|||
else |
|||
text = safe_join( {Chapter, Title, Place, tcommon, Date, pgtext, idcommon}, sepc ); |
|||
end |
|||
else |
else |
||
if in_array(config.CitationClass, {"journal","citation"}) and is_set(Periodical) then |
if in_array(config.CitationClass, {"journal","citation"}) and is_set(Periodical) then |
||
Line 3,183: | Line 3,329: | ||
end |
end |
||
if string.len(text:gsub("<span[^>/]*>.-</span>", ""):gsub("%b<>","")) <= 2 then |
if string.len(text:gsub("<span[^>/]*>(.-)</span>", "%1"):gsub("%b<>","")) <= 2 then -- remove <span> tags and other html-like markup; then get length of what remains |
||
z.error_categories = {}; |
z.error_categories = {}; |
||
text = set_error('empty_citation'); |
text = set_error('empty_citation'); |
||
Line 3,288: | Line 3,434: | ||
build_id_list = identifiers.build_id_list; |
build_id_list = identifiers.build_id_list; |
||
is_embargoed = identifiers.is_embargoed; |
is_embargoed = identifiers.is_embargoed; |
||
extract_id_access_levels = identifiers.extract_id_access_levels; |
|||
make_coins_title = metadata.make_coins_title; -- imported functions from Module:Citation/CS1/COinS |
make_coins_title = metadata.make_coins_title; -- imported functions from Module:Citation/CS1/COinS |