Anonymous user
Module:Citation/CS1: Difference between revisions
sync from sandbox;
(synch from sandbox;) |
(sync from sandbox;) |
||
Line 1:
local cs1 ={};▼
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
Line 133 ⟶ 131:
the first character of the whole domain name including subdomains must be a letter or a digit
internationalized domain name (ascii characters with .xn-- ASCII Compatible Encoding (ACE) prefix xn-- in the tld) see https://tools.ietf.org/html/rfc3490
single-letter/digit second-level domains in the .org, .cash, and .
q, x, and z SL domains in the .com TLD
i and q SL domains in the .net TLD
Line 165 ⟶ 163:
return true;
elseif domain:match ('%f[%a%d][%a%d]%.cash$') then -- one character/digit .cash hostname
elseif domain:match ('%f[%a%d][%a%d]%.today') then -- one character/digit .today hostname
return true;
elseif domain:match ('%f[%a%d][%a%d]%.org$') then -- one character/digit .org hostname
Line 713:
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().
Output of this function is an error message that identifies the character or the Unicode group, or the stripmarker
Line 1,221 ⟶ 1,219:
--[[--------------------------< N A M E _ H A S _ E T A L >----------------------------------------------------
Evaluates the content of
the et al. is removed, a flag is set to true and the function returns the modified name and the flag.
This function never sets the flag to false but returns it's previous state because it may have been set by
previous passes through this function or by the
]]
local function name_has_etal (name, etal, nocat, param)
if is_set (name) then -- name can be nil in which case just return
local patterns = cfg.et_al_patterns; --get patterns from configuration
table.insert( z.message_tail, {set_error ('etal', {param})}); -- and set an error if not added
end▼
▲ name = name:gsub (others_pattern, ''); -- if found, remove
end
end
end
return name, etal; --
end
Line 1,263 ⟶ 1,257:
local function name_has_ed_markup (name, list_name)
local _, pattern;
local patterns =
if is_set (name) then
Line 1,362 ⟶ 1,345:
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
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 = select_one( args, cfg.aliases[list_name .. '-Link'], 'redundant_parameters', i );
mask = select_one( args, cfg.aliases[list_name .. '-Mask'], 'redundant_parameters', i );
last, etal = name_has_etal (last, etal, false, last_alias);
first, etal = name_has_etal (first, etal, false, first_alias);
last, first= name_checks (last, first, list_name); -- multiple names, extraneous annotation, etc checks
if first and not last then -- if there is a firstn without a matching lastn
table.insert( z.message_tail, { set_error( 'first_missing_last', {
elseif not first and not last then -- if both firstn and lastn aren't found, are we done?
count = count + 1; -- number of times we haven't found last and first
Line 1,386 ⟶ 1,369:
n = n + 1; -- point to next location in the names table
if 1 == count then -- if the previous name was missing
table.insert( z.message_tail, { set_error( 'missing_name', {
end
count = 0; -- reset the counter, we're looking for two consecutive missing names
Line 1,624 ⟶ 1,607:
local function is_pdf (url)
return url:match ('%.pdf$') or url:match ('%.PDF$') or
url:match ('%.pdf[%?#]') or url:match ('%.PDF[%?#]') or
url:match ('%.PDF#') or url:match ('%.pdf#');
end
Line 1,652 ⟶ 1,637:
--[[--------------------------< G E T _ D I S P L A Y _ N A
Returns a number that defines the number of names displayed for author and editor name lists and a boolean flag
Line 1,675 ⟶ 1,660:
]]
local function
if is_set (max) then
if 'etal' == max:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
Line 1,683 ⟶ 1,668:
max = tonumber (max); -- make it a number
if max >= count then -- if |display-xxxxors= value greater than or equal to number of authors/editors
add_maint_cat ('
end
else -- not a valid keyword or number
Line 1,784 ⟶ 1,769:
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);
for i, v_name in ipairs(v_name_table) do
Line 2,216 ⟶ 2,201:
end
local translator_etal;
local t = {}; -- translators list from |translator-lastn= / translator-firstn= pairs
local Translators; -- assembled translators name list
t = extract_names (args, 'TranslatorList'); -- fetch translator list from |translatorn= / |translator-lastn=, -firstn=, -linkn=, -maskn=
local interviewer_etal;
local interviewers_list = {};
local Interviewers; -- used later
interviewers_list = extract_names (args, 'InterviewerList'); -- process preferred interviewers parameters
local contributor_etal;
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs
local Contributors; -- assembled contributors name list
Line 2,250 ⟶ 2,238:
NameListFormat = ''; -- anything else, set to empty string
end
if is_set (Others) then
if 0 == #a and 0 == #e then -- add maint cat when |others= has value and used without |author=, |editor=
add_maint_cat ('others');
end
end
local Year = A['Year'];
Line 2,408 ⟶ 2,402:
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;
end
Line 2,856 ⟶ 2,853:
do -- do editor name list first because the now unsupported coauthors used to modify control table
control.maximum , editor_etal =
last_first_list, EditorCount = list_people(control, e, editor_etal);
if is_set (Editors) then
Editors, editor_etal = name_has_etal (Editors, editor_etal, false, 'editors'); -- find and remove variations on et al.
if editor_etal then
Editors = Editors .. ' ' .. cfg.messages['et al']; -- add et al. to editors parameter beause |display-editors=etal
Line 2,875 ⟶ 2,873:
end
do -- now do interviewers
control.maximum , interviewer_etal = get_display_names (A['DisplayInterviewers'], #interviewers_list
Interviewers = list_people (control, interviewers_list,
end
do -- now do translators
control.maximum , translator_etal = get_display_names (A['DisplayTranslators'], #t
Translators = list_people (control, t,
end
do -- now do contributors
control.maximum , contributor_etal = get_display_names (A['DisplayContributors'], #c
Contributors = list_people (control, c,
-- control.maximum = #c; -- number of contributors
-- Contributors = list_people(control, c, false); -- et al not currently supported
end
do -- now do authors
control.maximum , author_etal =
last_first_list = list_people(control, a, author_etal);
if is_set (Authors) then
Authors, author_etal = name_has_etal (Authors, author_etal, false, 'authors'); -- find and remove variations on et al.
if author_etal then
Authors = Authors .. ' ' .. cfg.messages['et al']; -- add et al. to authors parameter
Line 3,351:
elseif 'episode' == config.CitationClass then -- special case for cite episode
tcommon = safe_join( {Title, TitleNote, TitleType, Series
else -- all other CS1 templates
Line 3,364:
end
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 );
▲
end
local text;
local pgtext = Position .. Sheet .. Sheets .. Page .. Pages .. At;
Line 3,390 ⟶ 3,396:
if (sepc ~= '.') then
in_text = in_text:lower() -- lowercase for cs2
▲ end
▲ else
if EditorCount <= 1 then▼
post_text = ", " .. cfg.messages['editor'];▼
else▼
end
end
post_text = " (" .. cfg.messages['editor'] .. ")"; -- be consistent with no-author, no-date case
▲ end
Editors = terminate_name_list (in_text .. Editors .. post_text, sepc); -- terminate with 0 or 1 sepc and a space
end
Line 3,612 ⟶ 3,617:
]]
local function missing_pipe_check (parameter, value)
local capture;
value = value:gsub ('%b<>', ''); -- remove xml/html tags because attributes: class=, title=, etc
Line 3,618 ⟶ 3,623:
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
end
end
Line 3,629 ⟶ 3,634:
]]
local function
Frame = frame; -- save a copy incase we need to display an error message in preview mode
local pframe = frame:getParent()
Line 3,745 ⟶ 3,750:
end
end
missing_pipe_check (k, v); -- do we think that there is a parameter that is missing a pipe?
-- TODO: is this the best place for this translation?
args[k] = v;
Line 3,761 ⟶ 3,766:
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
▲return cs1;
]]
return {citation = citation};
|