Module:Harvc: Difference between revisions

Content deleted Content added
No edit summary
Synch from sandbox;
Line 1:
local f = {};
args_default = {
err_msg = '',
page_sep = ", p. ",
pages_sep = ", pp. ",
}
};
 
--[[--------------------------< I S _ S E T >------------------------------------------------------------------
Line 13 ⟶ 7:
]]
 
local function is_set( var )
return not (var == nil or var == '');
end
 
--[[--------------------------< M A K E _ N A M E >------------------------------------------------------------
 
Assembles last, first, link, or mask into a displayable contributor name.
 
]]
 
local function make_name (last, first, link, mask)
local name = last;
if is_set (first) then
name = name .. ', ' .. first; -- concatenate first onto last
end
if is_set (link) then
name = '[[' .. link .. '|' .. name .. ']]'; -- form a wikilink around the name
end
if is_set (mask) then -- mask this author
mask = tonumber (mask); -- because the value provided might not be a number
if is_set (mask) then
name = string.rep ('—', mask) -- make a string that number length of mdashes
end
end
return name;
end
 
Line 30 ⟶ 51:
]]
 
local function core( args )
local span_open_tag; -- holds CITEREF and css
local contributors = ''; -- chapter or contribution authors
Line 38 ⟶ 59:
 
-- form the CITEREF anchor
if is_set (args.id) then
span_open_tag = '<span id="' .. args.id .. '" class="citation">'; -- for use when contributor name is same as source name
else
span_open_tag = '<span id="CITEREF' .. table.concat ({args.last1,citeref) args.last2, args.last3, args.last4, args.year}) .. '" class="citation">';
end
--[[
-- form the contributors list; similar to {{sfn}} and {{harv}}, 1 to 4 names but no date and also allows first contributor given name
form the contributors display list:
if args.first ~= '' then
if |display-authors= is empty or omitted, display is similar to {{sfn}} and {{harv}}, 1 to 4 last names;
args.first = ', ' .. args.first;
if |display-authors=all then displays all author names in last, first order (similar to CS1/2 authorlist);
end
if value assigned to |display-authors= is less than the number of author last names, displays the specified number of author names in last, first order followed by et al.
 
]]
if is_set (args.last4) and is_set (args.last3) and is_set (args.last2) and is_set (args.last1) then
if is_set (args.display_authors) then -- override default harv or sfn style contributor display
contributors = args.last1 .. args.first .. ' et al.';
local i = 1;
elseif not is_set (args.last4) and is_set (args.last3) and is_set (args.last2) and is_set (args.last1) then
local count;
contributors = args.last1 .. args.first .. ', ' .. args.last2 .. ' &amp; ' .. args.last3;
local etal = false; -- when |display-authors= is same as number of authors in contributor list
elseif not is_set (args.last4) and not is_set (args.last3) and is_set (args.last2) and is_set (args.last1) then
contributors = args.last1 .. args.first .. ' &amp; ' .. args.last2;
if 'all' == args.display_authors:lower() then -- force all contributor first and last names to be displayed
elseif not is_set (args.last4) and not is_set (args.last3) and not is_set (args.last2) and is_set (args.last1) then
count = #args.last; -- so set count accordingly
contributors = args.last1 .. args.first;
elseif 'etal' == args.display_authors:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
else
count = #args.last; -- display all authors and ...
args.err_msg = args.err_msg .. ' author missing from contributor list.';
etal = true; -- ... append 'at al.'
else
count = tonumber (args.display_authors) or 0; -- 0 if can't be converted to a number
if 0 >= count then
args.err_msg = args.err_msg .. ' invalid |display-authors='; -- if zero, then emit error message
end
end
if count > #args.last then
count = #args.last; -- when |display-authors= is more than the number of authors, use the number of authors
end
if count < #args.last then -- when |display-authors= is less than the number of authors
etal = true; -- append 'at al.'
end
while i <= count do
if is_set (contributors) then
contributors = contributors .. '; ' .. make_name (args.last[i], args.first[i], args.link[i], args.mask[i]); -- the rest of the contributors
else
contributors = make_name (args.last[i], args.first[i], args.link[i], args.mask[i]); -- first contributor's name
end
i = i+1; -- bump the index
end
if true == etal then
contributors = contributors .. ' et al.';
end
else -- do default harv- or sfn-style contributor display
if 4 <= #args.last then -- four or more contributors (first followed by et al.)
contributors = args.last[1] .. ' et al.';
elseif 3 == #args.last then -- three (display them all)
contributors = args.last[1] .. ', ' .. args.last[2] .. ' &amp; ' .. args.last[3];
elseif 2 == #args.last then -- two (first & second)
contributors = args.last[1] .. ' &amp; ' .. args.last[2];
elseif 1 == #args.last then -- just one (first)
contributors = args.last[1];
else
args.err_msg = args.err_msg .. ' no authors in contributor list.'; -- this code used to find holes in the list; no more
end
end
 
