ソースを参照

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

gnosygnu 4 年 前
コミット
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
 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,
 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.
 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
 GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
 Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.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
 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,
 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.
 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
 GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
 Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.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
 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,
 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.
 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
 GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
 Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.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
 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,
 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.
 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
 GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
 Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.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");
+	}
+}