diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_tst.java index fd295b35a..2cefbbabe 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_tst.java @@ -102,8 +102,8 @@ public class Scrib_lib_wikibase_tst { fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "test_str"); } @Test public void RenderSnak__quantity() { - Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_quantity(3, "123", "2", "125", "121")); - fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "123±2"); + Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_quantity(3, "123", "units", "125", "121")); + fxt.Test__proc__kvps__flat(lib, Scrib_lib_wikibase.Invk_renderSnak, args, "123±2 units"); } @Test public void RenderSnak__time() { Keyval[] args = Wbase_snak_utl_.Get_snak(wdata_fxt, wdata_fxt.Make_claim_time(3, "2012-01-02 03:04:05")); diff --git a/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor_.java b/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor_.java index 9e92550d5..bbfdd904a 100644 --- a/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor_.java +++ b/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor_.java @@ -45,18 +45,35 @@ public class Wdata_prop_val_visitor_ { return rv; } private static void Render_snak(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, byte[] page_url, Keyval[] props, int sub_idx, int sub_len) { - Keyval[] datavalue_ary = (Keyval[])Scrib_kv_utl_.Get_sub_by_key_or_null(props, Wdata_dict_mainsnak.Itm__datavalue.Key_str()); + // [snaktype=value, property=P1082, datavalue=[Lgplx.Keyval;@44a11b76, datatype=quantity] + // loop props to get (a) snaktype; (b) property; (c) datavalue + byte snak_tid = Byte_.Max_value_127; + int pid = -1; + Keyval[] datavalue_ary = null; + int len = props.length; + for (int i = 0; i < len; ++i) { + Keyval prop = props[i]; + byte prop_tid = Wdata_dict_mainsnak.Reg.Get_tid_or_max_and_log(page_url, prop.Key()); if (prop_tid == Byte_.Max_value_127) continue; + switch (prop_tid) { + case Wdata_dict_mainsnak.Tid__snaktype: snak_tid = Wbase_claim_value_type_.Reg.Get_tid_or_fail(prop.Val_to_bry()); break; + case Wdata_dict_mainsnak.Tid__datavalue: datavalue_ary = (Keyval[])prop.Val(); break; + case Wdata_dict_mainsnak.Tid__datatype: break; // ignore: has values like "wikibase-property"; EX: www.wikidata.org/wiki/Property:P397; DATE:2015-06-12 + case Wdata_dict_mainsnak.Tid__property: pid = To_pid_int(prop.Val_to_bry()); break; + case Wdata_dict_mainsnak.Tid__hash: break; // ignore: "84487fc3f93b4f74ab1cc5a47d78f596f0b49390" + } + } // loop datavalue_ary to get tid, val_obj byte tid = Byte_.Max_value_127; Object val_obj = null; - int len = datavalue_ary.length; + len = datavalue_ary.length; for (int i = 0; i < len; ++i) { - String key = datavalue_ary[i].Key(); + Keyval datavalue_itm = datavalue_ary[i]; + String key = datavalue_itm.Key(); if (String_.Eq(key, Wdata_dict_datavalue.Itm__type.Key_str())) - tid = Wbase_claim_type_.Get_tid_or_unknown((String)datavalue_ary[i].Val()); + tid = Wbase_claim_type_.Get_tid_or_unknown((String)datavalue_itm.Val()); else if (String_.Eq(key, Wdata_dict_datavalue.Itm__value.Key_str())) - val_obj = datavalue_ary[i].Val(); + val_obj = datavalue_itm.Val(); } // render val_obj based on tid @@ -65,7 +82,7 @@ public class Wdata_prop_val_visitor_ { case Wbase_claim_type_.Tid__string: bfr.Add_str_u8((String)val_obj); break; case Wbase_claim_type_.Tid__time: Render__time (bfr, wiki, page_url, (Keyval[])val_obj); break; case Wbase_claim_type_.Tid__globecoordinate: Render__geo (bfr, lang, page_url, (Keyval[])val_obj); break; - case Wbase_claim_type_.Tid__quantity: Render__quantity (bfr, lang, page_url, (Keyval[])val_obj); break; + case Wbase_claim_type_.Tid__quantity: Render__quantity (bfr, wiki, lang, page_url, pid, snak_tid, (Keyval[])val_obj); break; case Wbase_claim_type_.Tid__monolingualtext: Render__langtext (bfr, lang, (Keyval[])val_obj); break; } lang.Comma_wkr().Comma__itm(bfr, sub_idx, sub_len); @@ -125,7 +142,7 @@ public class Wdata_prop_val_visitor_ { , parser_mgr.Wbase__time__msgs(), page_url, Bry_.Empty, date, calendar_is_julian ); } - private static void Render__quantity(Bry_bfr bfr, Xol_lang_itm lang, byte[] page_url, Keyval[] kvs) { + private static void Render__quantity(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, byte[] page_url, int pid, byte snak_tid, Keyval[] kvs) { byte[] amount_bry = null, lbound_bry = null, ubound_bry = null, unit_bry = null; int len = kvs.length; for (int i = 0; i < len; ++i) { @@ -139,18 +156,19 @@ public class Wdata_prop_val_visitor_ { case Wbase_claim_quantity_.Tid__upperbound: ubound_bry = val_bry; break; } } - Render__quantity(bfr, lang, amount_bry, lbound_bry, ubound_bry, unit_bry); - } - private static void Render__quantity(Bry_bfr bfr, Xol_lang_itm lang, byte[] amount_bry, byte[] lbound_bry, byte[] ubound_bry, byte[] unit_bry) { - long val = Bry_.To_long_or(amount_bry, Byte_ascii.Comma_bry, 0, amount_bry.length, 0); // NOTE: must cast to long for large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02 - bfr.Add(lang.Num_mgr().Format_num_by_long(val));// amount; EX: 1,234 - long lbound = Bry_.To_long_or(lbound_bry, val); - long ubound = Bry_.To_long_or(lbound_bry, val); - if (lbound != val && ubound != val) { // NOTE: do not output � if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02 - bfr.Add(Wdata_prop_val_visitor.Bry__quantity_margin_of_error); // symbol: EX: � - bfr.Add(unit_bry); // unit; EX: 1 - } + Wbase_claim_quantity quantity = new Wbase_claim_quantity(pid, snak_tid, amount_bry, unit_bry, ubound_bry, lbound_bry); + wiki.Appe().Wiki_mgr().Wdata_mgr().Resolve_claim(bfr, wiki.Domain_itm(), quantity); } +// private static void Render__quantity(Bry_bfr bfr, Xol_lang_itm lang, byte[] amount_bry, byte[] lbound_bry, byte[] ubound_bry, byte[] unit_bry) { +// long val = Bry_.To_long_or(amount_bry, Byte_ascii.Comma_bry, 0, amount_bry.length, 0); // NOTE: must cast to long for large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02 +// bfr.Add(lang.Num_mgr().Format_num_by_long(val));// amount; EX: 1,234 +// long lbound = Bry_.To_long_or(lbound_bry, val); +// long ubound = Bry_.To_long_or(lbound_bry, val); +// if (lbound != val && ubound != val) { // NOTE: do not output � if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02 +// bfr.Add(Wdata_prop_val_visitor.Bry__quantity_margin_of_error); // symbol: EX: � +// bfr.Add(unit_bry); // unit; EX: 1 +// } +// } private static void Render__geo(Bry_bfr bfr, Xol_lang_itm lang, byte[] page_url, Keyval[] kvs) { double lat = 0, lng = 0; int len = kvs.length; @@ -177,5 +195,6 @@ public class Wdata_prop_val_visitor_ { private static void Render__langtext(Bry_bfr bfr, Xol_lang_itm lang, Keyval[] kvs) { bfr.Add_str_u8((String)Scrib_kv_utl_.Get_sub_by_key_or_null(kvs, Wbase_claim_monolingualtext_.Itm__text.Key_str())); } + private static int To_pid_int(byte[] pid) {return Bry_.To_int_or(pid, 1, pid.length, -1);} // skip "P" at bgn; EX: "p123" -> 123 private static final byte[] Bry__geo_dlm = Bry_.new_a7(", "); } diff --git a/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_wiki_mgr.java b/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_wiki_mgr.java index fbdd1a85d..05290ea55 100644 --- a/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_wiki_mgr.java @@ -82,10 +82,14 @@ public class Wdata_wiki_mgr implements Gfo_evt_itm, Gfo_invk { Wdata_doc wdoc = Doc_mgr.Get_by_bry_or_null(qid); if (wdoc == null) return or; Wbase_claim_grp claim_grp = wdoc.Claim_list_get(pid); if (claim_grp == null || claim_grp.Len() == 0) return or; Wbase_claim_base claim_itm = claim_grp.Get_at(0); + Resolve_claim(tmp_bfr, domain, claim_itm); + return tmp_bfr.To_bry_and_clear(); + } + public void Resolve_claim(Bry_bfr rv, Xow_domain_itm domain, Wbase_claim_base claim_itm) { synchronized (thread_lock) { // LOCK:must synchronized b/c prop_val_visitor has member bfr which can get overwritten; DATE:2016-07-06 - prop_val_visitor.Init(tmp_bfr, hwtr_mgr.Msgs(), domain.Lang_orig_key()); + Hwtr_mgr_assert(); + prop_val_visitor.Init(rv, hwtr_mgr.Msgs(), domain.Lang_orig_key()); claim_itm.Welcome(prop_val_visitor); - return tmp_bfr.To_bry_and_clear(); } } public void Resolve_to_bfr(Bry_bfr bfr, Wbase_claim_grp prop_grp, byte[] lang_key) {