跳转到内容

模組:ISODate

被永久保护的模块
维基百科,自由的百科全书

这是本页的一个历史版本,由Where was I last night?留言 | 贡献2016年12月10日 (六) 16:44编辑。这可能和当前版本存在着巨大的差异。

require('Module:No globals')

local getArgs = require('Module:Arguments').getArgs
local p = {}

local function toISO(format, string)
	
	return mw.getCurrentFrame():callParserFunction('#time', format, string)
end

local function convert(input)
	input = input:gsub(" "," ");
	input = input:gsub("%s+"," ");
	local y, m, d, suf

	-- Converts Chinese language dates into ISO 8601 format
	y, m, d, suf = string.match(input, '^(%d+)年-(%d%d?)月(%d%d?)日(.*)$');
	if y then
		return toISO('Y-m-d', y .. '-' .. m .. '-' .. d) , suf
	end

	y, m, suf = string.match(input, '^(%d+)年(%d%d?)月(.*)$');
	if y then
		return toISO('Y-m', y .. '-' .. m) , suf
	end

	y, suf = string.match(input, '^(%d+)年(.*)$');
	if y then
		return toISO('Y', y) , suf
	end

	-- Converts English language dates into ISO 8601 format

	d, m, y, suf = string.match(input, '^(%d%d?) ?(%a+)[ ,]*(%d+)(.*)$');
	if y then
		return toISO('Y-m-d', d .. ' ' .. m .. y) , suf
	end

	m, d, y, suf = string.match(input, '^(%a+) ?(%d%d?)[ ,]+(%d+)(.*)$');
	if y then
		return toISO('Y-m-d', m .. ' ' .. d .. ',' .. y) , suf
	end

	m, y, suf = string.match(input, '^(%a+)[ ,]*(%d+)(.*)$');
	if y then
		return toISO('Y-m', m .. y), suf
	end

	-- Tries to fix non-standard ISO 8601 format

	y, m, d, suf = string.match(input, '^(%d+)%-(%d%d?)%-(%d%d?)(.*)$');
	if y then
		return toISO('Y-m-d', y .. '-' .. m .. '-' .. d) , suf
	end

	y, m, suf = string.match(input, '^(%d+)%-(%d%d?)(.*)$');
	if y then
		return toISO('Y-m', y .. '-' .. m) , suf
	end

	y, suf = string.match(input, '^(%d+)(.*)$');
	if y then
		return toISO('Y', y) , suf
	end

	-- Other cases

	return toISO('Y-m-d', 'error')
end

function p.dates(frame)
	local args = getArgs(frame)
	return p._dates(args)
end

function p._dates(args)
	local returnval, suf = convert(args[1])
	local errorMessage = toISO('Y-m-d', 'error')

	if returnval == errorMessage and args.error == 'ignore' then
		return args[1]
	end

	return returnval .. (args.suffix and suf or '')
end

function p.dateAndSuffix(string)
	return convert(string)
end

return p