మాడ్యూల్:Citation/CS1: కూర్పుల మధ్య తేడాలు

Content deleted Content added
చి en:Module:Citation/CS1 నుండి కూర్పును దిగుమతి చేసాం
Reverted to revision 2865244 by Arjunaraoc: reverting to old working version for avoiding date error. (TW)
ట్యాగు: రద్దుచెయ్యి
పంక్తి 70:
if not added_prop_cats [key] then
added_prop_cats [key] = true; -- note that we've added this category
key = key:gsub ('(foreign_lang_source_?2?)%a%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
end
పంక్తి 534:
local lang=''; -- initialize to empty string
local name;
if script_value:match('^%l%l%l?%s*:') then -- if first 3 or 4 non-space characters are script language prefix
lang = script_value:match('^(%l%l%l?)%s*:%s*%S.*'); -- get the language prefix or nil if there is no script
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
పంక్తి 541:
end
-- if we get this far we have prefix and script
name = cfg.lang_code_remap[lang] or mw.language.fetchLanguageName( lang, cfg.this_wiki_code"en" ); -- get language name so that we can use it to categorize
if is_set (name) then -- is prefix a proper ISO 639-1 language code?
script_value = script_value:gsub ('^%l+%l%s*:%s*', ''); -- strip prefix from script
-- is prefix one of these language codes?
if in_array (lang, cfg.script_lang_codes) then
పంక్తి 614:
local wl_type, D, L;
local ws_url, ws_label;
local wikisource_prefix = table.concat ({'https://', cfg.this_wiki_code, '.wikisource.org/wiki/'});
 
wl_type, D, L = is_wikilink (str); -- wl_type is 0 (not a wikilink), 1 (simple wikilink), 2 (complex wikilink)
Line 622 ⟶ 621:
if is_set (str) then
ws_url = table.concat ({ -- build a wikisource url
wikisource_prefix'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
wikisource_prefix'https://en.wikisource.org/wiki/', -- prefix
str, -- article title
});
Line 641 ⟶ 640:
ws_label = D; -- get ws article name from display portion of interwiki link
ws_url = table.concat ({ -- build a wikisource url
wikisource_prefix'https://en.wikisource.org/wiki/', -- prefix
str, -- article title without namespace from link portion of wikilink
});
Line 649 ⟶ 648:
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 fragment markeranchor
end
 
Line 658 ⟶ 657:
--[[--------------------------< F O R M A T _ P E R I O D I C A L >--------------------------------------------
 
Format the threefour periodical parameters: |script-<periodical>=, |<periodical>=, and |trans-<periodical>= into a single Periodical meta-
parameter.
 
Line 678 ⟶ 677:
if is_set (periodical) then
periodical = periodical .. ' ' .. trans_periodical;
else -- here when trans-periodicaltranschapter without periodicalchapter or script-periodicalchapter
periodical = trans_periodical;
periodical_error = ' ' .. set_error ('trans_missing_title', {'periodical'});
Line 731 ⟶ 730:
end
end
 
-- if is_set (chapterurl) then
-- chapter = external_link (chapterurl, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate
-- end
 
return chapter .. chapter_error;
Line 837 ⟶ 840:
-- Empty strings, not nil;
if v == nil then
-- v = cfg.defaults[k] or '';
v = '';
origin[k] = '';
end
Line 883 ⟶ 885:
local function set_titletype (cite_class, title_type)
if is_set(title_type) then
if "none" == title_type then
 
if cfg.keywords_xlate[title_type] == 'none' then
title_type = ""; -- if |type=none then type parameter not displayed
end
Line 921 ⟶ 922:
str = str:gsub ('&[nm]dash;', {['&ndash;'] = '–', ['&mdash;'] = '—'}); -- replace &mdash; and &ndash; entities with their characters; semicolon mucks up the text.split
str = str:gsub ('&#45;', '-'); -- replace html numeric entity with hyphen character
str = str:gsub ('&nbsp;', ' '); -- replace &nbsp; entity with generic keyboard space character
local out = {};
Line 929 ⟶ 928:
for _, item in ipairs (list) do -- for each item in the list
if mw.ustring.match (item, '^%w*[%.%-]?%w+%s*[%-–—]%s*%w*[%.%-]?%w+$') then -- if a hyphenated range or has endash or emdash separators
if item:match ('^%a+[%.%-]?%d+%s*%-%s*%a+[%.%-]?%d+$') or -- letterdigit hyphen letterdigit (optional separator between letter and digit)
item:match ('^%d+[%.%-]?%a+%s*%-%s*%d+[%.%-]?%a+$') or -- digitletter hyphen digitletter (optional separator between digit and letter)
item:match ('^%d+[%.%-]%d+%s*%-%s*%d+[%.%-]%d+$') or -- digit separator digit hyphen digit separator digit
item:match ('^%d+%s*%-%s*%d+$') or -- digit hyphen digit
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
else
Line 1,079 ⟶ 1,078:
if is_set (suffix) then
if not is_suffix (suffix) then
add_vanc_error (cfg.err_msg_supl.'suffix');
return false; -- not a name with an appropriate suffix
end
Line 1,085 ⟶ 1,084:
if nil == mw.ustring.find (last, "^[A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143%-%s%']*$") or
nil == mw.ustring.find (first, "^[A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143%-%s%'%.]*$") then
add_vanc_error (cfg.err_msg_supl['non-Latin character']);
return false; -- not a string of latin characters; Vancouver requires Romanization
end;
Line 1,118 ⟶ 1,117:
return first; -- one or two initials and a valid suffix so nothing to do
else
add_vanc_error (cfg.err_msg_supl.'suffix'); -- one or two initials with invalid suffix so error message
return first; -- and return first unmolested
end
Line 1,126 ⟶ 1,125:
end
end -- if here then name has 3 or more uppercase letters so treat them as a word
 
 
local initials, names = {}, {}; -- tables to hold name parts and initials
పంక్తి 1,167:
sep = cfg.presentation['sep_nl_vanc']; -- name-list separator between authors is a comma
namesep = cfg.presentation['sep_name_vanc']; -- last/first separator is a space
lastauthoramp = nil; -- unset because isn't used by Vancouver style
else
sep = cfg.presentation['sep_nl']; -- name-list separator between authors is a semicolon
Line 1,203 ⟶ 1,202:
end
one = one .. namesep .. first;
end
if is_set(person.link) and person.link ~= control.page_name then
one = make_wikilink (person.link, one); -- link author/editor if this page is not the author's/editor's page
end
end
table.insert( text, one )
if is_set (person.link) then
table.insert( text, sep_one )
one = make_wikilink (person.link, one); -- link author/editor
end
table.insert (text, one)
table.insert (text, sep_one)
end
end
Line 1,237 ⟶ 1,236:
 
]]
 
local function anchor_id (namelist, year)
local names={}; -- a table for the one to four names and year
Line 1,281 ⟶ 1,279:
 
return name, etal; --
end
 
 
--[[--------------------------< N A M E _ I S _ N U M E R I C >------------------------------------------------
 
Add maint cat when name parameter value does not contain letters. Does not catch mixed alphanumeric names so
|last=A. Green (1922-1987) does not get caught in the current version of this test but |first=(1888) is caught.
 
returns nothing
 
]]
 
local function name_is_numeric (name, list_name)
if is_set (name) then
if mw.ustring.match (name, '^[%A]+$') then -- when name does not contain any letters
add_maint_cat ('numeric_names', cfg.special_case_translation [list_name]); -- add a maint cat for this template
end
end
end
 
Line 1,307 ⟶ 1,287:
These annotation do not belong in author parameters and are redundant in editor parameters. If found, the function
adds the editor markup maintenance category.
 
returns nothing
 
]]
 
