mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-09-30 07:20:52 +00:00
ParserFunctions: Support next / previous for day of week [#262]
This commit is contained in:
parent
50d1fbfed1
commit
2e5994788f
@ -66,10 +66,20 @@ public class Pft_func_time__basic__tst {
|
|||||||
@Test public void Unit_rel_year_next() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|next year}}" , "2013-01-02");} // DATE:2014-05-02
|
@Test public void Unit_rel_year_next() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|next year}}" , "2013-01-02");} // DATE:2014-05-02
|
||||||
@Test public void Unit_rel_year_last() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|last year}}" , "2011-01-02");}
|
@Test public void Unit_rel_year_last() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|last year}}" , "2011-01-02");}
|
||||||
@Test public void Unit_rel_year_previous(){fxt.Test_parse_tmpl_str("{{#time:Y-m-d|previous year}}" , "2011-01-02");}
|
@Test public void Unit_rel_year_previous(){fxt.Test_parse_tmpl_str("{{#time:Y-m-d|previous year}}" , "2011-01-02");}
|
||||||
|
@Test public void Unit_rel_month_next() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|next month}}" , "2012-02-02");}
|
||||||
|
@Test public void Unit_rel_month_prev() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|previous month}}" , "2011-12-02");}
|
||||||
@Test public void Unit_rel_year_this() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|this year}}" , "2012-01-02");}
|
@Test public void Unit_rel_year_this() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|this year}}" , "2012-01-02");}
|
||||||
@Test public void Time_rel_now() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d h:i:s A|now}}" , "2012-01-02 03:05:05 AM");} // NOTE: minute is 5, not 4, b/c each call to Datetime_now.Get() automatically increments by 1 minute; DATE:2014-04-13
|
@Test public void Time_rel_now() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d h:i:s A|now}}" , "2012-01-02 03:05:05 AM");} // NOTE: minute is 5, not 4, b/c each call to Datetime_now.Get() automatically increments by 1 minute; DATE:2014-04-13
|
||||||
@Test public void Empty_is_today() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|}}" , "2012-01-02");} // tested on MW
|
@Test public void Empty_is_today() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|}}" , "2012-01-02");} // tested on MW
|
||||||
@Test public void Day_name_today() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|Monday}}" , "2012-01-02");} // 2012-01-02 is Monday, so return Monday; DATE:2014-05-02
|
@Test public void Day_monday_none() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|Monday}}" , "2012-01-02");} // 2012-01-02 is Monday, so return Monday; DATE:2014-05-02
|
||||||
|
@Test public void Day_monday_this() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|this Monday}}" , "2012-01-02");} // "this Monday" is same as "Monday"
|
||||||
|
@Test public void Day_monday_next() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|next Monday}}" , "2012-01-09");}
|
||||||
|
@Test public void Day_monday_prev() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|previous Monday}}" , "2011-12-26");}
|
||||||
|
@Test public void Day_sunday_none() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|Sunday}}" , "2012-01-08");}
|
||||||
|
@Test public void Day_sunday_this() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|this Sunday}}" , "2012-01-08");}
|
||||||
|
@Test public void Day_sunday_next() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|next Sunday}}" , "2012-01-15");}
|
||||||
|
@Test public void Day_sunday_prev() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|previous Sunday}}" , "2012-01-01");}
|
||||||
|
@Test public void Day_relative_smoke() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|6 april next sunday}}" , "2012-04-15");}
|
||||||
@Test public void Day_name_future_1() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|Saturday}}" , "2012-01-07");} // return next Sunday; DATE:2014-05-02
|
@Test public void Day_name_future_1() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|Saturday}}" , "2012-01-07");} // return next Sunday; DATE:2014-05-02
|
||||||
@Test public void Day_name_future_2() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|Sunday}}" , "2012-01-08");} // return next Saturday; DATE:2014-05-02
|
@Test public void Day_name_future_2() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|Sunday}}" , "2012-01-08");} // return next Saturday; DATE:2014-05-02
|
||||||
@Test public void Day_name_dow() {fxt.Test_parse_tmpl_str("{{#time:w|Monday}}" , "1");}
|
@Test public void Day_name_dow() {fxt.Test_parse_tmpl_str("{{#time:w|Monday}}" , "1");}
|
||||||
|
36
400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pxd_date_bldr.java
Normal file
36
400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pxd_date_bldr.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.xowa.xtns.pfuncs.times; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
|
||||||
|
public class Pxd_date_bldr {
|
||||||
|
private int[] seg_ary;
|
||||||
|
public Pxd_date_bldr(int year, int month, int day, int hour, int minute, int second, int frac) {
|
||||||
|
this.seg_ary = new int[] {year, month, day, hour, minute, second, frac};
|
||||||
|
}
|
||||||
|
|
||||||
|
// most workers will just set individual segments
|
||||||
|
public void Seg_set(int idx, int val) {
|
||||||
|
seg_ary[idx] = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
// relative workers will convert segs to date, add a relative unit, and then convert back to date
|
||||||
|
// note that the date conversion is necessary b/c Date class has logic to do things like "2017-12-31 +1 day" and rollover to next month / next year
|
||||||
|
public DateAdp To_date() {
|
||||||
|
return DateAdp_.seg_(seg_ary);
|
||||||
|
}
|
||||||
|
public void By_date(DateAdp v) {
|
||||||
|
this.seg_ary = v.XtoSegAry();
|
||||||
|
}
|
||||||
|
}
|
@ -22,7 +22,7 @@ interface Pxd_itm {
|
|||||||
int Eval_idx();
|
int Eval_idx();
|
||||||
int Data_idx(); void Data_idx_(int v);
|
int Data_idx(); void Data_idx_(int v);
|
||||||
boolean Eval(Pxd_parser state);
|
boolean Eval(Pxd_parser state);
|
||||||
boolean Time_ini(DateAdpBldr bldr);
|
boolean Time_ini(Pxd_date_bldr bldr);
|
||||||
}
|
}
|
||||||
class Pxd_itm_ {
|
class Pxd_itm_ {
|
||||||
public static final int
|
public static final int
|
||||||
@ -46,7 +46,16 @@ class Pxd_itm_ {
|
|||||||
, Tid_colon = Byte_ascii.Colon
|
, Tid_colon = Byte_ascii.Colon
|
||||||
, Tid_ws = 98
|
, Tid_ws = 98
|
||||||
, Tid_sym = 99
|
, Tid_sym = 99
|
||||||
;
|
;
|
||||||
|
|
||||||
|
public static Pxd_itm Find_fwd__non_ws(Pxd_itm[] tkns, int bgn) {
|
||||||
|
int len = tkns.length;
|
||||||
|
for (int i = bgn; i < len; i++) {
|
||||||
|
Pxd_itm itm = tkns[i];
|
||||||
|
if (itm.Tkn_tid() != Tid_ws) return itm;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
public static Pxd_itm Find_bwd__non_ws(Pxd_itm[] tkns, int bgn) {
|
public static Pxd_itm Find_bwd__non_ws(Pxd_itm[] tkns, int bgn) {
|
||||||
for (int i = bgn - 1; i > -1; --i) {
|
for (int i = bgn - 1; i > -1; --i) {
|
||||||
Pxd_itm itm = tkns[i];
|
Pxd_itm itm = tkns[i];
|
||||||
@ -73,38 +82,13 @@ abstract class Pxd_itm_base implements Pxd_itm {
|
|||||||
public int Data_idx() {return data_idx;} public void Data_idx_(int v) {data_idx = v;} private int data_idx;
|
public int Data_idx() {return data_idx;} public void Data_idx_(int v) {data_idx = v;} private int data_idx;
|
||||||
public abstract int Eval_idx();
|
public abstract int Eval_idx();
|
||||||
@gplx.Virtual public boolean Eval(Pxd_parser state) {return true;}
|
@gplx.Virtual public boolean Eval(Pxd_parser state) {return true;}
|
||||||
@gplx.Virtual public boolean Time_ini(DateAdpBldr bldr) {return true;}
|
@gplx.Virtual public boolean Time_ini(Pxd_date_bldr bldr) {return true;}
|
||||||
public void Ctor(int ary_idx) {this.ary_idx = ary_idx;}
|
public void Ctor(int ary_idx) {this.ary_idx = ary_idx;}
|
||||||
public static final int Seg_idx_null = -1, Seg_idx_skip = -2;
|
public static final int Seg_idx_null = -1, Seg_idx_skip = -2;
|
||||||
}
|
}
|
||||||
interface Pxd_itm_prototype {
|
interface Pxd_itm_prototype {
|
||||||
Pxd_itm MakeNew(int ary_idx);
|
Pxd_itm MakeNew(int ary_idx);
|
||||||
}
|
}
|
||||||
class DateAdpBldr {
|
|
||||||
public DateAdp Date() {
|
|
||||||
if (dirty) {
|
|
||||||
if (date == null) date = DateAdp_.seg_(seg_ary); // date not set and seg_ary is dirty; make date = seg_ary;
|
|
||||||
return date;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return Datetime_now.Get(); // not dirtied; default to now;
|
|
||||||
}
|
|
||||||
public DateAdpBldr Date_(DateAdp v) {date = v; return this;} DateAdp date = null;
|
|
||||||
public void Seg_set(int idx, int val) {
|
|
||||||
if (date == null) seg_ary[idx] = val;
|
|
||||||
else {
|
|
||||||
seg_ary = date.XtoSegAry();
|
|
||||||
seg_ary[idx] = val;
|
|
||||||
date = DateAdp_.seg_(seg_ary);
|
|
||||||
}
|
|
||||||
dirty = true;
|
|
||||||
}
|
|
||||||
public DateAdp Bld() {
|
|
||||||
return date == null ? DateAdp_.seg_(seg_ary) : date;
|
|
||||||
}
|
|
||||||
public DateAdpBldr(int... seg_ary) {this.seg_ary = seg_ary;}
|
|
||||||
int[] seg_ary = new int[DateAdp_.SegIdx__max]; boolean dirty = false;
|
|
||||||
}
|
|
||||||
class Pft_func_time_log {
|
class Pft_func_time_log {
|
||||||
private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "time_parser");
|
private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "time_parser");
|
||||||
public static final Gfo_msg_itm
|
public static final Gfo_msg_itm
|
||||||
|
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.xowa.xtns.pfuncs.times; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
|
||||||
|
class Pxd_itm_dow_name extends Pxd_itm_base implements Pxd_itm_prototype {
|
||||||
|
private final int dow_idx;
|
||||||
|
private final byte[] dow_name;
|
||||||
|
private int relative_adj = Int_.Max_value;
|
||||||
|
public Pxd_itm_dow_name(int ary_idx, byte[] dow_name, int dow_idx) {
|
||||||
|
this.dow_name = dow_name;
|
||||||
|
this.dow_idx = dow_idx;
|
||||||
|
this.Ctor(ary_idx);
|
||||||
|
this.Seg_idx_(DateAdp_.SegIdx_dayOfWeek);
|
||||||
|
}
|
||||||
|
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_dow_name;}
|
||||||
|
@Override public int Eval_idx() {return 20;}
|
||||||
|
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_dow_name(ary_idx, dow_name, dow_idx);}
|
||||||
|
public void Relative_adj_(int v) { // handled by relative_word; EX: "next tuesday"
|
||||||
|
this.relative_adj = v;
|
||||||
|
}
|
||||||
|
@Override public boolean Eval(Pxd_parser state) {return true;}
|
||||||
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
|
DateAdp cur = bldr.To_date();
|
||||||
|
int cur_dow = cur.DayOfWeek();
|
||||||
|
|
||||||
|
// adj = requested_dow - cur_dow; EX: requesting Friday, and today is Wednesday; adj = 2 (4 - 2); DATE:2014-05-02
|
||||||
|
int adj = dow_idx - cur.DayOfWeek();
|
||||||
|
|
||||||
|
// requested_dow is before cur_dow; add 7 to get the next day
|
||||||
|
if (adj < 0) adj += 7;
|
||||||
|
|
||||||
|
// "next" always adds 7 days
|
||||||
|
if (relative_adj == 1)
|
||||||
|
adj += 7;
|
||||||
|
// "previous" always subtracts 7 days;
|
||||||
|
else if (relative_adj == -1)
|
||||||
|
adj -= 7;
|
||||||
|
|
||||||
|
cur = cur.Add_day(adj);
|
||||||
|
bldr.By_date(cur);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -41,27 +41,28 @@ class Pxd_itm_int extends Pxd_itm_base implements Pxd_itm_int_interface {
|
|||||||
public boolean Val_is_adj() {return val_is_adj;} public void Val_is_adj_(boolean v) {val_is_adj = v;} private boolean val_is_adj;
|
public boolean Val_is_adj() {return val_is_adj;} public void Val_is_adj_(boolean v) {val_is_adj = v;} private boolean val_is_adj;
|
||||||
public int Xto_int_or(int or) {return val;}
|
public int Xto_int_or(int or) {return val;}
|
||||||
public int Digits() {return digits;} private int digits;
|
public int Digits() {return digits;} private int digits;
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
int seg_idx = this.Seg_idx();
|
int seg_idx = this.Seg_idx();
|
||||||
if (seg_idx == Pxd_itm_base.Seg_idx_skip) return true;
|
if (seg_idx == Pxd_itm_base.Seg_idx_skip) return true;
|
||||||
if (val_is_adj) {
|
if (val_is_adj) {
|
||||||
if (val == 0) return true; // no adjustment to make
|
if (val == 0) return true; // no adjustment to make
|
||||||
DateAdp date = bldr.Date();
|
DateAdp date = bldr.To_date();
|
||||||
switch (seg_idx) {
|
switch (seg_idx) {
|
||||||
case DateAdp_.SegIdx_hour: date = date.Add_hour(val); break;
|
case DateAdp_.SegIdx_hour: date = date.Add_hour(val); break;
|
||||||
case DateAdp_.SegIdx_minute: date = date.Add_minute(val); break;
|
case DateAdp_.SegIdx_minute: date = date.Add_minute(val); break;
|
||||||
default: return true;
|
default: return true;
|
||||||
}
|
}
|
||||||
bldr.Date_(date);
|
bldr.By_date(date);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (val == 0) { // 0 means subtract 1; EX:w:Mariyinsky_Palace; DATE:2014-03-25
|
if (val == 0) { // 0 means subtract 1; EX:w:Mariyinsky_Palace; DATE:2014-03-25
|
||||||
DateAdp date = bldr.Date();
|
DateAdp date = bldr.To_date();
|
||||||
switch (seg_idx) {
|
switch (seg_idx) {
|
||||||
case DateAdp_.SegIdx_month: date = DateAdp_.seg_(new int[] {date.Year(), 1, date.Day(), date.Hour(), date.Minute(), date.Second(), date.Frac()}).Add_month(-1); bldr.Date_(date); break;
|
case DateAdp_.SegIdx_month: date = DateAdp_.seg_(new int[] {date.Year(), 1, date.Day(), date.Hour(), date.Minute(), date.Second(), date.Frac()}).Add_month(-1); break;
|
||||||
case DateAdp_.SegIdx_day: date = DateAdp_.seg_(new int[] {date.Year(), date.Month(), 1, date.Hour(), date.Minute(), date.Second(), date.Frac()}).Add_day(-1); bldr.Date_(date); break;
|
case DateAdp_.SegIdx_day: date = DateAdp_.seg_(new int[] {date.Year(), date.Month(), 1, date.Hour(), date.Minute(), date.Second(), date.Frac()}).Add_day(-1); break;
|
||||||
default: return true;
|
default: return true;
|
||||||
}
|
}
|
||||||
|
bldr.By_date(date);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (seg_idx == -1) return false; // PAGE:New_York_City EX: March 14, 2,013; DATE:2016-07-06
|
if (seg_idx == -1) return false; // PAGE:New_York_City EX: March 14, 2,013; DATE:2016-07-06
|
||||||
|
@ -79,7 +79,7 @@ class Pxd_itm_slash extends Pxd_itm_base {
|
|||||||
class Pxd_itm_sym extends Pxd_itm_base {
|
class Pxd_itm_sym extends Pxd_itm_base {
|
||||||
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_sym;}
|
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_sym;}
|
||||||
@Override public int Eval_idx() {return 99;}
|
@Override public int Eval_idx() {return 99;}
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {return true;}
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {return true;}
|
||||||
public byte Sym_byte() {return sym_byte;} private byte sym_byte;
|
public byte Sym_byte() {return sym_byte;} private byte sym_byte;
|
||||||
public Pxd_itm_sym(int ary_idx, byte val) {this.Ctor(ary_idx); this.sym_byte = val;}
|
public Pxd_itm_sym(int ary_idx, byte val) {this.Ctor(ary_idx); this.sym_byte = val;}
|
||||||
}
|
}
|
||||||
@ -88,7 +88,7 @@ class Pxd_itm_int_dmy_14 extends Pxd_itm_base implements Pxd_itm_int_interface {
|
|||||||
public int Xto_int_or(int or) {return Bry_.To_int_or(src, or);}
|
public int Xto_int_or(int or) {return Bry_.To_int_or(src, or);}
|
||||||
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_int_dmy_14;}
|
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_int_dmy_14;}
|
||||||
@Override public int Eval_idx() {return eval_idx;} private int eval_idx = 20;
|
@Override public int Eval_idx() {return eval_idx;} private int eval_idx = 20;
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return true; // has seg_idx; already eval'd by something else
|
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return true; // has seg_idx; already eval'd by something else
|
||||||
bldr.Seg_set(DateAdp_.SegIdx_year , Bry_.To_int_or(src, 0, 4, 0));
|
bldr.Seg_set(DateAdp_.SegIdx_year , Bry_.To_int_or(src, 0, 4, 0));
|
||||||
bldr.Seg_set(DateAdp_.SegIdx_month , Bry_.To_int_or(src, 4, 6, 0));
|
bldr.Seg_set(DateAdp_.SegIdx_month , Bry_.To_int_or(src, 4, 6, 0));
|
||||||
@ -111,7 +111,7 @@ class Pxd_itm_int_mhs_6 extends Pxd_itm_base implements Pxd_itm_int_interface {
|
|||||||
public int Xto_int_or(int or) {return Bry_.To_int_or(src, or);}
|
public int Xto_int_or(int or) {return Bry_.To_int_or(src, or);}
|
||||||
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_int_hms_6;}
|
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_int_hms_6;}
|
||||||
@Override public int Eval_idx() {return eval_idx;} private int eval_idx = 20;
|
@Override public int Eval_idx() {return eval_idx;} private int eval_idx = 20;
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return true; // has seg_idx; already eval'd by something else
|
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return true; // has seg_idx; already eval'd by something else
|
||||||
bldr.Seg_set(DateAdp_.SegIdx_hour , Bry_.To_int_or(src, 0, 2, 0));
|
bldr.Seg_set(DateAdp_.SegIdx_hour , Bry_.To_int_or(src, 0, 2, 0));
|
||||||
bldr.Seg_set(DateAdp_.SegIdx_minute , Bry_.To_int_or(src, 2, 4, 0));
|
bldr.Seg_set(DateAdp_.SegIdx_minute , Bry_.To_int_or(src, 2, 4, 0));
|
||||||
|
@ -16,10 +16,16 @@ 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.*;
|
package gplx.xowa.xtns.pfuncs.times; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
|
||||||
import gplx.core.brys.*;
|
import gplx.core.brys.*;
|
||||||
class Pxd_itm_month_name extends Pxd_itm_base implements Pxd_itm_prototype {
|
class Pxd_itm_month_name extends Pxd_itm_base implements Pxd_itm_prototype {
|
||||||
public Pxd_itm_month_name(int ary_idx, byte[] name, int seg_idx, int seg_val) {Ctor(ary_idx); this.name = name; Seg_idx_(seg_idx); this.seg_val = seg_val;} private byte[] name;
|
private byte[] name;
|
||||||
|
private int seg_val;
|
||||||
|
public Pxd_itm_month_name(int ary_idx, byte[] name, int seg_idx, int seg_val) {
|
||||||
|
Ctor(ary_idx);
|
||||||
|
this.name = name;
|
||||||
|
Seg_idx_(seg_idx);
|
||||||
|
this.seg_val = seg_val;
|
||||||
|
}
|
||||||
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_month_name;}
|
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_month_name;}
|
||||||
@Override public int Eval_idx() {return 20;}
|
@Override public int Eval_idx() {return 20;}
|
||||||
int seg_val;
|
|
||||||
public Pxd_itm MakeNew(int ary_idx) {
|
public Pxd_itm MakeNew(int ary_idx) {
|
||||||
Pxd_itm_month_name rv = new Pxd_itm_month_name(ary_idx, name, this.Seg_idx(), seg_val);
|
Pxd_itm_month_name rv = new Pxd_itm_month_name(ary_idx, name, this.Seg_idx(), seg_val);
|
||||||
return rv;
|
return rv;
|
||||||
@ -142,7 +148,7 @@ class Pxd_itm_month_name extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
bldr.Seg_set(this.Seg_idx(), seg_val);
|
bldr.Seg_set(this.Seg_idx(), seg_val);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -202,9 +208,8 @@ class Pxd_itm_unit extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
DateAdp cur = bldr.Date();
|
DateAdp cur = bldr.To_date();
|
||||||
if (cur == null) cur = Datetime_now.Get();
|
|
||||||
int val = seg_val * seg_multiple;
|
int val = seg_val * seg_multiple;
|
||||||
switch (this.Seg_idx()) {
|
switch (this.Seg_idx()) {
|
||||||
case DateAdp_.SegIdx_second: cur = cur.Add_second(val); break;
|
case DateAdp_.SegIdx_second: cur = cur.Add_second(val); break;
|
||||||
@ -215,7 +220,7 @@ class Pxd_itm_unit extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
case DateAdp_.SegIdx_year : cur = cur.Add_year (val); break;
|
case DateAdp_.SegIdx_year : cur = cur.Add_year (val); break;
|
||||||
default: throw Err_.new_unhandled(this.Seg_idx());
|
default: throw Err_.new_unhandled(this.Seg_idx());
|
||||||
}
|
}
|
||||||
bldr.Date_(cur);
|
bldr.By_date(cur);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -246,7 +251,7 @@ class Pxd_itm_ago extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {return true;}
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {return true;}
|
||||||
}
|
}
|
||||||
class Pxd_itm_day_suffix extends Pxd_itm_base implements Pxd_itm_prototype {
|
class Pxd_itm_day_suffix extends Pxd_itm_base implements Pxd_itm_prototype {
|
||||||
public Pxd_itm_day_suffix(int ary_idx) {Ctor(ary_idx);}
|
public Pxd_itm_day_suffix(int ary_idx) {Ctor(ary_idx);}
|
||||||
@ -271,7 +276,7 @@ class Pxd_itm_day_relative extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
@Override public int Eval_idx() {return 5;}
|
@Override public int Eval_idx() {return 5;}
|
||||||
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_day_relative(adj, ary_idx);}
|
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_day_relative(adj, ary_idx);}
|
||||||
@Override public boolean Eval(Pxd_parser state) {return true;}
|
@Override public boolean Eval(Pxd_parser state) {return true;}
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
DateAdp date = Datetime_now.Get();
|
DateAdp date = Datetime_now.Get();
|
||||||
if (adj != 0) date = date.Add_day(adj);
|
if (adj != 0) date = date.Add_day(adj);
|
||||||
bldr.Seg_set(DateAdp_.SegIdx_year , date.Year());
|
bldr.Seg_set(DateAdp_.SegIdx_year , date.Year());
|
||||||
@ -293,7 +298,7 @@ class Pxd_itm_time_relative extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
@Override public int Eval_idx() {return 5;}
|
@Override public int Eval_idx() {return 5;}
|
||||||
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_time_relative(ary_idx);}
|
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_time_relative(ary_idx);}
|
||||||
@Override public boolean Eval(Pxd_parser state) {return true;}
|
@Override public boolean Eval(Pxd_parser state) {return true;}
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
DateAdp date = Datetime_now.Get();
|
DateAdp date = Datetime_now.Get();
|
||||||
bldr.Seg_set(DateAdp_.SegIdx_year , date.Year());
|
bldr.Seg_set(DateAdp_.SegIdx_year , date.Year());
|
||||||
bldr.Seg_set(DateAdp_.SegIdx_month , date.Month());
|
bldr.Seg_set(DateAdp_.SegIdx_month , date.Month());
|
||||||
@ -309,34 +314,6 @@ class Pxd_itm_time_relative extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
;
|
;
|
||||||
Pxd_itm_time_relative() {}
|
Pxd_itm_time_relative() {}
|
||||||
}
|
}
|
||||||
class Pxd_itm_unit_relative extends Pxd_itm_base implements Pxd_itm_prototype { // EX: "next year"
|
|
||||||
private final int adj;
|
|
||||||
public Pxd_itm_unit_relative(int adj, int ary_idx) {
|
|
||||||
Ctor(ary_idx);
|
|
||||||
this.adj = adj;
|
|
||||||
}
|
|
||||||
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_unit_relative;}
|
|
||||||
@Override public int Eval_idx() {return 5;}
|
|
||||||
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_unit_relative(adj, ary_idx);}
|
|
||||||
@Override public boolean Eval(Pxd_parser state) {
|
|
||||||
// find next token: EX: sec, hour, day, fortnight, month, etc.
|
|
||||||
Pxd_itm itm = Pxd_itm_.Find_fwd_by_tid(state.Tkns(), this.Ary_idx() + 1, Pxd_itm_.Tid_unit);
|
|
||||||
if (itm == null) state.Err_set(Pft_func_time_log.Invalid_date, Bfr_arg_.New_int(adj));
|
|
||||||
|
|
||||||
// cast to unit; may fail; EX:update in "last update" as per "March 2006 [last update]";PAGE:s.w:Synesthesia;DATE:2016-07-06
|
|
||||||
Pxd_itm_unit unit_tkn = (Pxd_itm_unit)itm;
|
|
||||||
if (unit_tkn == null) {state.Err_set(Pft_func_time_log.Invalid_date, Bfr_arg_.New_int(adj)); return false;}
|
|
||||||
|
|
||||||
unit_tkn.Unit_seg_val_(adj);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {return true;}
|
|
||||||
public static final Pxd_itm_unit_relative
|
|
||||||
Next = new Pxd_itm_unit_relative( 1, 0)
|
|
||||||
, Prev = new Pxd_itm_unit_relative(-1, 0)
|
|
||||||
, This = new Pxd_itm_unit_relative( 0, 0)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
class Pxd_itm_unixtime extends Pxd_itm_base implements Pxd_itm_prototype {
|
class Pxd_itm_unixtime extends Pxd_itm_base implements Pxd_itm_prototype {
|
||||||
private long unixtime;
|
private long unixtime;
|
||||||
public Pxd_itm_unixtime(int ary_idx, int seg_idx) {Ctor(ary_idx); Seg_idx_(seg_idx);}
|
public Pxd_itm_unixtime(int ary_idx, int seg_idx) {Ctor(ary_idx); Seg_idx_(seg_idx);}
|
||||||
@ -349,7 +326,7 @@ class Pxd_itm_unixtime extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
unixtime = Pxd_itm_int_.Read_nearest_as_int_and_skip(state, tkns, this.Ary_idx(), true, Int_.Min_value);
|
unixtime = Pxd_itm_int_.Read_nearest_as_int_and_skip(state, tkns, this.Ary_idx(), true, Int_.Min_value);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
DateAdp date = DateAdp_.unixtime_utc_seconds_(unixtime);
|
DateAdp date = DateAdp_.unixtime_utc_seconds_(unixtime);
|
||||||
bldr.Seg_set(DateAdp_.SegIdx_year , date.Year());
|
bldr.Seg_set(DateAdp_.SegIdx_year , date.Year());
|
||||||
bldr.Seg_set(DateAdp_.SegIdx_month , date.Month());
|
bldr.Seg_set(DateAdp_.SegIdx_month , date.Month());
|
||||||
@ -361,22 +338,6 @@ class Pxd_itm_unixtime extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class Pxd_itm_dow_name extends Pxd_itm_base implements Pxd_itm_prototype {
|
|
||||||
private int dow_idx;
|
|
||||||
private byte[] dow_name;
|
|
||||||
public Pxd_itm_dow_name(int ary_idx, byte[] dow_name, int dow_idx) {Ctor(ary_idx); this.dow_name = dow_name; this.Seg_idx_(DateAdp_.SegIdx_dayOfWeek); this.dow_idx = dow_idx;}
|
|
||||||
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_dow_name;}
|
|
||||||
@Override public int Eval_idx() {return 20;}
|
|
||||||
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_dow_name(ary_idx, dow_name, dow_idx);}
|
|
||||||
@Override public boolean Eval(Pxd_parser state) {return true;}
|
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {
|
|
||||||
DateAdp now = Datetime_now.Get();
|
|
||||||
int adj = dow_idx - now.DayOfWeek(); // adj = requested_dow - current_dow; EX: requesting Friday, and today is Wednesday; adj = 2 (4 - 2); DATE:2014-05-02
|
|
||||||
if (adj < 0) adj += 7; // requested_down is before current_dow; add 7 to get the next day
|
|
||||||
bldr.Date_(bldr.Date().Add_day(adj));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class Pxd_itm_iso8601_t extends Pxd_itm_base implements Pxd_itm_prototype {
|
class Pxd_itm_iso8601_t extends Pxd_itm_base implements Pxd_itm_prototype {
|
||||||
public Pxd_itm_iso8601_t(int ary_idx, int seg_idx) {Ctor(ary_idx); Seg_idx_(seg_idx);}
|
public Pxd_itm_iso8601_t(int ary_idx, int seg_idx) {Ctor(ary_idx); Seg_idx_(seg_idx);}
|
||||||
public byte[] Name() {return Name_const;} public static final byte[] Name_const = Bry_.new_a7("T");
|
public byte[] Name() {return Name_const;} public static final byte[] Name_const = Bry_.new_a7("T");
|
||||||
@ -389,7 +350,7 @@ class Pxd_itm_iso8601_t extends Pxd_itm_base implements Pxd_itm_prototype {
|
|||||||
state.Err_set(Pft_func_time_log.Invalid_hour, Bfr_arg_.New_bry("T"));
|
state.Err_set(Pft_func_time_log.Invalid_hour, Bfr_arg_.New_bry("T"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@Override public boolean Time_ini(DateAdpBldr bldr) {return true;}
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {return true;}
|
||||||
private static Pxd_itm Next_non_ws_tkn(Pxd_itm[] tkns, int bgn) {
|
private static Pxd_itm Next_non_ws_tkn(Pxd_itm[] tkns, int bgn) {
|
||||||
int len = tkns.length;
|
int len = tkns.length;
|
||||||
for (int i = bgn; i < len; i++) {
|
for (int i = bgn; i < len; i++) {
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.xowa.xtns.pfuncs.times; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
|
||||||
|
import gplx.core.brys.*;
|
||||||
|
class Pxd_itm_unit_relative extends Pxd_itm_base implements Pxd_itm_prototype { // handle "next", "prev", "this"; EX: "next year"
|
||||||
|
private final int adj;
|
||||||
|
public Pxd_itm_unit_relative(int adj, int ary_idx) {
|
||||||
|
this.adj = adj;
|
||||||
|
Ctor(ary_idx);
|
||||||
|
}
|
||||||
|
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_unit_relative;}
|
||||||
|
@Override public int Eval_idx() {return 5;}
|
||||||
|
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_unit_relative(adj, ary_idx);}
|
||||||
|
@Override public boolean Eval(Pxd_parser state) {
|
||||||
|
// find next token: EX: year, month, Sunday, Monday, etc.
|
||||||
|
Pxd_itm itm = Pxd_itm_.Find_fwd__non_ws(state.Tkns(), this.Ary_idx() + 1);
|
||||||
|
if (itm == null) {
|
||||||
|
state.Err_set(Pft_func_time_log.Invalid_date, Bfr_arg_.New_int(adj));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (itm.Tkn_tid()) {
|
||||||
|
// EX: "next year", "next month", etc.
|
||||||
|
case Pxd_itm_.Tid_unit:
|
||||||
|
Pxd_itm_unit unit_tkn = (Pxd_itm_unit)itm;
|
||||||
|
unit_tkn.Unit_seg_val_(adj);
|
||||||
|
break;
|
||||||
|
// EX: "next Monday", "next Tuesday", etc.
|
||||||
|
case Pxd_itm_.Tid_dow_name:
|
||||||
|
Pxd_itm_dow_name day_tkn = (Pxd_itm_dow_name)itm;
|
||||||
|
day_tkn.Relative_adj_(adj);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
state.Err_set(Pft_func_time_log.Invalid_date, Bfr_arg_.New_int(adj));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public boolean Time_ini(Pxd_date_bldr bldr) {
|
||||||
|
// noop; date-logic handled by respective unit, month, dow classes; EX: "next month" -> "next" does no date logic; "month" does;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public static final Pxd_itm_unit_relative
|
||||||
|
Next = new Pxd_itm_unit_relative( 1, 0)
|
||||||
|
, Prev = new Pxd_itm_unit_relative(-1, 0)
|
||||||
|
, This = new Pxd_itm_unit_relative( 0, 0)
|
||||||
|
;
|
||||||
|
}
|
@ -143,8 +143,10 @@ class Pxd_parser {
|
|||||||
return DateAdp_.MinValue;
|
return DateAdp_.MinValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// build date
|
||||||
DateAdp now = Datetime_now.Get();
|
DateAdp now = Datetime_now.Get();
|
||||||
DateAdpBldr bldr = new DateAdpBldr(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0);
|
Pxd_date_bldr bldr = new Pxd_date_bldr(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0);
|
||||||
for (int i = 0; i < tkns_len; i++) {
|
for (int i = 0; i < tkns_len; i++) {
|
||||||
Pxd_itm itm = (Pxd_itm)tkns[i];
|
Pxd_itm itm = (Pxd_itm)tkns[i];
|
||||||
if (!itm.Time_ini(bldr)) {
|
if (!itm.Time_ini(bldr)) {
|
||||||
@ -152,7 +154,7 @@ class Pxd_parser {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bldr.Bld();
|
return bldr.To_date();
|
||||||
}
|
}
|
||||||
private void MakeDataAry() {
|
private void MakeDataAry() {
|
||||||
data_ary = new Pxd_itm[tkns_len]; data_ary_len = 0;
|
data_ary = new Pxd_itm[tkns_len]; data_ary_len = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user