Modul:Citation/CS1: Redaktələr arasındakı fərq

8.505 bayt çıxarıldı ,  18 iyun 2021
redaktənin izahı yoxdur
(24667 dəyişikliyi WikiSysop (Müzakirə) tərəfindən geri qaytarıldı.)
Teq: Geri qaytarma
Redaktənin izahı yoxdur
Sətir 1: Sətir 1:
local cs1 ={};


--[[--------------------------< F O R W A R D  D E C L A R A T I O N S >--------------------------------------
--[[--------------------------< F O R W A R D  D E C L A R A T I O N S >--------------------------------------
Sətir 7: Sətir 9:


local is_set, in_array, substitute, error_comment, set_error, select_one, -- functions in Module:Citation/CS1/Utilities
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, is_wikilink, make_wikilink,
add_maint_cat, wrap_style, safe_for_italics, is_wikilink, make_wikilink;
strip_apostrophe_markup;


local z ={}; -- tables in Module:Citation/CS1/Utilities
local z ={}; -- tables in Module:Citation/CS1/Utilities
Sətir 68: Sətir 69:


local function add_prop_cat (key, arguments)
local function add_prop_cat (key, arguments)
--[[ отключено для рувики
if not added_prop_cats [key] then
if not added_prop_cats [key] then
added_prop_cats [key] = true; -- note that we've added this category
added_prop_cats [key] = true; -- note that we've added this category
key = key:gsub ('(foreign_lang_source_?2?)%a%a%a?', '%1'); -- strip lang code from keyname
key = key:gsub ('(foreign_lang_source_?2?)%a%a%a?', '%1'); -- strip lang code from keyname
table.insert( z.properties_cats, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table
table.insert( z.properties_cats, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table
end
end
]]
end
end


Sətir 132: Sətir 135:
the first character of the whole domain name including subdomains must be a letter or a digit
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
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, .cash, and .today TLDs
single-letter/digit second-level domains in the .org and .cash TLDs
q, x, and z SL domains in the .com TLD
q, x, and z SL domains in the .com TLD
i and q SL domains in the .net TLD
i and q SL domains in the .net TLD
Sətir 151: Sətir 154:
domain = domain:gsub ('^//', ''); -- strip '//' from domain name if present; done here so we only have to do it once
domain = domain:gsub ('^//', ''); -- strip '//' from domain name if present; done here so we only have to do it once
if not domain:match ('^[%w]') then -- first character must be letter or digit
if not domain:match ('^[%a%d]') then -- first character must be letter or digit
return false;
return false;
end
end
 
-- Do most common case first
if domain:match ('^%a+:') then -- hack to detect things that look like s:Page:Title where Page: is namespace at wikisource
if domain:match ('%f[%a%d][%a%d][%a%d%-]+[%a%d]%.%a%a+$') then -- three or more character hostname.hostname or hostname.tld
return true;
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]%.cash$') then -- one character/digit .cash hostname
return true;
elseif domain:match ('%f[%a%d][%a%d]%.org$') then -- one character/digit .org hostname
return true;
elseif domain:match ('%f[%a][qxz]%.com$') then -- assigned one character .com hostname (x.com times out 2015-12-10)
return true;
elseif domain:match ('%f[%a][iq]%.net$') then -- assigned one character .net hostname (q.net registered but not active 2015-12-10)
return true;
elseif domain:match ('%f[%a%d][%a%d]%.%a%a$') then -- one character hostname and cctld (2 chars)
return true;
elseif domain:match ('%f[%a%d][%a%d][%a%d]%.%a%a+$') then -- two character hostname and tld
return true;
elseif domain:match ('^%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?') then -- IPv4 address
return true;
else
return false;
return false;
end
end
local patterns = { -- patterns that look like urls
'%f[%w][%w][%w%-]+[%w]%.%a%a+$', -- three or more character hostname.hostname or hostname.tld
'%f[%w][%w][%w%-]+[%w]%.xn%-%-[%w]+$', -- internationalized domain name with ACE prefix
'%f[%a][qxz]%.com$', -- assigned one character .com hostname (x.com times out 2015-12-10)
'%f[%a][iq]%.net$', -- assigned one character .net hostname (q.net registered but not active 2015-12-10)
'%f[%w][%w]%.%a%a$', -- one character hostname and cctld (2 chars)
'%f[%w][%w][%w]%.%a%a+$', -- two character hostname and tld
'^%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?', -- IPv4 address
}
for _, pattern in ipairs (patterns) do -- loop through the patterns list
if domain:match (pattern) then
return true; -- if a match then we think that this thing that purports to be a url is a url
end
end
for _, d in ipairs ({'cash', 'company', 'today', 'org'}) do -- look for single letter second level domain names for these top level domains
if domain:match ('%f[%w][%w]%.' .. d) then
return true
end
end
return false; -- no matches, we don't know what this thing is
end
end


Sətir 367: Sətir 365:
error_message=error_message .. "&#124;" .. k .. "="; -- add the failed parameter
error_message=error_message .. "&#124;" .. k .. "="; -- add the failed parameter
end
end
end
if is_set (error_message) then -- done looping, if there is an error message, display it
table.insert( z.message_tail, { set_error( 'param_has_ext_link', {error_message}, true ) } );
end
end
end
end
Sətir 379: Sətir 380:
local function safe_for_url( str )
local function safe_for_url( str )
if str:match( "%[%[.-%]%]" ) ~= nil then  
if str:match( "%[%[.-%]%]" ) ~= nil then  
table.insert( z.message_tail, { set_error( 'wikilink_in_url', {}, true ) } );
end
end
Sətir 399: Sətir 401:
local path;
local path;
local base_url;
local base_url;
 
if not is_set( label ) then
if not is_set( label ) then
label = URL;
label = URL;
Sətir 419: Sətir 421:


base_url = table.concat({ "[", URL, " ", safe_for_url (label), "]" }); -- assemble a wikimarkup url
base_url = table.concat({ "[", URL, " ", safe_for_url (label), "]" }); -- assemble a wikimarkup url
 
if is_set (access) then -- access level (subscription, registration, limited)
if is_set (access) then -- access level (subscription, registration, limited)
base_url = substitute (cfg.presentation['ext-link-access-signal'], {cfg.presentation[access].class, cfg.presentation[access].title, base_url}); -- add the appropriate icon
base_url = substitute (cfg.presentation['ext-link-access-signal'], {cfg.presentation[access].class, cfg.presentation[access].title, base_url}); -- add the appropriate icon
Sətir 441: Sətir 443:
if not added_deprecated_cat then
if not added_deprecated_cat then
added_deprecated_cat = true; -- note that we've added this category
added_deprecated_cat = true; -- note that we've added this category
table.insert( z.message_tail, { set_error( 'deprecated_params', {name}, true ) } ); -- add error message
end
end
end
end
Sətir 522: Sətir 525:
is not added.  At this time there is no error message for this condition.
is not added.  At this time there is no error message for this condition.


Supports |script-title=, |script-chapter=, |script-<periodical>=
Supports |script-title= and |script-chapter=


TODO: error messages when prefix is invalid ISO639-1 code; when script_value has prefix but no script;
]]
]]


local function format_script_value (script_value, script_param)
local function format_script_value (script_value)
local lang=''; -- initialize to empty string
local lang=''; -- initialize to empty string
local name;
local name;
Sətir 532: Sətir 536:
lang = script_value:match('^(%l%l)%s*:%s*%S.*'); -- get the language prefix or nil if there is no script
lang = script_value:match('^(%l%l)%s*:%s*%S.*'); -- get the language prefix or nil if there is no script
if not is_set (lang) then
if not is_set (lang) then
table.insert( z.message_tail, { set_error( 'script_parameter', {script_param, 'missing title part'}, true ) } ); -- prefix without 'title'; add error message
return ''; -- script_value was just the prefix so return empty string
return ''; -- script_value was just the prefix so return empty string
end
end
Sətir 540: Sətir 543:
script_value = script_value:gsub ('^%l%l%s*:%s*', ''); -- strip prefix from script
script_value = script_value:gsub ('^%l%l%s*:%s*', ''); -- strip prefix from script
-- is prefix one of these language codes?
-- is prefix one of these language codes?
if in_array (lang, cfg.script_lang_codes) then
add_prop_cat ('script_with_name', {name, lang})
else
add_prop_cat ('script')
end
lang = ' lang="' .. lang .. '" '; -- convert prefix into a lang attribute
lang = ' lang="' .. lang .. '" '; -- convert prefix into a lang attribute
else
else
table.insert( z.message_tail, { set_error( 'script_parameter', {script_param, 'invalid language code'}, true ) } ); -- invalid language code; add error message
lang = ''; -- invalid so set lang to empty string
lang = ''; -- invalid so set lang to empty string
end
end
else
table.insert( z.message_tail, { set_error( 'script_parameter', {script_param, 'missing prefix'}, true ) } ); -- no language code prefix; add error message
end
end
script_value = substitute (cfg.presentation['bdi'], {lang, script_value}); -- isolate in case script is rtl
script_value = substitute (cfg.presentation['bdi'], {lang, script_value}); -- isolate in case script is rtl
Sətir 560: Sətir 565:
]]
]]


local function script_concatenate (title, script, script_param)
local function script_concatenate (title, script)
if is_set (script) then
if is_set (script) then
script = format_script_value (script, script_param); -- <bdi> tags, lang atribute, categorization, etc; returns empty string on error
script = format_script_value (script); -- <bdi> tags, lang atribute, categorization, etc; returns empty string on error
if is_set (script) then
if is_set (script) then
title = title .. ' ' .. script; -- concatenate title and script title
title = title .. ' ' .. script; -- concatenate title and script title
Sətir 586: Sətir 591:
local msg;
local msg;
msg = cfg.messages[key]:lower(); -- set the message to lower case before  
msg = cfg.messages[key]:lower(); -- set the message to lower case before  
return substitute( msg, str ); -- including template text
return substitute( msg, str ); -- including template text
else
else
return substitute( cfg.messages[key], str );
return substitute( cfg.messages[key], str );
Sətir 593: Sətir 598:




--[[--------------------------< W I K I S O U R C E _ U R L _ M A K E >----------------------------------------
--[[--------------------------< F O R M A T _ C H A P T E R _ T I T L E >--------------------------------------


makes a wikisource url from wikisource interwiki link.  returns the url and appropriate label; nil else.
Format the four chapter parameters: |script-chapter=, |chapter=, |trans-chapter=, and |chapter-url= into a single Chapter meta-
 
parameter (chapter_url_source used for error messages).
str is the value assigned to |chapter= (or aliases) or |title= or |title-link=


]]
]]


local function wikisource_url_make (str)
local function format_chapter_title (scriptchapter, chapter, transchapter, chapterurl, chapter_url_source, no_quotes, access)
local wl_type, D, L;
local chapter_error = '';
local ws_url, ws_label;
 
if not is_set (chapter) then
wl_type, D, L = is_wikilink (str); -- wl_type is 0 (not a wikilink), 1 (simple wikilink), 2 (complex wikilink)
 
