Modül:Geçen zaman

Vikipedi, özgür ansiklopedi
Modül belgelemesi[oluştur]
-- [[Şablon:Geçen zaman]]ın gerçeklemesi

local numberSpell, yesno  -- lazy load

function numberSpell(arg)
 numberSpell = require('Module:NumberSpell')._main
 return numberSpell(arg)
end

function yesno(arg)
 yesno = require('Module:Yesno')
 return yesno(arg)
end

local p = {}

local getArgs = require('Modül:Bağımsız değişkenler').getArgs

-- lang.formatDate() Türkçe için çalışmıyor, o yüzden İngilizceye çeviriyoruz
-- bu sözlük çeviri için
local wordDictionary = {
	['önce'] = 'ago',
	['saniye'] = 'seconds',
	['dakika'] = 'minutes',
	['saat'] = 'hours',
	['gün'] = 'days',
	['hafta'] = 'weeks',
	['ay'] = 'months',
	['yıl'] = 'years',
	['ocak'] = 'January',
	['şubat'] = 'February',
	['mart'] = 'March',
	['nisan'] = 'April',
	['mayıs'] = 'May',
	['haziran'] = 'June',
	['temmuz'] = 'July',
	['ağustos'] = 'August',
	['eylül'] = 'September',
	['ekim'] = 'October',
	['kasım'] = 'November',
	['aralık'] = 'December',
}

-- Türkçe karakterler içeren kelimeleri yakalayabilmek için
local turkishWordPattern = "[a-zA-ZçÇğĞıİöÖşŞüÜ]+"

function translateWord(word)
  local word_lower = string.lower(word)
  	-- eğer sözlükte varsa çevir
  	if wordDictionary[word_lower] ~= nil then
  		return wordDictionary[word_lower]
  	end
  -- yoksa hata oluştur
  error('Sözlükte olmayan kelime: '.. word)
end

function translateDate(date)
  -- gsub bu örüntüye uygun her kelimeyi sırayla yakalayacak
  -- yakaladıklarını translateWord fonksiyonu ile çevirecek
  return string.gsub(date, turkishWordPattern, translateWord)
end

-- Table to convert entered text values to numeric values.
local timeText = {
 ['saniye'] = 1,
 ['dakika'] = 60,
 ['saat'] = 3600,
 ['gün'] = 86400,
 ['hafta'] = 604800,
 ['ay'] = 2629800,  -- 365.25 * 24 * 60 * 60 / 12
 ['yıl'] = 31557600
}

-- Table containing tables of possible units to use in output.
local timeUnits = {
 [1] = 'saniye',
 [60] = 'dakika',
 [3600] = 'saat',
 [86400] = 'gün',
 [604800] = 'hafta',
 [2629800] = 'ay',
 [31557600] = 'yıl',
}

function p._main( args )
 -- Initialize variables
 local lang = mw.language.getContentLanguage()
 local auto_magnitude_num
 local min_magnitude_num
 local magnitude = args.magnitude
 local min_magnitude = args.min_magnitude
 local purge = args.purge

-- Tarihi İngilizceye çevirmeyi dene, olmuyorsa (örn. zaten İngilizceyse) aynen devam et
 local success, date_translated = pcall(translateDate, args[1])
 local date_text = args[1]
 if success then
 	date_text = date_translated
 end
 	
 -- Add a purge link if something (usually "yes") is entered into the purge parameter
 if purge then
   purge = ' <span class="plainlinks">([' .. mw.title.getCurrentTitle():fullUrl('action=purge') .. ' purge])</span>'
 else
   purge = ''
 end


 -- Check that the entered timestamp is valid. If it isn't, then give an error message.
 -- Bu noktada lang.formatDate Türkçe için çalışmıyor, o yüzden yukarıda tarihi İngilizceye çevirdik
 local success, inputTime = pcall( lang.formatDate, lang, 'xnU', date_text )
 if not success then
   return '<strong class="error">Error: first parameter (' .. date_text .. ') cannot be parsed as a date or time.</strong>'
 end

 -- Store the difference between the current time and the inputted time, as well as its absolute value.
 local timeDiff = lang:formatDate( 'xnU' ) - inputTime
 local absTimeDiff = math.abs( timeDiff )

 if magnitude then
   auto_magnitude_num = 0
   min_magnitude_num = timeText[magnitude]
 else
   -- Calculate the appropriate unit of time if it was not specified as an argument.
   local autoMagnitudeData = {
     { factor = 2, amn = 31557600 },
     { factor = 2, amn = 2629800 },
     { factor = 2, amn = 86400 },
     { factor = 2, amn = 3600 },
     { factor = 2, amn = 60 }
   }
   for _, t in ipairs( autoMagnitudeData ) do
     if absTimeDiff / t.amn >= t.factor then
       auto_magnitude_num = t.amn
       break
     end
   end
   auto_magnitude_num = auto_magnitude_num or 1
   if min_magnitude then
     min_magnitude_num = timeText[min_magnitude]
   else
     min_magnitude_num = -1
   end
 end

 if not min_magnitude_num then
   -- Default to seconds if an invalid magnitude is entered.
   min_magnitude_num = 1
 end

 local result_num
 local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num )
 local unit = timeUnits[magnitude_num]
 if unit and absTimeDiff >= 864000 then
   local Date = require('Module:Date')._Date
   local input = lang:formatDate('Y-m-d H:i:s', date_text)  -- Date needs a clean date
   input = Date(input)
   if input then
     local id
     if input.hour == 0 and input.minute == 0 then
       id = 'currentdate'
     else
       id = 'currentdatetime'
     end
     result_num = (Date(id) - input):age(unit)
   end
 end
 result_num = result_num or math.floor ( absTimeDiff / magnitude_num )

 local punctuation_key, suffix
 if timeDiff >= 0 then -- Past
   if result_num == 1 then
     punctuation_key = 1
   else
     punctuation_key = 2
   end
   if args.ago == '' then
     suffix = ''
   else
     suffix = ' ' .. (args.ago or 'önce')
   end
 else -- Future
   if args.ago == '' then
     suffix = ''
     if result_num == 1 then
       punctuation_key = 1
     else
       punctuation_key = 2
     end
   else
     suffix = ' sonra'
     if result_num == 1 then
       punctuation_key = 3
     else
       punctuation_key = 4
     end
   end
 end
 local result_unit = timeUnits[ magnitude_num ]

 -- Convert numerals to words if appropriate.
 local spell_out = args.spellout
 local spell_out_max = tonumber(args.spelloutmax)
 local result_num_text
 if spell_out and (
   ( spell_out == 'auto' and 1 <= result_num and result_num <= 9 and result_num <= ( spell_out_max or 9 ) ) or
   ( yesno( spell_out ) and 1 <= result_num and result_num <= 100 and result_num <= ( spell_out_max or 100 ) )
   )
 then
   result_num_text = numberSpell( result_num )
 else
   result_num_text = tostring( result_num )
 end

 -- numeric or string
 local numeric_out = args.numeric
 local result = ""
 if numeric_out then
   result = tostring( result_num )
 else
   result = result_num_text .. ' ' .. result_unit .. suffix -- Spaces for suffix have been added in earlier.
 end

 return result .. purge
end

function p.main( frame )
	
 local args = getArgs( frame, {
   valueFunc = function( k, v )
     if v then
       v = v:match( '^%s*(.-)%s*$' ) -- Trim whitespace.
       if k == 'önce' or v ~= '' then
         return v
       end
     end
     return nil
   end,
   wrappers = 'Şablon:Geçen zaman'
 })
 return p._main( args )
end

return p