|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
/*
|
|
|
|
|
XOWA: the XOWA Offline Wiki Application
|
|
|
|
|
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
|
|
|
|
Copyright (C) 2012-2021 gnosygnu@gmail.com
|
|
|
|
|
|
|
|
|
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
|
|
|
|
or alternatively under the terms of the Apache License Version 2.0.
|
|
|
|
@ -13,216 +13,226 @@ The terms of each license can be found in the source code repository:
|
|
|
|
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|
|
|
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|
|
|
|
*/
|
|
|
|
|
package gplx.xowa.xtns.pfuncs.times; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
|
|
|
|
|
import gplx.core.btries.*;
|
|
|
|
|
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
|
|
|
|
|
import gplx.xowa.parsers.*;
|
|
|
|
|
public class Pft_fmt_itm_ {
|
|
|
|
|
public static final int
|
|
|
|
|
Tid_seg_int = 1
|
|
|
|
|
, Tid_hour_base12 = 2
|
|
|
|
|
, Tid_dow_base0 = 3
|
|
|
|
|
, Tid_seg_str = 4
|
|
|
|
|
, Tid_year_isLeap = 5
|
|
|
|
|
, Tid_timestamp_unix = 6
|
|
|
|
|
, Tid_raw_ary = 7
|
|
|
|
|
, Tid_raw_byt = 8
|
|
|
|
|
, Tid_dayOfYear = 9
|
|
|
|
|
, Tid_daysInMonth = 10
|
|
|
|
|
, Tid_AmPm = 11
|
|
|
|
|
, Tid_roman = 12
|
|
|
|
|
, Tid_iso_fmt = 13
|
|
|
|
|
, Tid_rfc_5322 = 14
|
|
|
|
|
, Tid_raw = 15
|
|
|
|
|
, Tid_timezone_offset = 16
|
|
|
|
|
, Tid_thai = 17
|
|
|
|
|
, Tid_minguo = 18
|
|
|
|
|
, Tid_hebrew_year_num = 21
|
|
|
|
|
, Tid_hebrew_month_num = 20
|
|
|
|
|
, Tid_hebrew_day_num = 19
|
|
|
|
|
, Tid_hebrew_month_days_count = 22
|
|
|
|
|
, Tid_hebrew_month_name_full = 23
|
|
|
|
|
, Tid_hebrew_month_name_gen = 24
|
|
|
|
|
, Tid_hebrew_numeral = 25
|
|
|
|
|
, Tid_iranian_year_idx = 26
|
|
|
|
|
, Tid_iranian_month_idx = 27
|
|
|
|
|
, Tid_iranian_day_idx = 28
|
|
|
|
|
, Tid_iranian_month_name = 29
|
|
|
|
|
, Tid_hijiri_year_idx = 30
|
|
|
|
|
, Tid_hijiri_month_idx = 31
|
|
|
|
|
, Tid_hijiri_day_idx = 32
|
|
|
|
|
, Tid_hijiri_month_name = 33
|
|
|
|
|
, Tid_timezone_id_full = 35
|
|
|
|
|
, Tid_timezone_id_abrv = 36
|
|
|
|
|
, Tid_timezone_offset_4 = 37
|
|
|
|
|
, Tid_timezone_offset_4_colon = 38
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
public static final Pft_fmt_itm
|
|
|
|
|
Year_len4 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_year , 4, Bool_.Y)
|
|
|
|
|
, Year_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_year , 2, Bool_.Y)
|
|
|
|
|
, Month_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_month , 2, Bool_.Y)
|
|
|
|
|
, Month_int = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_month , 2, Bool_.N)
|
|
|
|
|
, Day_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_day , 2, Bool_.Y)
|
|
|
|
|
, Day_int = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_day , 2, Bool_.N)
|
|
|
|
|
, Hour_base24_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_hour , 2, Bool_.Y)
|
|
|
|
|
, Hour_base24 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_hour , 2, Bool_.N)
|
|
|
|
|
, Hour_base12_len2 = new Pft_fmt_itm_hour_base12(Bool_.Y)
|
|
|
|
|
, Hour_base12 = new Pft_fmt_itm_hour_base12(Bool_.N)
|
|
|
|
|
, Minute_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_minute , 2, Bool_.Y)
|
|
|
|
|
, Second_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_second , 2, Bool_.Y)
|
|
|
|
|
, Dow_base1_int = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_dayOfWeek , 1, Bool_.Y)
|
|
|
|
|
, Dow_base0_int = new Pft_fmt_itm_dow_base0()
|
|
|
|
|
, WeekOfYear_int = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_weekOfYear , 2, Bool_.N)
|
|
|
|
|
, WeekOfYear_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_weekOfYear , 2, Bool_.Y)
|
|
|
|
|
, Month_abrv = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_month, Xol_msg_itm_.Id_dte_month_abrv_jan - Int_.Base1) // Jan
|
|
|
|
|
, Month_name = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_month, Xol_msg_itm_.Id_dte_month_name_january - Int_.Base1) // January
|
|
|
|
|
, Month_gen = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_month, Xol_msg_itm_.Id_dte_month_gen_january - Int_.Base1) // January
|
|
|
|
|
, Dow_abrv = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_dayOfWeek, Xol_msg_itm_.Id_dte_dow_abrv_sun) // Sun
|
|
|
|
|
, Dow_name = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_dayOfWeek, Xol_msg_itm_.Id_dte_dow_name_sunday) // Sunday
|
|
|
|
|
, Year_isLeap = new Pft_fmt_itm_year_isLeap()
|
|
|
|
|
, Timestamp_unix = new Pft_fmt_itm_timestamp_unix()
|
|
|
|
|
, Byte_space = new Pft_fmt_itm_raw_byt(Byte_ascii.Space)
|
|
|
|
|
, Byte_comma = new Pft_fmt_itm_raw_byt(Byte_ascii.Comma)
|
|
|
|
|
, Byte_dash = new Pft_fmt_itm_raw_byt(Byte_ascii.Dash)
|
|
|
|
|
, DayOfYear_int = new Pft_fmt_itm_dayOfYear()
|
|
|
|
|
, DaysInMonth_int = new Pft_fmt_itm_daysInMonth()
|
|
|
|
|
, AmPm_lower = new Pft_fmt_itm_am_pm(true)
|
|
|
|
|
, AmPm_upper = new Pft_fmt_itm_am_pm(false)
|
|
|
|
|
, Roman = new Pft_fmt_itm_roman()
|
|
|
|
|
, Thai = new Pft_fmt_itm_thai()
|
|
|
|
|
, Minguo = new Pft_fmt_itm_minguo()
|
|
|
|
|
, Hebrew_year_num = new Pft_fmt_itm_hebrew_year_num()
|
|
|
|
|
, Hebrew_month_num = new Pft_fmt_itm_hebrew_month_num()
|
|
|
|
|
, Hebrew_day_num = new Pft_fmt_itm_hebrew_day_num()
|
|
|
|
|
, Hebrew_month_days_count = new Pft_fmt_itm_hebrew_month_days_count()
|
|
|
|
|
, Hebrew_month_name_full = new Pft_fmt_itm_hebrew_month_name_full()
|
|
|
|
|
, Hebrew_month_name_gen = new Pft_fmt_itm_hebrew_month_name_gen()
|
|
|
|
|
, Hebrew_numeral = new Pft_fmt_itm_hebrew_numeral()
|
|
|
|
|
, Raw = new Pft_fmt_itm_raw()
|
|
|
|
|
, Iso_fmt = new Pft_fmt_itm_iso_fmt()
|
|
|
|
|
, Rfc_5322 = new Pft_fmt_itm_rfc_5322()
|
|
|
|
|
, Timezone_offset = new Pft_fmt_itm_timezone_offset()
|
|
|
|
|
, Iranian_year_idx = new Pft_fmt_itm_iranian_year_idx()
|
|
|
|
|
, Iranian_month_idx = new Pft_fmt_itm_iranian_month_idx()
|
|
|
|
|
, Iranian_day_idx = new Pft_fmt_itm_iranian_day_idx()
|
|
|
|
|
, Iranian_month_name = new Pft_fmt_itm_iranian_month_name()
|
|
|
|
|
, Hijiri_year_idx = new Pft_fmt_itm_hijiri_year_idx()
|
|
|
|
|
, Hijiri_month_idx = new Pft_fmt_itm_hijiri_month_idx()
|
|
|
|
|
, Hijiri_day_idx = new Pft_fmt_itm_hijiri_day_idx()
|
|
|
|
|
, Hijiri_month_name = new Pft_fmt_itm_hijiri_month_name()
|
|
|
|
|
, Timezone_id_full = new Pft_fmt_itm_timezone_id(Bool_.N)
|
|
|
|
|
, Timezone_id_abrv = new Pft_fmt_itm_timezone_id(Bool_.Y)
|
|
|
|
|
, Timezone_offset_4 = new Pft_fmt_itm_timezone_offset_4(Bool_.N)
|
|
|
|
|
, Timezone_offset_4_colon = new Pft_fmt_itm_timezone_offset_4(Bool_.Y)
|
|
|
|
|
;
|
|
|
|
|
public static final Btrie_fast_mgr Regy = Btrie_fast_mgr.cs()
|
|
|
|
|
.Add(Byte_ascii.Ltr_Y , Pft_fmt_itm_.Year_len4) // 2012
|
|
|
|
|
.Add(Byte_ascii.Ltr_y , Pft_fmt_itm_.Year_len2) // 12
|
|
|
|
|
.Add(Byte_ascii.Ltr_L , Pft_fmt_itm_.Year_isLeap) // 1,0
|
|
|
|
|
.Add(Byte_ascii.Ltr_o , Pft_fmt_itm_.Year_len4) // 2012: ISO-8601; don't know why it's different vs Ltr_Y
|
|
|
|
|
.Add(Byte_ascii.Ltr_n , Pft_fmt_itm_.Month_int) // 1
|
|
|
|
|
.Add(Byte_ascii.Ltr_m , Pft_fmt_itm_.Month_int_len2) // 01
|
|
|
|
|
.Add(Byte_ascii.Ltr_M , Pft_fmt_itm_.Month_abrv) // Jan
|
|
|
|
|
.Add(Byte_ascii.Ltr_F , Pft_fmt_itm_.Month_name) // January
|
|
|
|
|
.Add("xg" , Pft_fmt_itm_.Month_gen) // January
|
|
|
|
|
.Add(Byte_ascii.Ltr_W , Pft_fmt_itm_.WeekOfYear_int_len2) // 01
|
|
|
|
|
.Add(Byte_ascii.Ltr_j , Pft_fmt_itm_.Day_int) // 1
|
|
|
|
|
.Add(Byte_ascii.Ltr_d , Pft_fmt_itm_.Day_int_len2) // 01
|
|
|
|
|
.Add(Byte_ascii.Ltr_z , Pft_fmt_itm_.DayOfYear_int) // 0
|
|
|
|
|
.Add(Byte_ascii.Ltr_D , Pft_fmt_itm_.Dow_abrv) // Sun
|
|
|
|
|
.Add(Byte_ascii.Ltr_l , Pft_fmt_itm_.Dow_name) // Sunday
|
|
|
|
|
.Add(Byte_ascii.Ltr_N , Pft_fmt_itm_.Dow_base0_int) // 1; Sunday=7
|
|
|
|
|
.Add(Byte_ascii.Ltr_w , Pft_fmt_itm_.Dow_base1_int) // 1; Sunday=0
|
|
|
|
|
.Add(Byte_ascii.Ltr_a , Pft_fmt_itm_.AmPm_lower) // am/pm
|
|
|
|
|
.Add(Byte_ascii.Ltr_A , Pft_fmt_itm_.AmPm_upper) // AM/PM
|
|
|
|
|
.Add(Byte_ascii.Ltr_g , Pft_fmt_itm_.Hour_base12) // 1; Base12
|
|
|
|
|
.Add(Byte_ascii.Ltr_h , Pft_fmt_itm_.Hour_base12_len2) // 01; Base12; pad2
|
|
|
|
|
.Add(Byte_ascii.Ltr_G , Pft_fmt_itm_.Hour_base24) // 13; Base24;
|
|
|
|
|
.Add(Byte_ascii.Ltr_H , Pft_fmt_itm_.Hour_base24_len2) // 13; Base24; pad2
|
|
|
|
|
.Add(Byte_ascii.Ltr_i , Pft_fmt_itm_.Minute_int_len2) // 04
|
|
|
|
|
.Add(Byte_ascii.Ltr_s , Pft_fmt_itm_.Second_int_len2) // 05
|
|
|
|
|
.Add(Byte_ascii.Ltr_t , Pft_fmt_itm_.DaysInMonth_int) // 31
|
|
|
|
|
.Add(Byte_ascii.Ltr_U , Pft_fmt_itm_.Timestamp_unix) // 1343865600
|
|
|
|
|
.Add(Byte_ascii.Ltr_Z , Pft_fmt_itm_.Timezone_offset) // timezone offset in seconds
|
|
|
|
|
.Add(Byte_ascii.Ltr_c , Pft_fmt_itm_.Iso_fmt) // 2012-01-02T03:04:05+00:00
|
|
|
|
|
.Add(Byte_ascii.Ltr_r , Pft_fmt_itm_.Rfc_5322) // Mon 02 Jan 2012 08:04:05 +0000
|
|
|
|
|
.Add(Byte_ascii.Ltr_e , Pft_fmt_itm_.Timezone_id_full) // UTC
|
|
|
|
|
.Add(Byte_ascii.Ltr_T , Pft_fmt_itm_.Timezone_id_abrv) // UTC
|
|
|
|
|
.Add(Byte_ascii.Ltr_O , Pft_fmt_itm_.Timezone_offset_4) // timezone offset in seconds +0000
|
|
|
|
|
.Add(Byte_ascii.Ltr_P , Pft_fmt_itm_.Timezone_offset_4_colon) // timezone offset in seconds with colon +00:00
|
|
|
|
|
.Add("xr" , Pft_fmt_itm_.Roman) // MCXI
|
|
|
|
|
.Add("xkY" , Pft_fmt_itm_.Thai) // Year += 543
|
|
|
|
|
.Add("xoY" , Pft_fmt_itm_.Minguo) // Year -= 1911
|
|
|
|
|
.Add("xn" , Pft_fmt_itm_.Raw) // NOTE: really does nothing; REF.MW: Language.php|sprintfdate does $s .= $num; DATE:2013-12-31
|
|
|
|
|
.Add("xN" , Pft_fmt_itm_.Raw)
|
|
|
|
|
.Add("xjj" , Pft_fmt_itm_.Hebrew_day_num)
|
|
|
|
|
.Add("xjn" , Pft_fmt_itm_.Hebrew_month_num)
|
|
|
|
|
.Add("xjt" , Pft_fmt_itm_.Hebrew_month_days_count)
|
|
|
|
|
.Add("xjF" , Pft_fmt_itm_.Hebrew_month_name_full)
|
|
|
|
|
.Add("xjx" , Pft_fmt_itm_.Hebrew_month_name_gen)
|
|
|
|
|
.Add("xjY" , Pft_fmt_itm_.Hebrew_year_num)
|
|
|
|
|
.Add("xh" , Pft_fmt_itm_.Hebrew_numeral)
|
|
|
|
|
.Add("xij" , Pft_fmt_itm_.Iranian_day_idx)
|
|
|
|
|
.Add("xiF" , Pft_fmt_itm_.Iranian_month_name)
|
|
|
|
|
.Add("xin" , Pft_fmt_itm_.Iranian_month_idx)
|
|
|
|
|
.Add("xiY" , Pft_fmt_itm_.Iranian_year_idx)
|
|
|
|
|
.Add("xmj" , Pft_fmt_itm_.Hijiri_day_idx)
|
|
|
|
|
.Add("xmF" , Pft_fmt_itm_.Hijiri_month_name)
|
|
|
|
|
.Add("xmn" , Pft_fmt_itm_.Hijiri_month_idx)
|
|
|
|
|
.Add("xmY" , Pft_fmt_itm_.Hijiri_year_idx)
|
|
|
|
|
// TODO_OLD: space; "
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
public static Pft_fmt_itm[] Parse(Xop_ctx ctx, byte[] fmt) {
|
|
|
|
|
List_adp fmt_itms = ctx.Wiki().Parser_mgr().Time_parser_itms();
|
|
|
|
|
Btrie_fast_mgr trie = Pft_fmt_itm_.Regy;
|
|
|
|
|
Btrie_rv trv = new Btrie_rv();
|
|
|
|
|
int i = 0, fmt_len = fmt.length;
|
|
|
|
|
fmt_itms.Clear(); int raw_bgn = String_.Pos_neg1; byte raw_byt = Byte_.Zero;
|
|
|
|
|
while (i < fmt_len) {
|
|
|
|
|
byte b = fmt[i];
|
|
|
|
|
Object o = trie.Match_at_w_b0(trv, b, fmt, i, fmt_len);
|
|
|
|
|
if (o != null) {
|
|
|
|
|
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
|
|
|
|
|
fmt_itms.Add((Pft_fmt_itm)o);
|
|
|
|
|
i = trv.Pos();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
switch (b) {
|
|
|
|
|
case Byte_ascii.Backslash:
|
|
|
|
|
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
|
|
|
|
|
++i; // peek next char
|
|
|
|
|
if (i == fmt_len) // trailing backslash; add one; EX: "b\" -> "b\" not "b"
|
|
|
|
|
fmt_itms.Add(new Pft_fmt_itm_raw_byt(Byte_ascii.Backslash));
|
|
|
|
|
else
|
|
|
|
|
fmt_itms.Add(new Pft_fmt_itm_raw_byt(fmt[i]));
|
|
|
|
|
++i;
|
|
|
|
|
break;
|
|
|
|
|
case Byte_ascii.Quote:
|
|
|
|
|
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
|
|
|
|
|
++i; // skip quote_bgn
|
|
|
|
|
raw_bgn = i;
|
|
|
|
|
while (i < fmt_len) {
|
|
|
|
|
b = fmt[i];
|
|
|
|
|
if (b == Byte_ascii.Quote) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
++i;
|
|
|
|
|
}
|
|
|
|
|
fmt_itms.Add(i - raw_bgn == 0 ? new Pft_fmt_itm_raw_byt(Byte_ascii.Quote) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i));
|
|
|
|
|
raw_bgn = String_.Pos_neg1;
|
|
|
|
|
++i; // skip quote_end
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
if (raw_bgn == String_.Pos_neg1) {raw_bgn = i; raw_byt = b;}
|
|
|
|
|
i += gplx.core.intls.Utf8_.Len_of_char_by_1st_byte(b);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(fmt_len - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(fmt[fmt_len - 1]) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, fmt_len)); raw_bgn = String_.Pos_neg1;}
|
|
|
|
|
return (Pft_fmt_itm[])fmt_itms.To_ary(Pft_fmt_itm.class);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
package gplx.xowa.xtns.pfuncs.times;
|
|
|
|
|
|
|
|
|
|
import gplx.Bool_;
|
|
|
|
|
import gplx.Byte_;
|
|
|
|
|
import gplx.Byte_ascii;
|
|
|
|
|
import gplx.DateAdp_;
|
|
|
|
|
import gplx.Int_;
|
|
|
|
|
import gplx.List_adp;
|
|
|
|
|
import gplx.String_;
|
|
|
|
|
import gplx.core.btries.Btrie_fast_mgr;
|
|
|
|
|
import gplx.core.btries.Btrie_rv;
|
|
|
|
|
import gplx.xowa.langs.msgs.Xol_msg_itm_;
|
|
|
|
|
import gplx.xowa.parsers.Xop_ctx;
|
|
|
|
|
|
|
|
|
|
public class Pft_fmt_itm_ {
|
|
|
|
|
public static final int
|
|
|
|
|
Tid_seg_int = 1
|
|
|
|
|
, Tid_hour_base12 = 2
|
|
|
|
|
, Tid_dow_base0 = 3
|
|
|
|
|
, Tid_seg_str = 4
|
|
|
|
|
, Tid_year_isLeap = 5
|
|
|
|
|
, Tid_timestamp_unix = 6
|
|
|
|
|
, Tid_raw_ary = 7
|
|
|
|
|
, Tid_raw_byt = 8
|
|
|
|
|
, Tid_dayOfYear = 9
|
|
|
|
|
, Tid_daysInMonth = 10
|
|
|
|
|
, Tid_AmPm = 11
|
|
|
|
|
, Tid_roman = 12
|
|
|
|
|
, Tid_iso_fmt = 13
|
|
|
|
|
, Tid_rfc_5322 = 14
|
|
|
|
|
, Tid_raw = 15
|
|
|
|
|
, Tid_timezone_offset = 16
|
|
|
|
|
, Tid_thai = 17
|
|
|
|
|
, Tid_minguo = 18
|
|
|
|
|
, Tid_hebrew_year_num = 21
|
|
|
|
|
, Tid_hebrew_month_num = 20
|
|
|
|
|
, Tid_hebrew_day_num = 19
|
|
|
|
|
, Tid_hebrew_month_days_count = 22
|
|
|
|
|
, Tid_hebrew_month_name_full = 23
|
|
|
|
|
, Tid_hebrew_month_name_gen = 24
|
|
|
|
|
, Tid_hebrew_numeral = 25
|
|
|
|
|
, Tid_iranian_year_idx = 26
|
|
|
|
|
, Tid_iranian_month_idx = 27
|
|
|
|
|
, Tid_iranian_day_idx = 28
|
|
|
|
|
, Tid_iranian_month_name = 29
|
|
|
|
|
, Tid_hijri_year_idx = 30
|
|
|
|
|
, Tid_hijri_month_idx = 31
|
|
|
|
|
, Tid_hijri_day_idx = 32
|
|
|
|
|
, Tid_hijri_month_name = 33
|
|
|
|
|
, Tid_timezone_id_full = 35
|
|
|
|
|
, Tid_timezone_id_abrv = 36
|
|
|
|
|
, Tid_timezone_offset_4 = 37
|
|
|
|
|
, Tid_timezone_offset_4_colon = 38
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
public static final Pft_fmt_itm
|
|
|
|
|
Year_len4 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_year , 4, Bool_.Y)
|
|
|
|
|
, Year_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_year , 2, Bool_.Y)
|
|
|
|
|
, Month_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_month , 2, Bool_.Y)
|
|
|
|
|
, Month_int = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_month , 2, Bool_.N)
|
|
|
|
|
, Day_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_day , 2, Bool_.Y)
|
|
|
|
|
, Day_int = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_day , 2, Bool_.N)
|
|
|
|
|
, Hour_base24_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_hour , 2, Bool_.Y)
|
|
|
|
|
, Hour_base24 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_hour , 2, Bool_.N)
|
|
|
|
|
, Hour_base12_len2 = new Pft_fmt_itm_hour_base12(Bool_.Y)
|
|
|
|
|
, Hour_base12 = new Pft_fmt_itm_hour_base12(Bool_.N)
|
|
|
|
|
, Minute_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_minute , 2, Bool_.Y)
|
|
|
|
|
, Second_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_second , 2, Bool_.Y)
|
|
|
|
|
, Dow_base1_int = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_dayOfWeek , 1, Bool_.Y)
|
|
|
|
|
, Dow_base0_int = new Pft_fmt_itm_dow_base0()
|
|
|
|
|
, WeekOfYear_int = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_weekOfYear , 2, Bool_.N)
|
|
|
|
|
, WeekOfYear_int_len2 = new Pft_fmt_itm_seg_int(DateAdp_.SegIdx_weekOfYear , 2, Bool_.Y)
|
|
|
|
|
, Month_abrv = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_month, Xol_msg_itm_.Id_dte_month_abrv_jan - Int_.Base1) // Jan
|
|
|
|
|
, Month_name = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_month, Xol_msg_itm_.Id_dte_month_name_january - Int_.Base1) // January
|
|
|
|
|
, Month_gen = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_month, Xol_msg_itm_.Id_dte_month_gen_january - Int_.Base1) // January
|
|
|
|
|
, Dow_abrv = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_dayOfWeek, Xol_msg_itm_.Id_dte_dow_abrv_sun) // Sun
|
|
|
|
|
, Dow_name = new Pft_fmt_itm_seg_str(DateAdp_.SegIdx_dayOfWeek, Xol_msg_itm_.Id_dte_dow_name_sunday) // Sunday
|
|
|
|
|
, Year_isLeap = new Pft_fmt_itm_year_isLeap()
|
|
|
|
|
, Timestamp_unix = new Pft_fmt_itm_timestamp_unix()
|
|
|
|
|
, Byte_space = new Pft_fmt_itm_raw_byt(Byte_ascii.Space)
|
|
|
|
|
, Byte_comma = new Pft_fmt_itm_raw_byt(Byte_ascii.Comma)
|
|
|
|
|
, Byte_dash = new Pft_fmt_itm_raw_byt(Byte_ascii.Dash)
|
|
|
|
|
, DayOfYear_int = new Pft_fmt_itm_dayOfYear()
|
|
|
|
|
, DaysInMonth_int = new Pft_fmt_itm_daysInMonth()
|
|
|
|
|
, AmPm_lower = new Pft_fmt_itm_am_pm(true)
|
|
|
|
|
, AmPm_upper = new Pft_fmt_itm_am_pm(false)
|
|
|
|
|
, Roman = new Pft_fmt_itm_roman()
|
|
|
|
|
, Thai = new Pft_fmt_itm_thai()
|
|
|
|
|
, Minguo = new Pft_fmt_itm_minguo()
|
|
|
|
|
, Hebrew_year_num = new Pft_fmt_itm_hebrew_year_num()
|
|
|
|
|
, Hebrew_month_num = new Pft_fmt_itm_hebrew_month_num()
|
|
|
|
|
, Hebrew_day_num = new Pft_fmt_itm_hebrew_day_num()
|
|
|
|
|
, Hebrew_month_days_count = new Pft_fmt_itm_hebrew_month_days_count()
|
|
|
|
|
, Hebrew_month_name_full = new Pft_fmt_itm_hebrew_month_name_full()
|
|
|
|
|
, Hebrew_month_name_gen = new Pft_fmt_itm_hebrew_month_name_gen()
|
|
|
|
|
, Hebrew_numeral = new Pft_fmt_itm_hebrew_numeral()
|
|
|
|
|
, Raw = new Pft_fmt_itm_raw()
|
|
|
|
|
, Iso_fmt = new Pft_fmt_itm_iso_fmt()
|
|
|
|
|
, Rfc_5322 = new Pft_fmt_itm_rfc_5322()
|
|
|
|
|
, Timezone_offset = new Pft_fmt_itm_timezone_offset()
|
|
|
|
|
, Iranian_year_idx = new Pft_fmt_itm_iranian_year_idx()
|
|
|
|
|
, Iranian_month_idx = new Pft_fmt_itm_iranian_month_idx()
|
|
|
|
|
, Iranian_day_idx = new Pft_fmt_itm_iranian_day_idx()
|
|
|
|
|
, Iranian_month_name = new Pft_fmt_itm_iranian_month_name()
|
|
|
|
|
, hijri_year_idx = new Pft_fmt_itm_hijri_year_idx()
|
|
|
|
|
, hijri_month_idx = new Pft_fmt_itm_hijri_month_idx()
|
|
|
|
|
, hijri_day_idx = new Pft_fmt_itm_hijri_day_idx()
|
|
|
|
|
, hijri_month_name = new Pft_fmt_itm_hijri_month_name()
|
|
|
|
|
, Timezone_id_full = new Pft_fmt_itm_timezone_id(Bool_.N)
|
|
|
|
|
, Timezone_id_abrv = new Pft_fmt_itm_timezone_id(Bool_.Y)
|
|
|
|
|
, Timezone_offset_4 = new Pft_fmt_itm_timezone_offset_4(Bool_.N)
|
|
|
|
|
, Timezone_offset_4_colon = new Pft_fmt_itm_timezone_offset_4(Bool_.Y)
|
|
|
|
|
;
|
|
|
|
|
public static final Btrie_fast_mgr Regy = Btrie_fast_mgr.cs()
|
|
|
|
|
.Add(Byte_ascii.Ltr_Y , Pft_fmt_itm_.Year_len4) // 2012
|
|
|
|
|
.Add(Byte_ascii.Ltr_y , Pft_fmt_itm_.Year_len2) // 12
|
|
|
|
|
.Add(Byte_ascii.Ltr_L , Pft_fmt_itm_.Year_isLeap) // 1,0
|
|
|
|
|
.Add(Byte_ascii.Ltr_o , Pft_fmt_itm_.Year_len4) // 2012: ISO-8601; don't know why it's different vs Ltr_Y
|
|
|
|
|
.Add(Byte_ascii.Ltr_n , Pft_fmt_itm_.Month_int) // 1
|
|
|
|
|
.Add(Byte_ascii.Ltr_m , Pft_fmt_itm_.Month_int_len2) // 01
|
|
|
|
|
.Add(Byte_ascii.Ltr_M , Pft_fmt_itm_.Month_abrv) // Jan
|
|
|
|
|
.Add(Byte_ascii.Ltr_F , Pft_fmt_itm_.Month_name) // January
|
|
|
|
|
.Add("xg" , Pft_fmt_itm_.Month_gen) // January
|
|
|
|
|
.Add(Byte_ascii.Ltr_W , Pft_fmt_itm_.WeekOfYear_int_len2) // 01
|
|
|
|
|
.Add(Byte_ascii.Ltr_j , Pft_fmt_itm_.Day_int) // 1
|
|
|
|
|
.Add(Byte_ascii.Ltr_d , Pft_fmt_itm_.Day_int_len2) // 01
|
|
|
|
|
.Add(Byte_ascii.Ltr_z , Pft_fmt_itm_.DayOfYear_int) // 0
|
|
|
|
|
.Add(Byte_ascii.Ltr_D , Pft_fmt_itm_.Dow_abrv) // Sun
|
|
|
|
|
.Add(Byte_ascii.Ltr_l , Pft_fmt_itm_.Dow_name) // Sunday
|
|
|
|
|
.Add(Byte_ascii.Ltr_N , Pft_fmt_itm_.Dow_base0_int) // 1; Sunday=7
|
|
|
|
|
.Add(Byte_ascii.Ltr_w , Pft_fmt_itm_.Dow_base1_int) // 1; Sunday=0
|
|
|
|
|
.Add(Byte_ascii.Ltr_a , Pft_fmt_itm_.AmPm_lower) // am/pm
|
|
|
|
|
.Add(Byte_ascii.Ltr_A , Pft_fmt_itm_.AmPm_upper) // AM/PM
|
|
|
|
|
.Add(Byte_ascii.Ltr_g , Pft_fmt_itm_.Hour_base12) // 1; Base12
|
|
|
|
|
.Add(Byte_ascii.Ltr_h , Pft_fmt_itm_.Hour_base12_len2) // 01; Base12; pad2
|
|
|
|
|
.Add(Byte_ascii.Ltr_G , Pft_fmt_itm_.Hour_base24) // 13; Base24;
|
|
|
|
|
.Add(Byte_ascii.Ltr_H , Pft_fmt_itm_.Hour_base24_len2) // 13; Base24; pad2
|
|
|
|
|
.Add(Byte_ascii.Ltr_i , Pft_fmt_itm_.Minute_int_len2) // 04
|
|
|
|
|
.Add(Byte_ascii.Ltr_s , Pft_fmt_itm_.Second_int_len2) // 05
|
|
|
|
|
.Add(Byte_ascii.Ltr_t , Pft_fmt_itm_.DaysInMonth_int) // 31
|
|
|
|
|
.Add(Byte_ascii.Ltr_U , Pft_fmt_itm_.Timestamp_unix) // 1343865600
|
|
|
|
|
.Add(Byte_ascii.Ltr_Z , Pft_fmt_itm_.Timezone_offset) // timezone offset in seconds
|
|
|
|
|
.Add(Byte_ascii.Ltr_c , Pft_fmt_itm_.Iso_fmt) // 2012-01-02T03:04:05+00:00
|
|
|
|
|
.Add(Byte_ascii.Ltr_r , Pft_fmt_itm_.Rfc_5322) // Mon 02 Jan 2012 08:04:05 +0000
|
|
|
|
|
.Add(Byte_ascii.Ltr_e , Pft_fmt_itm_.Timezone_id_full) // UTC
|
|
|
|
|
.Add(Byte_ascii.Ltr_T , Pft_fmt_itm_.Timezone_id_abrv) // UTC
|
|
|
|
|
.Add(Byte_ascii.Ltr_O , Pft_fmt_itm_.Timezone_offset_4) // timezone offset in seconds +0000
|
|
|
|
|
.Add(Byte_ascii.Ltr_P , Pft_fmt_itm_.Timezone_offset_4_colon) // timezone offset in seconds with colon +00:00
|
|
|
|
|
.Add("xr" , Pft_fmt_itm_.Roman) // MCXI
|
|
|
|
|
.Add("xkY" , Pft_fmt_itm_.Thai) // Year += 543
|
|
|
|
|
.Add("xoY" , Pft_fmt_itm_.Minguo) // Year -= 1911
|
|
|
|
|
.Add("xn" , Pft_fmt_itm_.Raw) // NOTE: really does nothing; REF.MW: Language.php|sprintfdate does $s .= $num; DATE:2013-12-31
|
|
|
|
|
.Add("xN" , Pft_fmt_itm_.Raw)
|
|
|
|
|
.Add("xjj" , Pft_fmt_itm_.Hebrew_day_num)
|
|
|
|
|
.Add("xjn" , Pft_fmt_itm_.Hebrew_month_num)
|
|
|
|
|
.Add("xjt" , Pft_fmt_itm_.Hebrew_month_days_count)
|
|
|
|
|
.Add("xjF" , Pft_fmt_itm_.Hebrew_month_name_full)
|
|
|
|
|
.Add("xjx" , Pft_fmt_itm_.Hebrew_month_name_gen)
|
|
|
|
|
.Add("xjY" , Pft_fmt_itm_.Hebrew_year_num)
|
|
|
|
|
.Add("xh" , Pft_fmt_itm_.Hebrew_numeral)
|
|
|
|
|
.Add("xij" , Pft_fmt_itm_.Iranian_day_idx)
|
|
|
|
|
.Add("xiF" , Pft_fmt_itm_.Iranian_month_name)
|
|
|
|
|
.Add("xin" , Pft_fmt_itm_.Iranian_month_idx)
|
|
|
|
|
.Add("xiY" , Pft_fmt_itm_.Iranian_year_idx)
|
|
|
|
|
.Add("xmj" , Pft_fmt_itm_.hijri_day_idx)
|
|
|
|
|
.Add("xmF" , Pft_fmt_itm_.hijri_month_name)
|
|
|
|
|
.Add("xmn" , Pft_fmt_itm_.hijri_month_idx)
|
|
|
|
|
.Add("xmY" , Pft_fmt_itm_.hijri_year_idx)
|
|
|
|
|
// TODO_OLD: space; "
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
public static Pft_fmt_itm[] Parse(Xop_ctx ctx, byte[] fmt) {
|
|
|
|
|
List_adp fmt_itms = ctx.Wiki().Parser_mgr().Time_parser_itms();
|
|
|
|
|
Btrie_fast_mgr trie = Pft_fmt_itm_.Regy;
|
|
|
|
|
Btrie_rv trv = new Btrie_rv();
|
|
|
|
|
int i = 0, fmt_len = fmt.length;
|
|
|
|
|
fmt_itms.Clear(); int raw_bgn = String_.Pos_neg1; byte raw_byt = Byte_.Zero;
|
|
|
|
|
while (i < fmt_len) {
|
|
|
|
|
byte b = fmt[i];
|
|
|
|
|
Object o = trie.Match_at_w_b0(trv, b, fmt, i, fmt_len);
|
|
|
|
|
if (o != null) {
|
|
|
|
|
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
|
|
|
|
|
fmt_itms.Add((Pft_fmt_itm)o);
|
|
|
|
|
i = trv.Pos();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
switch (b) {
|
|
|
|
|
case Byte_ascii.Backslash:
|
|
|
|
|
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
|
|
|
|
|
++i; // peek next char
|
|
|
|
|
if (i == fmt_len) // trailing backslash; add one; EX: "b\" -> "b\" not "b"
|
|
|
|
|
fmt_itms.Add(new Pft_fmt_itm_raw_byt(Byte_ascii.Backslash));
|
|
|
|
|
else
|
|
|
|
|
fmt_itms.Add(new Pft_fmt_itm_raw_byt(fmt[i]));
|
|
|
|
|
++i;
|
|
|
|
|
break;
|
|
|
|
|
case Byte_ascii.Quote:
|
|
|
|
|
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
|
|
|
|
|
++i; // skip quote_bgn
|
|
|
|
|
raw_bgn = i;
|
|
|
|
|
while (i < fmt_len) {
|
|
|
|
|
b = fmt[i];
|
|
|
|
|
if (b == Byte_ascii.Quote) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
++i;
|
|
|
|
|
}
|
|
|
|
|
fmt_itms.Add(i - raw_bgn == 0 ? new Pft_fmt_itm_raw_byt(Byte_ascii.Quote) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i));
|
|
|
|
|
raw_bgn = String_.Pos_neg1;
|
|
|
|
|
++i; // skip quote_end
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
if (raw_bgn == String_.Pos_neg1) {raw_bgn = i; raw_byt = b;}
|
|
|
|
|
i += gplx.core.intls.Utf8_.Len_of_char_by_1st_byte(b);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(fmt_len - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(fmt[fmt_len - 1]) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, fmt_len)); raw_bgn = String_.Pos_neg1;}
|
|
|
|
|
return (Pft_fmt_itm[])fmt_itms.To_ary(Pft_fmt_itm.class);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|