モジュール:サンドボックス/arashiyama2016/Footnotes

f = {
	args_default = {
		bracket_left = "",
		bracket_right = "",
		bracket_year_left = "",
		bracket_year_right = "",
		postscript = "",
		page = "",
		pages = "",
		location = "",
		page_sep = ", p. ",
		pages_sep = ", pp. ",
		ref = "",
		style = "",  -- '和書'又は'和書2'スタイルにする場合は値を'和書'('和書1'でも可)又は'和書2'に設定
		P1 = "",
		P2 = "",
		P3 = "",
		P4 = "",
		P5 = ""
	}
};
function trim( str )
	if str == nil then
		return nil;
	end
	return str:match( "^%s*(.-)%s*$");
end    
function core( args )
	local result;
--TODO: evaluate to make sure that the following if correctly handles the parameter set when there is no year
	if args.P5 ~= "" then
		if ( args.style == "和書" or args.style == "和書1" ) then     -- '和書'('和書1')スタイルの場合、'et al.' を'他'にする
			result = args.P1 ..  ' 他 ' .. args.bracket_year_left .. args.P5 .. 
			args.bracket_year_right;
		elseif args.style == "和書2" then     -- '和書2'スタイルの場合、4人目の著者も列記する
			result = args.P1 ..  '・' .. args.P2 .. '・' .. args.P3 .. '・' .. args.P4 .. ' ' .. 
			args.bracket_year_left .. args.P5 .. args.bracket_year_right;
		else
			result = args.P1 ..  ' et al. ' .. args.bracket_year_left .. args.P5 .. 
			args.bracket_year_right;
		end
	elseif args.P4 ~= "" then
		if ( args.style == "和書" or args.style == "和書1" or args.style == "和書2" ) then     -- '和書'('和書1')又は'和書2'スタイルの場合、複数著者の区切りを'・'にする
			result = args.P1 .. '・' .. args.P2 .. '・' .. args.P3 .. ' ' .. 
			args.bracket_year_left .. args.P4 .. args.bracket_year_right;
		else
			result = args.P1 .. ', ' .. args.P2 .. ' & ' .. args.P3 .. ' ' .. 
			args.bracket_year_left .. args.P4 .. args.bracket_year_right;
		end
	elseif args.P3 ~= "" then
		if ( args.style == "和書" or args.style == "和書1" or args.style == "和書2" ) then     -- '和書'('和書1')又は'和書2'スタイルの場合、複数著者の区切りを'・'にする
			result = args.P1 .. '・' .. args.P2 .. ' ' .. args.bracket_year_left .. 
			args.P3 .. args.bracket_year_right;
		else
			result = args.P1 .. ' & ' .. args.P2 .. ' ' .. args.bracket_year_left .. 
			args.P3 .. args.bracket_year_right;
		end
	elseif args.P2 ~= "" then
		if not args.P2:match ('%d%d%d%d') and not args.P2:match ('n%.d%.') and not args.P2:match ('nd') and not args.P2:match ('c%. %d%d%d%d?%c?') then
		-- for the case where the last numbered parameter is a name and not a year and not no-date
			if ( args.style == "和書" or args.style == "和書1" or args.style == "和書2" ) then     -- '和書'('和書1')又は'和書2'スタイルの場合、複数著者の区切りを'・'にする			
				result = args.P1 .. '・' .. args.P2;
			else
				result = args.P1 .. ' & ' .. args.P2;
			end
		else
			result = args.P1 .. ' ' .. args.bracket_year_left .. args.P2 .. args.bracket_year_right;
		end
	else
		result = trim( args.P1 .. ' ' .. args.bracket_year_left .. args.P2 .. 
		args.bracket_year_right )
	end
	if ('.' == result:sub(-1)) and ( == args.page) and ( == args.pages) and ( == args.location) then
		args.postscript = ;		-- prevent double periods when date is 'n.d.'
	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 = args.bracket_left .. result .. args.bracket_right .. args.postscript;
	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 pframe.args.REF or "";
	args.P1 = trim( pframe.args1 ) or "";
	args.P2 = trim( pframe.args2 ) or "";
	args.P3 = trim( pframe.args3 ) or "";
	args.P4 = trim( pframe.args4 ) or "";
	args.P5 = trim( pframe.args5 ) 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 pframe.args.REF or "";
	args.P1 = trim( pframe.args1 ) or "";
	args.P2 = trim( pframe.args2 ) or "";
	args.P3 = trim( pframe.args3 ) or "";
	args.P4 = trim( pframe.args4 ) or "";
	args.P5 = trim( pframe.args5 ) or "";
	return core( args );
end
function f.sfn( frame )   -- さしあたり和書スタイルは sfnのみ可能となっています
	local args = f.args_default;
	for k, v in pairs( frame.args ) do											-- for , override default with values provided in the #invoke:
		argsk = 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 pframe.args.REF or "";
	args.style = pframe.args.style or "";     -- '和書'、'和書2'スタイル対応箇所
	args.P1 = trim( pframe.args1 ) or "";
	args.P2 = trim( pframe.args2 ) or "";
	args.P3 = trim( pframe.args3 ) or "";
	args.P4 = trim( pframe.args4 ) or "";
	args.P5 = trim( pframe.args5 ) or "";
	local result = core( args );
	local name = "FOOTNOTE" .. args.P1 .. args.P2 .. 
	args.P3 .. args.P4 .. args.P5 .. args.page .. args.pages .. args.location .. 
	(( args.style=="和書" or args.style == "和書1" ) and "和書" or (args.style=="和書2" and "和書2" or "")); -- '和書'('和書1')又は
	  -- '和書2'スタイルの場合、 refタグに設定するname文字列の末尾に'和書'又は'和書2'を付加し、
	  -- '和書'('和書1')、'和書2'スタイル以外の場合は付加しない。
	result = frame:extensionTag{ name = "ref", args = {name=name}, content=result };
	return result;
end
return f;
----2017/06/25 '和書'、'和書2'スタイル対応