local function name_has_ed_markup (name, list_name)
local _, pattern;
local patterns = cfg.editor_markup_patterns; -- get patterns from configuration
 
Line 1,323 ⟶ 1,302:
end
end
return name; -- and done
end
 
Line 1,331 ⟶ 1,311:
indicated if there is more than one comma and or semicolon. If found, the function adds the multiple name
(author or editor) maintenance category.
 
returns nothing
 
]]
 
local function name_has_mult_names (name, list_name)
local _count, count_;
if is_set (name) then
_, count = name:gsub ('[;,]', ''); -- count the number of separator-like characters
Line 1,345 ⟶ 1,323:
end
end
return name; -- and done
end
 
 
--[[--------------------------< N A M E _ C H E C K S >--------------------------------------------------------
 
This function calls various name checking functions used to validate the content of the various name-holding
parameters.
Line 1,360 ⟶ 1,338:
last = last:match ('^%(%((.*)%)%)$'); -- strip parens
else
last = name_has_mult_names (last, list_name); -- check for multiple names in the parameter (last only)
last = name_has_ed_markup (last, list_name); -- check for extraneous 'editor' annotation
name_is_numeric (last, list_name); -- check for names that are compsed of digits and punctuation
end
end
Line 1,369 ⟶ 1,346:
first = first:match ('^%(%((.*)%)%)$'); -- strip parens
else
first = name_has_ed_markup (first, list_name); -- check for extraneous 'editor' annotation
name_is_numeric (first, list_name); -- check for names that are compsed of digits and punctuation
end
end
Line 1,404 ⟶ 1,380:
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, link_alias; -- selected parameter aliases used in error messaging
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
first, first_alias = select_one( args, cfg.aliases[list_name .. '-First'], 'redundant_parameters', i );
link, link_alias = select_one( args, cfg.aliases[list_name .. '-Link'], 'redundant_parameters', i );
mask = select_one( args, cfg.aliases[list_name .. '-Mask'], 'redundant_parameters', i );
 
Line 1,423 ⟶ 1,399:
end
else -- we have last with or without a first
link_title_ok (link, link_aliaslist_name:match ("(%w+)List"):lower() .. '-link' .. i, last, last_aliaslist_name:match ("(%w+)List"):lower() .. '-last' .. i); -- check for improper wikimarkup
if first then
link_title_ok (link, link_alias, first, first_alias); -- check for improper wikimarkup
end
 
names[n] = {last = last, first = first, link = link, mask = mask, corporate=false}; -- add this name to our names list (corporate for |vauthors= only)
Line 1,505 ⟶ 1,478:
 
Languages that are the same as the local wiki are not categorized. MediaWiki does not recognize three-character
equivalents of two-character codes: code 'ar' is recognized butbit code 'ara' is not.
 
This function supports multiple languages in the form |language=nb, French, th where the language names or codes are
separated from each other by commas with optional space characters.
 
]]
Line 1,518 ⟶ 1,491:
local names_table = {}; -- table made from the value assigned to |language=
 
local this_wiki_namethis_wiki = mw.language.fetchLanguageNamegetContentLanguage(cfg.this_wiki_code, cfg.this_wiki_code); -- get this wiki'sa language nameobject for this wiki
local this_wiki_code = this_wiki:getCode() -- get this wiki's language code
local this_wiki_name = mw.language.fetchLanguageName(this_wiki_code, this_wiki_code); -- get this wiki's language name
 
names_table = mw.text.split (lang, '%s*,%s*'); -- names should be a comma separated list
Line 1,526 ⟶ 1,501:
 
