Browse Source

Lang: Fix misspelling of `hijri` [#837]

gnosygnu 4 years ago
parent
commit
7e53c8462d

+ 224 - 214
400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_fmt_itm_.java

@@ -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);
+	}
+}

+ 140 - 135
400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_fmt_itm_foreign.java

@@ -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,137 +13,142 @@ 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.xowa.langs.*;
-class Pft_fmt_itm_roman implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_roman;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int nxt_idx = bldr.Idx_cur() + 1;
-		Pft_fmt_itm[] ary = bldr.Fmt_itms();
-		if (nxt_idx < ary.length) {
-			Pft_fmt_itm itm = (Pft_fmt_itm)ary[nxt_idx];
-			if (itm.TypeId() == Pft_fmt_itm_.Tid_seg_int) {
-				Pft_fmt_itm_seg_int nxt_int = (Pft_fmt_itm_seg_int)ary[nxt_idx];	// FUTURE: should check tkn type
-				int v = date.Segment(nxt_int.SegIdx());
-				Pfxtp_roman.ToRoman(v, bfr);
-				bldr.Idx_nxt_(nxt_idx + 1);
-				return;
-			}
-		}
-		bfr.Add_str_a7("xf");
-	}
-}
-class Pft_fmt_itm_thai implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_thai;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		bfr.Add_int_variable(date.Year() + 543);
-	}
-}
-class Pft_fmt_itm_minguo implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_minguo;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		bfr.Add_int_variable(date.Year() - 1911);
-	}
-}
-class Pft_fmt_itm_hebrew_year_num implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_year_num;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] hebrew_date = Pft_fmt_itm_hebrew_.Calc_hebrew_date(date);
-		bfr.Add_int_variable(hebrew_date[Pft_fmt_itm_hebrew_.Rslt_year_num]);
-	}
-}
-class Pft_fmt_itm_hebrew_month_num implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_month_num;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] hebrew_date = Pft_fmt_itm_hebrew_.Calc_hebrew_date(date);
-		bfr.Add_int_variable(hebrew_date[Pft_fmt_itm_hebrew_.Rslt_month_num]);
-	}
-}
-class Pft_fmt_itm_hebrew_day_num implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_day_num;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] hebrew_date = Pft_fmt_itm_hebrew_.Calc_hebrew_date(date);
-		bfr.Add_int_variable(hebrew_date[Pft_fmt_itm_hebrew_.Rslt_day_num]);
-	}
-}
-class Pft_fmt_itm_hebrew_month_days_count implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_month_days_count;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] hebrew_date = Pft_fmt_itm_hebrew_.Calc_hebrew_date(date);
-		bfr.Add_int_variable(hebrew_date[Pft_fmt_itm_hebrew_.Rslt_month_days_count]);
-	}
-}
-class Pft_fmt_itm_hebrew_month_name_full implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_month_name_full;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		bfr.Add(Pft_fmt_itm_hebrew_.Get_hebrew_month_name_full(wiki, date));
-	}
-}
-class Pft_fmt_itm_hebrew_month_name_gen implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_month_name_gen;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		bfr.Add(Pft_fmt_itm_hebrew_.Get_hebrew_month_name_gen(wiki, date));
-	}
-}
-class Pft_fmt_itm_hebrew_numeral implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_numeral;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int num_int = bfr.To_int_and_clear(-1);
-		byte[] num_bry = Pft_fmt_itm_hebrew_.Calc_hebrew_numeral(num_int);
-		bfr.Add(num_bry);
-	}
-}
-class Pft_fmt_itm_iranian_year_idx implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_iranian_year_idx;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] seg_ary = Pft_fmt_itm_iranian.Calc_date(date);
-		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_iranian.Rslt__year]);
-	}
-}
-class Pft_fmt_itm_iranian_month_idx implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_iranian_month_idx;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] seg_ary = Pft_fmt_itm_iranian.Calc_date(date);
-		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_iranian.Rslt__month]);
-	}
-}
-class Pft_fmt_itm_iranian_day_idx implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_iranian_day_idx;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] seg_ary = Pft_fmt_itm_iranian.Calc_date(date);
-		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_iranian.Rslt__day]);
-	}
-}
-class Pft_fmt_itm_iranian_month_name implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_iranian_month_name;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		bfr.Add(Pft_fmt_itm_iranian.Get_month_name(wiki, date));
-	}
-}
-class Pft_fmt_itm_hijiri_year_idx implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hijiri_year_idx;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] seg_ary = Pft_fmt_itm_hijiri.Calc_date(date);
-		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_hijiri.Rslt__year]);
-	}
-}
-class Pft_fmt_itm_hijiri_month_idx implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hijiri_month_idx;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] seg_ary = Pft_fmt_itm_hijiri.Calc_date(date);
-		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_hijiri.Rslt__month]);
-	}
-}
-class Pft_fmt_itm_hijiri_day_idx implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hijiri_day_idx;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		int[] seg_ary = Pft_fmt_itm_hijiri.Calc_date(date);
-		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_hijiri.Rslt__day]);
-	}
-}
-class Pft_fmt_itm_hijiri_month_name implements Pft_fmt_itm {
-	public int TypeId() {return Pft_fmt_itm_.Tid_hijiri_month_name;}
-	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
-		bfr.Add(Pft_fmt_itm_hijiri.Get_month_name(wiki, date));
-	}
-}
+package gplx.xowa.xtns.pfuncs.times;
+
+import gplx.Bry_bfr;
+import gplx.DateAdp;
+import gplx.xowa.Xowe_wiki;
+import gplx.xowa.langs.Xol_lang_itm;
+
+class Pft_fmt_itm_roman implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_roman;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int nxt_idx = bldr.Idx_cur() + 1;
+		Pft_fmt_itm[] ary = bldr.Fmt_itms();
+		if (nxt_idx < ary.length) {
+			Pft_fmt_itm itm = (Pft_fmt_itm)ary[nxt_idx];
+			if (itm.TypeId() == Pft_fmt_itm_.Tid_seg_int) {
+				Pft_fmt_itm_seg_int nxt_int = (Pft_fmt_itm_seg_int)ary[nxt_idx];	// FUTURE: should check tkn type
+				int v = date.Segment(nxt_int.SegIdx());
+				Pfxtp_roman.ToRoman(v, bfr);
+				bldr.Idx_nxt_(nxt_idx + 1);
+				return;
+			}
+		}
+		bfr.Add_str_a7("xf");
+	}
+}
+class Pft_fmt_itm_thai implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_thai;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		bfr.Add_int_variable(date.Year() + 543);
+	}
+}
+class Pft_fmt_itm_minguo implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_minguo;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		bfr.Add_int_variable(date.Year() - 1911);
+	}
+}
+class Pft_fmt_itm_hebrew_year_num implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_year_num;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] hebrew_date = Pft_fmt_itm_hebrew_.Calc_hebrew_date(date);
+		bfr.Add_int_variable(hebrew_date[Pft_fmt_itm_hebrew_.Rslt_year_num]);
+	}
+}
+class Pft_fmt_itm_hebrew_month_num implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_month_num;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] hebrew_date = Pft_fmt_itm_hebrew_.Calc_hebrew_date(date);
+		bfr.Add_int_variable(hebrew_date[Pft_fmt_itm_hebrew_.Rslt_month_num]);
+	}
+}
+class Pft_fmt_itm_hebrew_day_num implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_day_num;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] hebrew_date = Pft_fmt_itm_hebrew_.Calc_hebrew_date(date);
+		bfr.Add_int_variable(hebrew_date[Pft_fmt_itm_hebrew_.Rslt_day_num]);
+	}
+}
+class Pft_fmt_itm_hebrew_month_days_count implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_month_days_count;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] hebrew_date = Pft_fmt_itm_hebrew_.Calc_hebrew_date(date);
+		bfr.Add_int_variable(hebrew_date[Pft_fmt_itm_hebrew_.Rslt_month_days_count]);
+	}
+}
+class Pft_fmt_itm_hebrew_month_name_full implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_month_name_full;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		bfr.Add(Pft_fmt_itm_hebrew_.Get_hebrew_month_name_full(wiki, date));
+	}
+}
+class Pft_fmt_itm_hebrew_month_name_gen implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_month_name_gen;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		bfr.Add(Pft_fmt_itm_hebrew_.Get_hebrew_month_name_gen(wiki, date));
+	}
+}
+class Pft_fmt_itm_hebrew_numeral implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hebrew_numeral;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int num_int = bfr.To_int_and_clear(-1);
+		byte[] num_bry = Pft_fmt_itm_hebrew_.Calc_hebrew_numeral(num_int);
+		bfr.Add(num_bry);
+	}
+}
+class Pft_fmt_itm_iranian_year_idx implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_iranian_year_idx;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] seg_ary = Pft_fmt_itm_iranian.Calc_date(date);
+		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_iranian.Rslt__year]);
+	}
+}
+class Pft_fmt_itm_iranian_month_idx implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_iranian_month_idx;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] seg_ary = Pft_fmt_itm_iranian.Calc_date(date);
+		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_iranian.Rslt__month]);
+	}
+}
+class Pft_fmt_itm_iranian_day_idx implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_iranian_day_idx;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] seg_ary = Pft_fmt_itm_iranian.Calc_date(date);
+		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_iranian.Rslt__day]);
+	}
+}
+class Pft_fmt_itm_iranian_month_name implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_iranian_month_name;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		bfr.Add(Pft_fmt_itm_iranian.Get_month_name(wiki, date));
+	}
+}
+class Pft_fmt_itm_hijri_year_idx implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hijri_year_idx;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] seg_ary = Pft_fmt_itm_hijri.Calc_date(date);
+		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_hijri.Rslt__year]);
+	}
+}
+class Pft_fmt_itm_hijri_month_idx implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hijri_month_idx;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] seg_ary = Pft_fmt_itm_hijri.Calc_date(date);
+		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_hijri.Rslt__month]);
+	}
+}
+class Pft_fmt_itm_hijri_day_idx implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hijri_day_idx;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		int[] seg_ary = Pft_fmt_itm_hijri.Calc_date(date);
+		bfr.Add_int_variable(seg_ary[Pft_fmt_itm_hijri.Rslt__day]);
+	}
+}
+class Pft_fmt_itm_hijri_month_name implements Pft_fmt_itm {
+	public int TypeId() {return Pft_fmt_itm_.Tid_hijri_month_name;}
+	public void Fmt(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_func_formatdate_bldr bldr) {
+		bfr.Add(Pft_fmt_itm_hijri.Get_month_name(wiki, date));
+	}
+}

+ 63 - 57
400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_fmt_itm_hijiri.java

@@ -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,59 +13,65 @@ 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.*;
-class Pft_fmt_itm_hijiri {
-	public static int[] Calc_date(DateAdp date) {
-		int[] rv = new int[3];	// MEM:cache
-		Calc_date(rv, date.Year(), date.Month(), date.Day());
-		return rv;
-	}
-	public static boolean Calc_date(int[] rv, int greg_y, int greg_m, int greg_d) {
-		int hiji_d = greg_d;
-		int hiji_m = greg_m;
-		int hiji_y = greg_y;
-		int tmp_jd = 0;
-		if (
-			(hiji_y > 1582) || ((hiji_y == 1582) && (hiji_m > 10)) ||
-			((hiji_y == 1582) && (hiji_m == 10) && (hiji_d > 14))
-			)
-		{
-			tmp_jd = (int)((1461 * (hiji_y + 4800 + (int)((hiji_m - 14) / 12))) / 4) +
-				(int)((367 * (hiji_m - 2 - 12 * ((int)((hiji_m - 14) / 12)))) / 12) -
-				(int)((3 * (int)(((hiji_y + 4900 + (int)((hiji_m - 14) / 12)) / 100))) / 4) +
-				hiji_d - 32075;
-		} else {
-			tmp_jd = 367 * hiji_y - (int)((7 * (hiji_y + 5001 + (int)((hiji_m - 9) / 7))) / 4) +
-						(int)((275 * hiji_m) / 9) + hiji_d + 1729777;
-		}
-		int tmp_l = tmp_jd -1948440 + 10632;
-		int tmp_n = (int)((tmp_l - 1) / 10631);
-		tmp_l = tmp_l - 10631 * tmp_n + 354;
-		int tmp_j = ((int)((10985 - tmp_l) / 5316)) * ((int)((50 * tmp_l) / 17719)) + ((int)(tmp_l / 5670)) * ((int)((43 * tmp_l) / 15238));
-		tmp_l = tmp_l - ((int)((30 - tmp_j) / 15)) * ((int)((17719 * tmp_j) / 50)) - ((int)(tmp_j / 16)) * ((int)((15238 * tmp_j) / 43)) + 29;
-		hiji_m = (int)((24 * tmp_l) / 709);
-		hiji_d = tmp_l - (int)((709 * hiji_m) / 24);
-		hiji_y = 30 * tmp_n + tmp_j - 30;
-		rv[0] = hiji_y;
-		rv[1] = hiji_m;
-		rv[2] = hiji_d;
-		return true;
-	}
-	public static byte[] Get_month_name(Xowe_wiki wiki, DateAdp date) {
-		int[] seg_ary = Calc_date(date);
-		int m = seg_ary[Rslt__month] - List_adp_.Base1;
-		byte[] msg_key = Month_names[m];
-		return wiki.Msg_mgr().Val_by_key_obj(msg_key);
-	}
-	private static final    byte[][] Month_names = new byte[][] 
-	{ Bry_.new_a7("hijiri-calendar-m1"), Bry_.new_a7("hijiri-calendar-m2"), Bry_.new_a7("hijiri-calendar-m3")
-	, Bry_.new_a7("hijiri-calendar-m4"), Bry_.new_a7("hijiri-calendar-m5"), Bry_.new_a7("hijiri-calendar-m6")
-	, Bry_.new_a7("hijiri-calendar-m7"), Bry_.new_a7("hijiri-calendar-m8"), Bry_.new_a7("hijiri-calendar-m9")
-	, Bry_.new_a7("hijiri-calendar-m10"), Bry_.new_a7("hijiri-calendar-m11"), Bry_.new_a7("hijiri-calendar-m12")
-	};
-	public static final    int
-	  Rslt__year			= 0
-	, Rslt__month			= 1
-	, Rslt__day				= 2
-	;
-}
+package gplx.xowa.xtns.pfuncs.times;
+
+import gplx.Bry_;
+import gplx.DateAdp;
+import gplx.List_adp_;
+import gplx.xowa.Xowe_wiki;
+
+class Pft_fmt_itm_hijri {
+	public static int[] Calc_date(DateAdp date) {
+		int[] rv = new int[3];	// MEM:cache
+		Calc_date(rv, date.Year(), date.Month(), date.Day());
+		return rv;
+	}
+	public static boolean Calc_date(int[] rv, int greg_y, int greg_m, int greg_d) {
+		int hiji_d = greg_d;
+		int hiji_m = greg_m;
+		int hiji_y = greg_y;
+		int tmp_jd = 0;
+		if (
+			(hiji_y > 1582) || ((hiji_y == 1582) && (hiji_m > 10)) ||
+			((hiji_y == 1582) && (hiji_m == 10) && (hiji_d > 14))
+			)
+		{
+			tmp_jd = (int)((1461 * (hiji_y + 4800 + (int)((hiji_m - 14) / 12))) / 4) +
+				(int)((367 * (hiji_m - 2 - 12 * ((int)((hiji_m - 14) / 12)))) / 12) -
+				(int)((3 * (int)(((hiji_y + 4900 + (int)((hiji_m - 14) / 12)) / 100))) / 4) +
+				hiji_d - 32075;
+		} else {
+			tmp_jd = 367 * hiji_y - (int)((7 * (hiji_y + 5001 + (int)((hiji_m - 9) / 7))) / 4) +
+						(int)((275 * hiji_m) / 9) + hiji_d + 1729777;
+		}
+		int tmp_l = tmp_jd -1948440 + 10632;
+		int tmp_n = (int)((tmp_l - 1) / 10631);
+		tmp_l = tmp_l - 10631 * tmp_n + 354;
+		int tmp_j = ((int)((10985 - tmp_l) / 5316)) * ((int)((50 * tmp_l) / 17719)) + ((int)(tmp_l / 5670)) * ((int)((43 * tmp_l) / 15238));
+		tmp_l = tmp_l - ((int)((30 - tmp_j) / 15)) * ((int)((17719 * tmp_j) / 50)) - ((int)(tmp_j / 16)) * ((int)((15238 * tmp_j) / 43)) + 29;
+		hiji_m = (int)((24 * tmp_l) / 709);
+		hiji_d = tmp_l - (int)((709 * hiji_m) / 24);
+		hiji_y = 30 * tmp_n + tmp_j - 30;
+		rv[0] = hiji_y;
+		rv[1] = hiji_m;
+		rv[2] = hiji_d;
+		return true;
+	}
+	public static byte[] Get_month_name(Xowe_wiki wiki, DateAdp date) {
+		int[] seg_ary = Calc_date(date);
+		int m = seg_ary[Rslt__month] - List_adp_.Base1;
+		byte[] msg_key = Month_names[m];
+		return wiki.Msg_mgr().Val_by_key_obj(msg_key);
+	}
+	private static final    byte[][] Month_names = new byte[][] 
+	{ Bry_.new_a7("hijri-calendar-m1"), Bry_.new_a7("hijri-calendar-m2"), Bry_.new_a7("hijri-calendar-m3")
+	, Bry_.new_a7("hijri-calendar-m4"), Bry_.new_a7("hijri-calendar-m5"), Bry_.new_a7("hijri-calendar-m6")
+	, Bry_.new_a7("hijri-calendar-m7"), Bry_.new_a7("hijri-calendar-m8"), Bry_.new_a7("hijri-calendar-m9")
+	, Bry_.new_a7("hijri-calendar-m10"), Bry_.new_a7("hijri-calendar-m11"), Bry_.new_a7("hijri-calendar-m12")
+	};
+	public static final    int
+	  Rslt__year			= 0
+	, Rslt__month			= 1
+	, Rslt__day				= 2
+	;
+}

+ 41 - 37
400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_func_time__other__tst.java

@@ -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,39 +13,43 @@ 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 org.junit.*;
-public class Pft_func_time__other__tst {
-	@Before	public void init()							{fxt.Clear();} private Pft_func_time_foreign_fxt fxt = new Pft_func_time_foreign_fxt();
-	@After public void term()						{fxt.Term();}
-	@Test   public void Thai()							{fxt.Test_parse("{{#time:xkY|2012}}"			, "2555");}
-	@Test   public void Minguo()						{fxt.Test_parse("{{#time:xoY|2012}}"			, "101");}
-	@Test   public void Iranian__year_idx()				{fxt.Test_parse("{{#time:xiY|2012-01-02}}"		, "1390");}
-	@Test   public void Iranian__month_idx()			{fxt.Test_parse("{{#time:xin|2012-01-02}}"		, "10");}
-	@Test   public void Iranian__day_idx()				{fxt.Test_parse("{{#time:xij|2012-01-02}}"		, "12");}
-	@Test   public void Iranian__month_name()			{fxt.Init_msg("iranian-calendar-m10"	, "Dey"); fxt.Test_parse("{{#time:xiF|2012-01-02}}"		, "Dey");}
-	@Test   public void Hijiri__year_idx()				{fxt.Test_parse("{{#time:xmY|2012-01-02}}"		, "1433");}
-	@Test   public void Hijiri__month_idx()				{fxt.Test_parse("{{#time:xmn|2012-01-02}}"		, "2");}
-	@Test   public void Hijiri__day_idx()				{fxt.Test_parse("{{#time:xmj|2012-01-02}}"		, "7");}
-	@Test   public void Hijiri__month_name()			{fxt.Init_msg("hijiri-calendar-m2"	, "Safar"); fxt.Test_parse("{{#time:xmF|2012-01-02}}"		, "Safar");}
-	@Test   public void Roman__year()					{fxt.Test_parse("{{#time:xrY|2012}}"			, "MMXII");}
-	@Test   public void Roman__various() {
-		fxt.Test_Roman(   1, "I");
-		fxt.Test_Roman(   2, "II");
-		fxt.Test_Roman(   3, "III");
-		fxt.Test_Roman(   4, "IV");
-		fxt.Test_Roman(   5, "V");
-		fxt.Test_Roman(   6, "VI");
-		fxt.Test_Roman(   7, "VII");
-		fxt.Test_Roman(   8, "VIII");
-		fxt.Test_Roman(   9, "IX");
-		fxt.Test_Roman(  10, "X");
-		fxt.Test_Roman(  11, "XI");
-		fxt.Test_Roman( 100, "C");
-		fxt.Test_Roman( 101, "CI");
-		fxt.Test_Roman( 111, "CXI");
-		fxt.Test_Roman(1000, "M");
-		fxt.Test_Roman(1001, "MI");
-		fxt.Test_Roman(4000, "4000");
-	}
-}
+package gplx.xowa.xtns.pfuncs.times;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class Pft_func_time__other__tst {
+	@Before	public void init()							{fxt.Clear();} private Pft_func_time_foreign_fxt fxt = new Pft_func_time_foreign_fxt();
+	@After public void term()                           {fxt.Term();}
+	@Test   public void Thai()							{fxt.Test_parse("{{#time:xkY|2012}}"			, "2555");}
+	@Test   public void Minguo()						{fxt.Test_parse("{{#time:xoY|2012}}"			, "101");}
+	@Test   public void Iranian__year_idx()				{fxt.Test_parse("{{#time:xiY|2012-01-02}}"		, "1390");}
+	@Test   public void Iranian__month_idx()			{fxt.Test_parse("{{#time:xin|2012-01-02}}"		, "10");}
+	@Test   public void Iranian__day_idx()				{fxt.Test_parse("{{#time:xij|2012-01-02}}"		, "12");}
+	@Test   public void Iranian__month_name()			{fxt.Init_msg("iranian-calendar-m10"	, "Dey"); fxt.Test_parse("{{#time:xiF|2012-01-02}}"		, "Dey");}
+	@Test   public void hijri__year_idx()				{fxt.Test_parse("{{#time:xmY|2012-01-02}}"		, "1433");}
+	@Test   public void hijri__month_idx()				{fxt.Test_parse("{{#time:xmn|2012-01-02}}"		, "2");}
+	@Test   public void hijri__day_idx()				{fxt.Test_parse("{{#time:xmj|2012-01-02}}"		, "7");}
+	@Test   public void hijri__month_name()             {fxt.Init_msg("hijri-calendar-m2"	, "Safar"); fxt.Test_parse("{{#time:xmF|2012-01-02}}"		, "Safar");}
+	@Test   public void Roman__year()					{fxt.Test_parse("{{#time:xrY|2012}}"			, "MMXII");}
+	@Test   public void Roman__various() {
+		fxt.Test_Roman(   1, "I");
+		fxt.Test_Roman(   2, "II");
+		fxt.Test_Roman(   3, "III");
+		fxt.Test_Roman(   4, "IV");
+		fxt.Test_Roman(   5, "V");
+		fxt.Test_Roman(   6, "VI");
+		fxt.Test_Roman(   7, "VII");
+		fxt.Test_Roman(   8, "VIII");
+		fxt.Test_Roman(   9, "IX");
+		fxt.Test_Roman(  10, "X");
+		fxt.Test_Roman(  11, "XI");
+		fxt.Test_Roman( 100, "C");
+		fxt.Test_Roman( 101, "CI");
+		fxt.Test_Roman( 111, "CXI");
+		fxt.Test_Roman(1000, "M");
+		fxt.Test_Roman(1001, "MI");
+		fxt.Test_Roman(4000, "4000");
+	}
+}