"Module:Citation/CS1" හි සංශෝධන අතර වෙනස්කම්
Content deleted Content added
Synchronized with English Wikipedia! |
ටැගය: Rollback |
||
1 පේළිය:
local cs1 ={};
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]
local dates, year_date_check, reformat_dates, date_hyphen_to_dash
local is_set, in_array, substitute, error_comment, set_error, select_one, -- functions in Module:Citation/CS1/Utilities
add_maint_cat, wrap_style, safe_for_italics,
local z ={}; -- tables in Module:Citation/CS1/Utilities
Line 53 ⟶ 54:
end
end
--[[--------------------------< A D D _ P R O P _ C A T >--------------------------------------------------------
Adds a category to z.properties_cats using names from the configuration file with additional text if any.
added_prop_cats is a table declared in page scope variables above
Line 69 ⟶ 66:
if not added_prop_cats [key] then
added_prop_cats [key] = true; -- note that we've added this category
table.insert( z.properties_cats, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table
end
end
--[[--------------------------< A D D _ V A N C _ E R R O R >----------------------------------------------------
Line 131 ⟶ 126:
the first character of the whole domain name including subdomains must be a letter or a digit
internationalized domain name (ascii characters with .xn-- ASCII Compatible Encoding (ACE) prefix xn-- in the tld) see https://tools.ietf.org/html/rfc3490
single-letter/digit second-level domains in the .org
q, x, and z SL domains in the .com TLD
i and q SL domains in the .net TLD
Line 151 ⟶ 146:
if not domain:match ('^[%a%d]') then -- first character must be letter or digit
return false;
end
Line 162 ⟶ 153:
elseif domain:match ('%f[%a%d][%a%d][%a%d%-]+[%a%d]%.xn%-%-[%a%d]+$') then -- internationalized domain name with ACE prefix
return true;
elseif domain:match ('%f[%a%d][%a%d]%.
return true;
elseif domain:match ('%f[%a][qxz]%.com$') then -- assigned one character .com hostname (x.com times out 2015-12-10)
Line 262 ⟶ 249:
return not is_url (scheme, domain); -- return true if value DOES NOT appear to be a valid url
end
--[[--------------------------< L I N K _ T I T L E _ O K >---------------------------------------------------
Line 390 ⟶ 376:
['\n'] = ' ' } );
end
--[[--------------------------< E X T E R N A L _ L I N K >----------------------------------------------------
Line 403 ⟶ 388:
local path;
local base_url;
if not is_set( label ) then
label = URL;
Line 419 ⟶ 404:
if path then -- if there is a path portion
path = path:gsub ('[%[%]]', {['[']='%5b',[']']='%5d'}); -- replace '[' and ']' with their percent encoded values
URL
end
if is_set (access) then -- access level (subscription, registration, limited)
local label_head = '';
local label_tail;
local markup = ''; -- can't start a span inside italic markup and end it outside the italic markup
label = safe_for_url (label); -- replace square brackets and newlines (is this necessary? already done above?)
if label:match ("(.*)%s+(.+)('''?)$") then -- for italicized titles (cite book, etc)
label_head, label_tail, markup = label:match ("(.*)%s+(.+)('''?)$"); -- split the label at the right-most space; separate the markup
elseif label:match ("(.*)%s+(.+)$") then -- for upright titles (journal, news, magazine, etc)
label_head, label_tail = label:match ("(.*)%s+(.+)$"); -- split the label at the right-most space; no markup
elseif label:match ("(.+)('''?)$") then -- single word label with markup
label_tail, markup = label:match ("(.+)('''?)$"); -- save label text as label tail; separate the markup
else
label_tail = label;
end
base_url = table.concat (
{
'<span class="plainlinks">[', -- opening css
URL, -- the url
' ', -- the required space
label_head, -- all but the last word of the label
' <span class="nowrap">', -- nowrap css for the last word and the signal icon
label_tail, -- last (or only) word of the label inside the span
'<span style="padding-left:0.15em">', -- signal spacing css
cfg.presentation[access], -- the appropriate icon
'</span></span>', -- close signal spacing and nowrap spans
markup, -- insert italic markup if any
']</span>' -- close the plain links span
});
else
base_url = table.concat({ "[", URL, " ", safe_for_url( label ), "]" }); -- no signal markup
end
return table.concat
end
Line 449 ⟶ 462:
end
--[[--------------------------< K E R N _ Q U O T E S >--------------------------------------------------------
Apply kerning to open the space between the quote mark provided by the Module and a leading or trailing quote mark contained in a |title= or |chapter= parameter's value.
This function will positive kern either single or double quotes:
"'Unkerned title with leading and trailing single quote marks'"
Line 460 ⟶ 470:
Double single quotes (italic or bold wikimarkup) are not kerned.
Replaces unicode quotemarks
Call this function for chapter titles, for website titles, etc; not for book titles.
]
local function kern_quotes (str)
local cap='';
local cap2='';
-- TODO: move this elswhere so that all title-holding elements get these quote marks replaced?
-- str= mw.ustring.gsub (str, '[“”]', '\"'); -- replace “” (U+201C & U+201D) with " (typewriter double quote mark)
-- str= mw.ustring.gsub (str, '[‘’]', '\''); -- replace ‘’ (U+2018 & U+2019) with ' (typewriter single quote mark)
if is_set (cap) then
end
cap, cap2 = str:match ("^(.+[^\'])([\"\'])$")
if is_set (cap) then
str = substitute (cfg.presentation['kern-right'], {cap, cap2});
end
return str;
end
--[[--------------------------< F O R M A T _ S C R I P T _ V A L U E >----------------------------------------
Line 541 ⟶ 529:
end
-- if we get this far we have prefix and script
name =
if is_set (name) then -- is prefix a proper ISO 639-1 language code?
script_value = script_value:gsub ('^%l%l%s*:%s*', ''); -- strip prefix from script
Line 559 ⟶ 547:
return script_value;
end
--[[--------------------------< S C R I P T _ C O N C A T E N A T E >------------------------------------------
Line 597 ⟶ 584:
return substitute( cfg.messages[key], str );
end
end
Line 659 ⟶ 594:
]]
local function format_chapter_title (scriptchapter, chapter, transchapter, chapterurl, chapter_url_source, no_quotes
local chapter_error = '';
if not is_set (chapter) then
chapter = ''; -- to be safe for concatenation
else
if false == no_quotes then
chapter = kern_quotes (chapter); -- if necessary, separate chapter title's leading and trailing quote marks from Module provided quote marks
chapter = wrap_style ('quoted-title', chapter);
end
Line 678 ⟶ 607:
chapter = script_concatenate (chapter, scriptchapter) -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
if is_set (transchapter) then
Line 696 ⟶ 618:
end
return chapter .. chapter_error;
end
--[[--------------------------< H A S _ I N V I S I B L E _ C H A R S >----------------------------------------
Line 713 ⟶ 634:
Detects but ignores nowiki and math stripmarkers. Also detects other named stripmarkers (gallery, math, pre, ref)
and identifies them with a slightly different error message. See also coins_cleanup().
Detects but ignores the character pattern that results from the transclusion of {{'}} templates.
Output of this function is an error message that identifies the character or the Unicode group, or the stripmarker
Line 736 ⟶ 659:
local pattern=cfg.invisible_chars[i][2] -- the pattern used to find it
position, dummy, capture = mw.ustring.find (v, pattern) -- see if the parameter value contains characters that match the pattern
if position then
if 'nowiki' == capture or 'math' == capture
stripmarker = true; -- set a flag
elseif true == stripmarker and 'delete' == char then -- because stripmakers begin and end with the delete char, assume that we've found one end of a stripmarker
position = nil; -- unset
Line 813 ⟶ 729:
end,
});
end
--[[--------------------------< V A L I D A T E >--------------------------------------------------------------
Looks for a parameter's name in one of several whitelists.
Parameters in the whitelist can have three values:
true - active, supported parameters
false - deprecated, supported parameters
nil - unsupported parameters
]]
--local function validate( name )
local function validate( name, cite_class )
local name = tostring( name );
local state;
if in_array (cite_class, {'arxiv', 'biorxiv', 'citeseerx'}) then -- limited parameter sets allowed for these templates
state = whitelist.limited_basic_arguments[ name ];
if true == state then return true; end -- valid actively supported parameter
if false == state then
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
if 'arxiv' == cite_class then -- basic parameters unique to these templates
state = whitelist.arxiv_basic_arguments[name];
end
if 'biorxiv' == cite_class then
state = whitelist.biorxiv_basic_arguments[name];
end
if 'citeseerx' == cite_class then
state = whitelist.citeseerx_basic_arguments[name];
end
if true == state then return true; end -- valid actively supported parameter
if false == state then
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
-- limited enumerated parameters list
name = name:gsub( "%d+", "#" ); -- replace digit(s) with # (last25 becomes last#)
state = whitelist.limited_numbered_arguments[ name ];
if true == state then return true; end -- valid actively supported parameter
if false == state then
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
return false; -- not supported because not found or name is set to nil
end -- end limited parameter-set templates
state = whitelist.basic_arguments[ name ]; -- all other templates; all normal parameters allowed
if true == state then return true; end -- valid actively supported parameter
if false == state then
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
-- all enumerated parameters allowed
name = name:gsub( "%d+", "#" ); -- replace digit(s) with # (last25 becomes last#
state = whitelist.numbered_arguments[ name ];
if true == state then return true; end -- valid actively supported parameter
if false == state then
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
return false; -- not supported because not found or name is set to nil
end
Line 839 ⟶ 826:
return date;
end
--[[--------------------------< S E T _ T I T L E T Y P E >----------------------------------------------------
Line 862 ⟶ 848:
--[[--------------------------< H Y P H E N _ T O _ D A S H >--------------------------------------------------
Converts a hyphen to a dash
]]
local function hyphen_to_dash( str )
if not is_set
return str;
end
return str:gsub( '-', '–' );
end
Line 918 ⟶ 867:
local function safe_join( tbl, duplicate_char )
--[[
Note: we use string functions here, rather than ustring functions.
This has considerably faster performance and should work correctly as
long as the duplicate_char is strict ASCII. The strings
in tbl may be ASCII or UTF8.
]]
local str = ''; -- the output string
local comp = ''; -- what does 'comp' mean?
Line 945 ⟶ 891:
end
-- typically duplicate_char is sepc
if
-- Because individual string segments often (always?) begin with terminal punct for
-- preceding segment: 'First element' .. 'sepc next element' .. etc?
trim = false;
end_chr =
-- str = str .. "<HERE(enchr=" .. end_chr.. ")" -- debug stuff?
if end_chr == duplicate_char then -- if same as separator
str =
elseif end_chr == "'" then -- if it might be wikimarkup
if
str =
elseif
trim = true; -- why? why do this and next differently from previous?
elseif
trim = true; -- same question
end
elseif end_chr == "]" then -- if it might be wikimarkup
if
trim = true;
elseif
trim = true;
elseif
trim = true;
end
elseif end_chr == " " then -- if last char of output string is a space
if
str =
end
end
Line 980 ⟶ 924:
if value ~= comp then -- value does not equal comp when value contains html markup
local dup2 = duplicate_char;
if
value =
else
value =
end
end
Line 992 ⟶ 936:
end
return str;
end
Line 1,007 ⟶ 951:
return false;
end
--[[--------------------------< I S _ G O O D _ V A N C _ N A M E >--------------------------------------------
Line 1,054 ⟶ 997:
return true;
end
--[[--------------------------< R E D U C E _ T O _ I N I T I A L S >------------------------------------------
Line 1,113 ⟶ 1,055:
return table.concat(initials) -- Vancouver format does not include spaces.
end
--[[--------------------------< L I S T _ P E O P L E >-------------------------------------------------------
Line 1,130 ⟶ 1,071:
if 'vanc' == format then -- Vancouver-like author/editor name styling?
sep =
namesep =
elseif 'mla' == control.mode then
sep = ','; -- name-list separator between authors is a comma
namesep = ', ' -- last/first separator is <comma><space>
else
sep =
namesep =
end
Line 1,160 ⟶ 1,104:
local first = person.first
if is_set(first) then
if
if i == 1 then -- for mla
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
one = one .. namesep .. first;
end
end
if is_set(person.link) and person.link ~= control.page_name then
one =
end
end
Line 1,180 ⟶ 1,132:
if count > 0 then
if count > 1 and is_set(lastauthoramp) and not etal then
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
text[#text] = nil; -- erase the last separator
Line 1,192 ⟶ 1,148:
return result, count
end
--[[--------------------------< A N C H O R _ I D >------------------------------------------------------------
Line 1,219 ⟶ 1,174:
--[[--------------------------< N A M E _ H A S _ E T A L >----------------------------------------------------
Evaluates the content of
the et al. is removed, a flag is set to true and the function returns the modified name and the flag.
This function never sets the flag to false but returns it's previous state because it may have been set by
previous passes through this function or by the
]]
local function name_has_etal (name, etal, nocat
if is_set (name) then -- name can be nil in which case just return
local etal_pattern = "[;,]? *[\"']*%f[%a][Ee][Tt] *[Aa][Ll][%.\"']*$" -- variations on the 'et al' theme
local others_pattern = "[;,]? *%f[%a]and [Oo]thers"; -- and alternate to et al.
etal = true; -- set flag (may have been set previously here or by |display-authors=etal)
end
elseif name:match (others_pattern) then -- if not 'et al.', then 'and others'?
name = name:gsub (others_pattern, ''); -- if found, remove
etal = true; -- set flag (may have been set previously here or by |display-authors=etal)
if not nocat then -- no categorization for |vauthors=
add_maint_cat ('etal'); -- and add a category if not already added
end
end
end
return name, etal; --
end
Line 1,257 ⟶ 1,216:
local function name_has_ed_markup (name, list_name)
local _, pattern;
local patterns =
'%f[%(%[][%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]?$', -- (ed) or (eds): leading '(', case insensitive 'ed', optional 's', '.' and/or ')'
'[,%.%s]%f[e]eds?%.?$', -- ed or eds: without '('or ')'; case sensitive (ED could be initials Ed could be name)
'%f[%(%[][%(%[]%s*[Ee][Dd][Ii][Tt][Oo][Rr][Ss]?%.?%s*[%)%]]?$', -- (editor) or (editors): leading '(', case insensitive, optional '.' and/or ')'
'[,%.%s]%f[Ee][Ee][Dd][Ii][Tt][Oo][Rr][Ss]?%.?$', -- editor or editors: without '('or ')'; case insensitive
-- these patterns match annotations at beginning of name
'^eds?[%.,;]', -- ed. or eds.: lower case only, optional 's', requires '.'
'^[%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]', -- (ed) or (eds): also sqare brackets, case insensitive, optional 's', '.'
'^[%(%[]?%s*[Ee][Dd][Ii][Tt][Oo][Rr][Ss]?%A', -- (editor or (editors: also sq brackets, case insensitive, optional brackets, 's'
'^[%(%[]?%s*[Ee][Dd][Ii][Tt][Ee][Dd]%A', -- (edited: also sq brackets, case insensitive, optional brackets
}
if is_set (name) then
Line 1,345 ⟶ 1,316:
local etal=false; -- return value set to true when we find some form of et al. in an author parameter
local err_msg_list_name = list_name:match ("(%w+)List") .. 's list'; -- modify AuthorList or EditorList for use in error messages if necessary
while true do
last
first
link = select_one( args, cfg.aliases[list_name .. '-Link'], 'redundant_parameters', i );
mask = select_one( args, cfg.aliases[list_name .. '-Mask'], 'redundant_parameters', i );
last, etal = name_has_etal (last, etal, false
first, etal = name_has_etal (first, etal, false
last, first= name_checks (last, first, list_name); -- multiple names, extraneous annotation, etc checks
if first and not last then -- if there is a firstn without a matching lastn
table.insert( z.message_tail, { set_error( 'first_missing_last', {
elseif not first and not last then -- if both firstn and lastn aren't found, are we done?
count = count + 1; -- number of times we haven't found last and first
Line 1,369 ⟶ 1,340:
n = n + 1; -- point to next location in the names table
if 1 == count then -- if the previous name was missing
table.insert( z.message_tail, { set_error( 'missing_name', {
end
count = 0; -- reset the counter, we're looking for two consecutive missing names
Line 1,378 ⟶ 1,349:
return names, etal; -- all done, return our list of names
end
--[[--------------------------< G E T _ I S O 6 3 9 _ C O D E >------------------------------------------------
Line 1,389 ⟶ 1,359:
return the original language name string.
mw.language.fetchLanguageNames(<local wiki language>, 'all')
extensions. For example, code 'cbk-zam' and its associated name 'Chavacano de Zamboanga' (MediaWiki does not support
code 'cbk' or name 'Chavacano'.
Names but that are included in the list will be found if that name is provided in the |language= parameter. For example,
if |language=Chavacano de Zamboanga, that name will be found with the associated code 'cbk-zam'. When names are found
and the associated code is not two or three characters, this function returns only the
Adapted from code taken from Module:Check ISO 639-1.
Line 1,408 ⟶ 1,372:
local function get_iso639_code (lang, this_wiki_code)
if
return 'Bengali', 'bn'; -- make sure rendered version is properly capitalized
end
local languages = mw.language.fetchLanguageNames(this_wiki_code, 'all') -- get a list of language names known to Wikimedia
-- ('all' is required for North Ndebele, South Ndebele, and Ojibwa)
local langlc = mw.ustring.lower(lang); -- lower case version for comparisons
for code, name in pairs(languages) do -- scan the list to see if we can find our language
if langlc == mw.ustring.lower(name) then
if 2
return name
end
end
end
end
Line 1,463 ⟶ 1,422:
for _, lang in ipairs (names_table) do -- reuse lang
if
lang = lang:
name = mw.language.fetchLanguageName( lang:lower(), this_wiki_code); -- get language name if |language= is a proper code
end
if is_set (name) then -- if |language= specified a valid code
code = lang:lower(); -- save it
Line 1,483 ⟶ 1,437:
if is_set (code) then -- only 2- or 3-character codes
if this_wiki_code ~= code then -- when the language is not the same as this wiki's language
if 2 == code:len() then -- and is a two-character code
add_prop_cat ('foreign_lang_source'
else -- or is a recognized language (but has a three-character code)
add_prop_cat ('foreign_lang_source_2'
end
end
Line 1,502 ⟶ 1,455:
code = #language_list -- reuse code as number of languages in the list
if 2 >= code then
name = table.concat (language_list,
elseif 2 < code then
name =
end
if this_wiki_name == name then
Line 1,515 ⟶ 1,468:
]]
end
--[[--------------------------< S E T _ C S 1 _ S T Y L E >----------------------------------------------------
Set style settings for CS1 citation templates. Returns separator and postscript settings
]]
Line 1,528 ⟶ 1,477:
local function set_cs1_style (ps)
if not is_set (ps) then -- unless explicitely set to something
ps =
end
return
end
--[[--------------------------< S E T _ C S 2 _ S T Y L E >----------------------------------------------------
Set style settings for CS2 citation templates. Returns separator, postscript, ref settings
]]
Line 1,545 ⟶ 1,490:
local function set_cs2_style (ps, ref)
if not is_set (ps) then -- if |postscript= has not been set, set cs2 default
ps =
end
if not is_set (ref) then -- if |ref= is not set
ref = "harv"; -- set default |ref=harv
end
return
end
--[[--------------------------< G E T _ S E T T I N G S _ F R O M _ C I T E _ C L A S S >----------------------
Line 1,571 ⟶ 1,515:
return sep, ps, ref -- return them all
end
--[[--------------------------< S E T _ S T Y L E >------------------------------------------------------------
Line 1,585 ⟶ 1,528:
sep, ps, ref = set_cs2_style (ps, ref);
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);
else -- anything but cs1 or cs2
Line 1,595 ⟶ 1,540:
return sep, ps, ref
end
--[=[-------------------------< I S _ P D F >------------------------------------------------------------------
Line 1,602 ⟶ 1,546:
applying the pdf icon to external links.
returns true if file extension is one of the recognized
]=]
local function is_pdf (url)
return url:match ('%.pdf
end
--[[--------------------------< S T Y L E _ F O R M A T >------------------------------------------------------
Line 1,624 ⟶ 1,565:
local function style_format (format, url, fmt_param, url_param)
if is_set (format) then
format = wrap_style ('format', format); -- add leading space,
if not is_set (url) then
format = format .. set_error( 'format_missing_url', {fmt_param, url_param} ); -- add an error message
Line 1,636 ⟶ 1,577:
end
--[[--------------------------< G E T _ D I S P L A Y _ A U T H O R S _ E D I T O R S >------------------------
Returns a number that defines the number of names displayed for author and editor name lists and a boolean flag
Line 1,660 ⟶ 1,600:
]]
local function
if is_set (max) then
if 'etal' == max:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
Line 1,668 ⟶ 1,608:
max = tonumber (max); -- make it a number
if max >= count then -- if |display-xxxxors= value greater than or equal to number of authors/editors
add_maint_cat ('
end
else -- not a valid keyword or number
Line 1,678 ⟶ 1,618:
return max, etal;
end
--[[--------------------------< E X T R A _ T E X T _ I N _ P A G E _ C H E C K >------------------------------
Line 1,692 ⟶ 1,631:
local function extra_text_in_page_check (page)
-- local good_pattern = '^P[^%.P%l]';
local good_pattern = '^P[^%.Pp]'; -- ok to begin with uppercase P: P7 (pg 7 of section P) but not p123 (page 123) TODO: add Gg for PG or Pg?
-- local bad_pattern = '^[Pp][Pp]';
local bad_pattern = '^[Pp]?[Pp]%.?[ %d]';
Line 1,698 ⟶ 1,639:
add_maint_cat ('extra_text');
end
-- if Page:match ('^[Pp]?[Pp]%.?[ %d]') or Page:match ('^[Pp]ages?[ %d]') or
-- Pages:match ('^[Pp]?[Pp]%.?[ %d]') or Pages:match ('^[Pp]ages?[ %d]') then
-- add_maint_cat ('extra_text');
-- end
end
--[[--------------------------< G E T _ V _ N A M E _ T A B L E >----------------------------------------------
split apart a |vautthors= or |veditors= parameter. This function allows for corporate names, wrapped in doubled
parentheses to also have commas; in the old version of the code, the doubled parnetheses were included in the
rendered citation and in the metadata.
|vauthors=Jones AB,
This code is experimental and may not be retained.
]]
local function get_v_name_table (vparam, output_table)
local name_table = mw.text.split(vparam, "%s*,%s*"); -- names are separated by commas
local i = 1;
Line 1,729 ⟶ 1,673:
end
table.insert (output_table, name); -- and add corporate name to the output table
else
end
i = i+1;
Line 1,743 ⟶ 1,680:
return output_table;
end
--[[--------------------------< P A R S E _ V A U T H O R S _ V E D I T O R S >--------------------------------
Line 1,763 ⟶ 1,699:
local names = {}; -- table of names assembled from |vauthors=, |author-maskn=, |author-linkn=
local v_name_table = {};
local etal = false; -- return value set to true when we find some form of et al. vauthors parameter
local last, first, link, mask, suffix;
Line 1,769 ⟶ 1,704:
vparam, etal = name_has_etal (vparam, etal, true); -- find and remove variations on et al. do not categorize (do it here because et al. might have a period)
if vparam:find ('%[%[') or vparam:find ('%]%]') then -- no wikilinking vauthors names
add_vanc_error ('wikilink');
end
v_name_table = get_v_name_table (vparam, v_name_table); -- names are separated by commas
for i, v_name in ipairs(v_name_table) do
Line 1,813 ⟶ 1,751:
end
end
-- this from extract_names ()
link = select_one( args, cfg.aliases[list_name .. '-Link'], 'redundant_parameters', i )
mask = select_one( args, cfg.aliases[list_name .. '-Mask'], 'redundant_parameters', i );
names[i] = {last = last, first = first, link = link, mask = mask, corporate=corporate}; -- add this assembled name to our names list
Line 1,873 ⟶ 1,811:
This function is used to validate a parameter's assigned value for those parameters that have only a limited number
of allowable values (yes, y, true, no, etc). When the parameter value has not been assigned a value (missing or empty
in the source template) the function
true; else, emits an error message and returns false.
]]
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
return true; -- an empty parameter is ok
Line 1,917 ⟶ 1,862:
]]
local function format_volume_issue (volume, issue, cite_class, origin, sepc, lower, mode)
if not is_set (volume) and not is_set (issue) then
return '';
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 is_set (volume) and is_set (issue) then
Line 1,932 ⟶ 1,888:
end
local vol = '';
if is_set (volume) then
if (4 < mw.ustring.len(volume)) then
vol = substitute (cfg.
else
vol = substitute (cfg.
end
end
Line 1,949 ⟶ 1,902:
return vol;
end
--[[-------------------------< N O R M A L I Z E _ P A G E _ L I S T >-----------------------------------------
not currently used
normalizes a comma, ampersand, and/or space separated list to be '<value>, <value>, ..., <value>'
returns list unchanged if there are no commas else strips whitespace and then reformats the list
]]
--[[
local function normalize_page_list (list)
if not list:find ('[,& ]') then return list end -- if list is not delimited with commas, ampersands, or spaces; done
list = mw.text.split (list, '[,&%s]+'); -- make a table of values
list = table.concat (list, ', '); -- and now make a normalized list
return list;
end
]]
Line 1,961 ⟶ 1,933:
]]
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 is_set (sheet) then
Line 1,978 ⟶ 1,950:
end
local is_journal = 'journal' == cite_class or (in_array (cite_class, {'citation', 'map
if is_journal and 'mla' == mode then
is_journal = false; -- mla always uses p & pp
end
if is_set (page) then
if is_journal then
Line 2,002 ⟶ 1,978:
return '', '', '', ''; -- return empty strings
end
Line 2,131 ⟶ 2,050:
else
return url, date; -- preview mode so return archiveURL and ArchiveDate
end
end
--[[--------------------------< M I S S I N G _ P I P E _ C H E C K >------------------------------------------
Look at the contents of a parameter. If the content has a string of characters and digits followed by an equal
sign, compare the alphanumeric string to the list of cs1|2 parameters. If found, then the string is possibly a
parameter that is missing its pipe:
{{cite ... |title=Title access-date=2016-03-17}}
cs1|2 shares some parameter names with xml/html atributes: class=, title=, etc. To prevent false positives xml/html
tags are removed before the search.
If a missing pipe is detected, this function adds the missing pipe maintenance category.
]]
local function missing_pipe_check (value)
local capture;
value = value:gsub ('%b<>', ''); -- remove xml/html tags because attributes: class=, title=, etc
capture = value:match ('%s+(%a[%a%d]+)%s*=') or value:match ('^(%a[%a%d]+)%s*='); -- find and categorize parameters with possible missing pipes
if capture and validate (capture) then -- if the capture is a valid parameter name
add_maint_cat ('missing_pipe');
end
end
Line 2,152 ⟶ 2,096:
-- 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
Line 2,201 ⟶ 2,145:
end
local t = {}; -- translators list from |translator-lastn= / translator-firstn= pairs
local Translators; -- assembled translators name list
t = extract_names (args, 'TranslatorList'); -- fetch translator list from |translatorn= / |translator-lastn=, -firstn=, -linkn=, -maskn=
local
local
add_maint_cat ('interviewers'); -- because use of this parameter is discouraged
else
interviewers_list = extract_names (args, 'InterviewerList'); -- else, process preferred interviewers parameters
end
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs
local Contributors; -- assembled contributors name list
Line 2,238 ⟶ 2,184:
NameListFormat = ''; -- anything else, set to empty string
end
local Year = A['Year'];
Line 2,296 ⟶ 2,236:
local Pages;
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'];
Line 2,302 ⟶ 2,243:
-- 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
Issue =
end
local Position = '';
if not in_array (config.CitationClass, cfg.templates_not_using_page) then
Page = A['Page'];
Pages = hyphen_to_dash
At = A['At'];
end
Line 2,320 ⟶ 2,261:
RegistrationRequired=nil;
end
local SubscriptionRequired = A['SubscriptionRequired'];
if not is_valid_parameter_value (SubscriptionRequired, 'subscription', cfg.keywords ['yes_true_y']) then
SubscriptionRequired=nil;
end
local UrlAccess = A['UrlAccess'];
if not is_valid_parameter_value (UrlAccess, 'url-access', cfg.keywords ['url-access']) then
Line 2,344 ⟶ 2,283:
end
local Via = A['Via'];
Line 2,387 ⟶ 2,318:
LastAuthorAmp = nil; -- set to empty string
end
if 'mla' == Mode then
LastAuthorAmp = 'yes'; -- replaces last author/editor separator with ' and ' text
end
local no_tracking_cats = A['NoTracking'];
if not is_valid_parameter_value (no_tracking_cats, 'no-tracking', cfg.keywords ['yes_true_y']) then
Line 2,393 ⟶ 2,326:
end
local use_lowercase; -- controls capitalization of certain static text
local this_page = mw.title.getCurrentTitle(); -- also used for COinS and for language
Line 2,402 ⟶ 2,335:
if not is_valid_parameter_value (DF, 'df', cfg.keywords['date-format']) then -- validate reformatting keyword
DF = ''; -- not valid, set to empty string
end
Line 2,413 ⟶ 2,343:
use_lowercase = ( sepc == ',' ); -- used to control capitalization for certain static text
if not is_set (no_tracking_cats) then -- ignore if we are already not going to categorize this page
if in_array (this_page.nsText, cfg.uncategorized_namespaces) then
Line 2,426 ⟶ 2,356:
end
select_one( args, {'page', 'p', 'pp', 'pages', 'at', 'sheet', 'sheets'}, 'redundant_parameters' ); -- this is a dummy call simply to get the error message and category
local NoPP = A['NoPP']
Line 2,440 ⟶ 2,366:
end
if is_set(Page) then
if is_set(Pages) or is_set(At) then
Pages = ''; -- unset the others
At = '';
end
extra_text_in_page_check (Page); -- add this page to maint cat if |page= value begins with what looks like p. or pp.
elseif is_set(Pages) then
if is_set(At) then
At = ''; -- unset
end
extra_text_in_page_check (Pages); -- add this page to maint cat if |pages= value begins with what looks like p. or pp.
end
-- both |publication-place= and |place= (|location=) allowed if different
if not is_set(PublicationPlace) and is_set(Place) then
PublicationPlace = Place; -- promote |place= (|location=) to |publication-place
Line 2,447 ⟶ 2,386:
if PublicationPlace == Place then Place = ''; end -- don't need both if they are the same
local Encyclopedia = A['Encyclopedia'];
Line 2,471 ⟶ 2,410:
TransChapter = TransTitle;
ChapterURL = URL;
if not is_set (ChapterURL) and is_set (TitleLink) then
Chapter
end
Title = Periodical;
Line 2,492 ⟶ 2,429:
end
if (config.CitationClass == "techreport") then -- special case for cite techreport
if is_set(A['Number']) then -- cite techreport uses 'number', which other citations alias to 'issue'
Line 2,503 ⟶ 2,440:
end
if (config.CitationClass == "mailinglist") then
Periodical = A ['MailingList'];
Line 2,510 ⟶ 2,447:
end
if 'conference' == config.CitationClass then
if is_set(BookTitle) then
Line 2,516 ⟶ 2,453:
-- ChapterLink = TitleLink; -- |chapterlink= is deprecated
ChapterURL = URL;
ChapterURLorigin = URLorigin;
URLorigin = '';
Line 2,531 ⟶ 2,467:
end
local Cartography = "";
local Scale = "";
Line 2,539 ⟶ 2,475:
Chapter = A['Map'];
ChapterURL = A['MapURL'];
TransChapter = A['TransMap'];
ChapterURLorigin = A:ORIGIN('MapURL');
Line 2,554 ⟶ 2,489:
end
if 'episode' == config.CitationClass or 'serial' == config.CitationClass then
local AirDate = A['AirDate'];
Line 2,592 ⟶ 2,527:
TransChapter = TransTitle;
ChapterURL = URL;
ChapterURLorigin = A:ORIGIN('URL');
Line 2,600 ⟶ 2,534:
if is_set (ChapterLink) and not is_set (ChapterURL) then -- link but not URL
Chapter =
elseif is_set (ChapterLink) and is_set (ChapterURL) then -- if both are set, URL links episode;
Series =
end
URL = ''; -- unset
Line 2,612 ⟶ 2,546:
Chapter = A['Episode']; -- TODO: make |episode= available to cite episode someday?
if is_set (Series) and is_set (SeriesLink) then
Series =
end
Series = wrap_style ('italic-title', Series); -- series is italicized
end
end
do
if in_array (config.CitationClass, {'arxiv', 'biorxiv', 'citeseerx'}) then
Line 2,629 ⟶ 2,563:
Periodical = 'arXiv'; -- set to arXiv for COinS; after that, must be set to empty string
end
if 'biorxiv' == config.CitationClass then
Periodical = 'bioRxiv'; -- set to bioRxiv for COinS; after that, must be set to empty string
end
if 'citeseerx' == config.CitationClass then
Periodical = 'CiteSeerX'; -- set to CiteSeerX for COinS; after that, must be set to empty string
Line 2,640 ⟶ 2,572:
end
if in_array(config.CitationClass, {"AV-media-notes", "interview", "mailinglist", "map", "podcast", "pressrelease", "report", "techreport", "thesis"}) then
TitleType = set_titletype (config.CitationClass, TitleType);
Line 2,653 ⟶ 2,585:
end
if not is_set (Date) then
Date = Year; -- promote Year to Date
Line 2,662 ⟶ 2,592:
Date = PublicationDate; -- promote PublicationDate to Date
PublicationDate = ''; -- unset, no longer needed
end
end
if PublicationDate == Date then PublicationDate = ''; end -- if PublicationDate is same as Date, don't display in rendered citation
do -- create defined block to contain local variables error_message, date_parameters_list, mismatch
local error_message = '';
-- AirDate has been promoted to Date so not necessary to check it
local date_parameters_list = {['access-date']=AccessDate, ['archive-date']=ArchiveDate, ['date']=Date, ['doi-broken-date']=DoiBroken,
['embargo']=Embargo, ['lay-date']=LayDate, ['publication-date']=PublicationDate, ['year']=Year};
anchor_year, Embargo, error_message = dates(date_parameters_list, COinS_date);
if is_set (Year) and is_set (Date) then -- both |date= and |year= not normally needed;
Line 2,713 ⟶ 2,625:
if not is_set(error_message) then -- error free dates only
local modified = false; -- flag
if is_set (DF) then -- if we need to reformat dates
modified = reformat_dates (date_parameters_list, DF, false); -- reformat to DF format, use long month names if appropriate
end
if true == date_hyphen_to_dash (date_parameters_list) then -- convert hyphens to dashes where appropriate
modified = true;
add_maint_cat ('date_format'); -- hyphens were converted so add maint category
end
if modified then -- if the date_parameters_list values were modified
AccessDate = date_parameters_list['access-date']
ArchiveDate = date_parameters_list['archive-date']
Date = date_parameters_list['date']
DoiBroken = date_parameters_list['doi-broken-date']
LayDate = date_parameters_list['lay-date']
PublicationDate = date_parameters_list['publication-date']
end
else
Line 2,743 ⟶ 2,647:
end -- end of do
Embargo = is_embargoed (Embargo); --
if config.CitationClass == "journal" and not is_set(URL) and is_set(ID_list['PMC']) then
Line 2,759 ⟶ 2,663:
end
-- Test if citation has no title
if not is_set(Title) and
Line 2,815 ⟶ 2,719:
['Volume'] = Volume,
['Issue'] = Issue,
['Pages'] =
['Edition'] = Edition,
['PublisherName'] = PublisherName,
Line 2,824 ⟶ 2,728:
}, config.CitationClass);
-- if 'arxiv' == config.CitationClass then -- we have set rft.jtitle in COinS to arXiv, now unset so it isn't displayed
if in_array (config.CitationClass, {'arxiv', 'biorxiv', 'citeseerx'}) then -- we have set rft.jtitle in COinS to arXiv, bioRxiv, or CiteSeerX now unset so it isn't displayed
Periodical = ''; -- periodical not allowed in these templates; if article has been published, use cite journal
end
if 'newsgroup' == config.CitationClass then
if is_set (PublisherName) then
Line 2,853 ⟶ 2,758:
do -- do editor name list first because the now unsupported coauthors used to modify control table
control.maximum , editor_etal =
last_first_list, EditorCount = list_people(control, e, editor_etal);
if is_set (Editors) then
if editor_etal then
Editors = Editors .. ' ' .. cfg.messages['et al']; -- add et al. to editors parameter beause |display-editors=etal
Line 2,873 ⟶ 2,777:
end
do -- now do interviewers
control.maximum
Interviewers = list_people
end
do -- now do translators
control.maximum
Translators = list_people
end
do -- now do contributors
control.maximum
Contributors = list_people
end
do -- now do authors
control.maximum , author_etal =
last_first_list = list_people(control, a, author_etal);
if is_set (Authors) then
Authors, author_etal = name_has_etal (Authors, author_etal, false
if author_etal then
Authors = Authors .. ' ' .. cfg.messages['et al']; -- add et al. to authors parameter
Line 2,907 ⟶ 2,809:
end
ArchiveFormat = style_format (ArchiveFormat, ArchiveURL, 'archive-format', 'archive-url');
ConferenceFormat = style_format (ConferenceFormat, ConferenceURL, 'conference-format', 'conference-url');
Line 2,915 ⟶ 2,817:
TranscriptFormat = style_format (TranscriptFormat, TranscriptURL, 'transcript-format', 'transcripturl');
if not (in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx'}) or
('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia))) then
Line 2,936 ⟶ 2,838:
DeadURL = DeadURL:lower(); -- used later when assembling archived text
if is_set( ArchiveURL ) then
if is_set (ChapterURL) then -- URL not set so if chapter-url is set apply archive url to it
OriginalURL = ChapterURL; -- save copy of source chapter's url for archive text
OriginalURLorigin = ChapterURLorigin; -- name of chapter-url parameter for error messages
OriginalFormat = ChapterFormat; -- and original |
if 'no' ~= DeadURL then
ChapterURL = ArchiveURL -- swap-in the archive's url
ChapterURLorigin = A:ORIGIN('ArchiveURL') -- name of archive-url parameter for error messages
ChapterFormat = ArchiveFormat or ''; -- swap in archive's format
end
elseif is_set (URL) then
Line 2,991 ⟶ 2,892:
end
Chapter = format_chapter_title (ScriptChapter, Chapter, TransChapter, ChapterURL, ChapterURLorigin, no_quotes
if is_set (Chapter) then
Chapter = Chapter .. ChapterFormat ;
Line 3,004 ⟶ 2,905:
-- Format main title.
if is_set(TitleLink) and is_set(Title) then
Title = "[[" .. TitleLink .. "|" .. Title .. "]]"
end
if in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'mailinglist', 'interview', 'arxiv', 'biorxiv', 'citeseerx'}) or
('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia)) or
Line 3,043 ⟶ 2,933:
end
end
if is_set(Title) then
if not is_set(TitleLink) and is_set(URL) then
Title = external_link( URL, Title, URLorigin, UrlAccess ) .. TransTitle .. TransError .. Format;
-- 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
-- if in_array (DeadURL, {'unfit no archive', 'usurped no archive'}) then -- when url links to inappropriate location and there is no archive of original source available
-- local err_msg
-- if temp_title:match ('%[%S+%s+(.+)%](<.+)') then -- if there is an error message
-- Title, err_msg = temp_title:match ('%[%S+%s+(.+)%](<.+)'); -- strip off external link; TODO: find a better to do this
-- Title = Title .. (err_msg or '');
-- end
-- else
-- Title = temp_title;
-- end
URL = ''; -- unset these because no longer needed
Format = "";
else
Title = Title .. TransTitle .. TransError;
end
end
Line 3,114 ⟶ 2,996:
end
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 "";
Line 3,147 ⟶ 3,029:
if is_set (Translators) then
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 =
end
Line 3,158 ⟶ 3,044:
add_maint_cat ('extra_text', 'edition');
end
if 'mla' == Mode then
Edition = '. ' .. Edition .. ' ed.';
else
Edition = " " .. wrap_msg ('edition', Edition);
end
else
Edition = '';
Line 3,164 ⟶ 3,054:
Series = is_set(Series) and (sepc .. " " .. Series) 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 "";
Volume = format_volume_issue (Volume, Issue, config.CitationClass, Periodical_origin, sepc, use_lowercase, Mode);
------------------------------------ totally unrelated data
Line 3,175 ⟶ 3,068:
end
if is_set (SubscriptionRequired) then
SubscriptionRequired = sepc .. " " .. cfg.messages['subscription']; -- subscription required message
Line 3,192 ⟶ 3,085:
AccessDate = nowrap_date (AccessDate); -- wrap in nowrap span if date in appropriate format
if 'mla' == Mode then -- retrieved text not used in mla
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
end
Line 3,310 ⟶ 3,206:
end
if "speech" == config.CitationClass then -- cite speech only
TitleNote = " (Speech)"; -- annotate the citation
Line 3,331 ⟶ 3,227:
if in_array(config.CitationClass, {"journal","citation"}) and is_set(Periodical) then
if is_set(Others) then Others =
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
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
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
tcommon = safe_join( {Title, TitleNote, Conference, Periodical, Format, TitleType, Series, Language, Volume, Others, Edition, Publisher, Agency}, sepc );
Line 3,351 ⟶ 3,258:
elseif 'episode' == config.CitationClass then -- special case for cite episode
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
Line 3,364 ⟶ 3,278:
end
local idcommon = safe_join( { ID_list, URL, Archived, AccessDate, Via, SubscriptionRequired, Lay, Quote }, sepc );
local text;
local pgtext = Position .. Sheet .. Sheets .. Page .. Pages .. At;
if is_set(Date) 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
else -- neither of authors and editors set
Line 3,386 ⟶ 3,300:
end
if is_set(Authors) then
if (not is_set (Date)) or ('mla' == Mode) then
Authors = terminate_name_list (Authors, sepc); -- when no date, terminate with 0 or 1 sepc and a space
end
Line 3,392 ⟶ 3,306:
local in_text = " ";
local post_text = "";
if is_set(Chapter) and 0 == #c and 'mla' ~= Mode then
in_text = in_text .. cfg.messages['in'] .. " "
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
if EditorCount <= 1 then
post_text = ", " .. cfg.messages['editor'];
else
post_text = ", " .. cfg.messages['editors'];
end
end
Editors = terminate_name_list (in_text .. Editors .. post_text, sepc); -- terminate with 0 or 1 sepc and a space
end
Line 3,409 ⟶ 3,328:
if (sepc ~= '.') then by_text = by_text:lower() end -- lowercase for cs2
Authors = by_text .. Authors; -- author follows title so tweak it here
if is_set (Editors) and is_set (Date) and ('mla' ~= Mode) then
Authors = terminate_name_list (Authors, sepc); -- terminate with 0 or 1 sepc and a space
end
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
end
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
text = safe_join( {Authors, Date, Chapter, Place, Editors, tcommon, pgtext, idcommon }, sepc );
Line 3,433 ⟶ 3,359:
end
end
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
if in_array(config.CitationClass, {"journal","citation"}) and is_set(Periodical) then
Line 3,487 ⟶ 3,427:
end
if is_set(options.id) then -- here we wrap the rendered citation in <cite ...>...</cite> tags
else
end
if
text = text .. " ";
for i,v in ipairs( z.message_tail ) do
if is_set(v[1]) then
if i == #z.message_tail then
else
end
end
Line 3,510 ⟶ 3,448:
end
if
text = text .. '<span class="citation-comment" style="display:none; color:#33aa33; margin-left:0.3em">';
for _, v in ipairs( z.maintenance_cats ) do -- append maintenance categories
text = text .. v .. ' ([[:Category:' .. v ..'|link]])';
end
text = text .. '</span>'; -- maintenance mesages (realy just the names of the categories for now)
end
Line 3,526 ⟶ 3,459:
if in_array(no_tracking_cats, {"", "no", "false", "n"}) then
for _, v in ipairs( z.error_categories ) do
end
for _, v in ipairs( z.maintenance_cats ) do -- append maintenance categories
end
for _, v in ipairs( z.properties_cats ) do -- append
end
end
return text
end
Line 3,634 ⟶ 3,479:
]]
Frame = frame; -- save a copy incase we need to display an error message in preview mode
local pframe = frame:getParent()
local validation, utilities, identifiers, metadata
if nil ~= string.find (frame:getTitle(), 'sandbox', 1, true) then -- did the {{#invoke:}} use sandbox version?
Line 3,646 ⟶ 3,491:
identifiers = require ('Module:Citation/CS1/Identifiers/sandbox');
metadata = require ('Module:Citation/CS1/COinS/sandbox');
else -- otherwise
Line 3,655 ⟶ 3,499:
identifiers = require ('Module:Citation/CS1/Identifiers');
metadata = require ('Module:Citation/CS1/COinS');
end
utilities.set_selected_modules (cfg); -- so that functions in Utilities can see the cfg tables
identifiers.set_selected_modules (cfg, utilities); -- so that functions in Identifiers can see the selected cfg tables and selected Utilities module
validation.set_selected_modules (
metadata.set_selected_modules (cfg, utilities); -- so that functions in COinS can see the selected cfg tables and selected Utilities module
Line 3,668 ⟶ 3,510:
reformat_dates = validation.reformat_dates;
date_hyphen_to_dash = validation.date_hyphen_to_dash;
is_set = utilities.is_set; -- imported functions from Module:Citation/CS1/Utilities
in_array = utilities.in_array;
Line 3,679 ⟶ 3,520:
wrap_style = utilities.wrap_style;
safe_for_italics = utilities.safe_for_italics;
z = utilities.z; -- table of error and category tables in Module:Citation/CS1/Utilities
Line 3,706 ⟶ 3,546:
for k, v in pairs( pframe.args ) do
if v ~= '' then
if not validate( k, config.CitationClass ) then
error_text = "";
Line 3,717 ⟶ 3,554:
end
elseif validate( k:lower(), config.CitationClass ) then
error_text, error_state = set_error( 'parameter_ignored_suggest', {k, k:lower()}, true );
else
if nil == suggestions.suggestions then -- if this table is nil then we need to load it
Line 3,729 ⟶ 3,566:
capture = k:match (pattern); -- the whole match if no caputre in pattern else the capture if a match
if capture then -- if the pattern matches
param = substitute
error_text, error_state = set_error( 'parameter_ignored_suggest', {k, param}, true ); -- set the error message
end
end
Line 3,750 ⟶ 3,583:
end
end
missing_pipe_check (
args[k] = v;
elseif args[k] ~= nil or (k == 'postscript') then
args[k] = v;
end
end
Line 3,763 ⟶ 3,596:
end
end
return
end
return cs1;
|