if 0 == wl_type then -- not a wikilink; might be from |title-link=
str = D:match ('^[Ww]ikisource:(.+)') or D:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
if is_set (str) then
ws_url = table.concat ({ -- build a wikisource url
'https://en.wikisource.org/wiki/', -- prefix
str, -- article title
});
ws_label = str; -- label for the url
end
elseif 1 == wl_type then -- simple wikilink: [[Wikisource:ws article]]
str = D:match ('^[Ww]ikisource:(.+)') or D:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
if is_set (str) then
ws_url = table.concat ({ -- build a wikisource url
'https://en.wikisource.org/wiki/', -- prefix
str, -- article title
});
ws_label = str; -- label for the url
end
elseif 2 == wl_type then -- non-so-simple wikilink: [[Wikisource:ws article|displayed text]] ([[L|D]])
str = L:match ('^[Ww]ikisource:(.+)') or L:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
if is_set (str) then
ws_label = D; -- get ws article name from display portion of interwiki link
ws_url = table.concat ({ -- build a wikisource url
'https://en.wikisource.org/wiki/', -- prefix
str, -- article title without namespace from link portion of wikilink
});
end
end
if ws_url then
ws_url = mw.uri.encode (ws_url, 'WIKI'); -- make a usable url
ws_url = ws_url:gsub ('%%23', '#'); -- undo percent encoding of anchor
end
 
return ws_url, ws_label, L or D; -- return proper url or nil and a label or nil
end
 
 
--[[--------------------------< F O R M A T _ P E R I O D I C A L >--------------------------------------------
 
Format the four periodical parameters: |script-<periodical>=, |<periodical>=, and |trans-<periodical>= into a single Periodical meta-
parameter.
 
]]
 
local function format_periodical (script_periodical, script_periodical_source, periodical, trans_periodical)
local periodical_error = '';
 
if not is_set (periodical) then
periodical = ''; -- to be safe for concatenation
else
periodical = wrap_style ('italic-title', periodical); -- style
end
 
periodical = script_concatenate (periodical, script_periodical, script_periodical_source); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
 
if is_set (trans_periodical) then
trans_periodical = wrap_style ('trans-italic-title', trans_periodical);
if is_set (periodical) then
periodical = periodical ..  ' ' .. trans_periodical;
else -- here when transchapter without chapter or script-chapter
periodical = trans_periodical;
periodical_error = ' ' .. set_error ('trans_missing_title', {'periodical'});
end
end
 
return periodical .. periodical_error;
end
 
 
--[[--------------------------< F O R M A T _ C H A P T E R _ T I T L E >--------------------------------------
 
Format the four chapter parameters: |script-chapter=, |chapter=, |trans-chapter=, and |chapter-url= into a single Chapter meta-
parameter (chapter_url_source used for error messages).
 
]]
 
local function format_chapter_title (scriptchapter, script_chapter_source, chapter, transchapter, chapterurl, chapter_url_source, no_quotes, access)
local chapter_error = '';
 
local ws_url, ws_label, L = wikisource_url_make (chapter); -- make a wikisource url and label from a wikisource interwiki link
if ws_url then
ws_label = ws_label:gsub ('_', ''); -- replace underscore separaters with space characters
chapter = ws_label;
end
 
if not is_set (chapter) then
chapter = ''; -- to be safe for concatenation
chapter = ''; -- to be safe for concatenation
else
else
Sətir 702: Sətir 617:
end
end


chapter = script_concatenate (chapter, scriptchapter, script_chapter_source); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
chapter = script_concatenate (chapter, scriptchapter) -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped


if is_set (chapterurl) then
if is_set (chapterurl) then
chapter = external_link (chapterurl, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate
chapter = external_link (chapterurl, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate
elseif ws_url then
chapter = external_link (ws_url, chapter .. '&nbsp;', 'ws link in chapter'); -- adds bare_url_missing_title error if appropriate; space char to move icon away from chap text; TODO: better way to do this?
chapter = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, chapter});
end
end


Sətir 716: Sətir 628:
chapter = chapter ..  ' ' .. transchapter;
chapter = chapter ..  ' ' .. transchapter;
else -- here when transchapter without chapter or script-chapter
else -- here when transchapter without chapter or script-chapter
chapter = transchapter;
chapter = transchapter; --
chapter_error = ' ' .. set_error ('trans_missing_title', {'chapter'});
chapter_error = ' ' .. set_error ('trans_missing_title', {'chapter'});
end
end
Sətir 722: Sətir 634:


