Module:Footnotes/sandbox2 explained

f = ;

function trim(str) if str

nil then return nil; end return str:match("^%s*(.-)%s*$");end

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 ('.'

result:sub(-1)) and ('.'

args.postscript:sub(1)) and (

args.page) and (

args.pages) and (

args.location) then result = result:gsub ('%.$', ); end if args.ref ~= 'none' then if args.ref ~= "" then result = "" .. result .. ""; else result = "" .. result .. ""; end end

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.postscript then args.postscript = ; end

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'

args.postscript then args.postscript = ; end 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); -- 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;