X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/f8a22c0affe52ea630f05a438a88bcc300716d04..d08da842dbdcc2b452fdb6a70cb82f6cc85dc118:/luatz/strftime.lua diff --git a/luatz/strftime.lua b/luatz/strftime.lua index 55e7b67..223da0f 100644 --- a/luatz/strftime.lua +++ b/luatz/strftime.lua @@ -1,20 +1,21 @@ local strformat = string.format local floor = math.floor -local function idiv ( n , d ) - return floor ( n / d ) +local function idiv(n, d) + return floor(n / d) end local c_locale = { - abday = { "Sun" , "Mon" , "Tue" , "Wed" , "Thu" , "Fri" , "Sat" } ; - day = { "Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" } ; - abmon = { "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" , "Aug" , "Sep" , "Oct" , "Nov" , "Dec" } ; - mon = { "January" , "February" , "March" , "April" , "May" , "June" , "July" , "August" , "September" , "October" , "November" , "December" } ; - am_pm = { "AM" , "PM" } ; + abday = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; + day = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; + abmon = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + mon = {"January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"}; + am_pm = {"AM", "PM"}; } --- ISO-8601 week logic -- ISO 8601 weekday as number with Monday as 1 (1-7) -local function iso_8601_weekday ( wday ) +local function iso_8601_weekday(wday) if wday == 1 then return 7 else @@ -23,187 +24,187 @@ local function iso_8601_weekday ( wday ) end local iso_8601_week do -- Years that have 53 weeks according to ISO-8601 - local long_years = { } - for i, v in ipairs { + local long_years = {} + for _, v in ipairs { 4, 9, 15, 20, 26, 32, 37, 43, 48, 54, 60, 65, 71, 76, 82, 88, 93, 99, 105, 111, 116, 122, 128, 133, 139, 144, 150, 156, 161, 167, 172, 178, 184, 189, 195, 201, 207, 212, 218, 224, 229, 235, 240, 246, 252, 257, 263, 268, 274, 280, 285, 291, 296, 303, 308, 314, 320, 325, 331, 336, 342, 348, 353, 359, 364, 370, 376, 381, 387, 392, 398 } do - long_years [ v ] = true + long_years[v] = true end - local function is_long_year ( year ) - return long_years [ year % 400 ] + local function is_long_year(year) + return long_years[year % 400] end - function iso_8601_week ( self ) - local wday = iso_8601_weekday ( self.wday ) + function iso_8601_week(self) + local wday = iso_8601_weekday(self.wday) local n = self.yday - wday local year = self.year if n < -3 then year = year - 1 - if is_long_year ( year ) then - return year , 53 , wday + if is_long_year(year) then + return year, 53, wday else - return year , 52 , wday + return year, 52, wday end - elseif n >= 361 and not is_long_year ( year ) then - return year + 1 , 1 , wday + elseif n >= 361 and not is_long_year(year) then + return year + 1, 1, wday else - return year , idiv ( n + 10 , 7 ) , wday + return year, idiv(n + 10, 7), wday end end end --- Specifiers -local t = { } -function t:a ( locale ) - return "%s" , locale.abday [ self.wday ] +local t = {} +function t:a(locale) + return "%s", locale.abday[self.wday] end -function t:A ( locale ) - return "%s" , locale.day [ self.wday ] +function t:A(locale) + return "%s", locale.day[self.wday] end -function t:b ( locale ) - return "%s" , locale.abmon [ self.month ] +function t:b(locale) + return "%s", locale.abmon[self.month] end -function t:B ( locale ) - return "%s" , locale.mon [ self.month ] +function t:B(locale) + return "%s", locale.mon[self.month] end -function t:c ( locale ) - return "%.3s %.3s%3d %.2d:%.2d:%.2d %d" , - locale.abday [ self.wday ] , locale.abmon [ self.month ] , - self.day , self.hour , self.min , self.sec , self.year +function t:c(locale) + return "%.3s %.3s%3d %.2d:%.2d:%.2d %d", + locale.abday[self.wday], locale.abmon[self.month], + self.day, self.hour, self.min, self.sec, self.year end -- Century -function t:C ( ) - return "%02d" , idiv ( self.year , 100 ) +function t:C() + return "%02d", idiv(self.year, 100) end -function t:d ( ) - return "%02d" , self.day +function t:d() + return "%02d", self.day end -- Short MM/DD/YY date, equivalent to %m/%d/%y -function t:D ( ) - return "%02d/%02d/%02d" , self.month , self.day , self.year % 100 +function t:D() + return "%02d/%02d/%02d", self.month, self.day, self.year % 100 end -function t:e ( ) - return "%2d" , self.day +function t:e() + return "%2d", self.day end -- Short YYYY-MM-DD date, equivalent to %Y-%m-%d -function t:F ( ) - return "%d-%02d-%02d" , self.year , self.month , self.day +function t:F() + return "%d-%02d-%02d", self.year, self.month, self.day end -- Week-based year, last two digits (00-99) -function t:g ( ) - return "%02d" , iso_8601_week ( self ) % 100 +function t:g() + return "%02d", iso_8601_week(self) % 100 end -- Week-based year -function t:G ( ) - return "%d" , iso_8601_week ( self ) +function t:G() + return "%d", iso_8601_week(self) end t.h = t.b -function t:H ( ) - return "%02d" , self.hour +function t:H() + return "%02d", self.hour end -function t:I ( ) - return "%02d" , (self.hour-1) % 12 + 1 +function t:I() + return "%02d", (self.hour-1) % 12 + 1 end -function t:j ( ) - return "%03d" , self.yday +function t:j() + return "%03d", self.yday end -function t:m ( ) - return "%02d" , self.month +function t:m() + return "%02d", self.month end -function t:M ( ) - return "%02d" , self.min +function t:M() + return "%02d", self.min end -- New-line character ('\n') -function t:n ( ) +function t:n() -- luacheck: ignore 212 return "\n" end -function t:p ( locale ) +function t:p(locale) return self.hour < 12 and locale.am_pm[1] or locale.am_pm[2] end -- TODO: should respect locale -function t:r ( locale ) - return "%02d:%02d:%02d %s" , - (self.hour-1) % 12 + 1 , self.min , self.sec , +function t:r(locale) + return "%02d:%02d:%02d %s", + (self.hour-1) % 12 + 1, self.min, self.sec, self.hour < 12 and locale.am_pm[1] or locale.am_pm[2] end -- 24-hour HH:MM time, equivalent to %H:%M -function t:R ( ) - return "%02d:%02d" , self.hour , self.min +function t:R() + return "%02d:%02d", self.hour, self.min end -function t:s ( ) - return "%d" , self:timestamp ( ) +function t:s() + return "%d", self:timestamp() end -function t:S ( ) - return "%02d" , self.sec +function t:S() + return "%02d", self.sec end -- Horizontal-tab character ('\t') -function t:t ( ) +function t:t() -- luacheck: ignore 212 return "\t" end -- ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S -function t:T ( ) - return "%02d:%02d:%02d" , self.hour , self.min , self.sec +function t:T() + return "%02d:%02d:%02d", self.hour, self.min, self.sec end -function t:u ( ) - return "%d" , iso_8601_weekday ( self.wday ) +function t:u() + return "%d", iso_8601_weekday(self.wday) end -- Week number with the first Sunday as the first day of week one (00-53) -function t:U ( ) - return "%02d" , idiv ( self.yday - self.wday + 7 , 7 ) +function t:U() + return "%02d", idiv(self.yday - self.wday + 7, 7) end -- ISO 8601 week number (00-53) -function t:V ( ) - return "%02d" , select ( 2 , iso_8601_week ( self ) ) +function t:V() + return "%02d", select(2, iso_8601_week(self)) end -- Weekday as a decimal number with Sunday as 0 (0-6) -function t:w ( ) - return "%d" , self.wday - 1 +function t:w() + return "%d", self.wday - 1 end -- Week number with the first Monday as the first day of week one (00-53) -function t:W ( ) - return "%02d" , idiv ( self.yday - iso_8601_weekday ( self.wday ) + 7 , 7 ) +function t:W() + return "%02d", idiv(self.yday - iso_8601_weekday(self.wday) + 7, 7) end -- TODO make t.x and t.X respect locale t.x = t.D t.X = t.T -function t:y ( ) - return "%02d" , self.year % 100 +function t:y() + return "%02d", self.year % 100 end -function t:Y ( ) - return "%d" , self.year +function t:Y() + return "%d", self.year end -- TODO timezones -function t:z ( ) +function t:z() -- luacheck: ignore 212 return "+0000" end -function t:Z ( ) +function t:Z() -- luacheck: ignore 212 return "GMT" end -- A literal '%' character. -t["%"] = function ( self ) +t["%"] = function(self) -- luacheck: ignore 212 return "%%" end -local function strftime ( format_string , timetable ) - return ( string.gsub ( format_string , "%%([EO]?)(.)" , function ( locale_modifier , specifier ) - local func = t [ specifier ] +local function strftime(format_string, timetable) + return (string.gsub(format_string, "%%([EO]?)(.)", function(locale_modifier, specifier) + local func = t[specifier] if func then - return strformat ( func ( timetable , c_locale ) ) + return strformat(func(timetable, c_locale)) else - error ( "invalid conversation specifier '%"..locale_modifier..specifier.."'" , 3 ) + error("invalid conversation specifier '%"..locale_modifier..specifier.."'", 3) end - end ) ) + end)) end -local function asctime ( timetable ) +local function asctime(timetable) -- Equivalent to the format string "%c\n" - return t.c ( timetable , c_locale ) .. "\n" + return strformat(t.c(timetable, c_locale)) .. "\n" end return { - strftime = strftime ; - asctime = asctime ; + strftime = strftime; + asctime = asctime; }