Line 77 ⟶ 134:
source = source .. ' (' .. args.year .. ')';
else
args.err_msg = args.err_msg .. ' invalid or missing year.'; -- error message if year not provided or malformedis imalformed
end
 
Line 87 ⟶ 144:
args.contribution = '[' .. args.url .. ' ' .. args.contribution .. ']'; -- format external link
end
if args.sepc ~= contributors:sub(-1) and args.sepc .. ']]' ~= contributors:sub(-3) then
 
contributors = contributors .. args.sepc; -- add separator if not same as last character in name list (|first=John S. or et al.)
if args.separator ~= contributors:sub(-1) then
contributors = contributors .. args.separator; -- add separator if not same as last character in name list (|first=John S. or et al.)
end
 
Line 103 ⟶ 159:
end
 
--wrap error messages in span and add help link
if is_set (args.err_msg) then
args.err_msg = '<span style="font-size:100%" class="error">' .. args.err_msg .. '</span>';
args.err_msg = '<span style="font-size:100%" class="error"> harvc:' .. args.err_msg .. ' ([[Template:Harvc|help]])</span>';
end
 
if ',' == args.separatorsepc then
in_text = in_text:lower(); -- CS2 style use lower case
end
 
-- and put it all together
result = span_open_tag .. contributors .. ' "' .. args.contribution .. '"' .. args.separatorsepc .. in_text .. source .. args.p .. args.postscriptps .. '</span>' .. args.err_msg;
 
return result;
Line 123 ⟶ 181:
]]
function f.harvc (frame)
local args = f.args_default;{
err_msg = '',
pframe = frame:getParent();
page_sep = ", p.&nbsp;",
pages_sep = ", pp.&nbsp;",
sepc = '.',
ps = '.',
last = {},
first = {},
link = {},
mask = {},
citeref = {}
}
 
local pframe = frame:getParent();
args.contribution = pframe.args.c or -- chapter or contribution
pframe.args.chapter or
pframe.args.contribution or '';
args.first = pframe.args.first or pframe.args.first1 or ''; -- (optional) first author's given name; given names for other authors not supported
 
args.id = pframe.args.id or '';
Line 137 ⟶ 206:
args.in3 = pframe.args.in3 or '';
args.in4 = pframe.args.in4 or '';
 
args.display_authors = pframe.args['display-authors']; -- the number of contributor names to display; cs1/2 format includes first names
 
