モジュール:Citation/Show date

提供: uwuzu 非公式Wiki
2025年8月22日 (金) 15:19時点におけるWikipedia>本日晴天による版 (一部のページでスクリプトエラーが発生する不具合を修正)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

このモジュールは出典テンプレートで使われる各種の日付を表示します。{{Citation/showdate}}・{{Citation/showdateEN}}の内部で使用されているほか、各種出典テンプレートから直接使用することもできます。

従来のテンプレートで有効な日付形式は基本的にサポートしている一方で、CS1モジュールの機能を利用することで、|df=による日付の変換や、範囲を含む日付のような複雑な形式もサポートしているのが特長です。

使い方

書式

{{#invoke:Citation/Show date |show_date |1= |param-name= |post-text= |df=}}

|1=に日付を指定してください。

|param-name=にはdatepublication-datedoi-broken-datearchive-dateaccess-dateのような日付の種類を指定します。省略するか空文字列を指定した場合は、dateが指定された場合と同じ動作になります。

|post-text=には閲覧日の後ろに表示する文字列を指定します。この引数は|param-name=access-dateを同時に指定した場合のみ有効です。|post-text=を指定しなかった場合は閲覧日の後ろに「閲覧。」を表示します。空文字列を指定した場合は閲覧日の後ろに文字列を追加しません。

|df=には日付の表示形式を指定します。指定可能な値にはjaymdmdydmyなどがあり、それぞれの意味合いはCS1テンプレートの同名の引数に指定する値と同じです。ただし|df=を省略した場合は日付の変換を行いません。|param-name=archive-dateもしくはaccess-dateを指定した場合は、|df=に関係なく常に日付を日本語形式で表示します。

動作の解説

このモジュールの大まかな動作は以下のようになっています。以下の説明文にあるdates()reformat_dates()は、いずれもモジュール:Citation/CS1/Date validationで定義されている関数です。

まず、引数で指定された日付をdates()で検査します。

検査に合格した場合は必要に応じてreformat_dates()で日付を変換した上で、日付をモジュールの呼び出し元に返します。

|param-name=access-dateが指定されていて、dates()による検査が不合格であった場合は、{{Accessdate}}をモジュールの内部で呼び出し、その結果を返します。

|param-name=の値がaccess-date以外で、dates()による検査が不合格であった場合は、{{ISO dateJA}}をモジュールの内部で呼び出して、日付をISO 8601形式へ変換することを試みます。ISO 8601形式への変換に成功した場合は日付が再来年以降のものでないことを確認した上で、ISO 8601形式の日付をreformat_dates()で更に変換して返すか、もしくはモジュールの引数に指定された日付をそのまま返します。ISO 8601形式への変換に失敗した場合や、日付が再来年以降のものであった場合は、元の日付にエラーメッセージを追記して返します。


require('strict')

local cfg = mw.loadData('Module:Citation/Show date/Configuration')
local validation = require('Module:Citation/CS1/Date validation')

local function is_set (var)
	return not (var == nil or var == '');
end

local function in_array (needle, haystack)
	if needle == nil then
		return false;
	end
	for n, v in ipairs (haystack) do
		if v == needle then
			return n;
		end
	end
	return false;
end

-- [[モジュール:Citation/CS1/Utilities]]が返すテーブルの簡易版
local utilities = {
	is_set = is_set,
	in_array = in_array
}

-- utilities.set_message()などが空文字列を返すようにする
local _mt = {
	__index = function (t, key)
		return ( function () return '' end )
	end
}
setmetatable(utilities, _mt)

validation.set_selected_modules(cfg, utilities)

local function show_date(frame)
	local param_name = frame.args['param-name']
	
	if not is_set(param_name) then
		param_name = 'date'
	end
	
	local value = frame.args[1]
	local date_parameters_list = { [param_name] = {val = value} }
	local error_list = {}
	
	-- CS1モジュールによる日付の検査
	validation.dates(date_parameters_list, {}, error_list)
	
	if param_name == 'access-date' then
		-- 閲覧日については他の日付とは分けて処理する
		
		local post_text = frame.args['post-text'] or '閲覧。'
		
		if #error_list > 0 then
			-- validation.dates()による検査に不合格ならば{{Accessdate}}を呼び出す
			local args = { value, ['post-text'] = post_text }
			return frame:expandTemplate{ title = 'Accessdate', args = args }
		end
		
		-- validation.dates()による検査に合格していれば、
		-- validation.reformat_dates()を用いて日本語の形式に変換する
		validation.reformat_dates(date_parameters_list, 'ja')
		
		return date_parameters_list[param_name].val .. post_text
	end
	
	-- 閲覧日以外の日付
	
	if #error_list > 0 then
		-- validation.dates()による検査に不合格だった場合の追加処理
		
		-- {{ISO dateJA}}を用いてISO形式への変換を試みる
		local iso_date = frame:expandTemplate{ title = 'ISO dateJA', args = { value } }
		
		-- {{ISO dateJA}}でも認識できない日付はエラーとして扱う
		-- {{ISO dateJA|28 juin 06}}のように空でない不正な文字列を返す場合も考慮する
		if not is_set(iso_date) or not iso_date:match('^%d%d%d%d') then
			return value .. frame:expandTemplate{ title = 'Citation/showdateError' }
		end
		
		-- 日付が再来年以降であればエラーとして扱う
		local current_year = tonumber(mw.getContentLanguage():formatDate('Y'))
		if tonumber(iso_date:sub(1, 4)) - current_year > 1 then
			local args = { message = '日付が有効な範囲を超えています。' }
			return value .. frame:expandTemplate{ title = 'Citation/showdateError' , args = args }
		end
		
		-- 以後の処理は、validation.dates()による検査に合格した場合と基本的に同じ
		-- ただしvalidation.reformat_dates()を用いた日付の変換を行う場合は、
		-- valueではなくiso_dateを変換の対象とする
		date_parameters_list[param_name].val = iso_date
		
	end
	
	if param_name == 'archive-date' then
		-- アーカイブの日付は常に日本語の形式に変換する
		validation.reformat_dates(date_parameters_list, 'ja')
		value = date_parameters_list[param_name].val
		
		if in_array(mw.ustring.sub(value, -1, -1), {'年', '月'}) then
			-- 変換後の日付が「年」または「月」で終わる場合はエラーとして扱う
			local args = { message = 'アーカイブの日付は年・月・日のすべてを記入してください。' }
			return value .. frame:expandTemplate{ title = 'Citation/showdateError' , args = args }
		end
		
		return value
		
	else
		-- 閲覧日・アーカイブ日以外の日付
		-- df引数が空でなければ、CS1モジュールを用いて日付を変換する
		local df = frame.args['df']
		if is_set(df) then
			validation.reformat_dates(date_parameters_list, df)
			value = date_parameters_list[param_name].val
		end
		
		return value
	end
end

return { show_date = show_date }