Moduuli:Wd:Daterange


-- Translates and format date range sand other non punctual dates
--inspired by [[Commons:Module:Other dates]]
local datemodule = require('Module:Date')
local fallback = require('Module:Fallback')
local p = {}
--[[ wikibase format
	precision = 
0: 1 Gigayear
1: 100 Megayears
2: 10 Megayears
3: Megayear
4: 100 Kiloyears
5: 10 Kiloyears
6: Kiloyear
7: 100 years
8: 10 years
9: years
10: months
11: days
12: hours
13: minutes
14: seconds	
]]-- 

local function totext(obj, lang, case)
	return datemodule.Wikibasedate(obj, lang, case)
end

local function from(startpoint, lang)
	local precision = tonumber(startpoint.precision)
	local value = fallback._langSwitch({
		ar = function() return 'من ' .. totext(startpoint, lang) end,
		bn = function() return totext(startpoint, lang) .. ' থেকে' end,
		cs = function() return 'od ' .. totext(startpoint, lang) end,
		de = function() return 'ab ' .. totext(startpoint, lang) end,
		el = function() return 'από ' .. totext(startpoint, lang) end,
		en = function() return 'from ' .. totext(startpoint, lang) end,
		et = function() return 'alates ' .. totext(startpoint, lang) end,
		fa = function() return 'از  ' .. totext(startpoint, lang) end,
		-- ? fi = // Template: {{#ifeq:{{IsNum|{{{2|}}} }}|1|vuodesta}} {{ISOdate|1={{{2|}}}|2=fi|form=ela}} alkaen
		fr = function()
			if precision > 10 then -- precision > month
				return "à partir du " .. totext(startpoint, lang)
			else 
				return "à partir de " .. totext(startpoint, lang)
			end
		end,
		gl = function() return 'desde o ' .. totext(startpoint, lang) end,
		he = function() return 'מ- ' .. totext(startpoint, lang) end,
		hr = function() return 'od ' .. totext(startpoint, lang) end,
		it = function() return 'dal ' .. totext(startpoint, lang) end,
		ja = function() return totext(startpoint, lang) .. 'から' end,
		mk = function() return 'од ' .. totext(startpoint, lang) end,
		ml = function() return totext(startpoint, lang) .. 'മുതൽ'	 end,
		nds = function() return 'vonaf ' .. totext(startpoint, lang) end,
		nl = function() return 'vanaf ' .. totext(startpoint, lang) end,
		no = function() return 'fra ' .. totext(startpoint, lang) end,
		pl = function() return 'od '  .. totext(startpoint, lang, 'gen') end,
		qu = function() return totext(startpoint, lang) .. " p'unchawmanta" end,
		ro = function() return 'din ' .. totext(startpoint, lang) end,
		ru = function() return 'С ' .. totext(startpoint, lang, 'gen') end,
		sl = function() return 'od ' .. totext(startpoint, lang, 'gen') end, 
		sv = function() return 'från ' .. totext(startpoint, lang) end,
		vi = function() return 'từ ' .. totext(startpoint, lang) end,
		}, lang)
	return value()
end


local function fromuntil(startpoint, endpoint, lang)
	local precision = tonumber(startpoint.precision) -- may need 2 precisions for start and end
	local value = fallback._langSwitch({
		ar = function() return  ' من ' .. totext(startpoint, lang) .. ' إلى ' end,
		bn = function() return totext(startpoint, lang) .. ' থেকে '.. totext(endpoint, lang) .. ' পর্যন্ত'end,
		ca = function() return totext(startpoint, lang)  .. ' fins ' .. totext(endpoint, lang) end,
		cs = function() return totext(startpoint, lang) .. ' až '.. totext(endpoint, lang) end,
		da = function() return 'fra ' .. totext(startpoint, lang) .. ' til '.. totext(endpoint, lang) end,
		de = function() return totext(startpoint, lang) .. ' bis '.. totext(endpoint, lang) end,
		el = function() return 'από ' .. totext(startpoint, lang) .. ' bis '.. totext(endpoint, lang) end,
		en = function() return 'from ' .. totext(startpoint, lang) .. ' to '.. totext(endpoint, lang) end,
		es = function() return 'de ' .. totext(startpoint, lang) .. ' a '.. totext(endpoint, lang) end,
		et = function() return 'fra ' .. totext(startpoint, lang) .. ' kuni '.. totext(endpoint, lang) end,
		fa = function() return ' از ' .. totext(startpoint, lang) .. ' تا ' end,
		fi = function() return totext(startpoint, lang) .. '-'.. totext(endpoint, lang) end,
		fr = function() -- could actually be better should be "d'octobre à mars 2013' not "de octore 2013 à mars 2013" 
			if precision > 10 then -- precision > month
				return "du " .. totext(startpoint, lang) .. " au " ..  totext(endpoint, lang)
			else
				-- "DE septebmbre" / "D'octobre"
				return require('Module:Linguistic').of(totext(startpoint, 'fr'), 'fr') .. " à " .. totext(endpoint, lang)
			end
		end,
		gl = function() return 'de ' .. totext(startpoint, lang) .. ' a '.. totext(endpoint, lang) end,
		he = function() return 'מ- ' .. totext(startpoint, lang) .. ' עד '.. totext(endpoint, lang) end,
		hr = function() return 'od ' .. totext(startpoint, lang) .. ' do '.. totext(endpoint, lang) end,
		hu = function() return totext(startpoint, lang) .. ' - '.. totext(endpoint, lang) end,
		it = function() return 'dal ' .. totext(startpoint, lang) .. ' al '.. totext(endpoint, lang) end,
		ja = function() return totext(startpoint, lang) .. 'から'.. totext(endpoint, lang) .. 'まで'end,
		mk = function() return 'од ' .. totext(startpoint, lang) .. ' до '.. totext(endpoint, lang) end,
		nds = function() return totext(startpoint, lang) .. ' bet '.. totext(endpoint, lang) end,
		nl = function() return totext(startpoint, lang) .. ' tot '.. totext(endpoint, lang) end,
		no = function() return totext(startpoint, lang) .. ' til '.. totext(endpoint, lang) end,
		pl = function() return 'od ' .. totext(startpoint, lang, 'gen') .. ' do '.. totext(endpoint, lang) end,
		pt = function() return 'de ' .. totext(startpoint, lang) .. ' a '.. totext(endpoint, lang) end,
		qu = function() return totext(startpoint, lang) .. " p'unchawmanta ".. totext(endpoint, lang) .. " p'unchawkama" end,
		ro = function() return  'din '.. totext(startpoint, lang) .. ' până în '.. totext(endpoint, lang) end,
		ru = function() return 'c ' .. totext(startpoint, lang, 'gen') .. ' до '.. totext(endpoint, lang, 'gen') end,
		sl = function() return 'od ' .. totext(startpoint, lang, 'gen') .. ' do '.. totext(endpoint, lang, 'gen') end,
		sv = function() return 'från ' .. totext(startpoint, lang) .. ' till '.. totext(endpoint, lang) end,
		uk= function() return 'з ' .. totext(startpoint, lang, 'gen') .. ' до '.. totext(endpoint, lang, 'gen') end,
		vi = function() return 'từ ' .. totext(startpoint, lang) .. ' đến '.. totext(endpoint, lang) end,
		zh = function() return '从' .. totext(startpoint, lang) .. '到'.. totext(endpoint, lang) end,
		['zh-hant'] = function() return '從' .. totext(startpoint, lang) .. '到'.. totext(endpoint, lang) end,
		default = function() return totext(startpoint, lang) .. '-'.. totext(endpoint, lang) end,
		}, lang)
	return value()
end


local function upto(endpoint, lang)
	local precision = tonumber(endpoint.precision) -- may need 2 precisions for start and end
	local value = fallback._langSwitch({
		bn = function() return totext(endpoint, lang) .. ' পর্যন্ত' end,
		en = function() return 'until '.. totext(endpoint, lang) end,
		fr = function()
			if precision > 10 then -- precision > month
				return "jusqu'au " .. totext(endpoint, lang)
			else 
				return "jusqu'à " .. totext(endpoint, lang)
			end
		end

		}, lang)
	return value()
end

function p.wikibasedaterange(timedata, lang, case)
	local startpoint, endpoint, timepoint = timedata.startpoint, timedata.endpoint, timedata.timepoint
	if startpoint and endpoint then
		return fromuntil(startpoint, endpoint, lang)
	end
	if startpoint then
		return from(startpoint, lang)
	end
	if endpoint then
		return upto(endpoint, lang)
	end
	if timepoint then
		return datemodule.Wikibasedate(timepoint, lang)
	end
end

function p.compactdaterange(timedata, lang) -- YXXX-YXXX format
	local startyear, endyear = '?', '?'
	local pattern = "(%W)(%d+)%-(%d+)%-(%d+)"
	local startera, endera, startyear, endyear
	if timedata.startpoint and timedata.startpoint.time then
		startera, startyear = timedata.startpoint.time:match(pattern)
	end
	if timedata.endpoint and timedata.endpoint.time then 
		endera, endyear = timedata.endpoint.time:match(pattern)
	end
	-- remove leading zeros
	while string.sub(startyear, 1,1) == '0' do
		startyear = string.sub(startyear, 2)
	end
	while string.sub(endyear, 1,1) == '0' do
		endyear = string.sub(endyear, 2)
	end
	return startyear .. '-' .. endyear
end
return p