if is_set (pframe.args['last1']) or is_set (pframe.args['last']) then -- must have at least this to continue
args.last[1] = pframe.args.last or pframe.args.last1; -- get first contributor's last name
args.citeref[1] = args.last[1]; -- add it to the citeref
args.first[1] = pframe.args.first or pframe.args.first1; -- get first contributor's first name
args.link[1] = pframe.args['author-link'] or pframe.args['author-link1']; -- get first contributor's article link
args.mask[1] = pframe.args['author-mask'] or pframe.args['author-mask1']; -- get first contributor's article link
local i = 2; -- index for the rest of the names
args.last1 = pframe.args.last or pframe.args.last1 or ''; -- contribution author(s)
while is_set (pframe.args['last'..i]) do -- loop through pfram.args and get the rest of the names
args.last2 = pframe.args.last2 or '';
args.last3last[i] = pframe.args.last3 or ['last'..i]; -- last names
args.last4first[i] = pframe.args.last4 or ['first'..i]; -- first names
args.link[i] = pframe.args['author-link'..i]; -- first names
args.mask[i] = pframe.args['author-mask'..i]; -- first names
if 5 > i then
args.citeref[i] = args.last[i]; -- collect first four last names for CITEREF anchor
end
i = i + 1 -- bump the index
end
end
 
args.p = pframe.args.p or ''; -- source page number(s) or ___location
args.pp = pframe.args.pp or '';
args.loc = pframe.args.loc or '';
 
if 'cs2' == pframe.args.mode then
args.separator = pframe.args.sep or pframe.args.separator; -- !! before postscript!! element separator defaults to full stop
args.ps = ''; -- set postscript character to empty string, cs2 mode
args.postscript = pframe.args.ps or pframe.args.postscript;
args.sepc = ','; -- set seperator character to comma, cs2 mode
if not is_set (args.postscript) then
if not is_set (args.separator) then
args.postscript = '.'; -- neither set so set to defaults
args.separator = '.';
elseif ',' == args.separator then
args.postscript = ''; -- CS2 and postscript not set; no terminal punctuation
else
args.postscript = '.'; -- separator not CS2 and postscript not set; use default terminal punctuation
end
else -- if here, postscript set
if 'none' == args.postscript:lower() then -- if |ps=none or |postscript=none then
args.postscript = ''; -- no postscript
end
end
if not is_set (args.separator) then
args.separator = '.'; -- not set in template and we didn't set it here so set to default
end
do -- to limit scope of local temp
local temp = pframe.args.ps or pframe.args.postscript;
if is_set (temp) then
if 'none' == temp:lower() then -- if |ps=none or |postscript=none then
args.ps = ''; -- no postscript
else
args.ps = temp; -- override default postscript
end
end
end -- end of scope limit
 
args.url = pframe.args.url or ''; -- url for chapter or contribution
args.year = pframe.args.year or ''; -- required
 
if not is_set (args.contribution) then
Line 176 ⟶ 258:
end
if args.last1last[1] == args.in1 and
args.last2last[2] == args.in2 and
args.last3last[3] == args.in3 and
args.last4last[4] == args.in4 and
not is_set (args.id) then
args.err_msg = args.err_msg .. ' required &#124;id= parameter missing.'; -- error message if contributor and source are the same
Line 186 ⟶ 268:
return core (args);
end
 
 
--[[
function f.sfn( frame )
local args = f.args_default;
pframe = frame:getParent();
args.postscript = pframe.args.postscript or pframe.args.ps or ".";
args.page = pframe.args.p or pframe.args.page or "";
args.pages = pframe.args.pp or pframe.args.pages or "";
args.___location = pframe.args.loc or "";
args.ref = pframe.args.ref or pframe.args.Ref or "";
args.P1 = trim( pframe.args[1] ) or "";
args.P2 = trim( pframe.args[2] ) or "";
args.P3 = trim( pframe.args[3] ) or "";
args.P4 = trim( pframe.args[4] ) or "";
args.P5 = trim( pframe.args[5] ) or "";
local result = core( args );
local name = "FOOTNOTE" .. args.P1 .. args.P2 ..
args.P3 .. args.P4 .. args.P5 .. args.page .. args.pages .. args.___location;
result = frame:extensionTag{ name = "ref", args = {name=name}, content=result };
return result;
end
]]
 
return f;