Module:Citation/CS1: Difference between revisions
Synch from sandbox;
m>Trappist the monk (Synch from sandbox;) |
m>Trappist the monk (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 ( "vanc" == format ) then -- if vancouver format | if 'mla' == control.mode then | ||
if i == 1 then -- for mla | |||
one = one .. namesep .. first; -- first name last, first | |||
else -- all other names | |||
one = first .. ' ' .. one; -- first last | |||
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 | end | ||
one = one .. namesep .. first; | |||
end | end | ||
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 | ||
text[#text-2] = " & "; | if 'mla' == control.mode then | ||
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, | -- 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,062: | Line 2,123: | ||
if not is_valid_parameter_value (SubscriptionRequired, 'subscription', cfg.keywords ['yes_true_y']) then | if not is_valid_parameter_value (SubscriptionRequired, 'subscription', cfg.keywords ['yes_true_y']) then | ||
SubscriptionRequired=nil; | SubscriptionRequired=nil; | ||
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 | end | ||
local Via = A['Via']; | 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 AccessDate = A['AccessDate']; | local AccessDate = A['AccessDate']; | ||
local Agency = A['Agency']; | local Agency = A['Agency']; | ||
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 | ||
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 | |||
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; | |||
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; | |||
end | end | ||
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; | 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 | ||
Others = sepc .. ' ' .. wrap_msg ('translated', Translators, use_lowercase) .. Others; | if 'mla' == Mode then | ||
Others = sepc .. ' Trans. ' .. Translators .. Others; | |||
else | |||
Others = sepc .. ' ' .. wrap_msg ('translated', Translators, use_lowercase) .. Others; | |||
end | |||
end | |||
if is_set (Interviewers) then | |||
Others = sepc .. ' ' .. wrap_msg ('interview', Interviewers, use_lowercase) .. Others; | |||
end | 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 | ||
Edition = " " .. wrap_msg ('edition', Edition); | if 'mla' == Mode then | ||
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 ""; | ||
OrigYear = is_set(OrigYear) and (" [" .. OrigYear .. "]") or ""; | if 'mla' == Mode then -- not in brackets for mla | ||
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 (sepc ~= ".") then retrv_text = retrv_text:lower() end | if 'mla' == Mode then -- retrieved text not used in mla | ||
AccessDate = ' ' .. AccessDate; | |||
else | |||
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 | ||
tcommon = safe_join( {Others, Title, TitleNote, Conference, Periodical, Format, TitleType, Series, | if 'mla' == Mode then | ||
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 | ||
tcommon2 = safe_join( {Conference, Periodical, Format, TitleType, Series, Language, Volume, Others, Edition, Publisher, Agency}, sepc ); | if 'mla' == Mode then | ||
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 is_set (Authors) or is_set (Editors) then | if ('mla' == Mode) then | ||
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 | ||
text = safe_join( {Contributors, Date, Chapter, tcommon, Authors, Place, Editors, tcommon2, pgtext, idcommon }, sepc ); | if 'mla' == Mode then | ||
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 | ||
text = safe_join( {Editors, Date, Chapter, Place, tcommon, pgtext, idcommon}, sepc ); | if 'mla' == Mode then | ||
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 |