Modül:Geçen zaman
Görünüm
Modül belgelemesi[oluştur]
Bu modül şu Lua modülünü kullanıyor: |
-- [[Ş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