f = ;
function trim(str) if str
local function is_year (param) return param:match ('^%d%d%d%d?%l?$') or param:match ('^n%.d%.%l?$') or param:match ('^nd%l?$') or param:match ('^c%. %d%d%d%d?%l?$') or param:match ('^%d%d%d%d–%d%d%d%d%l?$');end
function core(args) local result;
if args.P5 ~= "" then if is_year (args.P5) then result = table.concat ; else args.P5 = ; -- when P5 not a year don't include in anchor result = table.concat ; -- and don't render it end
elseif args.P4 ~= "" then if is_year (args.P4) then result = table.concat ; -- three names and a year else result = table.concat ; -- four names end
elseif args.P3 ~= "" then if is_year (args.P3) then result = table.concat ; -- two names and a year else result = table.concat ; -- three names end elseif args.P2 ~= "" then if is_year (args.P2) then result = table.concat ; -- one name and year else result = table.concat ; -- two names end else result = args.P1; -- one name end -- when author-date result ends with a dot (typically when the last positional parameter holds 'n.d.') -- and when no in-source location (no |p=, |pp=, or |loc=) -- and when the first or only character in args.postscript is a dot -- remove the author-date result trailing dot -- the author-date result trailing dot will be replaced later with the content of args.postscript (usually a dot) if ('.'
args.postscript:sub(1)) and (
args.pages) and (
if args.page ~= "" then result = result .. args.page_sep .. args.page; elseif args.pages ~= "" then result = result .. args.pages_sep .. args.pages; end
if args.location ~= "" then result = result .. ", " .. args.location; end
result = table.concat :gsub ('%s+', ' '); -- strip redundant spaces return result;end
function f.harvard_core(frame) local args = ; local pframe = frame:getParent;
args.bracket_left = pframe.args.BracketLeft or ""; args.bracket_right = pframe.args.BracketRight or ""; args.bracket_year_left = pframe.args.BracketYearLeft or ""; args.bracket_year_right = pframe.args.BracketYearRight or ""; args.postscript = pframe.args.Postscript or ""; if 'none'
args.page = pframe.args.Page or ""; args.pages = pframe.args.Pages or ""; args.location = pframe.args.Location or ""; args.page_sep = pframe.args.PageSep or ""; args.pages_sep = pframe.args.PagesSep or ""; args.ref = pframe.args.REF or ""; args.P1 = trim(pframe.args.P1) or ""; args.P2 = trim(pframe.args.P2) or ""; args.P3 = trim(pframe.args.P3) or ""; args.P4 = trim(pframe.args.P4) or ""; args.P5 = trim(pframe.args.P5) or "";
return core(args);end
function f.harvard_citation(frame) local args = f.args_default; pframe = frame:getParent;
args.bracket_left = "("; args.bracket_right = ")"; 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 "";
return core(args);end
function f.harvard_citation_no_bracket(frame) local args = f.args_default; pframe = frame:getParent;
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 "";
return core(args);end
function f.sfn(frame, args) local args = args or f.args_default; for k, v in pairs(frame.args) do -- for, override default with values provided in the #invoke: args[k] = v; end pframe = frame:getParent;
args.postscript = pframe.args.postscript or pframe.args.ps or "."; if 'none'
local result = core(args); -- put it all together and then strip redundant spaces local name = table.concat :gsub ('%s+', ' ');
result = frame:extensionTag;
return result;end
function f.sfnt(frame) local args = f.args_default; args.article = mw.title.getCurrentTitle.subjectPageTitle.fullText; args.article = string.gsub(args.article, "Wikipedia:Articles for deletion/", "", 1); return f.sfn(frame, args);end
return f;