if name then -- there was a remapped code so
iflang not= lang:matchgsub ('^(%a%a%a?)%-x%-.*', '%a+$1') then; -- ifstrip notietf atags private ietffrom tagcode
lang = lang:gsub ('^(%a%a%a?)%-.*', '%1'); -- strip ietf tags from code
end
else
lang =if lang:gsubmatch ('^(%a%a%a?)%-.*', '%1'); then -- strip any ietf-like 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?
end
if 2 == lang:len() or 3 == lang:len() then -- if two-or three-character code
name = mw.language.fetchLanguageName (lang:lower(), cfg.this_wiki_code); -- get language name if |language= is a proper code
end
end
Line 1,539 ⟶ 1,514:
code = lang:lower(); -- save it
else
name, code = get_iso639_code (lang, cfg.this_wiki_code); -- attempt to get code from name (assign name here so that we are sure of proper capitalization)
end
Line 1,545 ⟶ 1,520:
name = cfg.lang_code_remap[code] or name; -- override wikimedia when they misuse language codes/names
 
if cfg.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; code appended to allow for multiple language categorization
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
elseif cfg.local_lang_cat_enable then -- when the language and this wiki's language are the same and categorization is enabled
add_prop_cat ('local_lang_source', {name, code}); -- categorize it
end
else
Line 1,566 ⟶ 1,539:
name = table.concat (language_list, cfg.messages['parameter-pair-separator']) -- insert '<space>and<space>' between two language names
elseif 2 < code then
name = table.concat (language_list, cfg.messages['parameter-separator'], 1, code-1'); -- and concatenate allwith but'<comma><space>' lastseparators
name = table.concatname:gsub ({name', language_list([code^,]}+)$', cfg.messages['parameter-final-separator'] .. '%1'); -- concatenatereplace last '<comma><space>' separator with final'<comma><space>and<space>' separator
end
if this_wiki_name == name then
Line 1,589 ⟶ 1,562:
 
local function set_cs1_style (ps)
if not is_set (ps) then -- unless explicitlyexplicitely set to something
ps = cfg.presentation['ps_cs1']; -- terminate the rendered citation
end
Line 1,651 ⟶ 1,624:
sep, ps, ref = get_settings_from_cite_class (ps, ref, cite_class); -- get settings based on the template's CitationClass
end
if 'none' == ps:lower() then -- if assigned value is 'none' then
 
if cfg.keywords_xlate[ps:lower()] == 'none' then -- if assigned value is 'none' then
ps = ''; -- set to empty string
end
Line 1,841 ⟶ 1,813:
elseif string.find(v_name, "%s") then
if v_name:find('[;%.]') then -- look for commonly occurring punctuation characters;
add_vanc_error (cfg.err_msg_supl.'punctuation');
end
local lastfirstTable = {}
Line 1,852 ⟶ 1,824:
last = table.concat(lastfirstTable, " ") -- returns a string that is the concatenation of all other names that are not initials
if mw.ustring.match (last, '%a+%s+%u+%s+%a+') then
add_vanc_error (cfg.err_msg_supl['missing comma']); -- matches last II last; the case when a comma is missing
end
if mw.ustring.match (v_name, ' %u %u$') then -- this test is in the wrong place TODO: move or replace with a more appropriate test
add_vanc_error (cfg.err_msg_supl.'name'); -- matches a space between two intiials
end
else
Line 1,864 ⟶ 1,836:
if is_set (first) then
if not mw.ustring.match (first, "^%u?%u$") then -- first shall contain one or two upper-case letters, nothing else
add_vanc_error (cfg.err_msg_supl.'initials'); -- too many initials; mixed case initials (which may be ok Romanization); hyphenated initials
end
is_good_vanc_name (last, first); -- check first and last before restoring the suffix which may have a non-Latin digit
Line 1,904 ⟶ 1,876:
 
local function select_author_editor_source (vxxxxors, xxxxors, args, list_name)
local lastfirst = false;
if select_one( args, cfg.aliases[list_name .. '-Last'], 'none', 1 ) or -- do this twice incase we have a |first1= without a |last1=; this ...
select_one( args, cfg.aliases[list_name .. '-First'], 'none', 1 ) or -- ... also catches the case where |first= is used with |vauthors=
Line 1,935 ⟶ 1,907:
 
This function is used to validate a parameter's assigned value for those parameters that have only a limited number
of allowable values (yes, y, true, live, deadno, etc). When the parameter value has not been assigned a value (missing or empty
or empty in the source template) the function returns the value specified by ret_valtrue. If the parameter value is one of the list of allowed values returns
of the list of allowed values returns the translated valuetrue; else, emits an error message and returns the valuefalse.
specified by ret_val.
 
]]
 
local function is_valid_parameter_value (value, name, possible, ret_val)
if not is_set (value) then
return ret_valtrue; -- an empty parameter is ok
elseif in_array (value, possible) then
return true;
return cfg.keywords_xlate[value]; -- return translation of parameter keyword
else
table.insert( z.message_tail, { set_error( 'invalid_param_val', {name, value}, true ) } ); -- not an allowed value so add error message
return ret_val;false
end
end
Line 1,994 ⟶ 1,965:
return wrap_msg ('issue', {sepc, issue}, lower);
end
end
 
if 'podcast' == cite_class and is_set (issue) then
return wrap_msg ('issue', {sepc, issue}, lower);
end
 
Line 2,126 ⟶ 2,093:
return page, pages, at, coins_pages;
end
 
 
 
Line 2,170 ⟶ 2,138:
 