-- if is_set (chapterurl) then
-- if is_set (chapterurl) then
-- chapter = external_link (chapterurl, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate
-- chapter = external_link (chapterurl, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate
-- end
-- end


Sətir 738: Sətir 650:
Detects but ignores nowiki and math stripmarkers.  Also detects other named stripmarkers (gallery, math, pre, ref)
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().
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
Output of this function is an error message that identifies the character or the Unicode group, or the stripmarker
Sətir 777: Sətir 691:
local err_msg;
local err_msg;
if capture then
if capture then
err_msg = capture .. ' ' .. char;
err_msg = capture .. ' ' .. char; -- для рувики: TODO: не согласуется?
else
else
err_msg = char .. ' ' .. 'character';
err_msg = 'Символ' .. ' ' .. char; -- для рувики
end
end


Sətir 825: Sətir 739:
-- maybe let through instead of raising an error?
-- maybe let through instead of raising an error?
-- v, origin[k] = args[k], k;
-- v, origin[k] = args[k], k;
error( cfg.messages['unknown_argument_map'] .. ': ' .. k);
error( cfg.messages['unknown_argument_map'] );
end
end
Sətir 910: Sətir 824:
return str; -- nothing to do, we're done
return str; -- nothing to do, we're done
end
end
str = str:gsub ('&[nm]dash;', {['&ndash;'] = '–', ['&mdash;'] = '—'}); -- replace &mdash; and &ndash; entities  with their characters; semicolon mucks up the text.split
local out = {};
local out = {};
Sətir 924: Sətir 836:
item:match ('%a+%s*%-%s*%a+') then -- letter hyphen letter
item:match ('%a+%s*%-%s*%a+') then -- letter hyphen letter
item = item:gsub ('(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)', '%1–%2'); -- replace hyphen, remove extraneous space characters
item = item:gsub ('(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)', '%1–%2'); -- replace hyphen, remove extraneous space characters
else
else -- для рувики: всё наоборот
item = mw.ustring.gsub (item, '%s*[–—]%s*', ''); -- for endash or emdash separated ranges, replace em with en, remove extraneous white space
item = mw.ustring.gsub (item, '%s*[–—]%s*', ''); -- for endash or emdash separated ranges, replace em with en, remove extraneous white space
end
end
end
end
Sətir 1.064: Sətir 976:


local function is_good_vanc_name (last, first)
local function is_good_vanc_name (last, first)
local first, suffix = first:match ('(.-),?%s*([%dJS][%drndth]+)%.?$') or first; -- if first has something that looks like a generational suffix, get it
local first, suffix = first:match ('(.-),?%s*([%dJS][%drndth]+)%.?$') or first; -- if first has something that looks like a generational suffix, get it


if is_set (suffix) then
if is_set (suffix) then
Sətir 1.205: Sətir 1.117:
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] = ", "; -- replace last separator with ampersand text
text[#text-2] = " & "; -- replace last separator with ampersand text
end
end
text[#text] = nil; -- erase the last separator
text[#text] = nil; -- erase the last separator
Sətir 1.244: Sətir 1.156:
--[[--------------------------< N A M E _ H A S _ E T A L >----------------------------------------------------
--[[--------------------------< N A M E _ H A S _ E T A L >----------------------------------------------------


Evaluates the content of name parameters (author, editor, etc) for variations on the theme of et al.  If found,
Evaluates the content of author and editor name parameters for variations on the theme of et al.  If found,
the et al. is removed, a flag is set to true and the function returns the modified name and the flag.
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
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 associated |display-<names>=etal parameter
previous passes through this function or by the parameters |display-authors=etal or |display-editors=etal


]]
]]


local function name_has_etal (name, etal, nocat, param)
local function name_has_etal (name, etal, nocat)


if is_set (name) then -- name can be nil in which case just return
if is_set (name) then -- name can be nil in which case just return
local patterns = cfg.et_al_patterns; --get patterns from configuration
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.
for _, pattern in ipairs (patterns) do -- loop through all of the patterns
if name:match (etal_pattern) then -- variants on et al.
if name:match (pattern) then -- if this 'et al' pattern is found in name
name = name:gsub (etal_pattern, ''); -- if found, remove
name = name:gsub (pattern, ''); -- remove the offending text
etal = true; -- set flag (may have been set previously here or by |display-authors=etal)
etal = true; -- set flag (may have been set previously here or by |display-<names>=etal)
if not nocat then -- no categorization for |vauthors=
if not nocat then -- no categorization for |vauthors=
add_maint_cat ('etal'); -- and add a category if not already added
table.insert( z.message_tail, {set_error ('etal', {param})}); -- and set an error if not added
end
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
end
end
end
return name, etal; --  
return name, etal; --  
end
end
Sətir 1.282: Sətir 1.198:
local function name_has_ed_markup (name, list_name)
local function name_has_ed_markup (name, list_name)
local _, pattern;
local _, pattern;
local patterns = cfg.editor_markup_patterns; -- get patterns from configuration
local patterns = { -- these patterns match annotations at end of name
'%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
if is_set (name) then
Sətir 1.308: Sətir 1.235:
if is_set (name) then
if is_set (name) then
_, count = name:gsub ('[;,]', ''); -- count the number of separator-like characters
_, count = name:gsub ('[;,]', ''); -- count the number of separator-like characters
if 1 < count then -- param could be |author= or |editor= so one separator character is acceptable
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
return name; -- and done
return name; -- and done
Sətir 1.366: Sətir 1.297:
local etal=false; -- return value set to true when we find some form of et al. in an author parameter
local etal=false; -- return value set to true when we find some form of et al. in an author parameter


local last_alias, first_alias; -- selected parameter aliases used in error messaging
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
while true do
last, last_alias = select_one( args, cfg.aliases[list_name .. '-Last'], 'redundant_parameters', i ); -- search through args for name components beginning at 1
last = select_one( args, cfg.aliases[list_name .. '-Last'], 'redundant_parameters', i ); -- search through args for name components beginning at 1
first, first_alias = select_one( args, cfg.aliases[list_name .. '-First'], 'redundant_parameters', i );
first = select_one( args, cfg.aliases[list_name .. '-First'], 'redundant_parameters', i );
link = select_one( args, cfg.aliases[list_name .. '-Link'], 'redundant_parameters', i );
link = select_one( args, cfg.aliases[list_name .. '-Link'], 'redundant_parameters', i );
mask = select_one( args, cfg.aliases[list_name .. '-Mask'], 'redundant_parameters', i );
mask = select_one( args, cfg.aliases[list_name .. '-Mask'], 'redundant_parameters', i );


last, etal = name_has_etal (last, etal, false, last_alias); -- 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, first_alias); -- find and remove variations on et al.
first, etal = name_has_etal (first, etal, false); -- find and remove variations on et al.
last, first= name_checks (last, first, list_name); -- multiple names, extraneous annotation, etc checks
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
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', {first_alias, first_alias:gsub('first', 'last')}, true ) } ); -- add this error message
table.insert( z.message_tail, { set_error( 'first_missing_last', {err_msg_list_name, i}, true ) } ); -- add this error message
elseif not first and not last then -- if both firstn and lastn aren't found, are we done?
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
count = count + 1; -- number of times we haven't found last and first
Sətir 1.390: Sətir 1.321:
n = n + 1; -- point to next location in the names table
n = n + 1; -- point to next location in the names table
if 1 == count then -- if the previous name was missing
if 1 == count then -- if the previous name was missing
table.insert( z.message_tail, { set_error( 'missing_name', {list_name:match ("(%w+)List"):lower(), i-1}, true ) } ); -- add this error message
table.insert( z.message_tail, { set_error( 'missing_name', {err_msg_list_name, i-1}, true ) } ); -- add this error message
end
end
count = 0; -- reset the counter, we're looking for two consecutive missing names
count = 0; -- reset the counter, we're looking for two consecutive missing names
Sətir 1.413: Sətir 1.344:
extensions. For example, code 'cbk-zam' and its associated name 'Chavacano de Zamboanga' (MediaWiki does not support
extensions. For example, code 'cbk-zam' and its associated name 'Chavacano de Zamboanga' (MediaWiki does not support
code 'cbk' or name 'Chavacano'.  Most (all?) of these languages are not used a 'language' codes per se, rather they
code 'cbk' or name 'Chavacano'.  Most (all?) of these languages are not used a 'language' codes per se, rather they
are used as sub-domain names: cbk-zam.wikipedia.org.  A list of language names and codes supported by fetchLanguageNames()
are used as sub-domain names: cbk-zam.wikipedia.org.  These names can be found (for the time being) at
can be found at Template:Citation Style documentation/language/doc
https://phabricator.wikimedia.org/diffusion/ECLD/browse/master/LocalNames/LocalNamesEn.php


Names that are included in the list will be found if that name is provided in the |language= parameter.  For example,
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
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 WikiMedia language name.
and the associated code is not two or three characters, this function returns only the Wikimedia language name.
 
Some language names have multiple entries under different codes:
Aromanian has code rup and code roa-rup
When this occurs, this function returns the language name and the 2- or 3-character code


Adapted from code taken from Module:Check ISO 639-1.
Adapted from code taken from Module:Check ISO 639-1.
Sətir 1.433: Sətir 1.360:
end
end


local ietf_code; -- because some languages have both ietf-like codes and iso 639-like codes
local ietf_name;
local languages = mw.language.fetchLanguageNames(this_wiki_code, 'all') -- get a list of language names known to Wikimedia
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)
-- ('all' is required for North Ndebele, South Ndebele, and Ojibwa)
local langlc = mw.ustring.lower(lang); -- lower case version for comparisons
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
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 langlc == mw.ustring.lower(name) then
if 2 == code:len() or 3 == code:len() then -- two- or three-character codes only; extensions not supported
if 2 ~= code:len() and 3 ~= code:len() then -- two- or three-character codes only; extensions not supported
return name, code; -- so return the name and the code
return name; -- so return the name but not the code
end
end
ietf_code = code; -- remember that we found an ietf-like code and save its name
return name, code; -- found it, return name to ensure proper capitalization and the the code
ietf_name = name; -- but keep looking for a 2- or 3-char code
end
end
end
end
-- didn't find name with 2- or 3-char code; if ietf-like code found return
return lang; -- not valid language; return language in original case and nil for the code
return ietf_code and ietf_name or lang; -- associated name; return original language text else
end
end


Sətir 1.484: Sətir 1.406:


for _, lang in ipairs (names_table) do -- reuse lang
for _, lang in ipairs (names_table) do -- reuse lang
name = cfg.lang_code_remap[lang:lower()]; -- first see if this is a code that is not supported by MediaWiki but is in remap


if name then -- there was a remapped code so
if lang:match ('^%a%a%-') then -- strip ietf language tags from code; TODO: is there a need to support 3-char with tag?
lang = lang:gsub ('^(%a%a%a?)%-.*', '%1'); -- strip ietf tags from code
lang = lang:match ('(%a%a)%-') -- keep only 639-1 code portion to lang; TODO: do something with 3166 alpha 2 country code?
else
end
if lang:match ('^%a%a%-') then -- strip ietf tags from code; TODO: is there a need to support 3-char with tag?
lang = lang:match ('(%a%a)%-') -- keep only 639-1 code portion to lang; TODO: do something with 3166 alpha 2 country code?
-- костыль для рувики: замена распространённых англоназваний на коды
local fromEnglishToCode = {
['Arabic'] = 'ar',
['Azerbaijani'] = 'az',
['Belarusian'] = 'be',
['Bulgarian'] = 'bg',
['Czech'] = 'cs',
['Danish'] = 'da',
['German'] = 'de',
['Greek'] = 'el',
['Spanish'] = 'es',
['English'] = 'en',
['Finnish'] = 'fi',
['French'] = 'fr',
['Hebrew'] = 'he',
['Croatian'] = 'hr',
['Hungarian'] = 'hu',
['Armenian'] = 'hy',
['Indonesian'] = 'id',
['Italian'] = 'it',
['Japanese'] = 'ja',
['Korean'] = 'ko',
['Latin'] = 'la',
['Dutch'] = 'nl',
['Norwegian'] = 'no',
['Polish'] = 'pl',
['Portuguese'] = 'pt',
['Romanian'] = 'ro',
['Russian'] = 'ru',
['Slovenian'] = 'sl',
['Serbian'] = 'sr',
['Swedish'] = 'sv',
['Thai'] = 'th',
['Turkish'] = 'tr',
['Ukrainian'] = 'uk',
['Chinese'] = 'zh',
}
if fromEnglishToCode[lang] then
lang = fromEnglishToCode[lang]
end
if 2 == lang:len() or 3 == lang:len() then -- if two-or three-character code
-- для рувики: замена полного названия на сокращение вроде фр. или англ.
name = mw.getCurrentFrame():expandTemplate{
title='lg',
args={lang}
}
if name == '' then
name = nil
end
end
if 2 == lang:len() or 3 == lang:len() then -- if two-or three-character code
if not is_set (name) then
name = mw.language.fetchLanguageName (lang:lower(), this_wiki_code); -- get language name if |language= is a proper code
name = mw.language.fetchLanguageName( lang:lower(), this_wiki_code); -- get language name if |language= is a proper code
end
if not is_set (name) then
name = cfg.lang_code_remap[lang]; -- not supported by MediaWiki; is it in remap?
end
end
end
end
 
if is_set (name) then -- if |language= specified a valid code
if is_set (name) then -- if |language= specified a valid code
code = lang:lower(); -- save it
code = lang:lower(); -- save it
Sətir 1.504: Sətir 1.477:
if is_set (code) then -- only 2- or 3-character codes
if is_set (code) then -- only 2- or 3-character codes
name = cfg.lang_code_remap[code] or name; -- override wikimedia when they misuse language codes/names -- add maint category if not already added
name = cfg.lang_code_remap[code] or name; -- override wikimedia when they misuse language codes/names
 
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' .. code, {name, code}) -- categorize it
else -- or is a recognized language (but has a three-character code)
add_prop_cat ('foreign_lang_source_2' .. code, {code}) -- categorize it differently TODO: support mutliple three-character code categories per cs1|2 template
end
end
else
add_maint_cat ('unknown_lang'); -- add maint category if not already added
end
end
Sətir 1.513: Sətir 1.496:
code = #language_list -- reuse code as number of languages in the list
code = #language_list -- reuse code as number of languages in the list
if 2 >= code then
if 2 >= code then
name = table.concat (language_list, cfg.messages['parameter-pair-separator']) -- insert '<space>and<space>' between two language names
name = table.concat (language_list, ' and ') -- insert '<space>and<space>' between two language names
elseif 2 < code then
elseif 2 < code then
name = table.concat (language_list, ', '); -- and concatenate with '<comma><space>' separators
language_list[code] = 'and ' .. language_list[code]; -- prepend last name with 'and<space>'
name = name:gsub (', ([^,]+)$', cfg.messages['parameter-final-separator'] .. '%1'); -- replace last '<comma><space>' separator with '<comma><space>and<space>' separator
name = table.concat (language_list, ', ') -- and concatenate with '<comma><space>' separators
end
end
if this_wiki_name == name then
if this_wiki_name == name then
Sətir 1.618: Sətir 1.601:


local function is_pdf (url)
local function is_pdf (url)
return url:match ('%.pdf$') or url:match ('%.PDF$') or
return url:match ('%.pdf$') or url:match ('%.PDF$') or url:match ('%.pdf[%?#]') or url:match ('%.PDF[%?#]');
url:match ('%.pdf[%?#]') or url:match ('%.PDF[%?#]') or
url:match ('%.PDF&#035') or url:match ('%.pdf&#035');
end
end


Sətir 1.648: Sətir 1.629:




--[[--------------------------< G E T _ D I S P L A Y _ N A M E S >--------------------------------------------
--[[--------------------------< 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
Returns a number that defines the number of names displayed for author and editor name lists and a boolean flag
Sətir 1.671: Sətir 1.652:
]]
]]


local function get_display_names (max, count, list_name, etal)
local function get_display_authors_editors (max, count, list_name, etal)
if is_set (max) then
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
if 'etal' == max:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
Sətir 1.678: Sətir 1.659:
elseif max:match ('^%d+$') then -- if is a string of numbers
elseif max:match ('^%d+$') then -- if is a string of numbers
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
add_maint_cat ('disp_auth_ed', cfg.special_case_translation [list_name]);
end
else -- not a valid keyword or number
else -- not a valid keyword or number
table.insert( z.message_tail, { set_error( 'invalid_param_val', {'display-' .. list_name, max}, true ) } ); -- add error message
table.insert( z.message_tail, { set_error( 'invalid_param_val', {'display-' .. list_name, max}, true ) } ); -- add error message
Sətir 1.702: Sətir 1.686:
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 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]%.?[ %d]';
local bad_pattern = '^[Pp]?[Pp]%.?[ %d]';
if not page:match (good_pattern) and (page:match (bad_pattern) or  page:match ('^[Pp]ages?')) then
add_maint_cat ('extra_text');
end
end
end


Sətir 1.773: Sətir 1.761:


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)
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)
v_name_table = get_v_name_table (vparam, v_name_table, v_link_table); -- names are separated by commas
v_name_table = get_v_name_table (vparam, v_name_table, v_link_table); -- names are separated by commas


for i, v_name in ipairs(v_name_table) do
for i, v_name in ipairs(v_name_table) do
Sətir 1.885: Sətir 1.873:
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
elseif in_array (value, possible) then
elseif in_array(value:lower(), possible) then
return true;
return true;
else
else
Sətir 1.936: Sətir 1.924:
end
end


local vol = ''; -- here for all cites except magazine
local vol = '';
if is_set (volume) then
if is_set (volume) then
if volume:match ('^[MDCLXVI]+$') or volume:match ('^%d+$')then -- volume value is all digits or all uppercase roman numerals
if (4 < mw.ustring.len(volume)) then
vol = substitute (cfg.presentation['vol-bold'], {sepc, hyphen_to_dash(volume)}); -- render in bold face
vol = substitute (cfg.messages['j-vol'], {sepc, volume});
elseif (4 < mw.ustring.len(volume)) then -- not all digits or roman numerals and longer than 4 characters
else
vol = substitute (cfg.messages['j-vol'], {sepc, volume}); -- not bold
vol = substitute (cfg.presentation['vol-bold'], {sepc, hyphen_to_dash(volume)});
else -- four or less characters
vol = substitute (cfg.presentation['vol-bold'], {sepc, hyphen_to_dash(volume)}); -- bold
end
end
end
end
Sətir 1.991: Sətir 1.977:
return substitute (cfg.messages['nopp'], {sepc, page}), '', '', '';
return substitute (cfg.messages['nopp'], {sepc, page}), '', '', '';
end
end
end
elseif is_set(pages) then
if is_set(pages) then
if is_journal then
if is_journal then
return substitute (cfg.messages['j-page(s)'], pages), '', '', '';
return substitute (cfg.messages['j-page(s)'], pages), '', '', '';
elseif tonumber(pages) ~= nil and not nopp then -- if pages is only digits, assume a single page number
elseif tonumber(pages) ~= nil and not nopp then -- if pages is only digits, assume a single page number
return '', substitute (cfg.messages['pp-suffix'], {sepc, pages}), '', '';
return '', substitute (cfg.messages['p-prefix'], {sepc, pages}), '', '';
elseif not nopp then
elseif not nopp then
return '', substitute (cfg.messages['pp-suffix'], {sepc, pages}), '', '';
return '', substitute (cfg.messages['pp-prefix'], {sepc, pages}), '', '';
else
else
return '', substitute (cfg.messages['nopp'], {sepc, pages}), '', '';
return '', substitute (cfg.messages['nopp'], {sepc, pages}), '', '';
Sətir 2.008: Sətir 1.993:




--[[--------------------------< I N S O U R C E _ L O C _ G E T >----------------------------------------------
--[=[-------------------------< A R C H I V E _ U R L _ C H E C K >--------------------------------------------


returns one of the in-source locators: page, pages, or at.
Check archive.org urls to make sure they at least look like they are pointing at valid archives and not to the  
 
save snapshot url or to calendar pages.  When the archive url is 'https://web.archive.org/save/' (or http://...)
If any of these are interwiki links to wikisource, returns the label portion of the interwikilink as plain text
archive.org saves a snapshot of the target page in the url.  That is something that Wikipedia should not allow
for use in COinS.  This COinS thing is done because here we convert an interwiki link to and external link and
unwitting readers to do.
add an icon span around that; get_coins_pages() doesn't know about the span.  TODO: should it? 
 
TODO: add support for sheet and sheets?; streamline;
 
TODO: make it so that this function returns only one of the three as the single in-source (the return value assigned
to a new name)?
 
]]
 
local function insource_loc_get (page, pages, at)
local ws_url, ws_label, coins_pages, L; -- for wikisource interwikilinks; TODO: this corrupts page metadata (span remains in place after cleanup; fix there?)
 
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.
 
ws_url, ws_label, L = wikisource_url_make (page); -- make ws url from |page= interwiki link; link portion L becomes tool tip label
if ws_url then
page = external_link (ws_url, ws_label .. '&nbsp;', 'ws link in page'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
page = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, page});
coins_pages = ws_label;
end
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.
 
ws_url, ws_label, L = wikisource_url_make (pages); -- make ws url from |pages= interwiki link; link portion L becomes tool tip label
if ws_url then
pages = external_link (ws_url, ws_label .. '&nbsp;', 'ws link in pages'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
pages = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, pages});
coins_pages = ws_label;
end
elseif is_set (at) then
ws_url, ws_label, L = wikisource_url_make (at); -- make ws url from |at= interwiki link; link portion L becomes tool tip label
if ws_url then
at = external_link (ws_url, ws_label .. '&nbsp;', 'ws link in at'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
at = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, at});
coins_pages = ws_label;
end
end
return page, pages, at, coins_pages;
end
 
 
 
--[=[-------------------------< A R C H I V E _ U R L _ C H E C K >--------------------------------------------
 
Check archive.org urls to make sure they at least look like they are pointing at valid archives and not to the  
save snapshot url or to calendar pages.  When the archive url is 'https://web.archive.org/save/' (or http://...)
archive.org saves a snapshot of the target page in the url.  That is something that Wikipedia should not allow
unwitting readers to do.


When the archive.org url does not have a complete timestamp, archive.org chooses a snapshot according to its own
When the archive.org url does not have a complete timestamp, archive.org chooses a snapshot according to its own
Sətir 2.112: Sətir 2.040:
err_msg = 'liveweb';
err_msg = 'liveweb';
else
else
path, timestamp, flag = url:match('//web%.archive%.org/([^%d]*)(%d+)([^/]*)/'); -- split out some of the url parts for evaluation
path, timestamp, flag = url:match('//web%.archive%.org/([^%d]*)(%d+)([^/]*)/'); -- split out some of the url parts for evaluation
if not is_set(timestamp) or 14 ~= timestamp:len() then -- path and flag optional, must have 14-digit timestamp here
if not is_set(timestamp) or 14 ~= timestamp:len() then -- path and flag optional, must have 14-digit timestamp here
Sətir 2.177: Sətir 2.105:
elseif 3 == selected then
elseif 3 == selected then
Authors = A['Authors']; -- use content of |authors=
Authors = A['Authors']; -- use content of |authors=
if 'authors' == A:ORIGIN('Authors') then -- but add a maint cat if the parameter is |authors=
add_maint_cat ('authors'); -- because use of this parameter is discouraged; what to do about the aliases is a TODO:
end
end
end
if is_set (Collaboration) then
if is_set (Collaboration) then
Sətir 2.183: Sətir 2.114:
end
end


local Coauthors = A['Coauthors']; -- для рувики (а вообще депрекированный)
local Others = A['Others'];
local Others = A['Others'];


Sətir 2.198: Sətir 2.130:
elseif 3 == selected then
elseif 3 == selected then
Editors = A['Editors']; -- use content of |editors=
Editors = A['Editors']; -- use content of |editors=
add_maint_cat ('editors'); -- but add a maint cat because use of this parameter is discouraged
end
end
end
end


local translator_etal;
local t = {}; -- translators list from |translator-lastn= / translator-firstn= pairs
local t = {}; -- translators list from |translator-lastn= / translator-firstn= pairs
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 interviewer_etal;
local interviewers_list = {};
local interviewers_list = {};
local Interviewers = A['Interviewers']
local Interviewers; -- used later
if is_set (Interviewers) then -- add a maint cat if the |interviewers= is used
interviewers_list = extract_names (args, 'InterviewerList'); -- process preferred interviewers parameters
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 contributor_etal;
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs
local Contributors; -- assembled contributors name list
local Contributors; -- assembled contributors name list
Sətir 2.235: Sətir 2.169:
end
end


if not is_valid_parameter_value (NameListFormat, 'name-list-format', cfg.keywords['name-list-format']) then -- only accepted value for this parameter is 'vanc'
if not is_valid_parameter_value (NameListFormat, 'name-list-format', cfg.keywords['name-list-format']) then -- only accepted value for this parameter is 'vanc'
NameListFormat = ''; -- anything else, set to empty string
NameListFormat = ''; -- anything else, set to empty string
end
end
Sətir 2.256: Sətir 2.190:
local Chapter = A['Chapter'];
local Chapter = A['Chapter'];
local ScriptChapter = A['ScriptChapter'];
local ScriptChapter = A['ScriptChapter'];
local ScriptChapterOrigin = A:ORIGIN ('ScriptChapter');
local ChapterLink -- = A['ChapterLink']; -- deprecated as a parameter but still used internally by cite episode
local ChapterLink -- = A['ChapterLink']; -- deprecated as a parameter but still used internally by cite episode
local TransChapter = A['TransChapter'];
local TransChapter = A['TransChapter'];
Sətir 2.269: Sətir 2.202:
ArchiveURL, ArchiveDate = archive_url_check (A['ArchiveURL'], A['ArchiveDate'])
ArchiveURL, ArchiveDate = archive_url_check (A['ArchiveURL'], A['ArchiveDate'])
local UrlStatus = A['UrlStatus'];
local DeadURL = A['DeadURL']
if 'url-status' == A:ORIGIN ('UrlStatus') then -- interim: TODO: this line goes away
if not is_valid_parameter_value (DeadURL, 'dead-url', cfg.keywords ['deadurl']) then -- set in config.defaults to 'yes'
if not is_valid_parameter_value (UrlStatus, 'url-status', cfg.keywords ['url-status']) then -- set in config.defaults to 'dead'
DeadURL = ''; -- anything else, set to empty string
UrlStatus = ''; -- anything else, set to empty string
end
end -- interim: TODO: this line goes away
 
elseif is_set (A:ORIGIN ('UrlStatus')) then -- interim: while both |dead-url= and |url-status= allowed use separate keyword lists; TODO: remove this section
if not is_valid_parameter_value (UrlStatus, A:ORIGIN ('UrlStatus'), cfg.keywords ['deadurl']) then -- interim: assume |dead-url=; use those keywords; TODO: this line goes away
UrlStatus = ''; -- anything else, set to empty string; interim: TODO: this line goes away
end -- interim: TODO: this line goes away
end -- interim: TODO: this line goes away
if in_array (UrlStatus, {'yes', 'true', 'y'}) then -- TODO: remove this whole thing when |dead-url=[yes|no] parameters removed from articles
UrlStatus = 'dead';
elseif 'no' == UrlStatus then
UrlStatus = 'live';
end
local URL = A['URL']
local URL = A['URL']
local URLorigin = A:ORIGIN('URL'); -- get name of parameter that holds URL
local URLorigin = A:ORIGIN('URL'); -- get name of parameter that holds URL
Sətir 2.294: Sətir 2.215:
local ConferenceURLorigin = A:ORIGIN('ConferenceURL'); -- get name of parameter that holds ConferenceURL
local ConferenceURLorigin = A:ORIGIN('ConferenceURL'); -- get name of parameter that holds ConferenceURL
local Periodical = A['Periodical'];
local Periodical = A['Periodical'];
local Periodical_origin = '';
local Periodical_origin = A:ORIGIN('Periodical'); -- get the name of the periodical parameter
if is_set (Periodical) then
Periodical_origin = A:ORIGIN('Periodical'); -- get the name of the periodical parameter
local i;
Periodical, i = strip_apostrophe_markup (Periodical); -- strip appostrophe markup so that metadata isn't contaminated
if i then -- non-zero when markup was stripped so emit an error message
table.insert( z.message_tail, {set_error ('apostrophe_markup', {Periodical_origin}, true)});
end
end


local ScriptPeriodical = A['ScriptPeriodical'];
local Series = A['Series'];
local ScriptPeriodical_origin = A:ORIGIN('ScriptPeriodical');
-- web and news not tested for now because of
-- Wikipedia:Administrators%27_noticeboard#Is_there_a_semi-automated_tool_that_could_fix_these_annoying_"Cite_Web"_errors?
 
local TransPeriodical =  A['TransPeriodical'];
 
local Series = A['Series'];
local Volume;
local Volume;
Sətir 2.319: Sətir 2.225:
local At;
local At;


if 'citation' == config.CitationClass then
if in_array (config.CitationClass, cfg.templates_using_volume) then
if is_set (Periodical) then
if not in_array (Periodical_origin, {'website', 'mailinglist'}) then -- {{citation}} does not render volume for these 'periodicals'
Volume = A['Volume']; -- but does for all other 'periodicals'
end
elseif is_set (ScriptPeriodical) then
if 'script-website' ~= ScriptPeriodical_origin then -- {{citation}} does not render volume for |script-website=
Volume = A['Volume']; -- but does for all other 'periodicals'
end
else
Volume = A['Volume']; -- and does for non-'periodical' cites
end
elseif in_array (config.CitationClass, cfg.templates_using_volume) then -- render |volume= for cs1 according to the configuration settings
Volume = A['Volume'];
Volume = A['Volume'];
end
if 'citation' == config.CitationClass then
if is_set (Periodical) and in_array (Periodical_origin, {'journal', 'magazine', 'newspaper', 'periodical', 'work'}) or -- {{citation}} renders issue for these 'periodicals'
is_set (ScriptPeriodical) and in_array (ScriptPeriodical_origin, {'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-work'}) then -- and these 'script-periodicals'
Issue = hyphen_to_dash (A['Issue']);
end
elseif in_array (config.CitationClass, cfg.templates_using_issue) then -- conference & map books do not support issue; {{citation}} listed here because included in settings table
if not (in_array (config.CitationClass, {'conference', 'map', 'citation'}) and not (is_set (Periodical) or is_set (ScriptPeriodical))) then
Issue = hyphen_to_dash (A['Issue']);
end
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
Issue = hyphen_to_dash (A['Issue']);
end
local Position = '';
local Position = '';
if not in_array (config.CitationClass, cfg.templates_not_using_page) then
if not in_array (config.CitationClass, cfg.templates_not_using_page) then
Sətir 2.358: Sətir 2.244:
local PublisherName = A['PublisherName'];
local PublisherName = A['PublisherName'];
local PublisherName_origin = A:ORIGIN('PublisherName');
if is_set (PublisherName) then
local i=0;
PublisherName, i = strip_apostrophe_markup (PublisherName); -- strip appostrophe markup so that metadata isn't contaminated; publisher is never italicized
if i then -- non-zero when markup was stripped so emit an error message
table.insert( z.message_tail, {set_error ('apostrophe_markup', {PublisherName_origin}, true)});
end
end
local RegistrationRequired = A['RegistrationRequired'];
local RegistrationRequired = A['RegistrationRequired'];
if not is_valid_parameter_value (RegistrationRequired, 'registration', cfg.keywords ['yes_true_y']) then
if not is_valid_parameter_value (RegistrationRequired, 'registration', cfg.keywords ['yes_true_y']) then
Sətir 2.386: Sətir 2.262:
table.insert( z.message_tail, { set_error( 'param_access_requires_param', {'url'}, true ) } );
table.insert( z.message_tail, { set_error( 'param_access_requires_param', {'url'}, true ) } );
end
end
 
if is_set (UrlAccess) and is_set (SubscriptionRequired) then -- while not aliases, these are much the same so if both are set
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
table.insert( z.message_tail, { set_error( 'redundant_parameters', {wrap_style ('parameter', 'url-access') .. ' and ' .. wrap_style ('parameter', 'subscription')}, true ) } ); -- add error message
Sətir 2.397: Sətir 2.273:


local ChapterUrlAccess = A['ChapterUrlAccess'];
local ChapterUrlAccess = A['ChapterUrlAccess'];
if not is_valid_parameter_value (ChapterUrlAccess, A:ORIGIN('ChapterUrlAccess'), cfg.keywords ['url-access']) then -- same as url-access
if not is_valid_parameter_value (ChapterUrlAccess, 'chapter-url-access', cfg.keywords ['url-access']) then -- same as url-access
ChapterUrlAccess = nil;
ChapterUrlAccess = nil;
end
end
if not is_set(ChapterURL) and is_set(ChapterUrlAccess) then
if not is_set(ChapterURL) and is_set(ChapterUrlAccess) then
ChapterUrlAccess = nil;
ChapterUrlAccess = nil;
table.insert( z.message_tail, { set_error( 'param_access_requires_param', {A:ORIGIN('ChapterUrlAccess'):gsub ('%-access', '')}, true ) } );
table.insert( z.message_tail, { set_error( 'param_access_requires_param', {'chapter-url'}, true ) } );
end
 
local MapUrlAccess = A['MapUrlAccess'];
if not is_valid_parameter_value (MapUrlAccess, 'map-url-access', cfg.keywords ['url-access']) then
MapUrlAccess = nil;
end
if not is_set(A['MapURL']) and is_set(MapUrlAccess) then
MapUrlAccess = nil;
table.insert( z.message_tail, { set_error( 'param_access_requires_param', {'map-url'}, true ) } );
end
end


Sətir 2.432: Sətir 2.299:


local ID_list = extract_ids( args );
local ID_list = extract_ids( args );
if is_set (DoiBroken) and not ID_list['DOI'] then
table.insert( z.message_tail, { set_error( 'doibroken_missing_doi', A:ORIGIN('DoiBroken'))});
end
local ID_access_levels = extract_id_access_levels( args, ID_list );
local ID_access_levels = extract_id_access_levels( args, ID_list );


Sətir 2.466: Sətir 2.330:
if not is_valid_parameter_value (DF, 'df', cfg.keywords['date-format']) then -- validate reformatting keyword
if not is_valid_parameter_value (DF, 'df', cfg.keywords['date-format']) then -- validate reformatting keyword
DF = ''; -- not valid, set to empty string
DF = ''; -- not valid, set to empty string
end
if not is_set (DF) then
DF = cfg.global_df;
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;
local Ref;
local Ref;
sepc, PostScript, Ref = set_style (Mode:lower(), A['PostScript'], A['Ref'], config.CitationClass);
sepc, PostScript, Ref = set_style (Mode:lower(), A['PostScript'], A['Ref'], config.CitationClass);
use_lowercase = ( sepc == ',' ); -- used to control capitalization for certain static text
use_lowercase = ( sepc == ',' ); -- used to control capitalization for certain static text


--check this page to see if it is in one of the namespaces that cs1 is not supposed to add to the error categories
--check this page to see if it is in one of the namespaces that cs1 is not supposed to add to the error categories
Sətir 2.491: Sətir 2.352:


-- check for extra |page=, |pages= or |at= parameters. (also sheet and sheets while we're at it)
-- check for extra |page=, |pages= or |at= parameters. (also sheet and sheets while we're at it)
select_one( args, {'page', 'p', 'at', 'sheet', 'sheets'}, 'redundant_parameters' ); -- this is a dummy call simply to get the error message and category
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 coins_pages;
Page, Pages, At, coins_pages = insource_loc_get (Page, Pages, At);


local NoPP = A['NoPP']  
local NoPP = A['NoPP']  
Sətir 2.504: Sətir 2.361:
end
end


if not is_set(PublicationPlace) and is_set(Place) then -- both |publication-place= and |place= (|location=) allowed if different
if is_set(Page) then
PublicationPlace = Place; -- promote |place= (|location=) to |publication-place
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
end
end
if PublicationPlace == Place then Place = ''; end -- don't need both if they are the same
if PublicationPlace == Place then Place = ''; end -- don't need both if they are the same
--[[
--[[
Sətir 2.515: Sətir 2.386:
|encyclopedia and |title then map |title to |article and |encyclopedia to |title
|encyclopedia and |title then map |title to |article and |encyclopedia to |title
|encyclopedia and |article then map |encyclopedia to |title
|encyclopedia and |article then map |encyclopedia to |title
 
|encyclopedia then map |encyclopedia to |title
|trans-title maps to |trans-chapter when |title is re-mapped
|trans-title maps to |trans-chapter when |title is re-mapped
|url maps to |chapterurl when |title is remapped
|url maps to |chapterurl when |title is remapped
Sətir 2.526: Sətir 2.398:


if ( config.CitationClass == "encyclopaedia" ) or ( config.CitationClass == "citation" and is_set (Encyclopedia)) then -- test code for citation
if ( config.CitationClass == "encyclopaedia" ) or ( config.CitationClass == "citation" and is_set (Encyclopedia)) then -- test code for citation
if is_set (Periodical) then -- Periodical is set when |encyclopedia is set
if is_set(Periodical) then -- Periodical is set when |encyclopedia is set
if is_set(Title) or is_set (ScriptTitle) then
if is_set(Title) or is_set (ScriptTitle) then
if not is_set(Chapter) then
if not is_set(Chapter) then
Chapter = Title; -- |encyclopedia and |title are set so map |title to |article and |encyclopedia to |title
Chapter = Title; -- |encyclopedia and |title are set so map |title to |article and |encyclopedia to |title
ScriptChapter = ScriptTitle;
ScriptChapter = ScriptTitle;
ScriptChapterOrigin = 'title';
TransChapter = TransTitle;
TransChapter = TransTitle;
ChapterURL = URL;
ChapterURL = URL;
Sətir 2.548: Sətir 2.419:
ScriptTitle = '';
ScriptTitle = '';
end
end
elseif is_set (Chapter) then -- |title not set
else -- |title not set
Title = Periodical; -- |encyclopedia set and |article set so map |encyclopedia to |title
Title = Periodical; -- |encyclopedia set and |article set or not set so map |encyclopedia to |title
Periodical = ''; -- redundant so unset
Periodical = ''; -- redundant so unset
end
end
Sətir 2.569: Sətir 2.440:
if (config.CitationClass == "mailinglist") then
if (config.CitationClass == "mailinglist") then
Periodical = A ['MailingList'];
Periodical = A ['MailingList'];
elseif 'mailinglist' == Periodical_origin then
elseif 'mailinglist' == A:ORIGIN('Periodical') then
Periodical = ''; -- unset because mailing list is only used for cite mailing list
Periodical = ''; -- unset because mailing list is only used for cite mailing list
end
end
Sətir 2.592: Sətir 2.463:
elseif 'speech' ~= config.CitationClass then
elseif 'speech' ~= config.CitationClass then
Conference = ''; -- not cite conference or cite speech so make sure this is empty string
Conference = ''; -- not cite conference or cite speech so make sure this is empty string
end
-- для рувики: конкатенация |month к |date
local Month = A['Month'];
if is_set(Month) and is_set(Year) then
Date = Month .. " " .. Year;
Month = nil;
Year = nil;
end
end


Sətir 2.602: Sətir 2.481:
Chapter = A['Map'];
Chapter = A['Map'];
ChapterURL = A['MapURL'];
ChapterURL = A['MapURL'];
ChapterUrlAccess = MapUrlAccess;
ChapterUrlAccess = UrlAccess;
TransChapter = A['TransMap'];
TransChapter = A['TransMap'];
ChapterURLorigin = A:ORIGIN('MapURL');
ChapterURLorigin = A:ORIGIN('MapURL');
Sətir 2.646: Sətir 2.525:
-- assemble a table of parts concatenated later into Series
-- assemble a table of parts concatenated later into Series
if is_set(Season) then table.insert(s, wrap_msg ('season', Season, use_lowercase)); end
if is_set(Season) then table.insert(s, wrap_msg ('season', Season, use_lowercase)); end
if is_set(SeriesNumber) then table.insert(s, wrap_msg ('seriesnum', SeriesNumber, use_lowercase)); end
if is_set(SeriesNumber) then table.insert(s, wrap_msg ('series', SeriesNumber, use_lowercase)); end
if is_set(Issue) then table.insert(s, wrap_msg ('episode', Issue, use_lowercase)); end
if is_set(Issue) then table.insert(s, wrap_msg ('episode', Issue, use_lowercase)); end
Issue = ''; -- unset because this is not a unique parameter
Issue = ''; -- unset because this is not a unique parameter
Sətir 2.652: Sətir 2.531:
Chapter = Title; -- promote title parameters to chapter
Chapter = Title; -- promote title parameters to chapter
ScriptChapter = ScriptTitle;
ScriptChapter = ScriptTitle;
ScriptChapterOrigin = 'title';
ChapterLink = TitleLink; -- alias episodelink
ChapterLink = TitleLink; -- alias episodelink
TransChapter = TransTitle;
TransChapter = TransTitle;
Sətir 2.683: Sətir 2.561:
-- end of {{cite episode}} stuff
-- end of {{cite episode}} stuff


-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, {{cite ssrn}}, before generation of COinS data.
-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, before generation of COinS data.
do
do
if in_array (config.CitationClass, {'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) then
if in_array (config.CitationClass, {'arxiv', 'biorxiv', 'citeseerx'}) then
if not is_set (ID_list[config.CitationClass:upper()]) then -- |arxiv= or |eprint= required for cite arxiv; |biorxiv= & |citeseerx= required for their templates
if not is_set (ID_list[config.CitationClass:upper()]) then -- |arxiv= or |eprint= required for cite arxiv; |biorxiv= & |citeseerx= required for their templates
table.insert( z.message_tail, { set_error( config.CitationClass .. '_missing', {}, true ) } ); -- add error message
table.insert( z.message_tail, { set_error( config.CitationClass .. '_missing', {}, true ) } ); -- add error message
end
if 'arxiv' == config.CitationClass then
Periodical = 'arXiv'; -- set to arXiv for COinS; after that, must be set to empty string
end
end


Periodical = ({['arxiv'] = 'arXiv', ['biorxiv'] = bioRxiv, ['citeseerx'] = 'CiteSeerX', ['ssrn'] = 'Social Science Research Network'})[config.CitationClass];
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
end
end
end
end
end
Sətir 2.747: Sətir 2.635:
anchor_year, Embargo, error_message = dates(date_parameters_list, COinS_date);
anchor_year, Embargo, error_message = dates(date_parameters_list, COinS_date);


-- start temporary Julian / Gregorian calendar uncertainty categorization
if COinS_date.inter_cal_cat then
add_prop_cat ('jul_greg_uncertainty');
end
-- end temporary Julian / Gregorian calendar uncertainty categorization
-- end temporary Julian / Gregorian calendar uncertainty categorization


Sətir 2.756: Sətir 2.648:
end
end
error_message = error_message .. '&#124;year= / &#124;date= mismatch';
error_message = error_message .. '&#124;year= / &#124;date= mismatch';
elseif 1 == mismatch then -- |year= matches year-value in |date=
add_maint_cat ('date_year');
end
end
end
end
Sətir 2.768: Sətir 2.662:
if true == date_hyphen_to_dash (date_parameters_list) then -- convert hyphens to dashes where appropriate
if true == date_hyphen_to_dash (date_parameters_list) then -- convert hyphens to dashes where appropriate
modified = true;
modified = true;
add_maint_cat ('date_format'); -- hyphens were converted so add maint category
end
end
Sətir 2.785: Sətir 2.680:
PublicationDate = date_parameters_list['publication-date'].val;
PublicationDate = date_parameters_list['publication-date'].val;
end
end
else
table.insert( z.message_tail, { set_error( 'bad_date', {error_message}, true ) } ); -- add this error message
end
end
end -- end of do
end -- end of do
Sətir 2.798: Sətir 2.695:
if is_set(AccessDate) then -- access date requires |url=; pmc created url is not |url=
if is_set(AccessDate) then -- access date requires |url=; pmc created url is not |url=
table.insert( z.message_tail, { set_error( 'accessdate_missing_url', {}, true ) } );
table.insert( z.message_tail, { set_error( 'accessdate_missing_url', {}, true ) } );
AccessDate = ''; -- unset
AccessDate = ''; -- для рувики: TODO: убрать? -- unset
end
end


Sətir 2.809: Sətir 2.706:
not is_set(TransTitle) and
not is_set(TransTitle) and
not is_set(ScriptTitle) then
not is_set(ScriptTitle) then
if 'episode' == config.CitationClass then
if 'episode' == config.CitationClass then -- special case for cite episode; TODO: is there a better way to do this?
table.insert( z.message_tail, { set_error( 'citation_missing_title', {'series'}, true ) } );
else
table.insert( z.message_tail, { set_error( 'citation_missing_title', {'title'}, true ) } );
end
end
end
end
 
if 'none' == Title and
if 'none' == Title and in_array (config.CitationClass, {'journal', 'citation'}) and is_set (Periodical) and 'journal' == A:ORIGIN('Periodical') then -- special case for journal cites
in_array (config.CitationClass, {'journal', 'citation'}) and
Title = ''; -- set title to empty string
(is_set (Periodical) or is_set (ScriptPeriodical)) and
add_maint_cat ('untitled');
('journal' == Periodical_origin or 'script-journal' == ScriptPeriodical_origin) then -- special case for journal cites
Title = ''; -- set title to empty string
end
end


check_for_url ({ -- add error message when any of these parameters hold a URL
check_for_url ({ -- add error message when any of these parameters contains a URL
['title']=Title,
['title']=Title,
[A:ORIGIN('Chapter')]=Chapter,
[A:ORIGIN('Chapter')]=Chapter,
[Periodical_origin] = Periodical,
[A:ORIGIN('Periodical')]=Periodical,
[PublisherName_origin] = PublisherName
[A:ORIGIN('PublisherName')] = PublisherName
});
});


Sətir 2.847: Sətir 2.745:
-- this is the function call to COinS()
-- this is the function call to COinS()
local OCinSoutput = COinS({
local OCinSoutput = COinS({
['Periodical'] = strip_apostrophe_markup (Periodical), -- no markup in the metadata
['Periodical'] = Periodical,
['Encyclopedia'] = strip_apostrophe_markup (Encyclopedia),
['Encyclopedia'] = Encyclopedia,
['Chapter'] = make_coins_title (coins_chapter, ScriptChapter), -- Chapter and ScriptChapter stripped of bold / italic wikimarkup
['Chapter'] = make_coins_title (coins_chapter, ScriptChapter), -- Chapter and ScriptChapter stripped of bold / italic wikimarkup
['Degree'] = Degree; -- cite thesis only
['Degree'] = Degree; -- cite thesis only
Sətir 2.859: Sətir 2.757:
['Volume'] = Volume,
['Volume'] = Volume,
['Issue'] = Issue,
['Issue'] = Issue,
['Pages'] = coins_pages or get_coins_pages (first_set ({Sheet, Sheets, Page, Pages, At}, 5)), -- pages stripped of external links
['Pages'] = get_coins_pages (first_set ({Sheet, Sheets, Page, Pages, At}, 5)), -- pages stripped of external links
['Edition'] = Edition,
['Edition'] = Edition,
['PublisherName'] = PublisherName, -- any apostrophe markup already removed
['PublisherName'] = PublisherName,
['URL'] = first_set ({ChapterURL, URL}, 2),
['URL'] = first_set ({ChapterURL, URL}, 2),
['Authors'] = coins_author,
['Authors'] = coins_author,
Sətir 2.868: Sətir 2.766:
}, config.CitationClass);
}, config.CitationClass);


-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, and {{cite ssrn}} AFTER generation of COinS data.
-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, and {{cite citeseerx}} AFTER generation of COinS data.
if in_array (config.CitationClass, {'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) then -- we have set rft.jtitle in COinS to arXiv, bioRxiv, CiteSeerX, or ssrn 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
Periodical = ''; -- periodical not allowed in these templates; if article has been published, use cite journal
end
end
Sətir 2.876: Sətir 2.774:
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, PublisherName_origin, nil ));
PublisherName = substitute (cfg.messages['newsgroup'], external_link( 'news:' .. PublisherName, PublisherName, A:ORIGIN('PublisherName'), nil ));
end
end
end
end


-- Now perform various field substitutions.
-- Now perform various field substitutions.
Sətir 2.895: Sətir 2.795:


do -- do editor name list first because the now unsupported coauthors used to modify control table
do -- do editor name list first because the now unsupported coauthors used to modify control table
control.maximum , editor_etal = get_display_names (A['DisplayEditors'], #e, 'editors', editor_etal);
control.maximum , editor_etal = get_display_authors_editors (A['DisplayEditors'], #e, 'editors', editor_etal);
last_first_list, EditorCount = list_people(control, e, editor_etal);
last_first_list, EditorCount = list_people(control, e, editor_etal);


if is_set (Editors) then
if is_set (Editors) then
Editors, editor_etal = name_has_etal (Editors, editor_etal, false, 'editors'); -- find and remove variations on et al.
if editor_etal then
if editor_etal then
Editors = Editors .. ' ' .. cfg.messages['et al']; -- add et al. to editors parameter beause |display-editors=etal
Editors = Editors .. ' ' .. cfg.messages['et al']; -- add et al. to editors parameter beause |display-editors=etal
Sətir 2.915: Sətir 2.814:
end
end
do -- now do interviewers
do -- now do interviewers
control.maximum , interviewer_etal = get_display_names (A['DisplayInterviewers'], #interviewers_list, 'interviewers', interviewer_etal);
control.maximum = #interviewers_list; -- number of interviewerss
Interviewers = list_people (control, interviewers_list, interviewer_etal);
Interviewers = list_people(control, interviewers_list, false); -- et al not currently supported
end
end
do -- now do translators
do -- now do translators
control.maximum , translator_etal = get_display_names (A['DisplayTranslators'], #t, 'translators', translator_etal);
control.maximum = #t; -- number of translators
Translators = list_people (control, t, translator_etal);
Translators = list_people(control, t, false); -- et al not currently supported
end
end
do -- now do contributors
do -- now do contributors
control.maximum , contributor_etal = get_display_names (A['DisplayContributors'], #c, 'contributors', contributor_etal);
control.maximum = #c; -- number of contributors
Contributors = list_people (control, c, contributor_etal);
Contributors = list_people(control, c, false); -- et al not currently supported
end
end
do -- now do authors
do -- now do authors
control.maximum , author_etal = get_display_names (A['DisplayAuthors'], #a, 'authors', author_etal);
control.maximum , author_etal = get_display_authors_editors (A['DisplayAuthors'], #a, 'authors', author_etal);


last_first_list = list_people(control, a, author_etal);
last_first_list = list_people(control, a, author_etal);


if is_set (Authors) then
if is_set (Authors) then
Authors, author_etal = name_has_etal (Authors, author_etal, false, 'authors'); -- find and remove variations on et al.
Authors, author_etal = name_has_etal (Authors, author_etal, false); -- find and remove variations on et al.
if author_etal then
if author_etal then
Authors = Authors .. ' ' .. cfg.messages['et al']; -- add et al. to authors parameter
Authors = Authors .. ' ' .. cfg.messages['et al']; -- add et al. to authors parameter
Sətir 2.956: Sətir 2.855:


-- special case for chapter format so no error message or cat when chapter not supported
-- special case for chapter format so no error message or cat when chapter not supported
if not (in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) or
if not (in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx'}) or
('citation' == config.CitationClass and (is_set (Periodical) or is_set (ScriptPeriodical)) and not is_set (Encyclopedia))) then
('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia))) then
ChapterFormat = style_format (ChapterFormat, ChapterURL, 'chapter-format', 'chapter-url');
ChapterFormat = style_format (ChapterFormat, ChapterURL, 'chapter-format', 'chapter-url');
end
end


if not is_set(URL) then
if not is_set(URL) then
if in_array(config.CitationClass, {"web","podcast", "mailinglist"}) or -- |url= required for cite web, cite podcast, and cite mailinglist
if in_array(config.CitationClass, {"web","podcast", "mailinglist"}) then -- |url= required for cite web, cite podcast, and cite mailinglist
('citation' == config.CitationClass and ('website' == Periodical_origin or 'script-website' == ScriptPeriodical_origin)) then -- and required for {{citation}} with |website= or |script-website=
table.insert( z.message_tail, { set_error( 'cite_web_url', {}, true ) } );
table.insert( z.message_tail, { set_error( 'cite_web_url', {}, true ) } );
end
end
Sətir 2.970: Sətir 2.868:
if is_set(AccessDate) and not is_set(ChapterURL)then -- ChapterURL may be set when URL is not set;
if is_set(AccessDate) and not is_set(ChapterURL)then -- ChapterURL may be set when URL is not set;
table.insert( z.message_tail, { set_error( 'accessdate_missing_url', {}, true ) } );
table.insert( z.message_tail, { set_error( 'accessdate_missing_url', {}, true ) } );
AccessDate = '';
-- AccessDate = ''; -- для рувики: убрано
end
end
end
end


local OriginalURL, OriginalURLorigin, OriginalFormat, OriginalAccess;
local OriginalURL, OriginalURLorigin, OriginalFormat, OriginalAccess;
-- DeadURL = DeadURL:lower(); -- used later when assembling archived text
DeadURL = DeadURL:lower(); -- used later when assembling archived text
UrlStatus = UrlStatus:lower(); -- used later when assembling archived text
if is_set( ArchiveURL ) then
if is_set( ArchiveURL ) then
if is_set (ChapterURL) then -- if chapter-url is set apply archive url to it
if is_set (ChapterURL) then -- if chapter-url is set apply archive url to it
Sətir 2.982: Sətir 2.879:
OriginalURLorigin = ChapterURLorigin; -- name of chapter-url parameter for error messages
OriginalURLorigin = ChapterURLorigin; -- name of chapter-url parameter for error messages
OriginalFormat = ChapterFormat; -- and original |chapter-format=
OriginalFormat = ChapterFormat; -- and original |chapter-format=
-- if 'no' ~= DeadURL then
if 'no' ~= DeadURL then
if 'live' ~= UrlStatus then
ChapterURL = ArchiveURL -- swap-in the archive's url
ChapterURL = ArchiveURL -- swap-in the archive's url
ChapterURLorigin = A:ORIGIN('ArchiveURL') -- name of archive-url parameter for error messages
ChapterURLorigin = A:ORIGIN('ArchiveURL') -- name of archive-url parameter for error messages
Sətir 2.994: Sətir 2.890:
OriginalFormat = Format; -- and original |format=
OriginalFormat = Format; -- and original |format=
OriginalAccess = UrlAccess;
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
if 'live' ~= UrlStatus 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
Sətir 3.004: Sətir 2.899:
end
end


if in_array(config.CitationClass, {'web','news','journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) or -- if any of the 'periodical' cites except encyclopedia
if in_array(config.CitationClass, {'web','news','journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx'}) or -- if any of the 'periodical' cites except encyclopedia
('citation' == config.CitationClass and (is_set (Periodical) or is_set (ScriptPeriodical)) and not is_set (Encyclopedia)) then
('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia)) then
local chap_param;
local chap_param;
if is_set (Chapter) then -- get a parameter name from one of these chapter related meta-parameters
if is_set (Chapter) then -- get a parameter name from one of these chapter related meta-parameters
Sətir 3.014: Sətir 2.909:
chap_param = A:ORIGIN ('ChapterURL')
chap_param = A:ORIGIN ('ChapterURL')
elseif is_set (ScriptChapter) then
elseif is_set (ScriptChapter) then
chap_param = ScriptChapterOrigin;
chap_param = A:ORIGIN ('ScriptChapter')
else is_set (ChapterFormat)
else is_set (ChapterFormat)
chap_param = A:ORIGIN ('ChapterFormat')
chap_param = A:ORIGIN ('ChapterFormat')
Sətir 3.035: Sətir 2.930:
end
end


Chapter = format_chapter_title (ScriptChapter, ScriptChapterOrigin, Chapter, TransChapter, ChapterURL, ChapterURLorigin, no_quotes, ChapterUrlAccess); -- Contribution is also in Chapter
Chapter = format_chapter_title (ScriptChapter, Chapter, TransChapter, ChapterURL, ChapterURLorigin, no_quotes, ChapterUrlAccess); -- Contribution is also in Chapter
if is_set (Chapter) then
if is_set (Chapter) then
Chapter = Chapter .. ChapterFormat ;
Chapter = Chapter .. ChapterFormat ;
Sətir 3.048: Sətir 2.943:


-- Format main title.
-- Format main title.
if is_set (ArchiveURL) and mw.ustring.match (mw.ustring.lower(Title), cfg.special_case_translation['archived_copy']) then -- if title is 'Archived copy' (place holder added by bots that can't find proper title)
add_maint_cat ('archived_copy'); -- add maintenance category before we modify the content of Title
end


if Title:match ('^%(%(.*%)%)$') then -- if keep as written markup:
if Title:match ('^%(%(.*%)%)$') then -- if keep as written markup:
Sətir 3.060: Sətir 2.958:
end
end
if in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'mailinglist', 'interview', 'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) or
if is_set(TitleLink) and is_set(Title) then
('citation' == config.CitationClass and (is_set (Periodical) or is_set (ScriptPeriodical)) and not is_set (Encyclopedia)) or
Title = make_wikilink (TitleLink, Title);
('map' == config.CitationClass and (is_set (Periodical) or is_set (ScriptPeriodical))) then -- special case for cite map when the map is in a periodical treat as an article
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
('map' == config.CitationClass and is_set (Periodical)) then -- special case for cite map when the map is in a periodical treat as an article
Title = kern_quotes (Title); -- if necessary, separate title's leading and trailing quote marks from Module provided quote marks
Title = kern_quotes (Title); -- if necessary, separate title's leading and trailing quote marks from Module provided quote marks
Title = wrap_style ('quoted-title', Title);
Title = wrap_style ('quoted-title', Title);
Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
Title = script_concatenate (Title, ScriptTitle); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
TransTitle= wrap_style ('trans-quoted-title', TransTitle );
TransTitle= wrap_style ('trans-quoted-title', TransTitle );
elseif 'report' == config.CitationClass then -- no styling for cite report
elseif 'report' == config.CitationClass then -- no styling for cite report
Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
Title = script_concatenate (Title, ScriptTitle); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
TransTitle= wrap_style ('trans-quoted-title', TransTitle ); -- for cite report, use this form for trans-title
TransTitle= wrap_style ('trans-quoted-title', TransTitle ); -- for cite report, use this form for trans-title
else
else
Title = wrap_style ('italic-title', Title);
Title = wrap_style ('italic-title', Title);
Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
Title = script_concatenate (Title, ScriptTitle); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
TransTitle = wrap_style ('trans-italic-title', TransTitle);
TransTitle = wrap_style ('trans-italic-title', TransTitle);
end
end
Sətir 3.084: Sətir 2.986:
end
end
end
end
 
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, UrlAccess) .. TransTitle .. TransError .. Format;
Title = external_link( URL, Title, URLorigin, UrlAccess ) .. TransTitle .. TransError .. Format;
URL = ''; -- unset these because no longer needed
URL = ''; -- unset these because no longer needed
Format = "";
Format = "";
elseif is_set (TitleLink) and not is_set (URL) then
local ws_url;
ws_url = wikisource_url_make (TitleLink); -- ignore ws_label return; not used here
if ws_url then
Title = external_link (ws_url, Title .. '&nbsp;', 'ws link in title-link'); -- space char after Title to move icon away from italic text; TODO: a better way to do this?
Title = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], TitleLink, Title});
Title = Title .. TransTitle .. TransError;
else
Title = make_wikilink (TitleLink, Title) .. TransTitle .. TransError;
end
else
else
local ws_url, ws_label;
Title = Title .. TransTitle .. TransError;
ws_url, ws_label, L = wikisource_url_make (Title); -- make ws url from |title= interwiki link; link portion L becomes tool tip label
if ws_url then
Title = Title:gsub ('%b[]', ws_label); -- replace interwiki link with ws_label to retain markup
Title = external_link (ws_url, Title .. '&nbsp;', 'ws link in title'); -- space char after Title to move icon away from italic text; TODO: a better way to do this?
Title = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, Title});
Title = Title .. TransTitle .. TransError;
else
Title = Title .. TransTitle .. TransError;
end
end
end
else
else
Sətir 3.196: Sətir 3.080:
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
if Edition:match ('%f[%a][Ee]d%.?$') or Edition:match ('%f[%a][Ee]dition$') then
add_maint_cat ('extra_text', 'edition');
end
Edition = " " .. wrap_msg ('edition', Edition);
Edition = " " .. wrap_msg ('edition', Edition);
else
else
Sətir 3.201: Sətir 3.088:
end
end


Series = is_set (Series) and wrap_msg ('series', {sepc, Series}) or ""; -- not the same as SeriesNum
Series = is_set(Series) and (sepc .. " " .. Series) or "";
OrigYear = is_set (OrigYear) and wrap_msg ('origyear', OrigYear) or '';
OrigYear = is_set(OrigYear) and (" [" .. OrigYear .. "]") or ""; -- TODO: presentation
Agency = is_set (Agency) and wrap_msg ('agency', {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);


------------------------------------ totally unrelated data
------------------------------------ totally unrelated data
Via = is_set (Via) and  wrap_msg ('via', Via) or '';
if is_set(Via) then
Via = " " .. wrap_msg ('via', Via);
end


--[[
--[[
Sətir 3.259: Sətir 3.150:
ArchiveDate = set_error('archive_missing_date');
ArchiveDate = set_error('archive_missing_date');
end
end
if "live" == UrlStatus then
if "no" == DeadURL then
local arch_text = cfg.messages['archived'];
local arch_text = cfg.messages['archived'];
if sepc ~= "." then arch_text = arch_text:lower() end
if sepc ~= "." then arch_text = arch_text:lower() end
Archived = sepc .. " " .. substitute( cfg.messages['archived-live'],
Archived = sepc .. " " .. substitute( cfg.messages['archived-not-dead'],
{ external_link( ArchiveURL, arch_text, A:ORIGIN('ArchiveURL'), nil ) .. 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');    
end
end
elseif is_set(OriginalURL) then -- UrlStatus is empty, 'dead', 'unfit', 'usurped', 'bot: unknown'
elseif is_set(OriginalURL) then -- DeadURL is empty, 'yes', 'true', 'y', 'unfit', 'usurped'
local arch_text = cfg.messages['archived-dead'];
local arch_text = cfg.messages['archived-dead'];
if sepc ~= "." then arch_text = arch_text:lower() end
if sepc ~= "." then arch_text = arch_text:lower() end
if in_array (UrlStatus, {'unfit', 'usurped', 'bot: unknown'}) then
if in_array (DeadURL, {'unfit', 'usurped', 'bot: unknown'}) then
Archived = sepc .. " " .. 'Archived from the original on ' .. ArchiveDate; -- format already styled
Archived = sepc .. " " .. 'Archived from the original on ' .. ArchiveDate; -- format already styled
else -- UrlStatus is empty, 'dead'
if 'bot: unknown' == DeadURL then
add_maint_cat ('bot:_unknown'); -- and add a category if not already added
else
add_maint_cat ('unfit'); -- and add a category if not already added
end
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, OriginalAccess ) .. OriginalFormat, ArchiveDate } ); -- format already styled
{ external_link( OriginalURL, cfg.messages['original'], OriginalURLorigin, OriginalAccess ) .. OriginalFormat, ArchiveDate } ); -- format already styled
Sətir 3.331: Sətir 3.227:
-- Several of the above rely upon detecting this as nil, so do it last.
-- Several of the above rely upon detecting this as nil, so do it last.
if (is_set (Periodical) or is_set (ScriptPeriodical) or is_set (TransPeriodical)) then
if is_set(Periodical) then
if is_set(Title) or is_set(TitleNote) then  
if is_set(Title) or is_set(TitleNote) then  
Periodical = sepc .. " " .. format_periodical (ScriptPeriodical, ScriptPeriodical_origin, Periodical, TransPeriodical);
Periodical = sepc .. " " .. wrap_style ('italic-title', Periodical)  
else  
else  
Periodical = format_periodical (ScriptPeriodical, ScriptPeriodical_origin, Periodical, TransPeriodical);
Periodical = wrap_style ('italic-title', Periodical)
end
end
end
end
Sətir 3.343: Sətir 3.239:
the annotation directly follows the |title= parameter value in the citation rather than the |event= parameter value (if provided).
the annotation directly follows the |title= parameter value in the citation rather than the |event= parameter value (if provided).
]]
]]
if "speech" == config.CitationClass then -- cite speech only
if "speech" == config.CitationClass then -- cite speech only
TitleNote = " (Speech)"; -- annotate the citation
TitleNote = " (Speech)"; -- annotate the citation
if is_set (Periodical) then -- if Periodical, perhaps because of an included |website= or |journal= parameter  
if is_set (Periodical) then -- if Periodical, perhaps because of an included |website= or |journal= parameter  
if is_set (Conference) then -- and if |event= is set
if is_set (Conference) then -- and if |event= is set
Conference = Conference .. sepc .. " "; -- then add appropriate punctuation to the end of the Conference variable before rendering
Conference = Conference .. sepc .. " "; -- then add appropriate punctuation to the end of the Conference variable before rendering
end
end
end
end
Sətir 3.380: Sətir 3.276:
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, Language, Edition, Publisher}, sepc );
tcommon = safe_join( {Title, TitleNote, TitleType, Series, Transcript, Language, Edition, Publisher}, sepc );


else -- all other CS1 templates
else -- all other CS1 templates
Sətir 3.393: Sətir 3.289:
end
end
local idcommon;
local idcommon = safe_join( { ID_list, URL, Archived, AccessDate, Via, SubscriptionRequired, Lay, Quote }, sepc );
if 'audio-visual' == config.CitationClass or 'episode' == config.CitationClass then -- special case for cite AV media & cite episode position transcript
idcommon = safe_join( { ID_list, URL, Archived, Transcript, AccessDate, Via, SubscriptionRequired, Lay, Quote }, sepc );
else
idcommon = safe_join( { ID_list, URL, Archived, AccessDate, Via, SubscriptionRequired, Lay, Quote }, sepc );
end
local text;
local text;
local pgtext = Position .. Sheet .. Sheets .. Page .. Pages .. At;
local pgtext = Position .. Sheet .. Sheets .. Page .. Pages .. At;
Sətir 3.413: Sətir 3.303:
end
end
end
end
end
end  
 
if is_set(Authors) then
if is_set(Authors) then
-- для рувики: конкатенация |coauthors к |authors (без остальной поддержки вроде убирания амперсанта и автоскрытия)
if is_set(Coauthors) then
Authors = Authors .. "; " .. Coauthors;
end
if (not is_set (Date)) then -- when date is set it's in parentheses; no Authors termination
if (not is_set (Date)) 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
Sətir 3.425: Sətir 3.321:
if (sepc ~= '.') then
if (sepc ~= '.') then
in_text = in_text:lower() -- lowercase for cs2
in_text = in_text:lower() -- lowercase for cs2
end
else
if EditorCount <= 1 then
post_text = ", " .. cfg.messages['editor'];
else
post_text = ", " .. cfg.messages['editors'];
end
end
end
end  
if EditorCount <= 1 then
post_text = " (" .. cfg.messages['editor'] .. ")"; -- be consistent with no-author, no-date case
else
post_text = " (" .. cfg.messages['editors'] .. ")";
end
Editors = terminate_name_list (in_text .. Editors .. post_text, sepc); -- terminate with 0 or 1 sepc and a space
Editors = terminate_name_list (in_text .. Editors .. post_text, sepc); -- terminate with 0 or 1 sepc and a space
end
end
Sətir 3.472: Sətir 3.369:
if is_set(PostScript) and PostScript ~= sepc then
if is_set(PostScript) and PostScript ~= sepc then
text = safe_join( {text, sepc}, sepc ); --Deals with italics, spaces, etc.
text = safe_join( {text, sepc}, sepc ); --Deals with italics, spaces, etc.
text = text:sub(1,-sepc:len()-1);
text = text:sub(1,-sepc:len()-1);
end
end
text = safe_join( {text, PostScript}, sepc );
text = safe_join( {text, PostScript}, sepc );
 
 
-- Now enclose the whole thing in a <cite/> element
-- Now enclose the whole thing in a <cite/> element
local options = {};
local options = {};
if is_set(config.CitationClass) and config.CitationClass ~= "citation" then
if is_set(config.CitationClass) and config.CitationClass ~= "citation" then
options.class = config.CitationClass;
options.class = config.CitationClass;
options.class = "citation " .. config.CitationClass; -- class=citation required for blue highlight when used with |ref=
options.class = "citation " .. config.CitationClass; -- class=citation required for blue highlight when used with |ref=
else
else
options.class = "citation";
options.class = "citation";
end
end
if is_set(Ref) and Ref:lower() ~= "none" then -- set reference anchor if appropriate
if is_set(Ref) and Ref:lower() ~= "none" then -- set reference anchor if appropriate
local id = Ref
local id = Ref
if ('harv' == Ref ) then
if ('harv' == Ref ) then
local namelist = {}; -- holds selected contributor, author, editor name list
local namelist = {}; -- holds selected contributor, author, editor name list
local year = first_set ({Year, anchor_year}, 2); -- Year first for legacy citations and for YMD dates that require disambiguation
local year = first_set ({Year, anchor_year}, 2); -- Year first for legacy citations and for YMD dates that require disambiguation
 
 
if #c > 0 then -- if there is a contributor list
if #c > 0 then -- if there is a contributor list
namelist = c; -- select it
namelist = c; -- select it
elseif #a > 0 then -- or an author list
elseif #a > 0 then -- or an author list
namelist = a;
namelist = a;
elseif #e > 0 then -- or an editor list
elseif #e > 0 then -- or an editor list
namelist = e;
namelist = e;
end
end
if #namelist > 0 then -- if there are names in namelist
if #namelist > 0 then -- if there are names in namelist
id = anchor_id (namelist, year); -- go make the CITEREF anchor
id = anchor_id (namelist, year); -- go make the CITEREF anchor
else
else
id = ''; -- unset
id = ''; -- unset
end
elseif Ref ~= '' and mw.ustring.sub(Ref, 0, 7) ~= 'CITEREF' then -- для рувики: иная генерация ref-якорей
if mw.ustring.match(id, '%d%d%d%d') then
id = 'CITEREF' .. id
else
local yearForRef = nil
if year and mw.ustring.match(year, '^%d%d%d%d$') then
yearForRef = mw.ustring.match(year, '^%d%d%d%d$')
elseif Date and mw.ustring.match(Date, '%d%d%d%d') then
yearForRef = mw.ustring.match(Date, '%d%d%d%d')
end
if yearForRef then
id = 'CITEREF' .. id .. yearForRef
else
id = '' -- TODO: для рувики: выдавать ошибку?
end
end
end
end
end
Sətir 3.524: Sətir 3.437:
end
end


table.insert (render, substitute (cfg.presentation['ocins'], {OCinSoutput})); -- append metadata to the citation
table.insert (render, substitute (cfg.presentation['ocins'], {OCinSoutput})); -- append metadata to the citation


if 0 ~= #z.message_tail then
if #z.message_tail ~= 0 then
table.insert (render, ' ');
table.insert (render, ' ');
for i,v in ipairs( z.message_tail ) do
for i,v in ipairs( z.message_tail ) do
Sətir 3.539: Sətir 3.452:
end
end


if 0 ~= #z.maintenance_cats then
if #z.maintenance_cats ~= 0 then
local maint_msgs = {}; -- here we collect all of the maint messages
table.insert (render, '<span class="citation-comment" style="display:none; color:#33aa33; margin-left:0.3em">');
for _, v in ipairs( z.maintenance_cats ) do -- append maintenance categories
for _, v in ipairs( z.maintenance_cats ) do -- append maintenance categories
local maint = {}; -- here we assemble a maintenence message
table.insert (render, v);
table.insert (maint, v); -- maint msg is the category name
table.insert (render, ' (');
table.insert (maint, ' ('); -- open the link text
table.insert (render, make_wikilink (':Category:' .. v, 'link'));
table.insert (maint, make_wikilink (':Category:' .. v, 'link')); -- add the link
table.insert (render, ') ');
table.insert (maint, ')'); -- and close it
table.insert (maint_msgs, table.concat (maint)); -- assemble new maint message and add it to the maint_msgs table
end
end
table.insert (render, substitute (cfg.presentation['hidden-maint'], table.concat (maint_msgs, ' '))); -- wrap the group of maint message with proper presentation and save
table.insert (render, '</span>');
end
end
Sətir 3.584: Sətir 3.495:
local state;
local state;
if in_array (cite_class, {'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) then -- limited parameter sets allowed for these templates
if in_array (cite_class, {'arxiv', 'biorxiv', 'citeseerx'}) then -- limited parameter sets allowed for these templates
state = whitelist.limited_basic_arguments[name];
state = whitelist.limited_basic_arguments[name];
if true == state then return true; end -- valid actively supported parameter
if true == state then return true; end -- valid actively supported parameter
Sətir 3.646: Sətir 3.557:
]]
]]


local function missing_pipe_check (parameter, value)
local function missing_pipe_check (value)
local capture;
local capture;
value = value:gsub ('%b<>', ''); -- remove xml/html tags because attributes: class=, title=, etc  
value = value:gsub ('%b<>', ''); -- remove xml/html tags because attributes: class=, title=, etc  


capture = value:match ('%s+(%a[%w%-]+)%s*=') or value:match ('^(%a[%w%-]+)%s*='); -- find and categorize parameters with possible missing pipes
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
if capture and validate (capture) then -- if the capture is a valid parameter name
table.insert( z.message_tail, {set_error ('missing_pipe',parameter)});
add_maint_cat ('missing_pipe');
end
end
end
end




--[[--------------------------< H A S _ E X T R A N E O U S _ P U N C T >--------------------------------------
--[[--------------------------< C S 1 . C I T A T I O N >------------------------------------------------------
 
look for extraneous terminal punctuation in most parameter values; parameters listed in skip table are not checked
 
]]
 
local function has_extraneous_punc (param, value)
if cfg.punct_skip[param] then
return; -- parameter name found in the skip table so done
end
end
 
 
--[[--------------------------< C I T A T I O N >--------------------------------------------------------------


This is used by templates such as {{cite book}} to create the actual citation text.
This is used by templates such as {{cite book}} to create the actual citation text.
Sətir 3.676: Sətir 3.574:
]]
]]


local function citation(frame)
function cs1.citation(frame)
Frame = frame; -- save a copy incase we need to display an error message in preview mode
Frame = frame; -- save a copy incase we need to display an error message in preview mode
local pframe = frame:getParent()
local pframe = frame:getParent()
Sətir 3.718: Sətir 3.616:
set_error = utilities.set_error;
set_error = utilities.set_error;
select_one = utilities.select_one;
select_one = utilities.select_one;
add_maint_cat = utilities.add_maint_cat;
add_maint_cat = function () end; -- для рувики: вместо utilities.add_maint_cat;
wrap_style = utilities.wrap_style;
wrap_style = utilities.wrap_style;
safe_for_italics = utilities.safe_for_italics;
safe_for_italics = utilities.safe_for_italics;
is_wikilink = utilities.is_wikilink;
is_wikilink = utilities.is_wikilink;
make_wikilink = utilities.make_wikilink;
make_wikilink = utilities.make_wikilink;
strip_apostrophe_markup = utilities.strip_apostrophe_markup;


z = utilities.z; -- table of error and category tables in Module:Citation/CS1/Utilities
z = utilities.z; -- table of error and category tables in Module:Citation/CS1/Utilities
Sətir 3.793: Sətir 3.690:
end
end
end
end
missing_pipe_check (k, v); -- do we think that there is a parameter that is missing a pipe?
missing_pipe_check (v); -- do we think that there is a parameter that is missing a pipe?
-- TODO: is this the best place for this translation?
-- TODO: is this the best place for this translation?
args[k] = v;
args[k] = v;
Sətir 3.804: Sətir 3.701:
if 'string' == type (k) then -- don't evaluate positional parameters
if 'string' == type (k) then -- don't evaluate positional parameters
has_invisible_chars (k, v);
has_invisible_chars (k, v);
has_extraneous_punc (k, v); -- look for extraneous terminal punctuation in parameter values
end
end
end
end
Sətir 3.810: Sətir 3.706:
end
end


--[[--------------------------< E X P O R T E D  F U N C T I O N S >------------------------------------------
return cs1;
]]
 
return {citation = citation};