f={args_default={bracket_left="",bracket_right="",bracket_year_left="",bracket_year_right="",postscript="",page="",pages="",location="",page_sep=", p. ",pages_sep=", pp. ",ref="",P1="",P2="",P3="",P4="",P5=""}};functiontrim(str)ifstr==nilthenreturnnil;endreturnstr:match("^%s*(.-)%s*$");endfunctioncore(args)localresult;ifargs.P5~=""thenresult=args.P1..' et al. '..args.bracket_year_left..args.P5..args.bracket_year_right;elseifargs.P4~=""thenresult=args.P1..', '..args.P2..' & '..args.P3..' '..args.bracket_year_left..args.P4..args.bracket_year_right;elseifargs.P3~=""thenresult=args.P1..' & '..args.P2..' '..args.bracket_year_left..args.P3..args.bracket_year_right;elseresult=trim(args.P1..' '..args.bracket_year_left..args.P2..args.bracket_year_right)endifargs.ref~='none'thenifargs.ref~=""thenresult="[[#"..mw.uri.anchorEncode(args.ref).."|"..result.."]]";elseresult="[[#CITEREF"..mw.uri.anchorEncode(args.P1..args.P2..args.P3..args.P4..args.P5).."|"..result.."]]";endendifargs.page~=""thenresult=result..args.page_sep..args.page;elseifargs.pages~=""thenresult=result..args.pages_sep..args.pages;endifargs.location~=""thenresult=result..", "..args.location;endresult=args.bracket_left..result..args.bracket_right..args.postscript;returnresult;endfunctionf.harvard_core(frame)localargs={};localpframe=frame:getParent();args.bracket_left=pframe.args.BracketLeftor"";args.bracket_right=pframe.args.BracketRightor"";args.bracket_year_left=pframe.args.BracketYearLeftor"";args.bracket_year_right=pframe.args.BracketYearRightor"";args.postscript=pframe.args.Postscriptor"";if'none'==args.postscriptthenargs.postscript='';endargs.page=pframe.args.Pageor"";args.pages=pframe.args.Pagesor"";args.location=pframe.args.Locationor"";args.page_sep=pframe.args.PageSepor"";args.pages_sep=pframe.args.PagesSepor"";args.ref=pframe.args.REFor"{{{REF}}}";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"";returncore(args);endfunctionf.harvard_citation(frame)localargs=f.args_default;pframe=frame:getParent();args.bracket_left="(";args.bracket_right=")";args.page=pframe.args.porpframe.args.pageor"";args.pages=pframe.args.pporpframe.args.pagesor"";args.location=pframe.args.locor"";args.ref=pframe.args.reforpframe.args.Reforpframe.args.REFor"";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"";returncore(args);endfunctionf.harvard_citation_no_bracket(frame)localargs=f.args_default;pframe=frame:getParent();args.page=pframe.args.porpframe.args.pageor"";args.pages=pframe.args.pporpframe.args.pagesor"";args.location=pframe.args.locor"";args.ref=pframe.args.reforpframe.args.Reforpframe.args.REFor"";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"";returncore(args);endfunctionf.sfn(frame)localargs=f.args_default;fork,vinpairs(frame.args)do-- for {{sfnp}}, override default with values provided in the #invoke:args[k]=v;endpframe=frame:getParent();args.postscript=pframe.args.postscriptorpframe.args.psor".";if'none'==args.postscriptthenargs.postscript='';endargs.page=pframe.args.porpframe.args.pageor"";args.pages=pframe.args.pporpframe.args.pagesor"";args.location=pframe.args.locor"";args.ref=pframe.args.reforpframe.args.Reforpframe.args.REFor"";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"";localresult=core(args);localname="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};returnresult;endreturnf;