if url:match('//web%.archive%.org/save/') then -- if a save command url, we don't want to allow saving of the target page
err_msg = cfg.err_msg_supl.'save command';
url = url:gsub ('(//web%.archive%.org)/save/', '%1/*/', 1); -- for preview mode: modify ArchiveURL
elseif url:match('//liveweb%.archive%.org/') then
err_msg = cfg.err_msg_supl.'liveweb';
else
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
err_msg = cfg.err_msg_supl.'timestamp';
if '*' ~= flag then
url=url:gsub ('(//web%.archive%.org/[^%d]*%d?%d?%d?%d?%d?%d?)[^/]*', '%1*', 1) -- for preview, modify ts to be yearmo* max (0-6 digits plus splat)
end
elseif is_set(path) and 'web/' ~= path then -- older archive urls do not have the extra 'web/' path element
err_msg = cfg.err_msg_supl.'path';
elseif is_set (flag) and not is_set (path) then -- flag not allowed with the old form url (without the 'web/' path element)
err_msg = cfg.err_msg_supl.'flag';
elseif is_set (flag) and not flag:match ('%a%a_') then -- flag if present must be two alpha characters and underscore (requires 'web/' path element)
err_msg = cfg.err_msg_supl.'flag';
else
return url, date; -- return ArchiveURLarchiveURL and ArchiveDate
end
end
Line 2,195 ⟶ 2,163:
table.insert( z.message_tail, { set_error( 'archive_url', {err_msg}, true ) } ); -- add error message and
if is_set (Frame:preprocess('{{REVISIONID}}')) then
return '', ''; -- return empty strings for ArchiveURLarchiveURL and ArchiveDate
else
return url, date; -- preview mode so return ArchiveURLarchiveURL and ArchiveDate
end
end
 
 
--[[--------------------------< P L A C E _ C H E C K >--------------------------------------------------------
 
check |place=, |publication-place=, |location= to see if these params include digits. This function added because
many editors mis-use location to specify the in-source location (|page(s)= and |at= are supposed to do that)
 
returns the original parameter value without modification; added maint cat when parameter value contains digits
 
]]
 
local function place_check (param_val)
if not is_set (param_val) then -- parameter empty or omitted
return param_val; -- return that empty state
end
if mw.ustring.find (param_val, '%d') then -- not empty, are there digits in the parameter value
add_maint_cat ('location'); -- yep, add maint cat
end
return param_val; -- and done
end
 
Line 2,241 ⟶ 2,187:
-- define different field names for the same underlying things.
 
-- set default parameter values defined by |mode= parameter.
local Mode = is_valid_parameter_value (A['Mode'], A:ORIGIN('Mode'), cfg.keywords_lists['mode'], '');
local Mode = A['Mode'];
if not is_valid_parameter_value (Mode, 'mode', cfg.keywords['mode']) then
Mode = '';
end
 
local author_etal;
local a = {}; -- authors list from |lastn= / |firstn= pairs or |vauthors=
local Authors;
local NameListFormat = A['NameListFormat'];
 
local NameListFormat = is_valid_parameter_value (A['NameListFormat'], A:ORIGIN('NameListFormat'), cfg.keywords_lists['name-list-format'], '');
local Collaboration = A['Collaboration'];
 
Line 2,300 ⟶ 2,249:
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs
local Contributors; -- assembled contributors name list
local Contribution = A['Contribution']; -- TODO: move to after chapter use if A:ORIGIN ('Chapter') ... to set Contribution; this to remove duplicate in aliases list
if in_array(config.CitationClass, {"book","citation"}) and not is_set(A['Periodical']) then -- |contributor= and |contribution= only supported in book cites
c = extract_names (args, 'ContributorList'); -- fetch contributor list from |contributorn= / |contributor-lastn=, -firstn=, -linkn=, -maskn=
Line 2,319 ⟶ 2,268:
end
Contribution = nil; -- unset
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'
NameListFormat = ''; -- anything else, set to empty string
end
 
Line 2,342 ⟶ 2,295:
link_title_ok (TitleLink, A:ORIGIN ('TitleLink'), Title, 'title'); -- check for wikimarkup in |title-link= or wikimarkup in |title= when |title-link= is set
 
local Chapter = A['Chapter'];
local Chapter = A['Chapter']; -- TODO: insert test, assignment, and then unset Chapter when |section= in cite map; test is at c. line 3220
local ScriptChapter = A['ScriptChapter'];
local ScriptChapterOrigin = A:ORIGIN ('ScriptChapter');
Line 2,357 ⟶ 2,310:
ArchiveURL, ArchiveDate = archive_url_check (A['ArchiveURL'], A['ArchiveDate'])
local UrlStatus = is_valid_parameter_value (A['UrlStatus'], A:ORIGIN('UrlStatus'), cfg.keywords_lists['url-status'], '');
if 'url-status' == A:ORIGIN ('UrlStatus') then -- interim: TODO: this line goes away
 
if not is_valid_parameter_value (UrlStatus, 'url-status', cfg.keywords ['url-status']) then -- set in config.defaults to 'dead'
 
UrlStatus = ''; -- anything else, set to empty string
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 URLorigin = A:ORIGIN('URL'); -- get name of parameter that holds URL
Line 2,367 ⟶ 2,334:
local ConferenceURL = A['ConferenceURL'];
local ConferenceURLorigin = A:ORIGIN('ConferenceURL'); -- get name of parameter that holds ConferenceURL
local Periodical = A['Periodical'];
 
-- TODO: mailinglist should be removed from Periodical alias list; Periodical should be assigned value from |mailinglist= here wh
local Periodical = A['Periodical']; -- cite mailinglist or citation and |mailinglist=; error check for duplicate work params (Periodical already set)
local Periodical_origin = '';
if is_set (Periodical) then
Line 2,379 ⟶ 2,344:
end
end
 
-- TODO: mailinglist assignment here? iff Periodical not set; err msg else; see TODO c. line 2607
local ScriptPeriodical = A['ScriptPeriodical'];
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?
if not (is_set (Periodical) or is_set (ScriptPeriodical)) then -- 'periodical' templates require periodical parameter
-- local p = {['journal'] = 'journal', ['magazine'] = 'magazine', ['news'] = 'newspaper', ['web'] = 'website'}; -- for error message
local p = {['journal'] = 'journal', ['magazine'] = 'magazine'}; -- for error message
if p[config.CitationClass] then
table.insert( z.message_tail, {set_error ('missing_periodical', {config.CitationClass, p[config.CitationClass]}, true)});
Line 2,437 ⟶ 2,400:
 
