「モジュール:Citation/Show date」の版間の差分
その他の操作
ja>本日晴天 一部のページでスクリプトエラーが発生する不具合を修正 |
細 1版をインポートしました タグ: モバイル編集 モバイルウェブ編集 |
(相違点なし)
| |
2025年10月23日 (木) 23:01時点における最新版
このモジュールについての説明文ページを モジュール: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 }