メニューを切り替える
個人設定メニューを切り替える
個人メニューを切り替える
ログインしていません
編集を行うと、IPアドレスが公開されます。
2025年10月23日 (木) 23:01時点におけるNull base (トーク | 投稿記録)による版 (1版をインポートしました)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

このモジュールについての説明文ページを モジュール:Citation/Show date/doc に作成できます

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 }