モジュール:Citation/Show date
| このLuaモジュールは610,000以上のページで使われています。 余計な混乱やサーバーへの負荷を避けるために、どんな変更でも最初はモジュールのサンドボックス・サブページ、テストケース・サブページで試すべきです。そうすれば、試した変更を1度の編集でこのモジュールに加えることができます。しかし、最初にあなたの提案した変更を、この項目のノートで議論するようにお願いします。 |
| Luaモジュールを使用しています: |
このモジュールは出典テンプレートで使われる各種の日付を表示します。{{Citation/showdate}}・{{Citation/showdateEN}}の内部で使用されているほか、各種出典テンプレートから直接使用することもできます。
従来のテンプレートで有効な日付形式は基本的にサポートしている一方で、CS1モジュールの機能を利用することで、|df=による日付の変換や、範囲を含む日付のような複雑な形式もサポートしているのが特長です。
使い方
書式
{{#invoke:Citation/Show date |show_date |1= |param-name= |post-text= |df=}}
|1=に日付を指定してください。
|param-name=にはdate・publication-date・doi-broken-date・archive-date・access-dateのような日付の種類を指定します。省略するか空文字列を指定した場合は、dateが指定された場合と同じ動作になります。
|post-text=には閲覧日の後ろに表示する文字列を指定します。この引数は|param-name=access-dateを同時に指定した場合のみ有効です。|post-text=を指定しなかった場合は閲覧日の後ろに「閲覧。」を表示します。空文字列を指定した場合は閲覧日の後ろに文字列を追加しません。
|df=には日付の表示形式を指定します。指定可能な値にはja・ymd・mdy・dmyなどがあり、それぞれの意味合いは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 }