모듈:Date2

--[[

This module is intended for processing of date strings.

Please do not modify this code without applying the changes first at Module:Date/sandbox and testing
at Module:Date/sandbox/testcases and Module talk:Date/sandbox/testcases.

Authors and maintainers:

  • User:Parent5446 - original version of the function mimicking template:ISOdate
  • User:Jarekt - original version of the functions mimicking template:Date and template:ISOyear

]]

local p = {}

-- =======================================
-- === Dependencies ======================
-- =======================================
local i18n = require('Module:I18n/date') get localized translations of date formats
local Fallback = require('Module:Fallback') get fallback functions
local yesno = require('Module:Yesno')

local i18n = {
DateLang = {
['ko'] = 'ko-form'
},
DateFormat = {
['ko-form'] = {
YMD ='Y년 F j일',
YM ='Y년 F',
Y ='Y',
}
}
}

--[[
Date

This function is the core part of the ISOdate template.

Usage:
{#invoke:Date|Date|year=|month=|day=|hour=|minute=|second=|lang=en}}

Parameters:

year,month,day,hour,minute,second: broken down date-time component strings
lang: The language to display it in
case: Language format (genitive, etc.) for some languages
class: CSS class for the
Error Handling:

]]
function p.Date(frame)
return p._Date(
{
frame.args["year"] or ,
frame.args["month"] or ,
frame.args["day"] or ,
},
frame.args["lang"] or 'ko', -- language
frame.args["trim_year"] or '100-999' -- by default pad one and 2 digit years to be 4 digit long, while keeping 3 digit years as is
)
end


function p._Date(datevec, lang, trim_year)
-- make sure inputs are in the right format
if #datevec<6 then
for i=#datevec,6,1 do datevec[i]= end
end
if not trim_year then trim_year = '100-999' end

-- if language is not provided than look up users language
-- WARNING: This step should be done by the template as it does not seem to work as well here (cache issues?)
if not lang or not mw.language.isValidCode( lang ) then
lang = 'ko'
end

-- Just in case someone broke the internationalization code than fix the english defaults
if i18n.DateLang['ko'] == nil then
i18n.DateLang['ko'] = 'ko-form'
end
if i18n.DateFormat['ko-form'] == nil then
i18n.DateFormat['ko-form'] = {
YMD ='Y년 F j일',
YM ='Y년 F',
Y ='Y',
}
end

-- create datecode based on which variables are provided and check for out of bound values
local maxval = {9999, 12, 31} -- max values for year, month, ...
local c = {'Y', 'M', 'D'}
local datecode = -- a string signifying which combination of variables was provided
local datenum = {} -- date-time encoded as a vector = [year, month, ... , second]
for i, v in ipairs( datevec ) do
if v~=nil and v~= then
datecode = datecode .. c[i]
datenum[i] = tonumber(v)
if datenum[i]==nil and i==2 then
-- month is not a number -> check if it is a month name in English
v = mw.language.new('en'):formatDate( "n", v)
datenum[i] = tonumber(v)
end
if datenum[i]==nil or datenum[i]>maxval[i] then
-- Some numbers are out of range -> abort and return the empty string
return
end
end
end

-- create time stamp string (for example 2000-02-20 02:20:20) based on which variables were provided
local timeStamp
if datecode:sub(1,3)=='YMD' then
timeStamp = string.format('%04i-%02i-%02i', datenum[1], datenum[2], datenum[3] )
datecode = 'YMD' -- 'YMD', 'YMDHMS' and 'YMDHM' are the only supported format starting with 'YMD'. All others will be converted to 'YMD'
elseif datecode == 'YM' then
timeStamp = string.format('%04i-%02i', datenum[1], datenum[2] )
elseif datecode:sub(1,1)=='Y' then
timeStamp = string.format('%04i', datenum[1] )
datecode = 'Y'
else
return -- format not supported
end

-- ==========================================================
-- === Create Date String using in chosen language
-- ==========================================================

-- which form should the date take?
-- Use Fallback module to handle rare languages which are more likely to use different for than default EN form
local langDateForm = 'ko-form'

-- Look up country specific format input to {{#time}} function
local dFormat = i18n.DateFormat[langDateForm][datecode]

-- Lua only date formating using {{#time}} parser function (new)
-- prefered call which gives "Lua error: too many language codes requested." on the Module talk:Date/sandbox/testcases page
--local datestr = mw.language.new(lang):formatDate( dFormat, timeStamp)
local datestr = mw.getCurrentFrame():callParserFunction( "#time", { dFormat, timeStamp, lang } )

-- If year<1000 than either keep it padded to the length of 4 digits or trim it
-- decide if the year will stay padded with zeros (for years in 0-999 range)
if datenum[1]~= nil and datenum[1]<1000 then
local trim = yesno(trim_year,nil)
if trim == nil then
local YMin, YMax = trim_year:match( '(%d+)-(%d+)' )
trim = (YMin~=nil and datenum[1]>=tonumber(YMin) and datenum[1]<=tonumber(YMax))
end

-- If the date form isn't the Thai solar calendar, don't zero pad years in the range of 100-999.
-- If at some point support for Islamic/Hebrew/Japanese years is added, they may need to be skipped as well.
if trim then
--local yearStr1 = mw.language.new(lang):formatDate( 'Y', timeStamp)
local yearStr1 = mw.getCurrentFrame():callParserFunction( "#time", { 'Y', timeStamp, lang } )
local yearStr1 = datestr:match( '%d%d%d%d' ) 4 digits in a row (in any language) - that must be a year
local yearStr2 = yearStr1
local zeroStr = mw.ustring.sub(yearStr1,1,1)
for i=1,3 do -- trim leading zeros
if mw.ustring.sub(yearStr2,1,1)==zeroStr then
yearStr2 = mw.ustring.sub(yearStr2, 2, 5-i)
else
break
end
end
datestr = datestr:gsub( yearStr1, yearStr2 )
--datestr = string.format('%s (%s, %s)', datestr, yearStr1, yearStr2 )
end
end

return datestr
end

return p