local Edition = A['Edition'];
local PublicationPlace = place_check (A['PublicationPlace'], A:ORIGIN('PublicationPlace'));
local Place = place_check (A['Place'], A:ORIGIN('Place'));
local PublisherName = A['PublisherName'];
Line 2,451 ⟶ 2,414:
end
 
local RegistrationRequired = A['RegistrationRequired'];
local Newsgroup = A['Newsgroup']; -- TODO: strip apostrophe markup?
if not is_valid_parameter_value (RegistrationRequired, 'registration', cfg.keywords ['yes_true_y']) then
local Newsgroup_origin = A:ORIGIN('Newsgroup');
RegistrationRequired=nil;
end
 
local SubscriptionRequired = A['SubscriptionRequired'];
if 'newsgroup' == config.CitationClass then
if not is_valid_parameter_value (SubscriptionRequired, 'subscription', cfg.keywords ['yes_true_y']) then
if is_set (PublisherName) then -- general use parmeter |publisher= not allowed in cite newsgroup
SubscriptionRequired=nil;
local error_text = set_error ('parameter_ignored', {PublisherName_origin}, true);
if is_set (error_text) then
table.insert( z.message_tail, {error_text, error_state} );
end
end
 
local UrlAccess = A['UrlAccess'];
PublisherName = nil; -- ensure that this parameter is unset for the time being; will be used again after COinS
if not is_valid_parameter_value (UrlAccess, 'url-access', cfg.keywords ['url-access']) then
end
UrlAccess = nil;
 
end
local UrlAccess = is_valid_parameter_value (A['UrlAccess'], A:ORIGIN('UrlAccess'), cfg.keywords_lists['url-access'], nil);
if not is_set(URL) and is_set(UrlAccess) then
UrlAccess = nil;
Line 2,471 ⟶ 2,433:
end
if is_set (UrlAccess) and is_set (SubscriptionRequired) then -- while not aliases, these are much the same so if both are set
local ChapterUrlAccess = is_valid_parameter_value (A['ChapterUrlAccess'], A:ORIGIN('ChapterUrlAccess'), cfg.keywords_lists['url-access'], nil);
table.insert( z.message_tail, { set_error( 'redundant_parameters', {wrap_style ('parameter', 'url-access') .. ' and ' .. wrap_style ('parameter', 'subscription')}, true ) } ); -- add error message
SubscriptionRequired = nil; -- unset; prefer |access= over |subscription=
end
if is_set (UrlAccess) and is_set (RegistrationRequired) then -- these are not the same but contradictory so if both are set
table.insert( z.message_tail, { set_error( 'redundant_parameters', {wrap_style ('parameter', 'url-access') .. ' and ' .. wrap_style ('parameter', 'registration')}, true ) } ); -- add error message
RegistrationRequired = nil; -- unset; prefer |access= over |registration=
end
 
local ChapterUrlAccess = A['ChapterUrlAccess'];
if not is_valid_parameter_value (ChapterUrlAccess, A:ORIGIN('ChapterUrlAccess'), cfg.keywords ['url-access']) then -- same as url-access
ChapterUrlAccess = nil;
end
if not is_set(ChapterURL) and is_set(ChapterUrlAccess) then
ChapterUrlAccess = nil;
Line 2,477 ⟶ 2,451:
end
 
local MapUrlAccess = is_valid_parameter_value (A['MapUrlAccess'], A:ORIGIN('MapUrlAccess'), cfg.keywords_lists['url-access'], nil);
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;
Line 2,493 ⟶ 2,470:
local ID = A['ID'];
local ASINTLD = A['ASINTLD'];
local IgnoreISBN = is_valid_parameter_value (A['IgnoreISBN'], A:ORIGIN('IgnoreISBN'), cfg.keywords_lists['yes_true_y'], nil);
if not is_valid_parameter_value (IgnoreISBN, 'ignore-isbn-error', cfg.keywords ['yes_true_y']) then
IgnoreISBN = nil; -- anything else, set to empty string
end
local Embargo = A['Embargo'];
local Class = A['Class']; -- arxiv class identifier
Line 2,513 ⟶ 2,493:
local TranscriptURLorigin = A:ORIGIN('TranscriptURL'); -- get name of parameter that holds TranscriptURL
 
local LastAuthorAmp = is_valid_parameter_value (A['LastAuthorAmp'], A:ORIGIN('LastAuthorAmp'), cfg.keywords_lists['yes_true_y'], nil);
if not is_valid_parameter_value (LastAuthorAmp, 'last-author-amp', cfg.keywords ['yes_true_y']) then
LastAuthorAmp = nil; -- set to empty string
end
 
local no_tracking_cats = is_valid_parameter_value (A['NoTracking'], A:ORIGIN('NoTracking'), cfg.keywords_lists['yes_true_y'], nil);
if not is_valid_parameter_value (no_tracking_cats, 'no-tracking', cfg.keywords ['yes_true_y']) then
no_tracking_cats = nil; -- set to empty string
end
 
--local variables that are not cs1 parameters
Line 2,523 ⟶ 2,509:
local COinS_date = {}; -- holds date info extracted from |date= for the COinS metadata by Module:Date verification
 
local DF = A['DF']; -- date format set in cs1|2 template
local DF = is_valid_parameter_value (A['DF'], A:ORIGIN('DF'), cfg.keywords_lists['df'], '');
if not is_valid_parameter_value (DF, 'df', cfg.keywords['date-format']) then -- validate reformatting keyword
DF = ''; -- not valid, set to empty string
end
if not is_set (DF) then
DF = cfg.global_df;
DF = cfg.global_df; -- local df if present overrides global df set by {{use xxx date}} template
end
 
