Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
Commit 366c7a25 authored by Ary Borenszweig's avatar Ary Borenszweig
Browse files

Some time refactors to reuse code for the parser

parent 595f24dc
No related merge requests found
require "./*"
require "./**"
lib C
struct TimeSpec
......
struct TimeFormat
MONTH_NAMES = %w(January February March April May June July August September October November December)
DAY_NAMES = %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
getter pattern
def initialize(@pattern : String)
end
def parse(string)
# TimeParser.new(pattern, string).parse
end
def format(time : Time)
String.build do |str|
format time, str
......@@ -14,237 +15,7 @@ struct TimeFormat
end
def format(time : Time, io : IO)
i = 0
bytesize = pattern.bytesize
str = pattern.cstr
while i < bytesize
byte = str[i]
case byte.chr
when '%'
i += 1
byte = str[i]
case byte.chr
when 'a'
percent_a time, io
when 'A'
io << day_name(time)
when 'b', 'h'
percent_b time, io
when 'c'
percent_a time, io
char ' ', io
percent_b time, io
char ' ', io
percent_e time, io
char ' ', io
percent_T time, io
char ' ', io
percent_Y time, io
when 'B'
io << month_name(time)
when 'C'
io << time.year / 100
when 'd'
pad2 time.day, '0', io
when 'D', 'x'
percent_m time, io
char '/', io
percent_d time, io
char '/', io
percent_y time, io
when 'e'
percent_e time, io
when 'F'
percent_Y time, io
char '-', io
percent_m time, io
char '-', io
percent_d time, io
when 'j'
pad3 time.day_of_year, '0', io
when 'H'
percent_H time, io
when 'I'
percent_I time, io
when 'k'
pad2 time.hour, ' ', io
when 'l'
pad2 (time.hour % 12), ' ', io
when 'L'
pad3 time.millisecond, '0', io
when 'm'
percent_m time, io
when 'M'
percent_M time, io
when 'p'
io << (time.hour < 12 ? "am" : "pm")
when 'P'
percent_P time, io
when 'r'
percent_I time, io
char ':', io
percent_M time, io
char ':', io
percent_S time, io
char ' ', io
percent_P time, io
when 'R'
percent_H time, io
char ':', io
percent_M time, io
when 'S'
percent_S time, io
when 'T'
percent_T time, io
when 'u'
v = time.day_of_week
v = 7 if v == 0
io << v
when 'w'
io << time.day_of_week
when 'X'
percent_T time, io
when 'y'
percent_y time, io
when 'Y'
percent_Y time, io
when '_'
i += 1
byte = str[i]
case byte.chr
when 'm'
pad2 time.month, ' ', io
else
char '%', io
char '_', io
io.write_byte byte
end
when '-'
i += 1
byte = str[i]
case byte.chr
when 'd'
io << time.day
when 'm'
io << time.month
else
char '%', io
char '-', io
io.write_byte byte
end
when '^'
i += 1
byte = str[i]
case byte.chr
when 'A'
io << day_name(time).upcase
when 'b', 'h'
io << short_month_name(time).upcase
when 'B'
io << month_name(time).upcase
else
char '%', io
char '^', io
io.write_byte byte
end
when '%'
char '%', io
else
char '%', io
io.write_byte byte
end
else
io.write_byte byte
end
i += 1
end
end
private def percent_a(time, io)
io << short_day_name(time)
end
private def percent_b(time, io)
io << short_month_name(time)
end
private def percent_d(time, io)
pad2 time.day, '0', io
end
private def percent_e(time, io)
pad2 time.day, ' ', io
end
private def percent_H(time, io)
pad2 time.hour, '0', io
end
private def percent_I(time, io)
pad2 (time.hour % 12), '0', io
end
private def percent_m(time, io)
pad2 time.month, '0', io
end
private def percent_M(time, io)
pad2 time.minute, '0', io
end
private def percent_P(time, io)
io << (time.hour < 12 ? "AM" : "PM")
end
private def percent_S(time, io)
pad2 time.second, '0', io
end
private def percent_T(time, io)
percent_H time, io
char ':', io
percent_M time, io
char ':', io
percent_S time, io
end
private def percent_y(time, io)
io << time.year % 100
end
private def percent_Y(time, io)
io << time.year
end
private def char(char, io)
io.write_byte char.ord.to_u8
end
private def month_name(time)
MONTH_NAMES[time.month]
end
private def short_month_name(time)
month_name(time)[0, 3]
end
private def day_name(time)
DAY_NAMES[time.day_of_week]
end
private def short_day_name(time)
day_name(time)[0, 3]
end
private def pad2(value, padding, io)
io.write_byte padding.ord.to_u8 if value < 10
io << value
end
private def pad3(value, padding, io)
io.write_byte padding.ord.to_u8 if value < 100
pad2 value, padding, io
formatter = Formatter.new(time, io)
formatter.visit(pattern)
end
end
require "pattern"
struct TimeFormat
struct Formatter
include Pattern
getter io
getter time
def initialize(@time, @io)
end
def short_day_name
io << get_short_day_name
end
def day_name
io << get_day_name
end
def short_month_name
io << get_short_month_name
end
def month_name
io << get_month_name
end
def year_divided_by_100
io << time.year / 100
end
def day_of_month_zero_padded
pad2 time.day, '0'
end
def day_of_month_blank_padded
pad2 time.day, ' '
end
def hour_24_zero_padded
pad2 time.hour, '0'
end
def hour_12_zero_padded
pad2 (time.hour % 12), '0'
end
def day_of_year_zero_padded
pad3 time.day_of_year, '0'
end
def hour_24_blank_padded
pad2 time.hour, ' '
end
def hour_12_blank_padded
pad2 (time.hour % 12), ' '
end
def milliseconds
pad3 time.millisecond, '0'
end
def month_zero_padded
pad2 time.month, '0'
end
def minute_zero_padded
pad2 time.minute, '0'
end
def am_pm
io << (time.hour < 12 ? "am" : "pm")
end
def am_pm_upcase
io << (time.hour < 12 ? "AM" : "PM")
end
def second_zero_padded
pad2 time.second, '0'
end
def day_of_week_monday_1_7
v = time.day_of_week
v = 7 if v == 0
io << v
end
def day_of_week_sunday_0_6
io << time.day_of_week
end
def year_modulo_100
io << time.year % 100
end
def year
io << time.year
end
def month_blank_padded
pad2 time.month, ' '
end
def day
io << time.day
end
def month
io << time.month
end
def day_name_upcase
io << get_day_name.upcase
end
def short_month_name_upcase
io << get_short_month_name.upcase
end
def month_name_upcase
io << get_month_name.upcase
end
def byte(byte)
io.write_byte byte
end
def get_month_name
MONTH_NAMES[time.month]
end
def get_short_month_name
get_month_name[0, 3]
end
def get_day_name
DAY_NAMES[time.day_of_week]
end
def get_short_day_name
get_day_name[0, 3]
end
def pad2(value, padding)
io.write_byte padding.ord.to_u8 if value < 10
io << value
end
def pad3(value, padding)
io.write_byte padding.ord.to_u8 if value < 100
pad2 value, padding
end
end
end
struct TimeFormat
module Pattern
MONTH_NAMES = %w(January February March April May June July August September October November December)
DAY_NAMES = %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
def visit(pattern)
i = 0
bytesize = pattern.bytesize
str = pattern.cstr
while i < bytesize
byte = str[i]
case byte.chr
when '%'
i += 1
byte = str[i]
case byte.chr
when 'a'
short_day_name
when 'A'
day_name
when 'b', 'h'
short_month_name
when 'c'
date_and_time
when 'B'
month_name
when 'C'
year_divided_by_100
when 'd'
day_of_month_zero_padded
when 'D', 'x'
date
when 'e'
day_of_month_blank_padded
when 'F'
iso_8601_date
when 'j'
day_of_year_zero_padded
when 'H'
hour_24_zero_padded
when 'I'
hour_12_zero_padded
when 'k'
hour_24_blank_padded
when 'l'
hour_12_blank_padded
when 'L'
milliseconds
when 'm'
month_zero_padded
when 'M'
minute_zero_padded
when 'p'
am_pm
when 'P'
am_pm_upcase
when 'r'
twelve_hour_time
when 'R'
twenty_four_hour_time
when 'S'
second_zero_padded
when 'T'
twenty_four_hour_time_with_seconds
when 'u'
day_of_week_monday_1_7
when 'w'
day_of_week_sunday_0_6
when 'X'
twenty_four_hour_time_with_seconds
when 'y'
year_modulo_100
when 'Y'
year
when '_'
i += 1
byte = str[i]
case byte.chr
when 'm'
month_blank_padded
else
char '%'
char '_'
byte byte
end
when '-'
i += 1
byte = str[i]
case byte.chr
when 'd'
day
when 'm'
month
else
char '%'
char '-'
byte byte
end
when '^'
i += 1
byte = str[i]
case byte.chr
when 'A'
day_name_upcase
when 'b', 'h'
short_month_name_upcase
when 'B'
month_name_upcase
else
char '%'
char '^'
byte byte
end
when '%'
char '%'
else
char '%'
byte byte
end
else
byte byte
end
i += 1
end
end
def char(char)
byte char.ord.to_u8
end
def date_and_time
short_day_name
char ' '
short_month_name
char ' '
day_of_month_blank_padded
char ' '
twenty_four_hour_time_with_seconds
char ' '
year
end
def date
month_zero_padded
char '/'
day_of_month_zero_padded
char '/'
year_modulo_100
end
def iso_8601_date
year
char '-'
month_zero_padded
char '-'
day_of_month_zero_padded
end
def twelve_hour_time
hour_12_zero_padded
char ':'
minute_zero_padded
char ':'
second_zero_padded
char ' '
am_pm_upcase
end
def twenty_four_hour_time
hour_24_zero_padded
char ':'
minute_zero_padded
end
def twenty_four_hour_time_with_seconds
hour_24_zero_padded
char ':'
minute_zero_padded
char ':'
second_zero_padded
end
end
end
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment