You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gnosygnu_xowa/400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_fmt_itm_.java

239 lines
12 KiB

/*
XOWA: the XOWA Offline Wiki Application
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.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
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.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);
}
}