local sepc; -- separator between citation elements for CS1 a period, for CS2, a comma
local PostScript;
local Ref = A['Ref'];
sepc, PostScript, Ref = set_style (Mode:lower(), A['PostScript'], A['Ref'], config.CitationClass);
if 'harv' == Ref then
add_maint_cat ('ref_harv'); -- add maint cat to identify templates that have this now-extraneous param value
elseif not is_set (Ref) then
Ref = 'harv'; -- set as default when not set externally
end
sepc, PostScript, Ref = set_style (Mode:lower(), A['PostScript'], Ref, config.CitationClass);
use_lowercase = ( sepc == ',' ); -- used to control capitalization for certain static text
 
Line 2,552 ⟶ 2,535:
end
end
 
-- 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', 'pp', 'pages', '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;
Line 2,559 ⟶ 2,543:
Page, Pages, At, coins_pages = insource_loc_get (Page, Pages, At);
 
local NoPP = is_valid_parameter_value (A['NoPP'], A:ORIGIN('NoPP'), cfg.keywords_lists['yes_true_y'], nil);
if is_set (NoPP) and is_valid_parameter_value (NoPP, 'nopp', cfg.keywords ['yes_true_y']) then
NoPP = true;
else
NoPP = nil; -- unset, used as a flag later
end
 
if not is_set (PublicationPlace) and is_set (Place) then -- both |publication-place= and |place= (|location=) allowed if different
add_prop_cat ('location test'); -- add property cat to evaluate how often PublicationPlace and Place are used together
if PublicationPlace == Place then
Place = ''; -- unset; don't need both if they are the same
end
elseif not is_set (PublicationPlace) and is_set (Place) then -- when only |place= (|location=) is set ...
PublicationPlace = Place; -- promote |place= (|location=) to |publication-place
end
 
if PublicationPlace == Place then Place = ''; end -- don't need both if they are the same
Line 2,585 ⟶ 2,569:
]]
 
local Encyclopedia = A['Encyclopedia'];
 
if ( config.CitationClass == "encyclopaedia" ) or ( config.CitationClass == "citation" and is_set (Encyclopedia)) then -- test code for citation
Line 2,593 ⟶ 2,577:
Chapter = Title; -- |encyclopedia and |title are set so map |title to |article and |encyclopedia to |title
ScriptChapter = ScriptTitle;
ScriptChapterOrigin = A:ORIGIN('ScriptTitletitle');
TransChapter = TransTitle;
ChapterURL = URL;
ChapterURLorigin = A:ORIGIN('URL')
 
ChapterUrlAccess = UrlAccess;
 
Line 2,631 ⟶ 2,613:
 
-- special case for cite mailing list
if (config.CitationClass == "mailinglist") then -- TODO: move this to Periodical assignment; see TODOs at c. line 2360
Periodical = A ['MailingList'];
elseif 'mailinglist' == Periodical_origin then
Line 2,641 ⟶ 2,623:
if is_set(BookTitle) then
Chapter = Title;
-- ChapterLink = TitleLink; -- |chapterlink= is deprecated
ChapterURL = URL;
ChapterUrlAccess = UrlAccess;
Line 2,650 ⟶ 2,632:
Title = BookTitle;
Format = '';
-- TitleLink = '';
TransTitle = '';
URL = '';
Line 2,666 ⟶ 2,648:
Chapter = A['Map'];
ChapterURL = A['MapURL'];
ChapterURLorigin = A:ORIGIN('MapURL');
TransChapter = A['TransMap'];
ScriptChapter = A['ScriptMap']
ScriptChapterOrigin = A:ORIGIN('ScriptMap')
 
ChapterUrlAccess = MapUrlAccess;
TransChapter = A['TransMap'];
ChapterURLorigin = A:ORIGIN('MapURL');
ChapterFormat = A['MapFormat'];
 
Cartography = A['Cartography'];
if is_set( Cartography ) then
Line 2,686 ⟶ 2,665:
-- Account for the oddities that are {{cite episode}} and {{cite serial}}, before generation of COinS data.
if 'episode' == config.CitationClass or 'serial' == config.CitationClass then
local AirDate = A['AirDate'];
local SeriesLink = A['SeriesLink'];
 
Line 2,698 ⟶ 2,678:
ID = table.concat(n, sepc .. ' ');
if not is_set (Date) and is_set (AirDate) then -- promote airdate to date
Date = AirDate;
end
 
