Modul:Age

Frå Wikipedia – det frie oppslagsverket

Dokumentasjon for modulen kan opprettast på Modul:Age/dok


local h = {}

local months = {
	['jan'] = 'January',
	['januar'] = 'January',
	['feb'] = 'February',
	['februar'] = 'February',
	['mar'] = 'March',
	['mars'] = 'March',
	['apr'] = 'April',
	['april'] = 'April',
	['mai'] = 'May',
	['jun'] = 'June',
	['juni'] = 'June',
	['jul'] = 'July',
	['juli'] = 'July',
	['aug'] = 'August',
	['august'] = 'August',
	['sep'] = 'September',
	['september'] = 'September',
	['okt'] = 'October',
	['oktober'] = 'October',
	['nov'] = 'November',
	['november'] = 'November',
	['des'] = 'December',
	['desember'] = 'December',
}

local lang = mw.language.getContentLanguage()

local function translate( date )
	local day, month, year
	local i, j

	i, j = mw.ustring.find( date, "^%d+")
	if not i then
		return date
	end
	day = mw.ustring.sub( date, i, j )
	if not tonumber( day ) then
		return date
	end
	
	i, j = mw.ustring.find( date, "%s%a+", j )
	if not i then
		return date
	end
	month = months[mw.ustring.sub( date, i+1, j )]
	if not month then
		return date
	end

	i, j = mw.ustring.find( date, "%s%d+", j )
	if not i then
		return date
	end
	year = mw.ustring.sub( date, i+1, j )
	if not tonumber( day ) then
		return date
	end
	
	return mw.ustring.format( "%s %s %s", day, month, year )
end

local function getYear( date )
	return tonumber( lang:formatDate( 'Y', date, true ) )
end

local function getMonth( date )
	return tonumber( lang:formatDate( 'n', date, true ) )
end

local function getDate( date )
	return tonumber( lang:formatDate( 'j', date, true ) )
end

local function duration( first, last )
	local age = getYear( last ) - getYear( first )
	if getMonth( last ) < getMonth( first ) then
		age = age - 1
	elseif getMonth( last ) == getMonth( first ) then
		if getDate( last ) < getDate( first ) then
			age = age - 1;
		end
	end
	return age
end

function h.duration( frame )
	local first = frame.args['first'] or frame.args[1]
	if not first or mw.ustring.find( first, '^%s$' ) then
		return ''
	end
	first = translate( mw.ustring.gsub( first, "<[^>]+>", "" ) )
	local last = frame.args['last'] or frame.args[2]
	if not last or mw.ustring.find( last, '^%s$' ) then
		last = mw.language.getContentLanguage():formatDate( 'Y-m-d' )
		if not last or mw.ustring.find( last, '^%s$' ) then
			return ''
		end
	end
	last = translate( mw.ustring.gsub( last, "<[^>]+>", "" ) )
	local res, age = pcall( duration, first, last )
	if not res or age < 0 then
		return ''
	end
	local msg = mw.message.new( 'gadget-age-years-plain' ); -- this can't handle plural
	if not msg:exists() then
		msg = mw.message.newRawMessage( '($1 years)' )
	end
	if not msg:exists() then
		return ''
	end
	msg:numParams( age )
	return msg:plain()
end

return h