if 'episode' == config.CitationClass then -- handle the oddities that are strictly {{cite episode}}
local Season = A['Season'];
Line 2,714 ⟶ 2,698:
Chapter = Title; -- promote title parameters to chapter
ScriptChapter = ScriptTitle;
ScriptChapterOrigin = A:ORIGIN('ScriptTitletitle');
ChapterLink = TitleLink; -- alias episodelink
TransChapter = TransTitle;
Line 2,747 ⟶ 2,731:
-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, {{cite ssrn}}, before generation of COinS data.
do
if in_array (config.CitationClass, whitelist.preprint_template_list{'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) then
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
end
 
Periodical = ({['arxiv'] = 'arXiv', ['biorxiv'] = 'bioRxiv', ['citeseerx'] = 'CiteSeerX', ['ssrn'] = 'Social Science Research Network'})[config.CitationClass];
end
end
Line 2,842 ⟶ 2,826:
-- uncomment these three lines. Not supported by en.wiki (for obvious reasons)
-- set date_name_xlate() second argument to true to translate English digits to local digits (will translate ymd dates)
-- if date_name_xlate (date_parameters_list, false) then
-- modified = true;
-- end
 
if modified then -- if the date_parameters_list values were modified
Line 2,887 ⟶ 2,871:
end
 
if cfg.keywords_xlate[Title]'none' == 'none'Title and
in_array (config.CitationClass, {'journal', 'citation'}) and
(is_set (Periodical) or is_set (ScriptPeriodical)) and
Line 2,919 ⟶ 2,903:
coins_author = c; -- use that instead
end
 
-- this is the function call to COinS()
local OCinSoutput = COinS({
Line 2,936 ⟶ 2,920:
['Pages'] = coins_pages or get_coins_pages (first_set ({Sheet, Sheets, Page, Pages, At}, 5)), -- pages stripped of external links
['Edition'] = Edition,
['PublisherName'] = PublisherName or Newsgroup, -- any apostrophe markup already removed from PublisherName
['URL'] = first_set ({ChapterURL, URL}, 2),
['Authors'] = coins_author,
Line 2,944 ⟶ 2,928:
 
-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, and {{cite ssrn}} AFTER generation of COinS data.
if in_array (config.CitationClass, whitelist.preprint_template_list{'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
Periodical = ''; -- periodical not allowed in these templates; if article has been published, use cite journal
end
 
-- special case for cite newsgroup. Do this after COinS because we are modifying Publishername to include some static text
if 'newsgroup' == config.CitationClass andthen
if is_set (NewsgroupPublisherName) then
PublisherName = substitute (cfg.messages['newsgroup'], external_link( 'news:' .. NewsgroupPublisherName, NewsgroupPublisherName, Newsgroup_originPublisherName_origin, nil ));
end
end
 
Line 2,963 ⟶ 2,949:
maximum = nil, -- as if display-authors or display-editors not set
lastauthoramp = LastAuthorAmp,
page_name = this_page.text, -- get current page name so that we don't wikilink to it via editorlinkn
mode = Mode
};
Line 2,974 ⟶ 2,961:
if editor_etal then
Editors = Editors .. ' ' .. cfg.messages['et al']; -- add et al. to editors parameter beause |display-editors=etal
EditorCount = 2; -- with et al., |editors= is multiple names; spoof to display (eds.) annotation
else
EditorCount = 2; -- we don't know but assume |editors= is multiple names; spoof to display (eds.) annotation
end
EditorCount = 2; -- we don't know but assume |editors= is multiple names; spoof to display (eds.) annotation
else
Editors = last_first_list; -- either an author name list or an empty string
Line 3,045 ⟶ 3,034:
 
local OriginalURL, OriginalURLorigin, OriginalFormat, OriginalAccess;
-- DeadURL = DeadURL:lower(); -- used later when assembling archived text
UrlStatus = UrlStatus:lower(); -- used later when assembling archived text
if is_set( ArchiveURL ) then
Line 3,051 ⟶ 3,041:
OriginalURLorigin = ChapterURLorigin; -- name of chapter-url parameter for error messages
OriginalFormat = ChapterFormat; -- and original |chapter-format=
-- if 'no' ~= DeadURL then
 
if 'live' ~= UrlStatus then
ChapterURL = ArchiveURL -- swap-in the archive's url
Line 3,063 ⟶ 3,053:
OriginalFormat = Format; -- and original |format=
OriginalAccess = UrlAccess;
-- 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
Line 3,099 ⟶ 3,089:
local no_quotes = false; -- default assume that we will be quoting the chapter parameter value
if is_set (Contribution) and 0 < #c then -- if this is a contribution with contributor(s)
if in_array (Contribution:lower(), cfg.keywords_listskeywords.contribution) then -- and a generic contribution title
no_quotes = true; -- then render it unquoted
end
Line 3,116 ⟶ 3,106:
end
 
-- Format main title.
-- Format main title. TODO: add support for non-English versions of 'Archived copy' when used on other-language wikis
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)
if is_set (ArchiveURL) and
add_maint_cat ('archived_copy'); -- add maintenance category before we modify the content of Title
(mw.ustring.match (mw.ustring.lower(Title), cfg.special_case_translation.archived_copy.en) or -- if title is 'Archived copy' (place holder added by bots that can't find proper title)
mw.ustring.match (mw.ustring.lower(Title), cfg.special_case_translation.archived_copy['local'])) then -- local-wiki's form
add_maint_cat ('archived_copy'); -- add maintenance category before we modify the content of Title
end
 
Line 3,133 ⟶ 3,121:
end
end
 
if in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'mailinglist', 'interview', 'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) or
('citation' == config.CitationClass and (is_set (Periodical) or is_set (ScriptPeriodical)) and not is_set (Encyclopedia)) or
Line 3,159 ⟶ 3,147:
end
 
if is_set (Title) then -- TODO: is this the right place to be making wikisource urls?
if not is_set (TitleLink) and is_set (URL) then
Title = external_link (URL, Title, URLorigin, UrlAccess) .. TransTitle .. TransError .. Format;
Line 3,175 ⟶ 3,163:
end
else
local ws_url, ws_label;
local ws_url, ws_label; -- Title has italic or quote markup by the time we get here which causes is_wikilink() to return 0 (not a wikilink)
ws_url, ws_label, L = wikisource_url_make (Title:gsub('[\'"](.-)[\'"]', '%1')); -- make ws url from |title= interwiki link (strip italic or quote markup); 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
Line 3,233 ⟶ 3,221:
At = is_set(At) and (sepc .. " " .. At) or "";
Position = is_set(Position) and (sepc .. " " .. Position) or "";
if config.CitationClass == 'map' then -- TODO copy this line and
local Section = A['Section']; -- TODO move this line to c. line 2337 so that separate Sections in aliases{} not required? then unset Chapter?
local Sections = A['Sections'];
local Inset = A['Inset'];
Line 3,285 ⟶ 3,273:
------------------------------------ totally unrelated data
Via = is_set (Via) and wrap_msg ('via', Via) or '';
 
--[[
Subscription implies paywall; Registration does not. If both are used in a citation, the subscription required link
note is displayed. There are no error messages for this condition.
]]
if is_set (SubscriptionRequired) then
SubscriptionRequired = sepc .. " " .. cfg.messages['subscription']; -- subscription required message
elseif is_set (RegistrationRequired) then
SubscriptionRequired = sepc .. " " .. cfg.messages['registration']; -- registration required message
else
SubscriptionRequired = ''; -- either or both might be set to something other than yes true y
end
 
if is_set(AccessDate) then
Line 3,320 ⟶ 3,321:
local Archived
if is_set(ArchiveURL) then
local arch_text;
if not is_set(ArchiveDate) then
ArchiveDate = set_error('archive_missing_date');
end
if "live" == UrlStatus then
local arch_text = cfg.messages['archived'];
if sepc ~= "." then arch_text = arch_text:lower() end
Archived = sepc .. " " .. substitute( cfg.messages['archived-live'],
{ external_link( ArchiveURL, arch_text, A:ORIGIN('ArchiveURL'), nil ) .. ArchiveFormat, ArchiveDate } );
if not is_set (OriginalURL) then
Archived = Archived .. " " .. set_error('archive_missing_url');
end
elseif is_set(OriginalURL) then -- UrlStatus is empty, 'dead', 'unfit', 'usurped', 'bot: unknown'
local arch_text = cfg.messages['archived-dead'];
if sepc ~= "." then arch_text = arch_text:lower() end
if in_array (UrlStatus, {'unfit', 'usurped', 'bot: unknown'}) then
Archived = sepc .. " " .. 'మూలమును ఆర్కైవు చేసిన తేదీ: ' .. ArchiveDate; -- format already styled
arch_text = cfg.messages['archived-unfit'];
if sepc ~= "." then arch_text = arch_text:lower() end
Archived = sepc .. " " .. arch_text .. ArchiveDate; -- format already styled
if 'bot: unknown' == UrlStatus then
add_maint_cat ('bot:_unknown'); -- and add a category if not already added
పంక్తి 3,343:
end
else -- UrlStatus is empty, 'dead'
arch_text = cfg.messages['archived-dead'];
if sepc ~= "." then arch_text = arch_text:lower() end
Archived = sepc .. " " .. substitute( arch_text,
{ external_link( OriginalURL, cfg.messages['original'], OriginalURLorigin, OriginalAccess ) .. OriginalFormat, ArchiveDate } ); -- format already styled
end
else
else -- OriginalUrl not set
local arch_text = cfg.messages['archived-missing'];
if sepc ~= "." then arch_text = arch_text:lower() end
Archived = sepc .. " " .. substitute( arch_text,
Line 3,467 ⟶ 3,465:
local idcommon;
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
Line 3,560 ⟶ 3,558:
end
if is_set(Ref) and 'none' ~= cfg.keywords_xlate[Ref:lower()] ~= "none" then -- set reference anchor if appropriate
local id = Ref
if ('harv' == Ref ) then
Line 3,624 ⟶ 3,622:
end
ifno_tracking_cats not= no_tracking_cats then:lower();
if in_array(no_tracking_cats, {"", "no", "false", "n"}) then
for _, v in ipairs( z.error_categories ) do
table.insert (render, make_wikilink ('Category:' .. v));
Line 3,654 ⟶ 3,653:
local name = tostring (name);
local state;
local function state_test (state, name) -- local function to do testing of state values
if in_array (cite_class, {'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) then -- limited parameter sets allowed for these templates
state = whitelist.limited_basic_arguments[name];
if true == state then return true; end -- valid actively supported parameter
if false == state then
Line 3,660 ⟶ 3,661:
return true;
end
return nil;
end
 
state = whitelist[cite_class .. '_basic_arguments'][name]; -- look in the parameter-list for the template identified by cite_class
if name:find ('#') then -- # is a cs1|2 reserved character so parameters with # not permitted
return nil;
end
 
if in_array (cite_class, whitelist.preprint_template_list ) then -- limited parameter sets allowed for these templates
state = whitelist.limited_basic_arguments[name];
if true == state_test (state, name) then return true; end
 
state = whitelist.preprint_arguments[cite_class][name]; -- look in the parameter-list for the template identified by cite_class
if true == state_test (state, name) then return true; end
 
if true == state then return true; end -- valid actively supported parameter
if false == state then
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
-- limited enumerated parameters list
name = name:gsub("%d+", "#" ); -- replace digit(s) with # (last25 becomes last#) (mw.ustring because non-Western 'local' digits)
state = whitelist.limited_numbered_arguments[name];
if true == state_test (state, name) then return true; end -- valid actively supported parameter
if false == state then
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
 
return false; -- not supported because not found or name is set to nil
end -- end limited parameter-set templates
 
if in_array (cite_class, whitelist.unique_param_template_list) then -- experiment for template-specific parameters for templates that accept parameters from the basic argument list
state = whitelist.unique_arguments[cite_class][name]; -- look in the template-specific parameter-lists for the template identified by cite_class
if true == state_test (state, name) then return true; end
end -- if here, fall into general validation
state = whitelist.basic_arguments[name]; -- all other templates; all normal parameters allowed
if true == state_test (state, name) then return true; end
if true == state then return true; end -- valid actively supported parameter
 
if false == state then
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
-- all enumerated parameters allowed
name = name:gsub("%d+", "#" ); -- replace digit(s) with # (last25 becomes last#) (mw.ustring because non-Western 'local' digits)
state = whitelist.numbered_arguments[name];
if true == state_test (state, name) then return true; end
 
if true == state then return true; end -- valid actively supported parameter
if false == state then
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
return false; -- not supported because not found or name is set to nil
end
Line 3,848 ⟶ 3,851:
else
error_text, error_state = set_error( 'parameter_ignored', {param}, true ); -- suggested param not supported by this template
v = ''; -- unset
end
end
Line 3,879 ⟶ 3,881:
end
end
 
return table.concat ({citation0( config, args), frame:extensionTag ('templatestyles', '', {src=styles})});
end
"https://te.wikipedia.org/wiki/మాడ్యూల్:Citation/CS1" నుండి వెలికితీశారు