From 299e19d455b8a2a429b47c31da539adf174af4c0 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Sun, 19 Apr 2015 12:33:25 -0400 Subject: [PATCH] v2.4.3.1 --- .../src_120_basicDataType/gplx/Guid_adp_.java | 2 +- .../gplx/ios/IoEngine_xrg_recycleFil.java | 2 +- 100_core/src_400_gfs/gplx/GfsCore.java | 20 +- 150_gfui/src_700_env/gplx/gfui/Gfui_kit.java | 2 +- .../src_700_env/gplx/gfui/Gfui_kit_base.java | 2 +- 150_gfui/src_700_env/gplx/gfui/Swt_kit.java | 247 ++--- 150_gfui/xtn/gplx/gfui/Swt_html.java | 2 +- 400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java | 1 + 400_xowa/src/gplx/fsdb/Fsdb_db_file.java | 6 +- 400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java | 15 +- 400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2.java | 4 + .../src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java | 6 +- 400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java | 2 + 400_xowa/src/gplx/xowa/Xoa_app_.java | 2 +- 400_xowa/src/gplx/xowa/Xoae_app.java | 2 +- .../xowa/apis/xowa/specials/Xoapi_search.java | 22 +- .../bldrs/cmds/files/Xob_fsdb_make_cmd.java | 8 +- .../bldrs/cmds/texts/sqls/Xob_term_cmd.java | 1 + .../xowa/bldrs/infos/Xob_info_session.java | 2 +- .../xowa/bldrs/langs/Xol_mw_lang_parser.java | 2 +- .../src/gplx/xowa/dbs/Xodb_save_mgr_sql.java | 4 +- .../src/gplx/xowa/files/Xof_file_itm.java | 2 +- .../src/gplx/xowa/files/Xof_file_wkr.java | 4 +- .../src/gplx/xowa/files/Xof_img_size.java | 2 +- .../src/gplx/xowa/files/Xof_img_size_tst.java | 3 + .../src/gplx/xowa/files/Xof_url_bldr.java | 1 + .../src/gplx/xowa/files/Xof_xfer_itm.java | 15 +- .../src/gplx/xowa/files/Xow_file_mgr.java | 2 +- .../src/gplx/xowa/files/bins/Xof_bin_mgr.java | 32 +- .../files/bins/Xof_bin_wkr__fsdb_sql.java | 66 +- .../xowa/files/caches/Xof_cache_mgr2.java | 2 +- .../gplx/xowa/files/fsdb/Xof_fsdb_itm.java | 12 +- .../xowa/files/fsdb/Xof_fsdb_mgr__sql.java | 2 +- .../xowa/files/origs/Xob_orig_tbl_bldr.java | 2 +- .../gplx/xowa/files/origs/Xof_orig_mgr.java | 10 +- .../gplx/xowa/gui/menus/dom/Xog_mnu_grp.java | 2 +- .../src/gplx/xowa/gui/views/Xog_tab_mgr.java | 21 +- .../src/gplx/xowa/gui/views/Xog_win_itm.java | 6 +- .../xowa/html/lnkis/Xoh_file_wtr__basic.java | 11 +- .../html/lnkis/Xoh_file_wtr_basic_tst.java | 20 + .../src/gplx/xowa/langs/Xol_lang_itm_.java | 874 ++++++++++-------- .../xowa/servers/http/Http_server_mgr.java | 3 +- .../xowa/servers/http/Http_server_wkr_.java | 39 + .../servers/http/Http_server_wkr__tst.java | 42 + .../maints/Wmf_dump_list_parser_tst.java | 2 +- 400_xowa/src/gplx/xowa/specials/Xows_mgr.java | 2 +- .../xowa/specials/search/Xows_db_wkr.java | 1 + .../xowa/specials/search/Xows_html_wkr.java | 8 +- .../specials/search/Xows_page__search.java | 26 +- .../xowa/specials/search/Xows_ui_cmd.java | 3 +- .../src/gplx/xowa/wikis/Xoa_wiki_mgr.java | 11 +- 400_xowa/src/gplx/xowa/wikis/Xow_domain_.java | 7 +- .../gplx/xowa/wikis/data/Xowd_db_file.java | 2 +- .../src/gplx/xowa/wikis/data/Xowd_db_mgr.java | 2 +- .../xowa/wikis/data/tbls/Xowd_page_tbl.java | 5 +- .../wikis/data/tbls/Xowd_search_word_tbl.java | 6 +- .../domains/crts/Xow_domain_crt_itm.java | 22 + .../domains/crts/Xow_domain_crt_itm_.java | 81 ++ .../crts/Xow_domain_crt_itm_parser.java | 69 ++ .../domains/crts/Xow_domain_crt_kv_mgr.java | 45 + .../xowa/xtns/gallery/Gallery_itm_parser.java | 5 + .../gallery/Gallery_mgr_base_basic_tst.java | 6 + .../xtns/scribunto/Scrib_invoke_func.java | 4 +- .../xtns/wdatas/imports/Xow_wmf_api_mgr.java | 12 +- .../xtns/wdatas/imports/Xow_wmf_api_wkr.java | 25 + 400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java | 2 +- 400_xowa/src_120_wiki/gplx/xowa/Xow_ns.java | 2 +- .../src_120_wiki/gplx/xowa/Xowe_wiki.java | 13 +- .../gplx/xowa/Xof_xfer_queue.java | 4 +- .../gplx/xowa/Xoi_cmd_wiki_tst.java | 8 +- .../src_405_tkn/gplx/xowa/Xop_tkn_mkr.java | 2 +- .../src_440_lnki/gplx/xowa/Xop_lnki_type.java | 77 +- .../src_490_xnde/gplx/xowa/Xop_xnde_wkr.java | 7 +- .../en.wikipedia.org-text.xowa | Bin 36864 -> 36864 bytes 74 files changed, 1267 insertions(+), 719 deletions(-) create mode 100644 400_xowa/src/gplx/xowa/servers/http/Http_server_wkr_.java create mode 100644 400_xowa/src/gplx/xowa/servers/http/Http_server_wkr__tst.java create mode 100644 400_xowa/src/gplx/xowa/wikis/domains/crts/Xow_domain_crt_itm.java create mode 100644 400_xowa/src/gplx/xowa/wikis/domains/crts/Xow_domain_crt_itm_.java create mode 100644 400_xowa/src/gplx/xowa/wikis/domains/crts/Xow_domain_crt_itm_parser.java create mode 100644 400_xowa/src/gplx/xowa/wikis/domains/crts/Xow_domain_crt_kv_mgr.java create mode 100644 400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_wkr.java diff --git a/100_core/src_120_basicDataType/gplx/Guid_adp_.java b/100_core/src_120_basicDataType/gplx/Guid_adp_.java index 3f4faf732..7cda6af35 100644 --- a/100_core/src_120_basicDataType/gplx/Guid_adp_.java +++ b/100_core/src_120_basicDataType/gplx/Guid_adp_.java @@ -19,6 +19,6 @@ package gplx; public class Guid_adp_ { public static final String Cls_ref_name = "Guid"; public static final Guid_adp Empty = parse_("00000000-0000-0000-0000-000000000000"); - public static Guid_adp random_() {return new Guid_adp(java.util.UUID.randomUUID());} + public static Guid_adp new_() {return new Guid_adp(java.util.UUID.randomUUID());} public static Guid_adp parse_(String s) {return new Guid_adp(java.util.UUID.fromString(s));} } \ No newline at end of file diff --git a/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java b/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java index 5d81a4e79..8e39ca553 100644 --- a/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java +++ b/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java @@ -49,7 +49,7 @@ public class IoEngine_xrg_recycleFil extends IoEngine_xrg_fil_affects1_base { public IoEngine_xrg_recycleFil(int v) { mode = v; time = DateAdp_.Now(); - uuid = Guid_adp_.random_(); + uuid = Guid_adp_.new_(); rootDirNames = ListAdp_.new_(); rootDirNames.Add("z_trash"); } public static IoEngine_xrg_recycleFil sysm_(Io_url url) {return new IoEngine_xrg_recycleFil(SysmConst);} diff --git a/100_core/src_400_gfs/gplx/GfsCore.java b/100_core/src_400_gfs/gplx/GfsCore.java index ca7f2f804..41b6f3cc7 100644 --- a/100_core/src_400_gfs/gplx/GfsCore.java +++ b/100_core/src_400_gfs/gplx/GfsCore.java @@ -89,25 +89,25 @@ public class GfsCore implements GfoInvkAble { } class GfsCore_ { public static final String Arg_primitive = "v"; - public static Object Exec(GfsCtx ctx, GfoInvkAble ownerInvk, GfoMsg ownerMsg, Object ownerPrimitive, int depth) { - if (ownerMsg.Args_count() == 0 && ownerMsg.Subs_count() == 0 && String_.Eq(ownerMsg.Key(), "")) {UsrDlg_._.Warn("empty msg"); return GfoInvkAble_.Rv_unhandled;} - if (ownerPrimitive != null) ownerMsg.Parse_(false).Add(GfsCore_.Arg_primitive, ownerPrimitive); - Object rv = ownerInvk.Invk(ctx, 0, ownerMsg.Key(), ownerMsg); + public static Object Exec(GfsCtx ctx, GfoInvkAble owner_invk, GfoMsg owner_msg, Object owner_primitive, int depth) { + if (owner_msg.Args_count() == 0 && owner_msg.Subs_count() == 0 && String_.Eq(owner_msg.Key(), "")) {UsrDlg_._.Warn("empty msg"); return GfoInvkAble_.Rv_unhandled;} + if (owner_primitive != null) owner_msg.Parse_(false).Add(GfsCore_.Arg_primitive, owner_primitive); + Object rv = owner_invk.Invk(ctx, 0, owner_msg.Key(), owner_msg); if (rv == GfoInvkAble_.Rv_cancel) return rv; else if (rv == GfoInvkAble_.Rv_unhandled) { if (ctx.Fail_if_unhandled()) - throw Err_.new_("Object does not support key").Add("key", ownerMsg.Key()).Add("ownerType", ClassAdp_.FullNameOf_obj(ownerInvk)); + throw Err_.new_("Object does not support key").Add("key", owner_msg.Key()).Add("ownerType", ClassAdp_.FullNameOf_obj(owner_invk)); else { Gfo_usr_dlg usr_dlg = ctx.Usr_dlg(); - if (usr_dlg != null) usr_dlg.Warn_many(GRP_KEY, "unhandled_key", "Object does not support key: key=~{0} ownerType=~{1}", ownerMsg.Key(), ClassAdp_.FullNameOf_obj(ownerInvk)); + if (usr_dlg != null) usr_dlg.Warn_many(GRP_KEY, "unhandled_key", "Object does not support key: key=~{0} ownerType=~{1}", owner_msg.Key(), ClassAdp_.FullNameOf_obj(owner_invk)); return GfoInvkAble_.Null; } } - if (ownerMsg.Subs_count() == 0) { // msg is leaf + if (owner_msg.Subs_count() == 0) { // msg is leaf GfsRegyItm regyItm = GfsRegyItm.as_(rv); if (regyItm == null) return rv; // rv is primitive or other non-regy Object if (regyItm.IsCmd()) // rv is cmd; invk cmd - return regyItm.InvkAble().Invk(ctx, 0, ownerMsg.Key(), ownerMsg); + return regyItm.InvkAble().Invk(ctx, 0, owner_msg.Key(), owner_msg); else // rv is host return regyItm.InvkAble(); } @@ -123,9 +123,9 @@ class GfsCore_ { primitive = rv; } Object exec_rv = null; - int len = ownerMsg.Subs_count(); + int len = owner_msg.Subs_count(); for (int i = 0; i < len; i++) // iterate over subs; needed for a{b;c;d;} - exec_rv = Exec(ctx, invk, ownerMsg.Subs_getAt(i), primitive, depth + 1); + exec_rv = Exec(ctx, invk, owner_msg.Subs_getAt(i), primitive, depth + 1); return exec_rv; } } diff --git a/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java b/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java index cbaf67d19..1af8a4ac3 100644 --- a/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java @@ -20,7 +20,7 @@ public interface Gfui_kit extends GfoInvkAble { byte Tid(); String Key(); void Cfg_set(String type, String key, Object val); - boolean Kit_init_done(); + boolean Kit_mode__ready(); void Kit_init(Gfo_usr_dlg gui_wtr); void Kit_run(); void Kit_term(); diff --git a/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java b/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java index 46454b22d..ea91771a6 100644 --- a/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java +++ b/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java @@ -25,7 +25,7 @@ public abstract class Gfui_kit_base implements Gfui_kit { public Gfui_clipboard Clipboard() {return Gfui_clipboard_null.Null;} public GfoInvkAbleCmd Kit_term_cbk() {return kit_term_cbk;} public void Kit_term_cbk_(GfoInvkAbleCmd v) {kit_term_cbk = v;} private GfoInvkAbleCmd kit_term_cbk; public void Cfg_set(String type, String key, Object val) {} - public boolean Kit_init_done() {return true;} + public boolean Kit_mode__ready() {return true;} public void Kit_init(Gfo_usr_dlg gui_wtr) {} @gplx.Virtual public void Kit_run() {} @gplx.Virtual public void Kit_term() {kit_term_cbk.Invk();} diff --git a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java index b650839bc..184f1a4e1 100644 --- a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java @@ -42,46 +42,40 @@ import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; import org.omg.PortableServer.THREAD_POLICY_ID; +import gplx.threads.*; public class Swt_kit implements Gfui_kit { - private Shell shell; - private String xulRunnerPath = null; - private KeyValHash ctor_args = KeyValHash.new_(); private HashAdp kit_args = HashAdp_.new_(); private Swt_msg_wkr_stop msg_wkr_stop; - private KeyValHash nullArgs = KeyValHash.new_(); - public byte Tid() {return Gfui_kit_.Swt_tid;} - public String Key() {return "swt";} - Display Swt_display() {return display;} private Display display; - public Gfui_clipboard Clipboard() {return clipboard;} private Swt_clipboard clipboard; - public boolean Mode_is_shutdown() {return mode_is_shutdown;} public void Mode_is_shutdown_y_() {mode_is_shutdown = true;} private boolean mode_is_shutdown = false; - public GfoInvkAbleCmd Kit_term_cbk() {return term_cbk;} public void Kit_term_cbk_(GfoInvkAbleCmd v) {this.term_cbk = v;} private GfoInvkAbleCmd term_cbk = GfoInvkAbleCmd.Null; - public Gfui_html_cfg Html_cfg() {return html_cfg;} private Gfui_html_cfg html_cfg = new Gfui_html_cfg(); - public void Cfg_set(String type, String key, Object val) { - if (String_.Eq(type, Gfui_kit_.Cfg_HtmlBox)) { - if (String_.Eq(key, "XulRunnerPath")) { - xulRunnerPath = (String)val; - return; - } - } - KeyValHash typeCfg = (KeyValHash)kit_args.Fetch(type); - if (typeCfg == null) { - typeCfg = KeyValHash.new_(); - kit_args.Add(type, typeCfg); - } - typeCfg.AddReplace(key, val); - } - public boolean Kit_init_done() {return kit_init_done;} private boolean kit_init_done; + private final KeyValHash ctor_args = KeyValHash.new_(); private final KeyValHash ctor_args_null = KeyValHash.new_(); + private final HashAdp kit_args = HashAdp_.new_(); private Swt_msg_wkr_stop msg_wkr_stop; + private Gfo_usr_dlg gui_wtr; private String xul_runner_path = null; + private final Bry_fmtr ask_fmtr = Bry_fmtr.new_().Fail_when_invalid_escapes_(false); private final Bry_bfr ask_bfr = Bry_bfr.new_(); + private final Object thread_lock = new Object(); + public byte Tid() {return Gfui_kit_.Swt_tid;} + public String Key() {return "swt";} + public Display Swt_display() {return display;} private Display display; + public Shell Swt_shell() {return shell;} private Shell shell; + public Gfui_clipboard Clipboard() {return clipboard;} private Swt_clipboard clipboard; + public int Kit_mode() {synchronized (thread_lock) {return mode;}} private int mode = Swt_kit_mode.Tid_ctor; + public void Kit_mode_(int v) {synchronized (thread_lock) {mode = v;}} + public boolean Kit_mode__ready() {return Kit_mode() == Swt_kit_mode.Tid_ready;} + public boolean Kit_mode__term() {return Kit_mode() == Swt_kit_mode.Tid_term;} + public boolean Kit_sync_cmd_exists() {synchronized (thread_lock) {return sync_cmd_list.Count() != 0;}} private final ListAdp sync_cmd_list = ListAdp_.new_(); + public void Kit_sync_cmd_add(Swt_gui_cmd cmd) {synchronized (thread_lock) {sync_cmd_list.Add(cmd);}} + public void Kit_sync_cmd_del(Swt_gui_cmd cmd) {synchronized (thread_lock) {sync_cmd_list.Del(cmd);}} + public GfoInvkAbleCmd Kit_term_cbk() {return term_cbk;} public void Kit_term_cbk_(GfoInvkAbleCmd v) {this.term_cbk = v;} private GfoInvkAbleCmd term_cbk = GfoInvkAbleCmd.Null; + public Gfui_html_cfg Html_cfg() {return html_cfg;} private final Gfui_html_cfg html_cfg = new Gfui_html_cfg(); public void Kit_init(Gfo_usr_dlg gui_wtr) { this.gui_wtr = gui_wtr; - msg_wkr_stop = new Swt_msg_wkr_stop(this, gui_wtr); - display = new Display(); - clipboard = new Swt_clipboard(display); + this.msg_wkr_stop = new Swt_msg_wkr_stop(this, gui_wtr); + this.display = new Display(); + this.clipboard = new Swt_clipboard(display); UsrDlg_._.Reg(UsrMsgWkr_.Type_Warn, GfoConsoleWin._); UsrDlg_._.Reg(UsrMsgWkr_.Type_Stop, msg_wkr_stop); - if (xulRunnerPath != null) System.setProperty("org.eclipse.swt.browser.XULRunnerPath", xulRunnerPath); - kit_init_done = true; + if (xul_runner_path != null) System.setProperty("org.eclipse.swt.browser.XULRunnerPath", xul_runner_path); + this.Kit_mode_(Swt_kit_mode.Tid_ready); gui_wtr.Log_many("", "", "swt.kit.init.done"); - } private Gfo_usr_dlg gui_wtr; + } public void Kit_run() { - shell.addListener(SWT.Close, new Swt_shell_close_lnr(this)); + shell.addListener(SWT.Close, new Swt_shell_close_lnr(this, gui_wtr)); shell.open(); Cursor cursor = new Cursor(display, SWT.CURSOR_ARROW); shell.setCursor(cursor); // set cursor to hand else cursor defaults to Hourglass until mouse is moved; DATE: 2014-01-31 @@ -90,24 +84,36 @@ public class Swt_kit implements Gfui_kit { display.sleep(); } gui_wtr.Log_many("", "", "swt.kit.term:bgn"); - cursor.dispose(); gui_wtr.Log_many("", "", "swt.kit.term:cursor"); + cursor.dispose(); gui_wtr.Log_many("", "", "swt.kit.term:cursor"); } - public Shell Main_shell() {return shell;} public void Kit_term() { - clipboard.Rls(); gui_wtr.Log_many("", "", "swt.kit.term:clipboard"); - msg_wkr_stop.Rls(); gui_wtr.Log_many("", "", "swt.kit.term:usrMsgWkr"); + clipboard.Rls(); gui_wtr.Log_many("", "", "swt.kit.term:clipboard"); shell.close(); } - public boolean Ask_yes_no(String grp_key, String msg_key, String fmt, Object... args) { + public void Cfg_set(String type, String key, Object val) { + // XulRunnerPath gets set immediately; do not add to widget_cfg_hash + if (String_.Eq(type, Gfui_kit_.Cfg_HtmlBox) && String_.Eq(key, "XulRunnerPath")) { + this.xul_runner_path = (String)val; + return; + } + // add kv to widget_cfg_hash; new controls will get properties from cfg_hash + KeyValHash widget_cfg_hash = (KeyValHash)kit_args.Fetch(type); + if (widget_cfg_hash == null) { + widget_cfg_hash = KeyValHash.new_(); + kit_args.Add(type, widget_cfg_hash); + } + widget_cfg_hash.AddReplace(key, val); + } + public boolean Ask_yes_no(String grp_key, String msg_key, String fmt, Object... args) { Swt_dlg_msg dlg = (Swt_dlg_msg)New_dlg_msg(ask_fmtr.Bld_str_many(ask_bfr, fmt, args)).Init_btns_(Gfui_dlg_msg_.Btn_yes, Gfui_dlg_msg_.Btn_no).Init_ico_(Gfui_dlg_msg_.Ico_question); display.syncExec(dlg); return dlg.Ask_rslt == Gfui_dlg_msg_.Btn_yes; } - public boolean Ask_ok_cancel(String grp_key, String msg_key, String fmt, Object... args) { + public boolean Ask_ok_cancel(String grp_key, String msg_key, String fmt, Object... args) { Swt_dlg_msg dlg = (Swt_dlg_msg)New_dlg_msg(ask_fmtr.Bld_str_many(ask_bfr, fmt, args)).Init_btns_(Gfui_dlg_msg_.Btn_ok, Gfui_dlg_msg_.Btn_cancel).Init_ico_(Gfui_dlg_msg_.Ico_question); display.syncExec(dlg); return dlg.Ask_rslt == Gfui_dlg_msg_.Btn_ok; - } Bry_fmtr ask_fmtr = Bry_fmtr.new_().Fail_when_invalid_escapes_(false); Bry_bfr ask_bfr = Bry_bfr.new_(); + } public int Ask_yes_no_cancel(String grp_key, String msg_key, String fmt, Object... args) { Swt_dlg_msg dlg = (Swt_dlg_msg)New_dlg_msg(ask_fmtr.Bld_str_many(ask_bfr, fmt, args)).Init_btns_(Gfui_dlg_msg_.Btn_yes, Gfui_dlg_msg_.Btn_no, Gfui_dlg_msg_.Btn_cancel).Init_ico_(Gfui_dlg_msg_.Ico_question); display.syncExec(dlg); @@ -117,15 +123,14 @@ public class Swt_kit implements Gfui_kit { Swt_dlg_msg dlg = (Swt_dlg_msg)New_dlg_msg(ask_fmtr.Bld_str_many(ask_bfr, fmt, args)).Init_btns_(Gfui_dlg_msg_.Btn_ok).Init_ico_(Gfui_dlg_msg_.Ico_information); display.syncExec(dlg); } - public GfuiInvkCmd New_cmd_sync(GfoInvkAble invk) {return new Swt_gui_cmd(this, gui_wtr, display, invk, Bool_.N);} + public GfuiInvkCmd New_cmd_sync (GfoInvkAble invk) {return new Swt_gui_cmd(this, gui_wtr, display, invk, Bool_.N);} public GfuiInvkCmd New_cmd_async(GfoInvkAble invk) {return new Swt_gui_cmd(this, gui_wtr, display, invk, Bool_.Y);} - public GfuiWin New_win_utl(String key, GfuiWin owner, KeyVal... args) {return GfuiWin_.kit_(this, key, new Swt_win(shell), nullArgs); } + public GfuiWin New_win_utl(String key, GfuiWin owner, KeyVal... args) {return GfuiWin_.kit_(this, key, new Swt_win(shell), ctor_args_null); } public GfuiWin New_win_app(String key, KeyVal... args) { Swt_win win = new Swt_win(display); this.shell = win.UnderShell(); shell.setLayout(null); - GfuiWin rv = GfuiWin_.kit_(this, key, win, nullArgs); - return rv; + return GfuiWin_.kit_(this, key, win, ctor_args_null); } public GfuiBtn New_btn(String key, GfuiElem owner, KeyVal... args) { GfuiBtn rv = GfuiBtn_.kit_(this, key, new Swt_btn_no_border(Swt_control_.cast_or_fail(owner), ctor_args), ctor_args); @@ -134,18 +139,18 @@ public class Swt_kit implements Gfui_kit { } public Gfui_html New_html(String key, GfuiElem owner, KeyVal... args) { ctor_args.Clear(); - Object htmlBox_args_obj = kit_args.Fetch(Gfui_kit_.Cfg_HtmlBox); - if (htmlBox_args_obj != null) { - KeyValHash htmlBox_args = (KeyValHash)htmlBox_args_obj; - KeyVal browser_type = htmlBox_args.FetchOrNull(Cfg_Html_BrowserType); + // check cfg for browser type + KeyValHash html_cfg_args = (KeyValHash)kit_args.Fetch(Gfui_kit_.Cfg_HtmlBox); + if (html_cfg_args != null) { + KeyVal browser_type = html_cfg_args.FetchOrNull(Cfg_Html_BrowserType); if (browser_type != null) ctor_args.Add(browser_type); } - Swt_html html_control = new Swt_html(this, Swt_control_.cast_or_fail(owner), ctor_args); - Gfui_html rv = Gfui_html.kit_(this, key, html_control, ctor_args); - ((Swt_html)rv.UnderElem()).Under_control().addMenuDetectListener(new Swt_lnr__menu_detect(rv)); - rv.Owner_(owner); - html_control.Delete_elems_(owner, rv); - return rv; + Swt_html swt_html = new Swt_html(this, Swt_control_.cast_or_fail(owner), ctor_args); + Gfui_html gfui_html = Gfui_html.kit_(this, key, swt_html, ctor_args); + swt_html.Under_control().addMenuDetectListener(new Swt_lnr__menu_detect(gfui_html)); + gfui_html.Owner_(owner); + swt_html.Delete_elems_(owner, gfui_html); + return gfui_html; } public Gfui_tab_mgr New_tab_mgr(String key, GfuiElem owner, KeyVal... args) { ctor_args.Clear(); @@ -199,20 +204,11 @@ public class Swt_kit implements Gfui_kit { return 8; } } - public boolean Window_is_disposed() { - return shell.isDisposed(); - } public void Set_mnu_popup(GfuiElem owner, Gfui_mnu_grp grp) { Control control = Swt_control_.cast_or_fail(owner).Under_menu_control(); Swt_popup_grp popup = (Swt_popup_grp)grp; control.setMenu(popup.Under_menu()); } - public static final Swt_kit _ = new Swt_kit(); private Swt_kit() {} // singleton b/c of following line "In particular, some platforms which SWT supports will not allow more than one active display" (http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html) - public static final String Cfg_Html_BrowserType = "BrowserType"; - public static int Cfg_Html_BrowserType_parse(String v) { - if (String_.Eq(v, "mozilla")) return Swt_html.Browser_tid_mozilla; - else return Swt_html.Browser_tid_none; - } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (String_.Eq(k, Invk_Cfg_add)) { String type = m.ReadStrOr("type", ""); @@ -221,16 +217,24 @@ public class Swt_kit implements Gfui_kit { if (ctx.Deny()) return this; if (String_.Eq(type, Gfui_kit_.Cfg_HtmlBox)) { if (String_.Eq(key, "XulRunnerPath")) - xulRunnerPath = val; + xul_runner_path = val; else if (String_.Eq(key, Swt_kit.Cfg_Html_BrowserType)) Cfg_set(type, Swt_kit.Cfg_Html_BrowserType, Cfg_Html_BrowserType_parse(val)); } } else if (String_.Eq(k, Invk_HtmlBox)) {return html_cfg;} else if (String_.Eq(k, Invk_ask_file)) return this.New_dlg_file(Gfui_kit_.File_dlg_type_open, m.Args_getAt(0).Val_to_str_or_empty()).Ask(); + else if (String_.Eq(k, Invk_shell_close)) shell.close(); return this; - } public static final String Invk_Cfg_add = "Cfg_add", Invk_HtmlBox = "HtmlBox", Invk_ask_file = "ask_file"; - public static boolean Html_box_focus_automatically = false; + } + public static final String Invk_Cfg_add = "Cfg_add", Invk_HtmlBox = "HtmlBox", Invk_ask_file = "ask_file"; // private or public? + public static final String Invk_shell_close = "shell_close"; // public + public static final Swt_kit _ = new Swt_kit(); private Swt_kit() {} // singleton b/c of following line "In particular, some platforms which SWT supports will not allow more than one active display" (http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html) + public static final String Cfg_Html_BrowserType = "BrowserType"; + public static int Cfg_Html_BrowserType_parse(String v) { + if (String_.Eq(v, "mozilla")) return Swt_html.Browser_tid_mozilla; + else return Swt_html.Browser_tid_none; + } public static FontAdp Control_font_get(Font font, GxwCore_base owner) { FontData fontData = font.getFontData()[0]; FontAdp rv = FontAdp.new_(fontData.getName(), fontData.getHeight(), FontStyleAdp_.lang_(fontData.getStyle())); // NOTE: swt style constants match swing @@ -244,50 +248,85 @@ public class Swt_kit implements Gfui_kit { control.setFont(rv); } } -class Swt_shell_close_lnr implements Listener { - public Swt_shell_close_lnr(Swt_kit kit) {this.kit = kit;} private Swt_kit kit; +class Swt_shell_close_lnr implements Listener, GfoInvkAble { + private final Swt_kit kit; private final Gfo_usr_dlg usr_dlg; + public Swt_shell_close_lnr(Swt_kit kit, Gfo_usr_dlg usr_dlg) {this.kit = kit; this.usr_dlg = usr_dlg;} @Override public void handleEvent(Event event) { - kit.Mode_is_shutdown_y_(); // NOTE: must mark kit as shutting down, else writing to status_bar will create stack overflow; DATE:2014-05-05 - GfoInvkAbleCmd term_cbk = kit.Kit_term_cbk(); - if (term_cbk.Cmd() == null) return; // term_cbk not defined; exit - boolean rslt = Bool_.cast_(term_cbk.Invk()); // term_cbk defined; call it - if (!rslt) event.doit = false; // term_cbk canceled term; stop close + if (kit.Kit_mode__term()) return; // NOTE: will be term if called again from wait_for_sync_cmd + kit.Kit_mode_(Swt_kit_mode.Tid_term); // NOTE: must mark kit as shutting down, else writing to status_bar will create stack overflow; DATE:2014-05-05 + boolean rslt = Bool_.cast_(kit.Kit_term_cbk().Invk()); // call bgn term + if (!rslt) { + event.doit = false; // cbk canceled term; stop close + kit.Kit_mode_(Swt_kit_mode.Tid_ready); // reset kit back to "running" mode; + return; + } + if (kit.Kit_sync_cmd_exists()) { // sync cmd is running; cannot shut down app else app just hangs; DATE:2015-04-13 + event.doit = false; // cancel shutdown + ThreadAdp_.invk_(this, Invk_wait_for_sync_cmd).Start(); // wait for sync_cmd to end in background thread; call shutdown again when it does + } + } + private void Wait_for_sync_cmd() { // THREAD:non-GUI + int loop_count = 0, loop_max = 50, loop_wait = 100; // loop for 100 ms for no more than 5 seconds + while (loop_count < loop_max) { + usr_dlg.Log_many("", "", "swt:waiting for sync cmd; loop=~{0}", loop_count); + if (!kit.Kit_sync_cmd_exists()) { + usr_dlg.Log_many("", "", "swt:sync cmd done; shutting down"); + break; + } + ThreadAdp_.Sleep(loop_wait); + loop_count++; + } + if (loop_count == loop_max) + usr_dlg.Log_many("", "", "swt:sync_wait failed", loop_count); + GfoInvkAble_.InvkCmd(kit.New_cmd_sync(kit), Swt_kit.Invk_shell_close); // shutdown again; note that cmd must be called on GUI thread + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_wait_for_sync_cmd)) Wait_for_sync_cmd(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk_wait_for_sync_cmd = "wait_for_sync_cmd"; +} +class Swt_kit_mode { + public static final int + Tid_ctor = 0 + , Tid_ready = 1 + , Tid_term = 2 + ; +} +class Swt_gui_cmd implements GfuiInvkCmd, Runnable { + private final Swt_kit kit; private final Gfo_usr_dlg usr_dlg; private final Display display; private final GfoInvkAble target; private final boolean async; + private GfsCtx invk_ctx; private int invk_ikey; private String invk_key; private GfoMsg invk_msg; + public Swt_gui_cmd(Swt_kit kit, Gfo_usr_dlg usr_dlg, Display display, GfoInvkAble target, boolean async) { + this.kit = kit; this.usr_dlg = usr_dlg; this.display = display; this.target = target; this.async = async; + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + this.invk_ctx = ctx; this.invk_ikey = ikey; this.invk_key = k; this.invk_msg = m; + if (async) + display.asyncExec(this); + else { + kit.Kit_sync_cmd_add(this); + try {display.syncExec(this);} + finally {kit.Kit_sync_cmd_del(this);} + } + return this; + } + @Override public void run() { + try {target.Invk(invk_ctx, invk_ikey, invk_key, invk_msg);} + catch (Exception e) { + if (kit.Kit_mode__term()) return; // NOTE: if shutting down, don't warn; warn will try to write to status.bar, which will fail b/c SWT is shutting down; failures will try to write to status.bar again, causing StackOverflow exception; DATE:2014-05-04 + usr_dlg.Warn_many("", "", "fatal error while running; key=~{0} err=~{1}", invk_key, Err_.Message_gplx_brief(e)); + } + } + public void Rls() { + this.invk_ctx = null; this.invk_key = null; this.invk_msg = null; } } -class Swt_msg_wkr_stop implements UsrMsgWkr, RlsAble { - public Swt_msg_wkr_stop(Swt_kit kit, Gfo_usr_dlg gui_wtr) {this.kit = kit; this.gui_wtr = gui_wtr;} private Swt_kit kit; private Gfo_usr_dlg gui_wtr; - @Override public void Rls() {this.kit = null;} +class Swt_msg_wkr_stop implements UsrMsgWkr { + private final Swt_kit kit; private final Gfo_usr_dlg gui_wtr; + public Swt_msg_wkr_stop(Swt_kit kit, Gfo_usr_dlg gui_wtr) {this.kit = kit; this.gui_wtr = gui_wtr;} public void ExecUsrMsg(int type, UsrMsg umsg) { String msg = umsg.XtoStr(); kit.Ask_ok("xowa.gui", "stop", msg); gui_wtr.Log_many("", "", msg); } } -class Swt_gui_cmd implements GfuiInvkCmd, Runnable { - private Swt_kit kit; private Gfo_usr_dlg usr_dlg; private GfoInvkAble target; private Display display; private boolean async; - private GfsCtx invk_ctx; private int invk_ikey; private String invk_key; private GfoMsg invk_msg; - public Swt_gui_cmd(Swt_kit kit, Gfo_usr_dlg usr_dlg, Display display, GfoInvkAble target, boolean async) { - this.kit = kit; this.usr_dlg = usr_dlg; this.display = display; this.target = target; this.async = async; - } - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - this.invk_ctx = ctx; this.invk_ikey = ikey ; this.invk_key = k; this.invk_msg = m; - if (async) - display.asyncExec(this); - else - display.syncExec(this); - return this; - } - @Override public void run() { - try { - target.Invk(invk_ctx, invk_ikey, invk_key, invk_msg); - } - catch (Exception e) { - if (kit.Mode_is_shutdown()) return; // NOTE: if shutting down, don't warn; warn will try to write to status.bar, which will fail b/c SWT is shutting down; failures will try to write to status.bar again, causing StackOverflow exception; DATE:2014-05-04 - usr_dlg.Warn_many("", "", "fatal error while running; key=~{0} err=~{1}", invk_key, Err_.Message_gplx_brief(e)); - } - } - public void Rls() { - usr_dlg = null; target = null; display = null; - invk_ctx = null; invk_key = null; invk_msg = null; - } -} diff --git a/150_gfui/xtn/gplx/gfui/Swt_html.java b/150_gfui/xtn/gplx/gfui/Swt_html.java index 50215a836..dcc534cf4 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_html.java +++ b/150_gfui/xtn/gplx/gfui/Swt_html.java @@ -216,7 +216,7 @@ class Swt_html_lnr_status implements StatusTextListener { public Swt_html_lnr_status(Swt_html html_box) {this.html_box = html_box;} private Swt_html html_box; public void Host_set(GfoEvObj host) {this.host = host;} GfoEvObj host; @Override public void changed(StatusTextEvent ev) { - if (html_box.Kit().Mode_is_shutdown()) + if (html_box.Kit().Kit_mode__term()) return; // shutting down raises status changed events; ignore, else SWT exception thrown; DATE:2014-05-29 String ev_text = ev.text; // if (String_.Has(ev_text, "Loading [MathJax]")) return; // suppress MathJax messages; // NOTE: disabled for 2.1 (which no longer outputs messages to status); DATE:2013-05-03 diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java index ed8428ed2..08dfa5090 100644 --- a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java @@ -60,6 +60,7 @@ public class Db_cfg_tbl implements RlsAble { if (stmt_update == null) stmt_update = conn.Stmt_update_exclude(tbl_name, flds, fld_grp, fld_key); stmt_update.Clear().Val_str(fld_val, val).Crt_str(fld_grp, grp).Crt_str(fld_key, key).Exec_update(); } + public void Upsert_int (String grp, String key, int val) {Upsert_str(grp, key, Int_.Xto_str(val));} public void Upsert_str (String grp, String key, String val) { String cur_val = this.Select_str_or(grp, key, null); if (cur_val == null) this.Insert_str(grp, key, val); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_file.java b/400_xowa/src/gplx/fsdb/Fsdb_db_file.java index 188586bce..ad796f47b 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_file.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_file.java @@ -22,7 +22,7 @@ public class Fsdb_db_file { this.url = url; this.conn = conn; this.tbl__core_cfg = new Db_cfg_tbl(conn, "xowa_cfg"); } - public Io_url Url() {return url;} private final Io_url url; - public Db_conn Conn() {return conn;} private final Db_conn conn; - public Db_cfg_tbl Tbl__cfg() {return tbl__core_cfg;} private final Db_cfg_tbl tbl__core_cfg; + public Io_url Url() {return url;} private final Io_url url; + public Db_conn Conn() {return conn;} private final Db_conn conn; + public Db_cfg_tbl Tbl__cfg() {return tbl__core_cfg;} private final Db_cfg_tbl tbl__core_cfg; } diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java index 018bc8e67..412252453 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java @@ -18,12 +18,13 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; import gplx.xowa.*; import gplx.xowa.wikis.data.*; public class Fsdb_db_mgr_ { - public static Fsdb_db_mgr new_detect(String domain_str, Io_url wiki_dir, Io_url file_dir) { + public static Fsdb_db_mgr new_detect(Xow_wiki wiki, Io_url wiki_dir, Io_url file_dir) { Gfo_usr_dlg usr_dlg = Xoa_app_.Usr_dlg(); + String domain_str = wiki.Domain_str(); Fsdb_db_mgr rv = null; - rv = load_or_null(Xowd_db_layout.Itm_few, usr_dlg, wiki_dir, domain_str); if (rv != null) return rv; - rv = load_or_null(Xowd_db_layout.Itm_lot, usr_dlg, wiki_dir, domain_str); if (rv != null) return rv; - rv = load_or_null(Xowd_db_layout.Itm_all, usr_dlg, wiki_dir, domain_str); if (rv != null) return rv; + rv = load_or_null(Xowd_db_layout.Itm_few, usr_dlg, wiki_dir, wiki, domain_str); if (rv != null) return rv; + rv = load_or_null(Xowd_db_layout.Itm_lot, usr_dlg, wiki_dir, wiki, domain_str); if (rv != null) return rv; + rv = load_or_null(Xowd_db_layout.Itm_all, usr_dlg, wiki_dir, wiki, domain_str); if (rv != null) return rv; Io_url url = file_dir.GenSubFil(Fsdb_db_mgr__v1.Mnt_name); // EX: /xowa/file/en.wikipedia.org/wiki.mnt.sqlite3 if (Db_conn_bldr.I.Exists(url)) { usr_dlg.Log_many("", "", "fsdb.db_core.v1: url=~{0}", url.Raw()); @@ -32,13 +33,15 @@ public class Fsdb_db_mgr_ { usr_dlg.Log_many("", "", "fsdb.db_core.none: wiki_dir=~{0} file_dir=~{1}", wiki_dir.Raw(), file_dir.Raw()); return null; } - private static Fsdb_db_mgr load_or_null(Xowd_db_layout layout, Gfo_usr_dlg usr_dlg, Io_url wiki_dir, String domain_str) { + private static Fsdb_db_mgr load_or_null(Xowd_db_layout layout, Gfo_usr_dlg usr_dlg, Io_url wiki_dir, Xow_wiki wiki, String domain_str) { Io_url main_core_url = wiki_dir.GenSubFil(Fsdb_db_mgr__v2_bldr.Main_core_name(layout, domain_str)); if (!Db_conn_bldr.I.Exists(main_core_url)) return null; usr_dlg.Log_many("", "", "fsdb.db_core.v2: type=~{0} url=~{1}", layout.Name(), main_core_url.Raw()); Db_conn main_core_conn = Db_conn_bldr.I.Get(main_core_url); Io_url user_core_url = wiki_dir.GenSubFil(Fsdb_db_mgr__v2_bldr.Make_user_name(domain_str)); - Db_conn user_core_conn = Db_conn_bldr.I.Get(user_core_url); + if (!Db_conn_bldr.I.Exists(user_core_url)) // if user file does not exist, create it; needed b/c offline packages don't include file; DATE:2015-04-19 + Fsdb_db_mgr__v2_bldr.I.Make_core_file_user(wiki, wiki_dir, user_core_url.NameAndExt(), main_core_url.NameAndExt()); + Db_conn user_core_conn = Db_conn_bldr.I.Get(user_core_url); return new Fsdb_db_mgr__v2(Fsdb_db_mgr__v2.Cfg__layout_file__get(main_core_conn), wiki_dir, new Fsdb_db_file(main_core_url, main_core_conn), new Fsdb_db_file(user_core_url, user_core_conn)); } } diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2.java index 74f5a19ae..802f446a3 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2.java @@ -41,6 +41,10 @@ public class Fsdb_db_mgr__v2 implements Fsdb_db_mgr { if (layout.Tid_is_all_or_few()) return file_main_core; Io_url url = wiki_dir.GenSubFil(file_name); Db_conn conn = Db_conn_bldr.I.Get(url); + if (conn == null) { // bin file deleted or not downloaded; use Noop Db_conn and continue; do not fail; DATE:2015-04-16 + Gfo_usr_dlg_.I.Warn_many("", "", "fsdb.bin:file does not exist; url=~{0}", url); + conn = Db_conn_.Empty; + } return new Fsdb_db_file(url, conn); } public Fsdb_db_file File__bin_file__new(int mnt_id, String file_name) { diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java index 9a8118e4a..f6e2f8789 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java @@ -39,7 +39,7 @@ public class Fsdb_db_mgr__v2_bldr { conn.Txn_end(); return rv; } - private Fsdb_db_file Make_core_file_user(Xowe_wiki wiki, Io_url wiki_dir, String user_file_name, String main_core_name) { // always create file; do not create mnt_tbl; + public Fsdb_db_file Make_core_file_user(Xow_wiki wiki, Io_url wiki_dir, String user_file_name, String main_core_name) { // always create file; do not create mnt_tbl; Io_url url = wiki_dir.GenSubFil(user_file_name); Db_conn conn = Db_conn_bldr.I.New(url); conn.Txn_bgn(); @@ -91,11 +91,11 @@ public class Fsdb_db_mgr__v2_bldr { default: throw Err_.not_implemented_(); } } - public static void Make_cfg_data(Xowe_wiki wiki, String file_core_name, Fsdb_db_file file, byte file_tid, int part_id) { + public static void Make_cfg_data(Xow_wiki wiki, String file_core_name, Fsdb_db_file file, byte file_tid, int part_id) { Db_cfg_tbl cfg_tbl = file.Tbl__cfg(); Xowd_db_file core_db = wiki.Data_mgr__core_mgr().Db__core(); core_db.Info_session().Save(cfg_tbl); - Xob_info_file info_file = new Xob_info_file(-1, Xowd_db_file_.To_key(file_tid), Xob_info_file.Ns_ids_empty, part_id, Guid_adp_.random_(), 2, file_core_name, file.Url().NameAndExt()); + Xob_info_file info_file = new Xob_info_file(-1, Xowd_db_file_.To_key(file_tid), Xob_info_file.Ns_ids_empty, part_id, Guid_adp_.new_(), 2, file_core_name, file.Url().NameAndExt()); info_file.Save(cfg_tbl); } private static String Main_core_name_all(String wiki_domain) {return wiki_domain + ".xowa";} // EX: en.wikipedia.org.xowa diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java index 88af814b9..cb3386ad9 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java @@ -69,6 +69,8 @@ public class Fsd_fil_tbl implements RlsAble { .Val_int(fld_bin_db_id, bin_db_id) .Val_bry_as_str(fld_name, name) .Val_long(fld_size, size) + .Val_str(fld_modified, String_.Empty) + .Val_str(fld_hash, String_.Empty) .Crt_int(fld_id, id) .Exec_update(); } diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index e3032aa48..48959a9b8 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -26,7 +26,7 @@ public class Xoa_app_ { boot_mgr.Run(args); } public static final String Name = "xowa"; - public static final String Version = "2.4.2.1"; + public static final String Version = "2.4.3.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys; public static String User_agent = ""; diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java index fe2861fea..e19e0f063 100644 --- a/400_xowa/src/gplx/xowa/Xoae_app.java +++ b/400_xowa/src/gplx/xowa/Xoae_app.java @@ -156,9 +156,9 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { if (setup_mgr.Cmd_mgr().Working()) { if (!gui_mgr.Kit().Ask_yes_no("", "", "An import is in progress. Are you sure you want to exit?")) return false; } + if (!gui_mgr.Browser_win().Tab_mgr().Tabs__pub_close_all()) return false; gui_mgr.Browser_win().Usr_dlg().Canceled_y_(); user.App_term(); usr_dlg.Log_many("", "", "term:app_term"); - gui_mgr.Browser_win().Tab_mgr().Tabs_close_all(); log_wtr.Term(); usr_dlg.Log_many("", "", "term:log_wtr"); log_mgr.Rls(); usr_dlg.Log_many("", "", "term:log_mgr"); if (Scrib_core.Core() != null) {Scrib_core.Core().Term(); usr_dlg.Log_many("", "", "term:scrib");} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/specials/Xoapi_search.java b/400_xowa/src/gplx/xowa/apis/xowa/specials/Xoapi_search.java index 631126f86..4e09ff94f 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/specials/Xoapi_search.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/specials/Xoapi_search.java @@ -16,19 +16,39 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.apis.xowa.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; -public class Xoapi_search implements GfoInvkAble { +import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.crts.*; +public class Xoapi_search implements GfoInvkAble, GfoEvMgrOwner { + private final Xow_domain_crt_kv_mgr multi_wiki_rules_mgr = new Xow_domain_crt_kv_mgr(); private String multi_wiki_rules_str = "*.*|"; + public Xoapi_search() { + this.evMgr = GfoEvMgr.new_(this); + } + public GfoEvMgr EvMgr() {return evMgr;} private GfoEvMgr evMgr; public int Results_per_page() {return results_per_page;} private int results_per_page = 20; public boolean Async_db() {return async_db;} private boolean async_db = true; + public void Multi_wiki_rule_str_(String v) { + if (!multi_wiki_rules_mgr.Parse(Bry_.new_utf8_(v))) return; + this.multi_wiki_rules_str = v; + GfoEvMgr_.PubVal(this, Evt_multi_wiki_rules_changed, v); + } + public Xow_domain_crt_itm Multi_wiki_crt(Xow_domain cur_domain) { + return multi_wiki_rules_mgr.Find(cur_domain, cur_domain); + } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_results_per_page)) return results_per_page; else if (ctx.Match(k, Invk_results_per_page_)) results_per_page = m.ReadInt("v"); else if (ctx.Match(k, Invk_async_db)) return Yn.Xto_str(async_db); else if (ctx.Match(k, Invk_async_db_)) async_db = m.ReadYn("v"); + else if (ctx.Match(k, Invk_multi_wiki_rules)) return multi_wiki_rules_str; + else if (ctx.Match(k, Invk_multi_wiki_rules_)) multi_wiki_rules_str = m.ReadStr("v"); else return GfoInvkAble_.Rv_unhandled; return this; } private static final String Invk_results_per_page = "results_per_page" , Invk_results_per_page_ = "results_per_page_" , Invk_async_db = "async_db" , Invk_async_db_ = "async_db_" + , Invk_multi_wiki_rules = "multi_wiki_rules" , Invk_multi_wiki_rules_ = "multi_wiki_rules_" + ; + public static final String + Evt_multi_wiki_rules_changed = "multi_wiki_rules_changed" ; } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java index 471399e79..1822f09d5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java @@ -61,7 +61,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { } // trg_mnt_itm this.trg_bin_db_max = app.Api_root().Bldr().Wiki().Import().File_db_max(); - Fsdb_db_mgr trg_db_mgr = Fsdb_db_mgr_.new_detect(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); + Fsdb_db_mgr trg_db_mgr = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); if (trg_db_mgr == null) trg_db_mgr = Fsdb_db_mgr__v2_bldr.I.Make(wiki); Fsm_mnt_mgr trg_mnt_mgr = new Fsm_mnt_mgr(); trg_mnt_mgr.Ctor_by_load(trg_db_mgr); trg_mnt_mgr.Mnts__get_insert_idx_(Fsm_mnt_mgr.Mnt_idx_main); // NOTE: do not delete; mnt_mgr default to Mnt_idx_user; DATE:2014-04-25 @@ -119,7 +119,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { } public void Cmd_end() { usr_dlg.Note_many("", "", "fsdb_make.done: count=~{0} rate=~{1}", exec_count, DecimalAdp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).Xto_str("#,###.000")); - src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Txn_end(); + if (src_fsdb_wkr != null) src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Txn_end(); // NOTE: src_fsdb_wkr will be null if no src db defined trg_atr_fil.Conn().Txn_end(); trg_atr_fil.Conn().Rls_conn(); if (!trg_mnt_itm.Db_mgr().File__solo_file()) { trg_bin_fil.Conn().Txn_end(); trg_bin_fil.Conn().Rls_conn(); @@ -303,10 +303,10 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { } else if (String_.Eq(version, "v2")) { url = wiki.Fsys_mgr().Root_dir().GenSubDir("prv"); // v2: EX: /xowa/wiki/en.wikipedia.org/prv/ - rv = Fsdb_db_mgr_.new_detect(domain_str, url, url); // note that v2 is prioritized over v1 + rv = Fsdb_db_mgr_.new_detect(wiki, url, url); // note that v2 is prioritized over v1 } else throw Err_.new_("fsdb.make:unknown fsdb_type; version={0}", version); - if (!Io_mgr._.ExistsFil(rv.File__mnt_file().Url())) throw Err_.new_("fsdb.make:source fsdb not found; version={0} url={1}", version, url.Raw()); + if (rv == null) throw Err_.new_("fsdb.make:source fsdb not found; version={0} url={1}", version, url.Raw()); return rv; } private static final byte Select_rv_stop = 0, Select_rv_process = 1, Select_rv_next_page = 2; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java index caddb8256..c0cb9ba8f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java @@ -27,6 +27,7 @@ public class Xob_term_cmd extends Xob_term_base { cfg_tbl.Insert_bry(Xow_cfg_consts.Grp_wiki_init, "props.main_page", wiki.Props().Main_page()); cfg_tbl.Insert_bry(Xow_cfg_consts.Grp_wiki_init, "props.siteinfo_misc", wiki.Props().Siteinfo_misc()); cfg_tbl.Insert_bry(Xow_cfg_consts.Grp_wiki_init, "props.siteinfo_mainpage", wiki.Props().Siteinfo_mainpage()); +// gplx.fsdb.Fsdb_db_mgr__v2_bldr.I.Make(wiki);// bld wiki wiki.Data_mgr__core_mgr().Rls(); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java index 0fe834fba..40892c0b8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java +++ b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java @@ -56,6 +56,6 @@ public class Xob_info_session { , Cfg_key__time = "time" // EX: 20150102 030405 , Cfg_key__guid = "guid" // EX: 00000000-0000-0000-0000-000000000000 ; - public static Xob_info_session new_(String user, String wiki_domain, String dump_name) {return new Xob_info_session(user, Xoa_app_.Version, wiki_domain, dump_name, DateAdp_.Now(), Guid_adp_.Empty);} + public static Xob_info_session new_(String user, String wiki_domain, String dump_name) {return new Xob_info_session(user, Xoa_app_.Version, wiki_domain, dump_name, DateAdp_.Now(), Guid_adp_.new_());} public static final Xob_info_session Test = new_("anonymous", "en.wikipedia.org", "enwiki-latest-pages-articles"); } diff --git a/400_xowa/src/gplx/xowa/bldrs/langs/Xol_mw_lang_parser.java b/400_xowa/src/gplx/xowa/bldrs/langs/Xol_mw_lang_parser.java index ed2bcdea6..321388dda 100644 --- a/400_xowa/src/gplx/xowa/bldrs/langs/Xol_mw_lang_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/langs/Xol_mw_lang_parser.java @@ -104,7 +104,7 @@ public class Xol_mw_lang_parser { try { Xol_lang lang = lang_mgr.Get_by_key_or_new(Bry_.new_utf8_(fil.NameOnly())); Xob_i18n_parser.Load_msgs(true, lang, fil); - } catch (Exception exc) {Err_.Noop(exc); Tfds.WriteText(String_.Format("failed to parse json file; url={0} err={1}", fil.Raw(), Err_.Message_gplx_brief(exc)));} + } catch (Exception exc) {Err_.Noop(exc); Tfds.WriteText(String_.Format("failed to parse json file; url={0} err={1}\n", fil.Raw(), Err_.Message_gplx_brief(exc)));} } } } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java index 281648a07..4e402d58f 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java @@ -39,7 +39,7 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr { if (cur_page_id > max_page_id) max_page_id = cur_page_id; } page_id = max_page_id + 1; - db_mgr.Core_data_mgr().Tbl__cfg().Insert_int("db", "page.id_next", page_id + 1); + db_mgr.Core_data_mgr().Tbl__cfg().Upsert_int("db", "page.id_next", page_id + 1); } finally {rdr.Rls();} } @@ -52,7 +52,7 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr { page_core_tbl.Insert_bgn(); page_text_tbl.Insert_bgn(); try { - page_mgr.Create(page_core_tbl, page_text_tbl, page_id, ns_id, text_raw, redirect, DateAdp_.Now(), text_zip, text_raw.length, ns_count, page_text_db.Id(), -1); + page_mgr.Create(page_core_tbl, page_text_tbl, page_id, ns_id, ttl.Page_db(), redirect, DateAdp_.Now(), text_zip, text_raw.length, ns_count, page_text_db.Id(), -1); db_file.Tbl__ns().Update_ns_count(ns_id, ns_count); db_file.Tbl__cfg().Update_int("db", "page.id_next", page_id + 1); } finally { diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_itm.java b/400_xowa/src/gplx/xowa/files/Xof_file_itm.java index 237156c55..223253527 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_itm.java @@ -29,7 +29,7 @@ public interface Xof_file_itm { byte Orig_repo_id(); byte[] Orig_repo_name(); byte[] Orig_ttl(); - int Orig_ext(); + Xof_ext Orig_ext(); int Orig_w(); int Orig_h(); byte[] Orig_redirect(); diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java index 285830fd8..8232f790d 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java @@ -64,7 +64,7 @@ public class Xof_file_wkr implements Gfo_thread_wkr { } public static void Show_img(byte exec_tid, Xof_fsdb_itm fsdb, Gfo_usr_dlg usr_dlg, Xof_bin_mgr bin_mgr, Fsm_mnt_mgr mnt_mgr, Xof_cache_mgr cache_mgr, Xow_repo_mgr repo_mgr, Xog_js_wkr js_wkr, Xof_img_size img_size, Xof_url_bldr url_bldr, Xoa_page hpg) { try { - if (fsdb.Orig_ext() < 0) { + if (fsdb.Orig_ext() == null) { usr_dlg.Warn_many("", "", "file.missing.ext: file=~{0} width=~{1} page=~{2}", fsdb.Lnki_ttl(), fsdb.Lnki_w(), hpg.Ttl().Full_db()); return; } @@ -104,7 +104,7 @@ public class Xof_file_wkr implements Gfo_thread_wkr { byte repo_id = orig.Repo(); Xof_repo_pair repo_pair = repo_mgr.Repos_get_by_id(repo_id); Xof_repo_itm repo_itm = repo_pair.Trg(); - fsdb.Ctor_by_orig(repo_id, repo_pair.Wiki_domain(), orig.Page(), orig.Ext(), orig.W(), orig.H(), orig.Redirect()); + fsdb.Ctor_by_orig(repo_id, repo_pair.Wiki_domain(), orig.Page(), Xof_ext_.new_by_id_(orig.Ext()), orig.W(), orig.H(), orig.Redirect()); fsdb.Ctor_for_html(exec_tid, img_size, repo_itm, url_bldr); } private static void Save_bin(Xof_fsdb_itm itm, Fsm_mnt_mgr mnt_mgr) { diff --git a/400_xowa/src/gplx/xowa/files/Xof_img_size.java b/400_xowa/src/gplx/xowa/files/Xof_img_size.java index 364be2911..7791be885 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_img_size.java +++ b/400_xowa/src/gplx/xowa/files/Xof_img_size.java @@ -28,7 +28,7 @@ public class Xof_img_size { } public void Html_size_calc(byte exec_tid, int lnki_w, int lnki_h, byte lnki_type, int upright_patch, double lnki_upright, int lnki_ext, int orig_w, int orig_h, int thm_dflt_w) { this.Clear(); // always clear before calc; caller should be responsible, but just to be safe. - if (lnki_type == Xop_lnki_type.Id_frame // frame: always return orig size; Linker.php!makeThumbLink2; // Use image dimensions, don't scale + if (Enm_.HasInt(lnki_type, Xop_lnki_type.Id_frame) // frame: always return orig size; Linker.php!makeThumbLink2; // Use image dimensions, don't scale && lnki_h == Null) { // unless lnki_h specified; DATE:2013-12-22 html_w = file_w = orig_w; html_h = file_h = orig_h; diff --git a/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java b/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java index d11d6caf7..a3562c97d 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java +++ b/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java @@ -74,6 +74,9 @@ public class Xof_img_size_tst { @Test public void Frame() { // PURPOSE: frame incorrectly defaulted to file_is_orig; [[File:MESSENGER.jpg|200x200px|framed]]; DATE:2013-12-22 fxt.Lnki_type_(Xop_lnki_type.Id_frame).Lnki_ext_(Xof_ext_.Id_png).Lnki_(200, 200).Orig_(2038, 1529).Test_html(200, 150, Bool_.N); } + @Test public void Frame_and_thumb(){ // PURPOSE: frame and thumb should be treated as frame; Enm.Has(val, Id_frame) vs val == Id_frame; PAGE:en.w:History_of_Western_Civilization; DATE:2015-04-16 + fxt.Lnki_type_(Enm_.Add_byte(Xop_lnki_type.Id_frame, Xop_lnki_type.Id_thumb)).Lnki_(200, -1).Test_html(400, 200, Bool_.Y); // mut return same as Lnki_lt_orig_frame above + } } class Xof_img_size_fxt { private Xof_img_size img_size = new Xof_img_size(); diff --git a/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java b/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java index 6cb41eef0..6e3a8333d 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java @@ -65,6 +65,7 @@ public class Xof_url_bldr { public Io_url Xto_url() {Bld(); Io_url rv = Io_url_.new_fil_(bfr.Xto_str()); Clear(); return rv;} public Io_url To_url_trg(Xof_repo_itm repo_itm, Xof_fsdb_itm itm, boolean orig) { byte mode = orig ? Xof_repo_itm.Mode_orig : Xof_repo_itm.Mode_thumb; +// return this.Init_for_trg_file(mode, repo_itm, itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), itm.Html_w(), itm.Lnki_time(), itm.Lnki_page()).Xto_url(); return this.Init_for_trg_file(mode, repo_itm, itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), itm.Html_w(), itm.Lnki_time(), itm.Lnki_page()).Xto_url(); } private void Bld() { diff --git a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java index 96402900e..d47344875 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java @@ -30,7 +30,7 @@ public class Xof_xfer_itm implements Xof_file_itm { public byte Orig_repo_id() {return orig_repo_id;} private byte orig_repo_id = Xof_repo_itm.Repo_null; public byte[] Orig_repo_name() {return orig_repo_name;} private byte[] orig_repo_name; public byte[] Orig_ttl() {return orig_ttl;} private byte[] orig_ttl; - public int Orig_ext() {return orig_ext;} private int orig_ext; + public Xof_ext Orig_ext() {return orig_ext;} private Xof_ext orig_ext; public int Orig_w() {return orig_w;} private int orig_w; public int Orig_h() {return orig_h;} private int orig_h; public byte[] Orig_redirect() {return orig_redirect;} private byte[] orig_redirect; @@ -66,7 +66,8 @@ public class Xof_xfer_itm implements Xof_file_itm { public Xof_xfer_itm Url_bldr_(Xof_url_bldr v) {url_bldr = v; return this;} private Xof_url_bldr url_bldr = Xof_url_bldr.Temp; public Xof_xfer_itm Clear() { lnki_type = orig_repo_id = Byte_.Max_value_127; - lnki_w = lnki_h = file_w = orig_ext = orig_w = orig_h = html_w = html_h = gallery_mgr_h = Int_.Neg1; + lnki_w = lnki_h = file_w = orig_w = orig_h = html_w = html_h = gallery_mgr_h = Int_.Neg1; + orig_ext = null; lnki_upright = Int_.Neg1; lnki_time = Xof_lnki_time.Null; lnki_page = Xof_lnki_page.Null; file_found = file_exists = img_is_thumbable = false; orig_file_len = 0; // NOTE: cannot be -1, or else will always download orig; see ext rule chk and (orig_file_len < 0) @@ -104,14 +105,16 @@ public class Xof_xfer_itm implements Xof_file_itm { public void Init_by_orig_old(int w, int h, int orig_file_len) { this.orig_w = w; this.orig_h = h; this.orig_file_len = orig_file_len; } - public void Init_by_orig(byte orig_repo_id, byte[] orig_repo_name, byte[] orig_ttl, int orig_ext, int orig_w, int orig_h, byte[] orig_redirect, int orig_file_len) { + public void Init_by_orig(byte orig_repo_id, byte[] orig_repo_name, byte[] orig_ttl, Xof_ext orig_ext, int orig_w, int orig_h, byte[] orig_redirect, int orig_file_len) { this.orig_repo_id = orig_repo_id; this.orig_repo_name = orig_repo_name; this.orig_ttl = orig_ttl; this.orig_ext = orig_ext; this.orig_w = orig_w; this.orig_h = orig_h; this.orig_redirect = orig_redirect; - if (orig_ext != lnki_ext.Id()) - this.Lnki_ext_(Xof_ext_.new_by_id_(orig_ext)); // overwrite ext with whatever's in file_orig; needed for ogg -> oga / ogv - if (Bry_.Len_gt_0(orig_redirect)) // redirect exists; EX: A.png redirected to B.png + if (orig_ext.Id() != lnki_ext.Id()) + this.Lnki_ext_(orig_ext); // overwrite ext with whatever's in file_orig; needed for ogg -> oga / ogv + if (Bry_.Len_gt_0(orig_redirect)) // redirect exists; EX: A.png redirected to B.png this.Lnki_ttl_(orig_redirect); // update fsdb with atrs of B.png + else if (!Bry_.Eq(lnki_ttl, orig_ttl)) // ttls differ; EX: "A_.png" vs "A.png" + this.Lnki_ttl_(orig_ttl); this.orig_file_len = orig_file_len; } private void Lnki_ttl_(byte[] v) { diff --git a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java index dc3cabd16..f4b23115b 100644 --- a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java @@ -115,7 +115,7 @@ public class Xow_file_mgr implements GfoInvkAble { } public void Init_file_mgr_by_load(Xow_wiki wiki) { if (db_core != null) return; // already init'd - this.db_core = Fsdb_db_mgr_.new_detect(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); + this.db_core = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); if (db_core == null ) return; // no fsdb_core found; exit this.version = Version_2; this.fsdb_mode = Xof_fsdb_mode.new_view(); diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java index 97364965c..aae320aff 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java @@ -62,43 +62,43 @@ public class Xof_bin_mgr { if (!Env_.Mode_testing()) cache_mgr.Reg(itm, rdr.Len()); return trg; } - public Io_stream_rdr Find_as_rdr(byte exec_tid, Xof_fsdb_itm itm) { + public Io_stream_rdr Find_as_rdr(byte exec_tid, Xof_fsdb_itm fsdb) { Io_stream_rdr rv = Io_stream_rdr_.Null; - Xof_repo_itm repo = repo_mgr.Repos_get_by_wiki(itm.Orig_repo_name()).Trg(); - boolean file_is_orig = itm.File_is_orig(); + Xof_repo_itm repo = repo_mgr.Repos_get_by_wiki(fsdb.Orig_repo_name()).Trg(); + boolean file_is_orig = fsdb.File_is_orig(); if (file_is_orig || exec_tid == Xof_exec_tid.Tid_viewer_app) { // orig or viewer_app; note that viewer_app always return orig - Io_url trg = url_bldr.To_url_trg(repo, itm, Bool_.Y); - itm.Html_view_url_(trg); + Io_url trg = url_bldr.To_url_trg(repo, fsdb, Bool_.Y); + fsdb.Html_view_url_(trg); for (int i = 0; i < wkrs_len; i++) { Xof_bin_wkr wkr = wkrs[i]; - rv = wkr.Get_as_rdr(itm, Bool_.N, itm.Html_w()); + rv = wkr.Get_as_rdr(fsdb, Bool_.N, fsdb.Html_w()); if (rv == Io_stream_rdr_.Null) continue; // orig not found; continue; - itm.File_exists_y_(); + fsdb.File_exists_y_(); return rv; } } else { // thumb - Io_url trg = url_bldr.To_url_trg(repo, itm, Bool_.N); - itm.Html_view_url_(trg); + Io_url trg = url_bldr.To_url_trg(repo, fsdb, Bool_.N); + fsdb.Html_view_url_(trg); for (int i = 0; i < wkrs_len; i++) { Xof_bin_wkr wkr = wkrs[i]; - rv = wkr.Get_as_rdr(itm, Bool_.Y, itm.Html_w()); // get thumb's bin + rv = wkr.Get_as_rdr(fsdb, Bool_.Y, fsdb.Html_w()); // get thumb's bin if (rv != Io_stream_rdr_.Null) { // thumb's bin exists; - itm.File_exists_y_(); + fsdb.File_exists_y_(); return rv; } - usr_dlg.Log_direct(String_.Format("thumb not found; ttl={0} w={1} ", String_.new_utf8_(itm.Lnki_ttl()), itm.Lnki_w())); - rv = wkr.Get_as_rdr(itm, Bool_.N, itm.Orig_w()); // thumb missing; get orig; + usr_dlg.Log_direct(String_.Format("thumb not found; ttl={0} w={1} ", String_.new_utf8_(fsdb.Lnki_ttl()), fsdb.Lnki_w())); + rv = wkr.Get_as_rdr(fsdb, Bool_.N, fsdb.Orig_w()); // thumb missing; get orig; if (rv == Io_stream_rdr_.Null) { usr_dlg.Log_direct(String_.Format("orig not found;")); continue; // nothing found; continue; } if (!wkr.Resize_allowed()) continue; - Io_url orig = url_bldr.To_url_trg(repo, itm, Bool_.Y); // get orig url + Io_url orig = url_bldr.To_url_trg(repo, fsdb, Bool_.Y); // get orig url Io_stream_wtr_.Save_rdr(orig, rv); - boolean resized = Resize(exec_tid, itm, file_is_orig, orig, trg); + boolean resized = Resize(exec_tid, fsdb, file_is_orig, orig, trg); if (!resized) continue; - itm.File_exists_y_(); + fsdb.File_exists_y_(); rv = Io_stream_rdr_.file_(trg); // return stream of resized url; (result of imageMagick / inkscape) rv.Open(); return rv; diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java index 61120e3e0..5be3fe3c9 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java @@ -16,47 +16,42 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.core.primitives.*; import gplx.dbs.*; import gplx.ios.*; import gplx.cache.*; import gplx.xowa.files.fsdb.*; +import gplx.dbs.*; import gplx.ios.*; import gplx.cache.*; import gplx.xowa.files.fsdb.*; import gplx.fsdb.*; import gplx.fsdb.data.*; import gplx.fsdb.meta.*; public class Xof_bin_wkr__fsdb_sql implements Xof_bin_wkr { - private final Int_obj_ref tmp_itm_id = Int_obj_ref.neg1_(), tmp_bin_id = Int_obj_ref.neg1_(), tmp_mnt_id = Int_obj_ref.neg1_(); + private final Xof_bin_wkr_ids tmp_ids = new Xof_bin_wkr_ids(); Xof_bin_wkr__fsdb_sql(Fsm_mnt_mgr mnt_mgr) {this.mnt_mgr = mnt_mgr;} public byte Tid() {return Xof_bin_wkr_.Tid_fsdb_xowa;} public String Key() {return Xof_bin_wkr_.Key_fsdb_wiki;} public Fsm_mnt_mgr Mnt_mgr() {return mnt_mgr;} private final Fsm_mnt_mgr mnt_mgr; public boolean Resize_allowed() {return bin_wkr_resize;} public void Resize_allowed_(boolean v) {bin_wkr_resize = v;} private boolean bin_wkr_resize = false; public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm itm, boolean is_thumb, int w) { - Find_ids(itm, is_thumb, w, tmp_itm_id, tmp_bin_id, tmp_mnt_id); - int bin_db_id = tmp_bin_id.Val(); if (bin_db_id == Fsd_bin_tbl.Bin_db_id_null) return gplx.ios.Io_stream_rdr_.Null; - Fsm_bin_fil bin_db = mnt_mgr.Bins__at(tmp_mnt_id.Val(), bin_db_id); - return bin_db.Select_as_rdr(tmp_itm_id.Val()); + Find_ids(itm, is_thumb, w); + int bin_db_id = tmp_ids.Bin_db_id(); if (bin_db_id == Fsd_bin_tbl.Bin_db_id_null) return gplx.ios.Io_stream_rdr_.Null; + Fsm_bin_fil bin_db = mnt_mgr.Bins__at(tmp_ids.Mnt_id(), bin_db_id); + return bin_db.Select_as_rdr(tmp_ids.Itm_id()); } public boolean Get_to_fsys(Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) {return Get_to_fsys(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), is_thumb, w, itm.Lnki_time(), itm.Lnki_page(), bin_url);} private boolean Get_to_fsys(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { - Find_ids(orig_repo, orig_ttl, orig_ext.Id(), lnki_time, lnki_page, lnki_is_thumb, file_w, tmp_itm_id, tmp_bin_id, tmp_mnt_id); - int bin_db_id = tmp_bin_id.Val(); if (bin_db_id == Fsd_bin_tbl.Bin_db_id_null) return false; - Fsm_bin_fil bin_db = mnt_mgr.Bins__at(tmp_mnt_id.Val(), bin_db_id); - return bin_db.Select_to_url(tmp_itm_id.Val(), file_url); + Find_ids(orig_repo, orig_ttl, orig_ext.Id(), lnki_time, lnki_page, lnki_is_thumb, file_w); + int bin_db_id = tmp_ids.Bin_db_id(); if (bin_db_id == Fsd_bin_tbl.Bin_db_id_null) return false; + Fsm_bin_fil bin_db = mnt_mgr.Bins__at(tmp_ids.Mnt_id(), bin_db_id); + return bin_db.Select_to_url(tmp_ids.Itm_id(), file_url); } - private void Find_ids(Xof_fsdb_itm itm, boolean is_thumb, int w, Int_obj_ref tmp_itm_id, Int_obj_ref tmp_bin_id, Int_obj_ref tmp_mnt_id) {Find_ids(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext().Id(), itm.Lnki_time(), itm.Lnki_page(), is_thumb, w, tmp_itm_id, tmp_bin_id, tmp_mnt_id);} - private void Find_ids(byte[] orig_repo, byte[] orig_ttl, int orig_ext, double lnki_time, int lnki_page, boolean is_thumb, int w, Int_obj_ref tmp_itm_id, Int_obj_ref tmp_bin_id, Int_obj_ref tmp_mnt_id) { - synchronized (tmp_bin_id) { + private void Find_ids(Xof_fsdb_itm itm, boolean is_thumb, int w) {Find_ids(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext().Id(), itm.Lnki_time(), itm.Lnki_page(), is_thumb, w);} + private void Find_ids(byte[] orig_repo, byte[] orig_ttl, int orig_ext, double lnki_time, int lnki_page, boolean is_thumb, int w) { + synchronized (tmp_ids) { byte[] dir = orig_repo, fil = orig_ttl; double time = Xof_lnki_time.Convert_to_fsdb_thumbtime(orig_ext, lnki_time, lnki_page); if (is_thumb) { Fsd_thm_itm thm_itm = Fsd_thm_itm.new_(); thm_itm.Init_by_req(w, lnki_time, lnki_page); boolean found = Select_thm_bin(thm_itm, dir, fil); - tmp_itm_id.Val_(thm_itm.Thm_id()); - tmp_bin_id.Val_(found ? thm_itm.Db_bin_id() : Fsd_bin_tbl.Bin_db_id_null); - tmp_mnt_id.Val_(thm_itm.Mnt_id()); + tmp_ids.Init_by_thm(found, thm_itm); } else { Fsd_fil_itm fil_itm = Select_fil_bin(dir, fil, is_thumb, w, time); - if (fil_itm == Fsd_fil_itm.Null) return; - tmp_itm_id.Val_(fil_itm.Fil_id()); - tmp_bin_id.Val_(fil_itm.Bin_db_id()); - tmp_mnt_id.Val_(fil_itm.Mnt_id()); + tmp_ids.Init_by_fil(fil_itm); } } } @@ -82,4 +77,33 @@ public class Xof_bin_wkr__fsdb_sql implements Xof_bin_wkr { public void Txn_bgn() {mnt_mgr.Mnts__get_insert().Txn_bgn();} public void Txn_end() {mnt_mgr.Mnts__get_insert().Txn_end();} public static Xof_bin_wkr__fsdb_sql new_(Fsm_mnt_mgr mnt_mgr) {return new Xof_bin_wkr__fsdb_sql(mnt_mgr);} -} +} +class Xof_bin_wkr_ids { + public Xof_bin_wkr_ids() {this.Clear();} + public int Mnt_id() {return mnt_id;} private int mnt_id; + public int Bin_db_id() {return bin_db_id;} private int bin_db_id; + public int Itm_id() {return itm_id;} private int itm_id; + public void Init_by_thm(boolean found, Fsd_thm_itm thm) { + if (found) { + this.mnt_id = thm.Mnt_id(); + this.bin_db_id = thm.Db_bin_id(); + this.itm_id = thm.Thm_id(); + } + else + this.Clear(); + } + public void Init_by_fil(Fsd_fil_itm fil) { + if (fil == Fsd_fil_itm.Null) + this.Clear(); + else { + this.mnt_id = fil.Mnt_id(); + this.bin_db_id = fil.Bin_db_id(); + this.itm_id = fil.Fil_id(); + } + } + private void Clear() { + this.mnt_id = -1; + this.bin_db_id = Fsd_bin_tbl.Bin_db_id_null; + this.itm_id = -1; + } +} diff --git a/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java index 507edb04b..513064d58 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java @@ -46,7 +46,7 @@ public class Xof_cache_mgr2 { Xof_cache_itm itm = Get_or_null(fsdb.Lnki_ttl(), fsdb.Lnki_type(), fsdb.Lnki_upright(), fsdb.Lnki_w(), fsdb.Lnki_h(), fsdb.Lnki_time(), fsdb.Lnki_page()); if (itm == Xof_cache_itm.Null) { itm = new Xof_cache_itm(key_bfr, Db_cmd_mode.Tid_create, site, fsdb.Lnki_ttl(), fsdb.Lnki_type(), fsdb.Lnki_upright(), fsdb.Lnki_w(), fsdb.Lnki_h(), fsdb.Lnki_time(), fsdb.Lnki_page() - , fsdb.Orig_repo_id(), fsdb.Orig_ttl(), fsdb.Orig_ext(), fsdb.Orig_w(), fsdb.Orig_h() + , fsdb.Orig_repo_id(), fsdb.Orig_ttl(), fsdb.Orig_ext().Id(), fsdb.Orig_w(), fsdb.Orig_h() , fsdb.Lnki_time(), fsdb.Lnki_page(), fsdb.Temp_file_size(), 1, DateAdp_.Now().Timestamp_unix(), fsdb.Temp_file_w()) ; hash.Add(itm.Lnki_key(), itm); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java index 0947cb27f..76d6ecde3 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java @@ -30,7 +30,7 @@ public class Xof_fsdb_itm { public byte Orig_repo_id() {return orig_repo_id;} private byte orig_repo_id = Xof_repo_itm.Repo_null; public byte[] Orig_repo_name() {return orig_repo_name;} private byte[] orig_repo_name; public byte[] Orig_ttl() {return orig_ttl;} private byte[] orig_ttl; - public int Orig_ext() {return orig_ext;} private int orig_ext; + public Xof_ext Orig_ext() {return orig_ext;} private Xof_ext orig_ext; public int Orig_w() {return orig_w;} private int orig_w = Xop_lnki_tkn.Width_null; public int Orig_h() {return orig_h;} private int orig_h = Xop_lnki_tkn.Height_null; public byte[] Orig_redirect() {return orig_redirect;} private byte[] orig_redirect = Bry_.Empty; @@ -59,14 +59,16 @@ public class Xof_fsdb_itm { // this.file_is_orig = !(Xop_lnki_type.Id_defaults_to_thumb(lnki_type) || lnki_w != Xop_lnki_tkn.Width_null || lnki_h != Xop_lnki_tkn.Height_null); // DELETE: overriden below. this.Lnki_ttl_(lnki_ttl); } private int lnki_upright_patch; - public void Ctor_by_orig(byte orig_repo_id, byte[] orig_repo_name, byte[] orig_ttl, int orig_ext, int orig_w, int orig_h, byte[] orig_redirect) { + public void Ctor_by_orig(byte orig_repo_id, byte[] orig_repo_name, byte[] orig_ttl, Xof_ext orig_ext, int orig_w, int orig_h, byte[] orig_redirect) { this.orig_repo_id = orig_repo_id; this.orig_repo_name = orig_repo_name; this.orig_ttl = orig_ttl; this.orig_ext = orig_ext; this.orig_w = orig_w; this.orig_h = orig_h; this.orig_redirect = orig_redirect; - if (orig_ext != lnki_ext.Id()) - this.Lnki_ext_(Xof_ext_.new_by_id_(orig_ext)); // overwrite ext with whatever's in file_orig; needed for ogg -> oga / ogv - if (Bry_.Len_gt_0(orig_redirect)) // redirect exists; EX: A.png redirected to B.png + if (orig_ext != null && orig_ext.Id() != lnki_ext.Id()) + this.Lnki_ext_(orig_ext); // overwrite ext with whatever's in file_orig; needed for ogg -> oga / ogv + if (Bry_.Len_gt_0(orig_redirect)) // redirect exists; EX: A.png redirected to B.png this.Lnki_ttl_(orig_redirect); // update fsdb with atrs of B.png + else if (!Bry_.Eq(lnki_ttl, orig_ttl)) // ttls differ; EX: "A_.png" vs "A.png" + this.Lnki_ttl_(orig_ttl); } public void Ctor_for_html(byte exec_tid, Xof_img_size img_size, Xof_repo_itm repo, Xof_url_bldr url_bldr) { Calc_html_size(exec_tid, img_size); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java index 8f1864472..c54d19fbe 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java @@ -33,7 +33,7 @@ public class Xof_fsdb_mgr__sql implements Xof_fsdb_mgr, GfoInvkAble { Xoa_app app = wiki.App(); this.cache_mgr = app.File_mgr__cache_mgr(); this.url_bldr = Xof_url_bldr.new_v2_(); this.repo_mgr = wiki.File_mgr__repo_mgr(); Xof_img_mgr img_mgr = app.File_mgr__img_mgr(); - Fsdb_db_mgr core = Fsdb_db_mgr_.new_detect(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); + Fsdb_db_mgr core = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); if (core == null) return; fsdb_enabled = true; mnt_mgr.Ctor_by_load(core); diff --git a/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java b/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java index 0ef52b93f..f0ff93a17 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java @@ -26,7 +26,7 @@ public class Xob_orig_tbl_bldr extends Xob_itm_basic_base implements Xob_cmd { Xof_fsdb_mode fsdb_mode = wiki.File_mgr__fsdb_mode(); fsdb_mode.Tid_make_y_(); wiki.Init_assert(); - Fsdb_db_mgr db_core_mgr = Fsdb_db_mgr_.new_detect(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); + Fsdb_db_mgr db_core_mgr = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); conn = db_core_mgr.File__orig_tbl_ary()[gplx.fsdb.meta.Fsm_mnt_mgr.Mnt_idx_main].Conn(); Io_url make_db_url = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Url(); Sqlite_engine_.Db_attach(conn, "make_db", make_db_url.Raw()); diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_mgr.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_mgr.java index 74618a951..c564b358d 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_mgr.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_mgr.java @@ -37,9 +37,8 @@ public class Xof_orig_mgr { public Xof_orig_itm Find_by_ttl_or_null(byte[] ttl) { for (int i = 0; i < wkrs_len; i++) { Xof_orig_wkr wkr = wkrs[i]; - Xof_orig_itm orig = wkr.Find_as_itm(ttl); - if (orig == Xof_orig_itm.Null) continue; - if (orig.Insert_new()) this.Insert(orig.Repo(), orig.Page(), orig.Ext(), orig.W(), orig.H(), orig.Redirect()); + Xof_orig_itm orig = wkr.Find_as_itm(ttl); if (orig == Xof_orig_itm.Null) continue; + if (orig.Insert_new()) this.Insert(orig.Repo(), ttl, orig.Ext(), orig.W(), orig.H(), orig.Redirect()); // NOTE: orig_page must be same as find_arg not orig.Page() else will not be found for next call; DATE:2015-04-14 return orig; } return Xof_orig_itm.Null; @@ -54,9 +53,8 @@ public class Xof_orig_mgr { try { Xof_fsdb_itm fsdb = (Xof_fsdb_itm)itms.FetchAt(i); fsdb.Orig_exists_n_(); // default to status = missing - Xof_orig_itm orig = (Xof_orig_itm)rv.Fetch(fsdb.Lnki_ttl()); - if (orig == Xof_orig_itm.Null) continue; - if (orig.Insert_new()) this.Insert(orig.Repo(), orig.Page(), orig.Ext(), orig.W(), orig.H(), orig.Redirect()); + Xof_orig_itm orig = (Xof_orig_itm)rv.Fetch(fsdb.Lnki_ttl()); if (orig == Xof_orig_itm.Null) continue; + if (orig.Insert_new()) this.Insert(orig.Repo(), fsdb.Lnki_ttl(), orig.Ext(), orig.W(), orig.H(), orig.Redirect()); // NOTE: orig_page must be same as find_arg not orig.Page() else will not be found for next call; DATE:2015-04-14 Xof_file_wkr.Eval_orig(exec_tid, orig, fsdb, url_bldr, repo_mgr, img_size); if (!Io_mgr._.ExistsFil(fsdb.Html_view_url())) fsdb.File_exists_n_(); diff --git a/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_grp.java b/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_grp.java index 696b63631..92c5de8ca 100644 --- a/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_grp.java +++ b/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_grp.java @@ -57,7 +57,7 @@ public class Xog_mnu_grp extends Xog_mnu_base { } public void Build() { Xoa_gui_mgr gui_mgr = app.Gui_mgr(); Gfui_kit kit = gui_mgr.Kit(); Xog_win_itm win = gui_mgr.Browser_win(); - if (!kit.Kit_init_done()) return; // NOTE: .gfs will fire Build before Kit.Init; check that kit is inited + if (!kit.Kit_mode__ready()) return; // NOTE: .gfs will fire Build before Kit.Init; check that kit is inited if (under_mnu == null) { if (mnu_is_popup) { if (String_.Eq(key, Xog_popup_mnu_mgr.Root_key_tabs_btns)) diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java index 48f93802d..0bd523dd0 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java @@ -122,7 +122,7 @@ public class Xog_tab_mgr implements GfoEvObj { } public void Tabs_close_cur() { if (this.Active_tab_is_null()) return; - if (!active_tab.Page().Tab_data().Close_mgr().When_close(active_tab)) return; + Tabs__pub_close(active_tab); tab_mgr.Tabs_close_by_idx(active_tab.Tab_idx()); Xog_tab_itm cur_tab = this.Active_tab(); // get new current tab for line below if (cur_tab != null) cur_tab.Html_box().Focus(); // NOTE: needed to focus tab box else tab button will be focused; DATE:2014-07-13 @@ -133,11 +133,24 @@ public class Xog_tab_mgr implements GfoEvObj { public void Tabs_close_rng(int bgn, int end) { for (int i = bgn; i < end; i++) { Xog_tab_itm tab = Tabs_get_at(bgn); - if (tab.Page().Tab_data().Close_mgr().When_close(tab)) - tab_mgr.Tabs_close_by_idx(bgn); + if (!Tabs__pub_close(tab)) return; } + for (int i = bgn; i < end; i++) + tab_mgr.Tabs_close_by_idx(bgn); // NOTE: close at bgn, not at i, b/c each close will remove a tab from collection + } + public boolean Tabs__pub_close_all() {return Tabs__pub_close_rng(0, this.Tabs_len());} + public boolean Tabs__pub_close_rng(int bgn, int end) { + boolean rv = true; + for (int i = bgn; i < end; i++) { + Xog_tab_itm tab = Tabs_get_at(i); + boolean close_allowed = Tabs__pub_close(tab); + if (!close_allowed) rv = false; + } + return rv; + } + public boolean Tabs__pub_close(Xog_tab_itm tab) { + return tab.Page().Tab_data().Close_mgr().When_close(tab); } - public void Tabs_close_all() {Tabs_close_rng(0, Tabs_len());} public void Tabs_close_undo() { if (closed_undo_list.Count() == 0) return; String url = (String)ListAdp_.Pop(closed_undo_list); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java index 9040762a1..b61bbe1e9 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java @@ -44,8 +44,8 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { public Xoae_app App() {return app;} private Xoae_app app; public Xog_tab_mgr Tab_mgr() {return tab_mgr;} private Xog_tab_mgr tab_mgr; public Xog_tab_itm Active_tab() {return tab_mgr.Active_tab();} - public Xoae_page Active_page() {return tab_mgr.Active_tab().Page();} public void Active_page_(Xoae_page v) {tab_mgr.Active_tab().Page_(v);} - public Xowe_wiki Active_wiki() {return tab_mgr.Active_tab().Wiki();} + public Xoae_page Active_page() {return tab_mgr.Active_tab().Page();} public void Active_page_(Xoae_page v) {tab_mgr.Active_tab().Page_(v);} + public Xowe_wiki Active_wiki() {return tab_mgr.Active_tab().Wiki();} public Xog_html_itm Active_html_itm() {return tab_mgr.Active_tab().Html_itm();} public Gfui_html Active_html_box() {return tab_mgr.Active_tab().Html_itm().Html_box();} public Xog_resizer Resizer() {return resizer;} private Xog_resizer resizer = new Xog_resizer(); @@ -180,6 +180,8 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { Xoae_page cur_page = tab.Page(); Xowe_wiki cur_wiki = tab.Wiki(); Xoae_page new_page = tab.History_mgr().Go_by_dir(cur_wiki, fwd); if (new_page.Missing()) return; + if (new_page.Wikie().Special_mgr().Page_search().Match_ttl(new_page.Ttl())) // if Special:Search, reload page; needed for async loading; DATE:2015-04-19 + new_page = new_page.Wikie().GetPageByTtl(new_page.Url(), new_page.Ttl()); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save byte history_nav_type = fwd ? Xog_history_stack.Nav_fwd : Xog_history_stack.Nav_bwd; boolean new_page_is_same = Bry_.Eq(cur_page.Ttl().Full_txt(), new_page.Ttl().Full_txt()); Xog_tab_itm_read_mgr.Show_page(tab, new_page, true, new_page_is_same, false, history_nav_type); diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java index 6b7b2faca..7c1fb5ef4 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java @@ -211,12 +211,11 @@ public class Xoh_file_wtr__basic { return scratch_bfr.Xto_bry_and_clear(); } private static byte[] Arg_anchor_title(Bry_bfr tmp_bfr, byte[] src, Xop_lnki_tkn lnki, byte[] lnki_ttl, Xoh_lnki_title_fmtr anchor_title_wkr) { - switch (lnki.Lnki_type()) { - case Xop_lnki_type.Id_thumb: // If the image is a thumb, do not add a title / alt, even if a caption is available - case Xop_lnki_type.Id_frame: - return Bry_.Empty; - case Xop_lnki_type.Id_frameless: // If the image is frameless, add the caption as a title / alt. If no caption is available, do not add a title / alt - break; + if ( Enm_.HasInt(lnki.Lnki_type(), Xop_lnki_type.Id_thumb) + || Enm_.HasInt(lnki.Lnki_type(), Xop_lnki_type.Id_frame) // If the image is a thumb, do not add a title / alt, even if a caption is available + ) + return Bry_.Empty; + else if ( Enm_.HasInt(lnki.Lnki_type(), Xop_lnki_type.Id_frameless)) { // If the image is frameless, add the caption as a title / alt. If no caption is available, do not add a title / alt } Xop_tkn_itm anchor_title_tkn = lnki.Caption_tkn(); if (anchor_title_tkn == Xop_tkn_null.Null_tkn) return Bry_.Empty; // no caption; return empty; (do not use lnki); DATE:2013-12-31 diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java index 6907fefbc..acd916be8 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java @@ -98,6 +98,26 @@ public class Xoh_file_wtr_basic_tst { , "" )); } + @Test public void Img_frame_and_thumb() { // PURPOSE: lnki with "frame and thumb" was not showing box due to bit-adding; PAGE:en.w:History_of_Western_Civilization DATE:2015-04-16 + fxt.Test_parse_page_wiki_str + ( "[[File:A.png|frame|thumb|220x110px|b]]" // NOTE: frame AND thumb + , String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , " \"\"" + , "
" + , "
" + , " " + , " \"\"" + , " " + , "
" + , " b" + , "
" + , "
" + , "
" + , "" + )); + } @Test public void Cls_border() { fxt.Test_parse_page_wiki_str ( "[[File:A.png|border]]" diff --git a/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java b/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java index e8459c8ca..887b22d05 100644 --- a/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java +++ b/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java @@ -27,415 +27,440 @@ public class Xol_lang_itm_ { , Id_aa = 1 , Id_ab = 2 , Id_ace = 3 -, Id_aeb = 4 -, Id_af = 5 -, Id_ak = 6 -, Id_akz = 7 -, Id_aln = 8 -, Id_als = 9 -, Id_am = 10 -, Id_an = 11 -, Id_ang = 12 -, Id_anp = 13 -, Id_ar = 14 -, Id_arc = 15 -, Id_arn = 16 -, Id_arq = 17 -, Id_ary = 18 -, Id_arz = 19 -, Id_as = 20 -, Id_ast = 21 -, Id_av = 22 -, Id_avk = 23 -, Id_ay = 24 -, Id_az = 25 -, Id_azb = 26 -, Id_ba = 27 -, Id_ban = 28 -, Id_bar = 29 -, Id_bat_smg = 30 -, Id_bbc = 31 -, Id_bbc_latn = 32 -, Id_bcc = 33 -, Id_bcl = 34 -, Id_be = 35 -, Id_be_tarask = 36 -, Id_be_x_old = 37 -, Id_bg = 38 -, Id_bh = 39 -, Id_bho = 40 -, Id_bi = 41 -, Id_bjn = 42 -, Id_bm = 43 -, Id_bn = 44 -, Id_bo = 45 -, Id_bpy = 46 -, Id_bqi = 47 -, Id_br = 48 -, Id_brh = 49 -, Id_bs = 50 -, Id_bug = 51 -, Id_bxr = 52 -, Id_ca = 53 -, Id_cbk_zam = 54 -, Id_cdo = 55 -, Id_ce = 56 -, Id_ceb = 57 -, Id_ch = 58 -, Id_chm = 59 -, Id_cho = 60 -, Id_chr = 61 -, Id_chy = 62 -, Id_ckb = 63 -, Id_co = 64 -, Id_cps = 65 -, Id_cr = 66 -, Id_crh = 67 -, Id_crh_cyrl = 68 -, Id_crh_latn = 69 -, Id_cs = 70 -, Id_csb = 71 -, Id_cu = 72 -, Id_cv = 73 -, Id_cy = 74 -, Id_da = 75 -, Id_de = 76 -, Id_de_at = 77 -, Id_de_ch = 78 -, Id_de_formal = 79 -, Id_diq = 80 -, Id_dsb = 81 -, Id_dtp = 82 -, Id_dv = 83 -, Id_dz = 84 -, Id_ee = 85 -, Id_egl = 86 -, Id_el = 87 -, Id_eml = 88 -, Id_en_ca = 89 -, Id_en_rtl = 90 -, Id_en_gb = 91 -, Id_enrtl = 92 -, Id_eo = 93 -, Id_es = 94 -, Id_et = 95 -, Id_eu = 96 -, Id_ext = 97 -, Id_fa = 98 -, Id_ff = 99 -, Id_fi = 100 -, Id_fit = 101 -, Id_fiu_vro = 102 -, Id_fj = 103 -, Id_fo = 104 -, Id_fr = 105 -, Id_frc = 106 -, Id_frp = 107 -, Id_frr = 108 -, Id_fur = 109 -, Id_fy = 110 -, Id_ga = 111 -, Id_gag = 112 -, Id_gan = 113 -, Id_gan_hans = 114 -, Id_gan_hant = 115 -, Id_gd = 116 -, Id_gl = 117 -, Id_glk = 118 -, Id_gn = 119 -, Id_gom = 120 -, Id_gom_latn = 121 -, Id_got = 122 -, Id_grc = 123 -, Id_gsw = 124 -, Id_gu = 125 -, Id_gv = 126 -, Id_ha = 127 -, Id_hak = 128 -, Id_haw = 129 -, Id_he = 130 -, Id_hi = 131 -, Id_hif = 132 -, Id_hif_latn = 133 -, Id_hil = 134 -, Id_ho = 135 -, Id_hr = 136 -, Id_hrx = 137 -, Id_hsb = 138 -, Id_ht = 139 -, Id_hu = 140 -, Id_hu_formal = 141 -, Id_hy = 142 -, Id_hz = 143 -, Id_ia = 144 -, Id_id = 145 -, Id_ie = 146 -, Id_ig = 147 -, Id_ii = 148 -, Id_ik = 149 -, Id_ike_cans = 150 -, Id_ike_latn = 151 -, Id_ilo = 152 -, Id_inh = 153 -, Id_io = 154 -, Id_is = 155 -, Id_it = 156 -, Id_iu = 157 -, Id_ja = 158 -, Id_jam = 159 -, Id_jbo = 160 -, Id_jut = 161 -, Id_jv = 162 -, Id_ka = 163 -, Id_kaa = 164 -, Id_kab = 165 -, Id_kbd = 166 -, Id_kbd_cyrl = 167 -, Id_kg = 168 -, Id_khw = 169 -, Id_ki = 170 -, Id_kiu = 171 -, Id_kj = 172 -, Id_kk = 173 -, Id_kk_arab = 174 -, Id_kk_cn = 175 -, Id_kk_cyrl = 176 -, Id_kk_kz = 177 -, Id_kk_latn = 178 -, Id_kk_tr = 179 -, Id_kl = 180 -, Id_km = 181 -, Id_kn = 182 -, Id_ko = 183 -, Id_ko_kp = 184 -, Id_koi = 185 -, Id_kr = 186 -, Id_krc = 187 -, Id_kri = 188 -, Id_krj = 189 -, Id_krl = 190 -, Id_ks = 191 -, Id_ks_arab = 192 -, Id_ks_deva = 193 -, Id_ksh = 194 -, Id_ku = 195 -, Id_ku_arab = 196 -, Id_ku_latn = 197 -, Id_kv = 198 -, Id_kw = 199 -, Id_ky = 200 -, Id_la = 201 -, Id_lad = 202 -, Id_lb = 203 -, Id_lbe = 204 -, Id_lez = 205 -, Id_lfn = 206 -, Id_lg = 207 -, Id_li = 208 -, Id_lij = 209 -, Id_liv = 210 -, Id_lmo = 211 -, Id_ln = 212 -, Id_lo = 213 -, Id_loz = 214 -, Id_lrc = 215 -, Id_lt = 216 -, Id_ltg = 217 -, Id_lus = 218 -, Id_lv = 219 -, Id_lzh = 220 -, Id_lzz = 221 -, Id_mai = 222 -, Id_map_bms = 223 -, Id_mdf = 224 -, Id_mg = 225 -, Id_mh = 226 -, Id_mhr = 227 -, Id_mi = 228 -, Id_min = 229 -, Id_mk = 230 -, Id_ml = 231 -, Id_mn = 232 -, Id_mo = 233 -, Id_mr = 234 -, Id_mrj = 235 -, Id_ms = 236 -, Id_mt = 237 -, Id_mus = 238 -, Id_mwl = 239 -, Id_mwv = 240 -, Id_my = 241 -, Id_myv = 242 -, Id_mzn = 243 -, Id_na = 244 -, Id_nah = 245 -, Id_nan = 246 -, Id_nap = 247 -, Id_nb = 248 -, Id_nds = 249 -, Id_nds_nl = 250 -, Id_ne = 251 -, Id_new = 252 -, Id_ng = 253 -, Id_niu = 254 -, Id_nl = 255 -, Id_nl_informal = 256 -, Id_nn = 257 -, Id_no = 258 -, Id_nov = 259 -, Id_nrm = 260 -, Id_nso = 261 -, Id_nv = 262 -, Id_ny = 263 -, Id_oc = 264 -, Id_om = 265 -, Id_or = 266 -, Id_os = 267 -, Id_pa = 268 -, Id_pag = 269 -, Id_pam = 270 -, Id_pap = 271 -, Id_pcd = 272 -, Id_pdc = 273 -, Id_pdt = 274 -, Id_pfl = 275 -, Id_pi = 276 -, Id_pih = 277 -, Id_pl = 278 -, Id_pms = 279 -, Id_pnb = 280 -, Id_pnt = 281 -, Id_prg = 282 -, Id_ps = 283 -, Id_pt = 284 -, Id_pt_br = 285 -, Id_qqq = 286 -, Id_qu = 287 -, Id_qug = 288 -, Id_rgn = 289 -, Id_rif = 290 -, Id_rm = 291 -, Id_rmy = 292 -, Id_rn = 293 -, Id_ro = 294 -, Id_roa_rup = 295 -, Id_roa_tara = 296 -, Id_ru = 297 -, Id_rue = 298 -, Id_rup = 299 -, Id_ruq = 300 -, Id_ruq_cyrl = 301 -, Id_ruq_latn = 302 -, Id_rw = 303 -, Id_sa = 304 -, Id_sah = 305 -, Id_sat = 306 -, Id_sc = 307 -, Id_scn = 308 -, Id_sco = 309 -, Id_sd = 310 -, Id_sdc = 311 -, Id_se = 312 -, Id_sei = 313 -, Id_sg = 314 -, Id_sgs = 315 -, Id_sh = 316 -, Id_shi = 317 -, Id_si = 318 -, Id_simple = 319 -, Id_sk = 320 -, Id_sl = 321 -, Id_sli = 322 -, Id_sm = 323 -, Id_sma = 324 -, Id_sn = 325 -, Id_so = 326 -, Id_sq = 327 -, Id_sr = 328 -, Id_sr_ec = 329 -, Id_sr_el = 330 -, Id_srn = 331 -, Id_ss = 332 -, Id_st = 333 -, Id_stq = 334 -, Id_su = 335 -, Id_sv = 336 -, Id_sw = 337 -, Id_sxu = 338 -, Id_szl = 339 -, Id_ta = 340 -, Id_tcy = 341 -, Id_te = 342 -, Id_test = 343 -, Id_tet = 344 -, Id_tg = 345 -, Id_tg_cyrl = 346 -, Id_tg_latn = 347 -, Id_th = 348 -, Id_ti = 349 -, Id_tk = 350 -, Id_tl = 351 -, Id_tly = 352 -, Id_tn = 353 -, Id_to = 354 -, Id_tokipona = 355 -, Id_tp = 356 -, Id_tpi = 357 -, Id_tr = 358 -, Id_tru = 359 -, Id_ts = 360 -, Id_tt = 361 -, Id_tt_cyrl = 362 -, Id_tt_latn = 363 -, Id_ttt = 364 -, Id_tum = 365 -, Id_tw = 366 -, Id_ty = 367 -, Id_tyv = 368 -, Id_tzm = 369 -, Id_udm = 370 -, Id_ug = 371 -, Id_ug_arab = 372 -, Id_ug_latn = 373 -, Id_uk = 374 -, Id_ur = 375 -, Id_uz = 376 -, Id_ve = 377 -, Id_vec = 378 -, Id_vep = 379 -, Id_vi = 380 -, Id_vls = 381 -, Id_vmf = 382 -, Id_vo = 383 -, Id_vot = 384 -, Id_vro = 385 -, Id_wa = 386 -, Id_war = 387 -, Id_wo = 388 -, Id_wuu = 389 -, Id_xal = 390 -, Id_xh = 391 -, Id_xmf = 392 -, Id_yi = 393 -, Id_yo = 394 -, Id_yue = 395 -, Id_za = 396 -, Id_zea = 397 -, Id_zh = 398 -, Id_zh_classical = 399 -, Id_zh_cn = 400 -, Id_zh_hans = 401 -, Id_zh_hant = 402 -, Id_zh_hk = 403 -, Id_zh_min_nan = 404 -, Id_zh_mo = 405 -, Id_zh_my = 406 -, Id_zh_sg = 407 -, Id_zh_tw = 408 -, Id_zh_yue = 409 -, Id_zu = 410 +, Id_ady_cyrl = 4 +, Id_aeb = 5 +, Id_af = 6 +, Id_ak = 7 +, Id_akz = 8 +, Id_aln = 9 +, Id_als = 10 +, Id_am = 11 +, Id_an = 12 +, Id_ang = 13 +, Id_anp = 14 +, Id_ar = 15 +, Id_arc = 16 +, Id_arn = 17 +, Id_aro = 18 +, Id_arq = 19 +, Id_ary = 20 +, Id_arz = 21 +, Id_as = 22 +, Id_ase = 23 +, Id_ast = 24 +, Id_av = 25 +, Id_avk = 26 +, Id_ay = 27 +, Id_az = 28 +, Id_azb = 29 +, Id_ba = 30 +, Id_ban = 31 +, Id_bar = 32 +, Id_bat_smg = 33 +, Id_bbc = 34 +, Id_bbc_latn = 35 +, Id_bcc = 36 +, Id_bcl = 37 +, Id_be = 38 +, Id_be_tarask = 39 +, Id_be_x_old = 40 +, Id_bew = 41 +, Id_bg = 42 +, Id_bgn = 43 +, Id_bh = 44 +, Id_bho = 45 +, Id_bi = 46 +, Id_bjn = 47 +, Id_bm = 48 +, Id_bn = 49 +, Id_bo = 50 +, Id_bpy = 51 +, Id_bqi = 52 +, Id_br = 53 +, Id_brh = 54 +, Id_bs = 55 +, Id_bto = 56 +, Id_bug = 57 +, Id_bxr = 58 +, Id_ca = 59 +, Id_cbk_zam = 60 +, Id_cdo = 61 +, Id_ce = 62 +, Id_ceb = 63 +, Id_ch = 64 +, Id_chm = 65 +, Id_cho = 66 +, Id_chr = 67 +, Id_chy = 68 +, Id_ckb = 69 +, Id_co = 70 +, Id_cps = 71 +, Id_cr = 72 +, Id_crh = 73 +, Id_crh_cyrl = 74 +, Id_crh_latn = 75 +, Id_cs = 76 +, Id_csb = 77 +, Id_cu = 78 +, Id_cv = 79 +, Id_cy = 80 +, Id_da = 81 +, Id_de = 82 +, Id_de_at = 83 +, Id_de_ch = 84 +, Id_de_formal = 85 +, Id_diq = 86 +, Id_dsb = 87 +, Id_dtp = 88 +, Id_dv = 89 +, Id_dz = 90 +, Id_ee = 91 +, Id_egl = 92 +, Id_el = 93 +, Id_eml = 94 +, Id_en_ca = 95 +, Id_en_gb = 96 +, Id_en_rtl = 97 +, Id_enrtl = 98 +, Id_eo = 99 +, Id_es = 100 +, Id_es_formal = 101 +, Id_esu = 102 +, Id_et = 103 +, Id_eu = 104 +, Id_ext = 105 +, Id_fa = 106 +, Id_ff = 107 +, Id_fi = 108 +, Id_fit = 109 +, Id_fiu_vro = 110 +, Id_fj = 111 +, Id_fo = 112 +, Id_fr = 113 +, Id_frc = 114 +, Id_frp = 115 +, Id_frr = 116 +, Id_fur = 117 +, Id_fy = 118 +, Id_ga = 119 +, Id_gag = 120 +, Id_gan = 121 +, Id_gan_hans = 122 +, Id_gan_hant = 123 +, Id_gd = 124 +, Id_gl = 125 +, Id_glk = 126 +, Id_gn = 127 +, Id_gom = 128 +, Id_gom_deva = 129 +, Id_gom_latn = 130 +, Id_got = 131 +, Id_grc = 132 +, Id_gsw = 133 +, Id_gu = 134 +, Id_guc = 135 +, Id_gv = 136 +, Id_ha = 137 +, Id_hak = 138 +, Id_haw = 139 +, Id_he = 140 +, Id_hi = 141 +, Id_hif = 142 +, Id_hif_latn = 143 +, Id_hil = 144 +, Id_ho = 145 +, Id_hr = 146 +, Id_hrx = 147 +, Id_hsb = 148 +, Id_hsn = 149 +, Id_ht = 150 +, Id_hu = 151 +, Id_hu_formal = 152 +, Id_hy = 153 +, Id_hz = 154 +, Id_ia = 155 +, Id_id = 156 +, Id_ie = 157 +, Id_ig = 158 +, Id_ii = 159 +, Id_ik = 160 +, Id_ike_cans = 161 +, Id_ike_latn = 162 +, Id_ilo = 163 +, Id_inh = 164 +, Id_io = 165 +, Id_is = 166 +, Id_it = 167 +, Id_iu = 168 +, Id_izh = 169 +, Id_ja = 170 +, Id_jam = 171 +, Id_jbo = 172 +, Id_jut = 173 +, Id_jv = 174 +, Id_ka = 175 +, Id_kaa = 176 +, Id_kab = 177 +, Id_kbd = 178 +, Id_kbd_cyrl = 179 +, Id_kg = 180 +, Id_khw = 181 +, Id_ki = 182 +, Id_kiu = 183 +, Id_kj = 184 +, Id_kk = 185 +, Id_kk_arab = 186 +, Id_kk_cn = 187 +, Id_kk_cyrl = 188 +, Id_kk_kz = 189 +, Id_kk_latn = 190 +, Id_kk_tr = 191 +, Id_kl = 192 +, Id_km = 193 +, Id_kn = 194 +, Id_ko = 195 +, Id_ko_kp = 196 +, Id_koi = 197 +, Id_kr = 198 +, Id_krc = 199 +, Id_kri = 200 +, Id_krj = 201 +, Id_krl = 202 +, Id_ks = 203 +, Id_ks_arab = 204 +, Id_ks_deva = 205 +, Id_ksh = 206 +, Id_ku = 207 +, Id_ku_arab = 208 +, Id_ku_latn = 209 +, Id_kv = 210 +, Id_kw = 211 +, Id_ky = 212 +, Id_la = 213 +, Id_lad = 214 +, Id_lb = 215 +, Id_lbe = 216 +, Id_lez = 217 +, Id_lfn = 218 +, Id_lg = 219 +, Id_li = 220 +, Id_lij = 221 +, Id_liv = 222 +, Id_lmo = 223 +, Id_ln = 224 +, Id_lo = 225 +, Id_loz = 226 +, Id_lrc = 227 +, Id_lt = 228 +, Id_ltg = 229 +, Id_lus = 230 +, Id_luz = 231 +, Id_lv = 232 +, Id_lzh = 233 +, Id_lzz = 234 +, Id_mai = 235 +, Id_map_bms = 236 +, Id_mdf = 237 +, Id_mg = 238 +, Id_mh = 239 +, Id_mhr = 240 +, Id_mi = 241 +, Id_mic = 242 +, Id_min = 243 +, Id_mk = 244 +, Id_ml = 245 +, Id_mn = 246 +, Id_mnc = 247 +, Id_mo = 248 +, Id_mr = 249 +, Id_mrj = 250 +, Id_ms = 251 +, Id_mt = 252 +, Id_mui = 253 +, Id_mus = 254 +, Id_mwl = 255 +, Id_mwv = 256 +, Id_my = 257 +, Id_myv = 258 +, Id_mzn = 259 +, Id_na = 260 +, Id_nah = 261 +, Id_nan = 262 +, Id_nap = 263 +, Id_nb = 264 +, Id_nds = 265 +, Id_nds_nl = 266 +, Id_ne = 267 +, Id_new = 268 +, Id_ng = 269 +, Id_niu = 270 +, Id_nl = 271 +, Id_nl_informal = 272 +, Id_nn = 273 +, Id_no = 274 +, Id_nov = 275 +, Id_nrm = 276 +, Id_nso = 277 +, Id_nv = 278 +, Id_ny = 279 +, Id_oc = 280 +, Id_om = 281 +, Id_or = 282 +, Id_os = 283 +, Id_pa = 284 +, Id_pag = 285 +, Id_pam = 286 +, Id_pap = 287 +, Id_pbb = 288 +, Id_pcd = 289 +, Id_pdc = 290 +, Id_pdt = 291 +, Id_pfl = 292 +, Id_pi = 293 +, Id_pih = 294 +, Id_pl = 295 +, Id_pms = 296 +, Id_pnb = 297 +, Id_pnt = 298 +, Id_ppl = 299 +, Id_prg = 300 +, Id_ps = 301 +, Id_pt = 302 +, Id_pt_br = 303 +, Id_qqq = 304 +, Id_qu = 305 +, Id_qug = 306 +, Id_rap = 307 +, Id_rgn = 308 +, Id_rif = 309 +, Id_rm = 310 +, Id_rmf = 311 +, Id_rmy = 312 +, Id_rn = 313 +, Id_ro = 314 +, Id_roa_rup = 315 +, Id_roa_tara = 316 +, Id_ru = 317 +, Id_rue = 318 +, Id_rup = 319 +, Id_ruq = 320 +, Id_ruq_cyrl = 321 +, Id_ruq_latn = 322 +, Id_rw = 323 +, Id_ryu = 324 +, Id_sa = 325 +, Id_sah = 326 +, Id_sat = 327 +, Id_saz = 328 +, Id_sc = 329 +, Id_scn = 330 +, Id_sco = 331 +, Id_sd = 332 +, Id_sdc = 333 +, Id_sdh = 334 +, Id_se = 335 +, Id_sei = 336 +, Id_sg = 337 +, Id_sgs = 338 +, Id_sh = 339 +, Id_shi = 340 +, Id_shn = 341 +, Id_si = 342 +, Id_simple = 343 +, Id_sk = 344 +, Id_sl = 345 +, Id_sli = 346 +, Id_sly = 347 +, Id_sm = 348 +, Id_sma = 349 +, Id_sn = 350 +, Id_so = 351 +, Id_sq = 352 +, Id_sr = 353 +, Id_sr_ec = 354 +, Id_sr_el = 355 +, Id_srn = 356 +, Id_ss = 357 +, Id_st = 358 +, Id_stq = 359 +, Id_su = 360 +, Id_sv = 361 +, Id_sw = 362 +, Id_sxu = 363 +, Id_szl = 364 +, Id_ta = 365 +, Id_tcy = 366 +, Id_te = 367 +, Id_test = 368 +, Id_tet = 369 +, Id_tg = 370 +, Id_tg_cyrl = 371 +, Id_tg_latn = 372 +, Id_th = 373 +, Id_ti = 374 +, Id_tk = 375 +, Id_tl = 376 +, Id_tly = 377 +, Id_tn = 378 +, Id_to = 379 +, Id_tokipona = 380 +, Id_tp = 381 +, Id_tpi = 382 +, Id_tr = 383 +, Id_tru = 384 +, Id_ts = 385 +, Id_tt = 386 +, Id_tt_cyrl = 387 +, Id_tt_latn = 388 +, Id_ttt = 389 +, Id_tum = 390 +, Id_tw = 391 +, Id_ty = 392 +, Id_tyv = 393 +, Id_tzm = 394 +, Id_udm = 395 +, Id_ug = 396 +, Id_ug_arab = 397 +, Id_ug_latn = 398 +, Id_uk = 399 +, Id_ur = 400 +, Id_uz = 401 +, Id_ve = 402 +, Id_vec = 403 +, Id_vep = 404 +, Id_vi = 405 +, Id_vls = 406 +, Id_vmf = 407 +, Id_vo = 408 +, Id_vot = 409 +, Id_vro = 410 +, Id_wa = 411 +, Id_war = 412 +, Id_wo = 413 +, Id_wuu = 414 +, Id_xal = 415 +, Id_xh = 416 +, Id_xmf = 417 +, Id_yi = 418 +, Id_yo = 419 +, Id_yue = 420 +, Id_za = 421 +, Id_zea = 422 +, Id_zh = 423 +, Id_zh_classical = 424 +, Id_zh_cn = 425 +, Id_zh_hans = 426 +, Id_zh_hant = 427 +, Id_zh_hk = 428 +, Id_zh_min_nan = 429 +, Id_zh_mo = 430 +, Id_zh_my = 431 +, Id_zh_sg = 432 +, Id_zh_tw = 433 +, Id_zh_yue = 434 +, Id_zu = 435 ; - public static final int Id__max = 411; + public static final int Id__max = 436; public static Hash_adp_bry Regy() { if (regy == null) { // NOTE: any parenthetical String below will have an "unseen" character of "\xE2\x80\xAA" at the begining and "\xE2\x80\xAC" at the end. They are responsible for parentheses-orientation in RTL langs. @@ -444,6 +469,7 @@ Regy_add(regy, Id_en, "en", "English"); Regy_add(regy, Id_aa, "aa", "Qafár af"); Regy_add(regy, Id_ab, "ab", "Аҧсуа"); Regy_add(regy, Id_ace, "ace", "Acèh"); +Regy_add(regy, Id_ady_cyrl, "ady-cyrl", "West Circassian (Cyrillic)"); Regy_add(regy, Id_aeb, "aeb", "زَوُن"); Regy_add(regy, Id_af, "af", "Afrikaans"); Regy_add(regy, Id_ak, "ak", "Akan"); @@ -457,10 +483,12 @@ Regy_add(regy, Id_anp, "anp", "अङ्गिका"); Regy_add(regy, Id_ar, "ar", "العربية"); Regy_add(regy, Id_arc, "arc", "ܐܪܡܝܐ"); Regy_add(regy, Id_arn, "arn", "Mapudungun"); +Regy_add(regy, Id_aro, "aro", "Araona"); Regy_add(regy, Id_arq, "arq", "Algerian Arabic"); Regy_add(regy, Id_ary, "ary", "Maġribi"); Regy_add(regy, Id_arz, "arz", "مصرى"); Regy_add(regy, Id_as, "as", "অসমীয়া"); +Regy_add(regy, Id_ase, "ase", "American Sign Language"); Regy_add(regy, Id_ast, "ast", "Asturianu"); Regy_add(regy, Id_av, "av", "Авар"); Regy_add(regy, Id_avk, "avk", "Kotava"); @@ -478,7 +506,9 @@ Regy_add(regy, Id_bcl, "bcl", "Bikol Central"); Regy_add(regy, Id_be, "be", "Беларуская"); Regy_add(regy, Id_be_tarask, "be-tarask", "‪Беларуская (тарашкевіца)‬"); Regy_add(regy, Id_be_x_old, "be-x-old", "‪Беларуская (тарашкевіца)‬"); +Regy_add(regy, Id_bew, "bew", "Betawi"); Regy_add(regy, Id_bg, "bg", "Български"); +Regy_add(regy, Id_bgn, "bgn", "Balochi"); Regy_add(regy, Id_bh, "bh", "भोजपुरी"); Regy_add(regy, Id_bho, "bho", "भोजपुरी"); Regy_add(regy, Id_bi, "bi", "Bislama"); @@ -491,6 +521,7 @@ Regy_add(regy, Id_bqi, "bqi", "بختياري"); Regy_add(regy, Id_br, "br", "Brezhoneg"); Regy_add(regy, Id_brh, "brh", "Bráhuí"); Regy_add(regy, Id_bs, "bs", "Bosanski"); +Regy_add(regy, Id_bto, "bto", "Rinconada Bikol"); Regy_add(regy, Id_bug, "bug", "ᨅᨔ ᨕᨘᨁᨗ"); Regy_add(regy, Id_bxr, "bxr", "Буряад"); Regy_add(regy, Id_ca, "ca", "Català"); @@ -530,11 +561,13 @@ Regy_add(regy, Id_egl, "egl", "Emiliàn"); Regy_add(regy, Id_el, "el", "Ελληνικά"); Regy_add(regy, Id_eml, "eml", "Emiliàn e rumagnòl"); Regy_add(regy, Id_en_ca, "en-ca", "Canadian English"); -Regy_add(regy, Id_en_rtl, "en-rtl", "English rtl"); Regy_add(regy, Id_en_gb, "en-gb", "British English"); +Regy_add(regy, Id_en_rtl, "en-rtl", "English rtl"); Regy_add(regy, Id_enrtl, "enrtl", "English (right to left)"); Regy_add(regy, Id_eo, "eo", "Esperanto"); Regy_add(regy, Id_es, "es", "Español"); +Regy_add(regy, Id_es_formal, "es-formal", "Spanish (formal)"); +Regy_add(regy, Id_esu, "esu", "Yuk'ip"); Regy_add(regy, Id_et, "et", "Eesti"); Regy_add(regy, Id_eu, "eu", "Euskara"); Regy_add(regy, Id_ext, "ext", "Estremeñu"); @@ -561,11 +594,13 @@ Regy_add(regy, Id_gl, "gl", "Galego"); Regy_add(regy, Id_glk, "glk", "گیلکی"); Regy_add(regy, Id_gn, "gn", "Avañe'ẽ"); Regy_add(regy, Id_gom, "gom", "कोंकणी"); +Regy_add(regy, Id_gom_deva, "gom-deva", "Konkani"); Regy_add(regy, Id_gom_latn, "gom-latn", "कोंकणी (Latin)"); Regy_add(regy, Id_got, "got", "𐌲𐌿𐍄𐌹𐍃𐌺"); Regy_add(regy, Id_grc, "grc", "Ἀρχαία ἑλληνικὴ"); Regy_add(regy, Id_gsw, "gsw", "Alemannisch"); Regy_add(regy, Id_gu, "gu", "ગુજરાતી"); +Regy_add(regy, Id_guc, "guc", "Wayuu"); Regy_add(regy, Id_gv, "gv", "Gaelg"); Regy_add(regy, Id_ha, "ha", "هَوُسَ"); Regy_add(regy, Id_hak, "hak", "Hak-kâ-fa"); @@ -579,6 +614,7 @@ Regy_add(regy, Id_ho, "ho", "Hiri Motu"); Regy_add(regy, Id_hr, "hr", "Hrvatski"); Regy_add(regy, Id_hrx, "hrx", "Hunsriker"); Regy_add(regy, Id_hsb, "hsb", "Hornjoserbsce"); +Regy_add(regy, Id_hsn, "hsn", "Xiang"); Regy_add(regy, Id_ht, "ht", "Kreyòl ayisyen"); Regy_add(regy, Id_hu, "hu", "Magyar"); Regy_add(regy, Id_hu_formal, "hu-formal", "Magyar (formal)"); @@ -598,6 +634,7 @@ Regy_add(regy, Id_io, "io", "Ido"); Regy_add(regy, Id_is, "is", "Íslenska"); Regy_add(regy, Id_it, "it", "Italiano"); Regy_add(regy, Id_iu, "iu", "ᐃᓄᒃᑎᑐᑦ/inuktitut"); +Regy_add(regy, Id_izh, "izh", "Ingrian"); Regy_add(regy, Id_ja, "ja", "日本語"); Regy_add(regy, Id_jam, "jam", "Patois"); Regy_add(regy, Id_jbo, "jbo", "Lojban"); @@ -659,6 +696,7 @@ Regy_add(regy, Id_lrc, "lrc", "لوری"); Regy_add(regy, Id_lt, "lt", "Lietuvių"); Regy_add(regy, Id_ltg, "ltg", "Latgaļu"); Regy_add(regy, Id_lus, "lus", "Mizo ţawng"); +Regy_add(regy, Id_luz, "luz", "Luri"); Regy_add(regy, Id_lv, "lv", "Latviešu"); Regy_add(regy, Id_lzh, "lzh", "文言"); Regy_add(regy, Id_lzz, "lzz", "Lazuri"); @@ -669,15 +707,18 @@ Regy_add(regy, Id_mg, "mg", "Malagasy"); Regy_add(regy, Id_mh, "mh", "Ebon"); Regy_add(regy, Id_mhr, "mhr", "Олык Марий"); Regy_add(regy, Id_mi, "mi", "Māori"); +Regy_add(regy, Id_mic, "mic", "Mi'kmaq"); Regy_add(regy, Id_min, "min", "Baso Minangkabau"); Regy_add(regy, Id_mk, "mk", "Македонски"); Regy_add(regy, Id_ml, "ml", "മലയാളം"); Regy_add(regy, Id_mn, "mn", "Монгол"); +Regy_add(regy, Id_mnc, "mnc", "Manchu"); Regy_add(regy, Id_mo, "mo", "Молдовеняскэ"); Regy_add(regy, Id_mr, "mr", "मराठी"); Regy_add(regy, Id_mrj, "mrj", "Кырык мары"); Regy_add(regy, Id_ms, "ms", "Bahasa Melayu"); Regy_add(regy, Id_mt, "mt", "Malti"); +Regy_add(regy, Id_mui, "mui", "Musi"); Regy_add(regy, Id_mus, "mus", "Mvskoke"); Regy_add(regy, Id_mwl, "mwl", "Mirandés"); Regy_add(regy, Id_mwv, "mwv", "Behase Mentawei"); @@ -712,6 +753,7 @@ Regy_add(regy, Id_pa, "pa", "ਪੰਜਾਬੀ"); Regy_add(regy, Id_pag, "pag", "Pangasinan"); Regy_add(regy, Id_pam, "pam", "Kapampangan"); Regy_add(regy, Id_pap, "pap", "Papiamentu"); +Regy_add(regy, Id_pbb, "pbb", "Páez"); Regy_add(regy, Id_pcd, "pcd", "Picard"); Regy_add(regy, Id_pdc, "pdc", "Deitsch"); Regy_add(regy, Id_pdt, "pdt", "Plautdietsch"); @@ -722,6 +764,7 @@ Regy_add(regy, Id_pl, "pl", "Polski"); Regy_add(regy, Id_pms, "pms", "Piemontèis"); Regy_add(regy, Id_pnb, "pnb", "پنجابی"); Regy_add(regy, Id_pnt, "pnt", "Ποντιακά"); +Regy_add(regy, Id_ppl, "ppl", "Pipil"); Regy_add(regy, Id_prg, "prg", "Prūsiskan"); Regy_add(regy, Id_ps, "ps", "پښتو"); Regy_add(regy, Id_pt, "pt", "Português"); @@ -729,9 +772,11 @@ Regy_add(regy, Id_pt_br, "pt-br", "Português do Brasil"); Regy_add(regy, Id_qqq, "qqq", "MediaWiki sample"); Regy_add(regy, Id_qu, "qu", "Runa Simi"); Regy_add(regy, Id_qug, "qug", "Runa shimi"); +Regy_add(regy, Id_rap, "rap", "Rapa Nui"); Regy_add(regy, Id_rgn, "rgn", "Rumagnôl"); Regy_add(regy, Id_rif, "rif", "Tarifit"); Regy_add(regy, Id_rm, "rm", "Rumantsch"); +Regy_add(regy, Id_rmf, "rmf", "Finnish Kalo"); Regy_add(regy, Id_rmy, "rmy", "Romani"); Regy_add(regy, Id_rn, "rn", "Kirundi"); Regy_add(regy, Id_ro, "ro", "Română"); @@ -744,25 +789,30 @@ Regy_add(regy, Id_ruq, "ruq", "Vlăheşte"); Regy_add(regy, Id_ruq_cyrl, "ruq-cyrl", "Влахесте"); Regy_add(regy, Id_ruq_latn, "ruq-latn", "Vlăheşte"); Regy_add(regy, Id_rw, "rw", "Kinyarwanda"); +Regy_add(regy, Id_ryu, "ryu", "Okinawan"); Regy_add(regy, Id_sa, "sa", "संस्कृत"); Regy_add(regy, Id_sah, "sah", "Саха тыла"); Regy_add(regy, Id_sat, "sat", "Santali"); +Regy_add(regy, Id_saz, "saz", "Saurashtra"); Regy_add(regy, Id_sc, "sc", "Sardu"); Regy_add(regy, Id_scn, "scn", "Sicilianu"); Regy_add(regy, Id_sco, "sco", "Scots"); Regy_add(regy, Id_sd, "sd", "سنڌي"); Regy_add(regy, Id_sdc, "sdc", "Sassaresu"); +Regy_add(regy, Id_sdh, "sdh", "Southern Kurdish"); Regy_add(regy, Id_se, "se", "Sámegiella"); Regy_add(regy, Id_sei, "sei", "Cmique Itom"); Regy_add(regy, Id_sg, "sg", "Sängö"); Regy_add(regy, Id_sgs, "sgs", "Žemaitėška"); Regy_add(regy, Id_sh, "sh", "Srpskohrvatski / Српскохрватски"); Regy_add(regy, Id_shi, "shi", "Tašlḥiyt"); +Regy_add(regy, Id_shn, "shn", "Shan"); Regy_add(regy, Id_si, "si", "Sinhalese"); Regy_add(regy, Id_simple, "simple", "Simple English"); Regy_add(regy, Id_sk, "sk", "Slovenčina"); Regy_add(regy, Id_sl, "sl", "Slovenščina"); Regy_add(regy, Id_sli, "sli", "Schläsch"); +Regy_add(regy, Id_sly, "sly", "Selayar"); Regy_add(regy, Id_sm, "sm", "Gagana Samoa"); Regy_add(regy, Id_sma, "sma", "Åarjelsaemien"); Regy_add(regy, Id_sn, "sn", "chiShona"); @@ -867,7 +917,11 @@ Regy_add(regy, Id_zu, "zu", "isiZulu"); if (lang_itm == null) lang_itm = (Xol_lang_itm)regy.Get_by_bry(Xol_lang_.Key_en); return lang_itm; } - public static Xol_lang_itm Get_by_key(byte[] key) {if (regy == null) Regy(); return (Xol_lang_itm)regy.Get_by_bry(key);} + public static Xol_lang_itm Get_by_key(byte[] key) {return Get_by_key(key, 0, key.length);} + public static Xol_lang_itm Get_by_key(byte[] key, int bgn, int end) { + if (regy == null) Regy(); + return (Xol_lang_itm)regy.Get_by_mid(key, bgn, end); + } public static Xol_lang_itm Get_by_key_or_intl(byte[] key) {return Get_by_key_or_intl(key, 0, key.length);} public static Xol_lang_itm Get_by_key_or_intl(byte[] key, int bgn, int end) { Xol_lang_itm rv = Get_by_key_or_null(key, bgn, end); diff --git a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java index bb823f623..c494b9e20 100644 --- a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java +++ b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java @@ -229,8 +229,7 @@ class HttpRequest implements Runnable{ else req += app.Http_server().Home(); } - if(req.endsWith("wiki/")) req+="Main_Page"; - if(req.endsWith("wiki")) req+="/Main_Page"; + req = Http_server_wkr_.Assert_main_page(app, req); } if(req.contains("%xowa-cmd%") || req.contains("/xowa-cmd:")){ diff --git a/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr_.java b/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr_.java new file mode 100644 index 000000000..cd76077ce --- /dev/null +++ b/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr_.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.servers.http; import gplx.*; import gplx.xowa.*; import gplx.xowa.servers.*; +import gplx.xowa.wikis.*; import gplx.xowa.langs.*; +class Http_server_wkr_ { + public static String Assert_main_page(Xoae_app app, String req) { + int mode = -1; + String[] req_array = String_.Split(req, "/"); + if (String_.HasAtEnd(req, "wiki/")) mode = 0; + else if (String_.HasAtEnd(req, "wiki")) mode = 1; + else if (req_array.length == 3) mode = 2; + if (mode == -1) return req; // not a link to a Main Page; EX:localhost:8080/en.wikipedia.org/wiki/Earth + if (req_array.length < 3) return req; // shouldn't happen; EX: "localhost:8080wiki" + byte[] wiki_domain = Bry_.new_utf8_(req_array[1]); + Xow_domain domain_itm = Xow_domain_.parse(wiki_domain); + if (domain_itm.Domain_tid() == Xow_domain_.Tid_int_other && domain_itm.Lang_itm().Id() == Xol_lang_itm_.Id__intl) return req; + Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(wiki_domain); + wiki.Init_assert(); + String main_page = String_.new_utf8_(wiki.Props().Main_page()); + if (mode == 1) main_page = "/" + main_page; + else if (mode == 2) main_page = "wiki/" + main_page; + return req + main_page; + } +} diff --git a/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr__tst.java b/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr__tst.java new file mode 100644 index 000000000..8a75074e8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr__tst.java @@ -0,0 +1,42 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.servers.http; import gplx.*; import gplx.xowa.*; import gplx.xowa.servers.*; +import org.junit.*; +public class Http_server_wkr__tst { + @Before public void init() {fxt.Clear();} private Http_server_wkr__fxt fxt = new Http_server_wkr__fxt(); + @Test public void Assert_main_page() { + fxt.Init_wiki_main_page("fr.wikiversity.org", "Accueil"); + fxt.Test_assert_main_page("/fr.wikiversity.org/" , "/fr.wikiversity.org/wiki/Accueil"); + fxt.Test_assert_main_page("/fr.wikiversity.org/wiki" , "/fr.wikiversity.org/wiki/Accueil"); + fxt.Test_assert_main_page("/fr.wikiversity.org/wiki/" , "/fr.wikiversity.org/wiki/Accueil"); + fxt.Test_assert_main_page("/fr.wikiversity.org/wiki/A" , "/fr.wikiversity.org/wiki/A"); + } +} +class Http_server_wkr__fxt { + private Xoae_app app; + public void Clear() { + this.app = Xoa_app_fxt.app_(); + } + public void Init_wiki_main_page(String domain, String main_page) { + Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_utf8_(domain)); + wiki.Props().Main_page_(Bry_.new_utf8_(main_page)); + } + public void Test_assert_main_page(String url, String expd) { + Tfds.Eq(expd, Http_server_wkr_.Assert_main_page(app, url)); + } +} diff --git a/400_xowa/src/gplx/xowa/setup/maints/Wmf_dump_list_parser_tst.java b/400_xowa/src/gplx/xowa/setup/maints/Wmf_dump_list_parser_tst.java index cedc072ee..eaa69bb84 100644 --- a/400_xowa/src/gplx/xowa/setup/maints/Wmf_dump_list_parser_tst.java +++ b/400_xowa/src/gplx/xowa/setup/maints/Wmf_dump_list_parser_tst.java @@ -41,7 +41,7 @@ public class Wmf_dump_list_parser_tst { , fxt.itm("zh-classicalwiki", "20131128", Wmf_dump_itm.Status_tid_complete, "Dump complete", "2013-11-28 06:08:56") ); } -// @Test public void Update() { // MAINT:QUARTERLY:2015-03-01 +// @Test public void Update() { // MAINT:QUARTERLY:2015-03-01; must run C:\xowa\ and update dump status // Hash_adp_bry excluded_domains = Hash_adp_bry.cs_().Add_many_str // ( "advisory.wikipedia.org", "beta.wikiversity.org", "donate.wikipedia.org", "login.wikipedia.org" // , "nostalgia.wikipedia.org", "outreach.wikipedia.org", "quality.wikipedia.org", "sources.wikipedia.org" diff --git a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java index 59918b490..ea1c40923 100644 --- a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java @@ -32,7 +32,7 @@ public class Xows_mgr { Evt_lang_changed(wiki.Lang()); } public Xows_page_allpages Page_allpages() {return page_allpages;} private final Xows_page_allpages page_allpages; - public Xows_page__search Page_search() {return page_search;} private final Xows_page__search page_search; + public Xows_page__search Page_search() {return page_search;} private final Xows_page__search page_search; public Xows_page_random Page_random() {return page_random;} private final Xows_page_random page_random; public Xop_randomRootPage_page Page_randomRootPage() {return page_randomRootPage;} private final Xop_randomRootPage_page page_randomRootPage = new Xop_randomRootPage_page(); public Xou_history_html Page_history() {return page_history;} private final Xou_history_html page_history = new Xou_history_html(); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_db_wkr.java b/400_xowa/src/gplx/xowa/specials/search/Xows_db_wkr.java index d0ff25152..92ab85e48 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_db_wkr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_db_wkr.java @@ -34,6 +34,7 @@ class Xows_db_wkr { , wiki.Data_mgr__core_mgr().Db__search().Tbl__search_word() ); } + Xoa_app_.Usr_dlg().Prog_many("", "", "search started (please wait)"); // load pages for each word Xows_db_matcher matcher = cache.Matcher(); Xows_db_word[] word_ary = cache.Words(); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr.java b/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr.java index eb1774c51..a397f96af 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr.java @@ -78,7 +78,7 @@ class Xows_html_wkr { private static final Bry_fmtr fmtr_tbl = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" , " " - , " " - , "
Help" + , " Help" // SERVER:"~{a_text}", "a_href", "a_title", "a_text"); - private static final Bry_fmtr fmtr_link_id = Bry_fmtr.new_("~{a_text}", "a_id", "a_href", "a_title", "a_text"); + private static final Bry_fmtr fmtr_link = Bry_fmtr.new_("~{a_text}", "a_href", "a_title", "a_text"); // SERVER:"~{a_text}", "a_id", "a_href", "a_title", "a_text"); // SERVER:"" , " ~{page_len}" , " ~{a_text}" + , " ~{a_text}" // SERVER:". */ package gplx.xowa; import gplx.*; import org.junit.*; -import gplx.brys.*; import gplx.threads.*; import gplx.xowa.wikis.*; import gplx.xowa.setup.maints.*; +import gplx.brys.*; import gplx.threads.*; import gplx.xowa.wikis.*; import gplx.xowa.setup.maints.*; import gplx.xowa.xtns.wdatas.imports.*; public class Xoi_cmd_wiki_tst { - @Test public void Run() { -// Bld_import_list(Wikis); -// Bld_cfg_files(Wikis); // NOTE: remember to carry over the wikisource / page / index commands from the existing xowa_build_cfg.gfs; also, only run the xowa_build_cfg.gfs once; DATE:2013-10-15; last run: DATE:2014-09-09 + @Test public void Run() { // MAINT +// Bld_import_list(Xow_wmf_api_mgr.Wikis); +// Bld_cfg_files(Xow_wmf_api_mgr.Wikis); // NOTE: remember to carry over the wikisource / page / index commands from the existing xowa_build_cfg.gfs; also, only run the xowa_build_cfg.gfs once; DATE:2013-10-15; last run: DATE:2014-09-09 } public void Bld_import_list(String... ary) { int ary_len = ary.length; diff --git a/400_xowa/src_405_tkn/gplx/xowa/Xop_tkn_mkr.java b/400_xowa/src_405_tkn/gplx/xowa/Xop_tkn_mkr.java index 50568f6ac..4b6c12fcc 100644 --- a/400_xowa/src_405_tkn/gplx/xowa/Xop_tkn_mkr.java +++ b/400_xowa/src_405_tkn/gplx/xowa/Xop_tkn_mkr.java @@ -76,7 +76,7 @@ public class Xop_tkn_mkr { public gplx.xowa.xtns.proofreadPage.Pp_pagequality_nde Xnde_pagequality() {return new gplx.xowa.xtns.proofreadPage.Pp_pagequality_nde();} public gplx.xowa.xtns.lst.Lst_section_nde Xnde_section() {return new gplx.xowa.xtns.lst.Lst_section_nde();} public gplx.xowa.xtns.categoryList.Xtn_categorylist_nde Xnde_categoryList() {return new gplx.xowa.xtns.categoryList.Xtn_categorylist_nde();} - public gplx.xowa.xtns.dynamicPageList.Dpl_xnde Xnde_dynamicPageList() {return new gplx.xowa.xtns.dynamicPageList.Dpl_xnde();} + public gplx.xowa.xtns.dynamicPageList.Dpl_xnde Xnde_dynamicPageList() {return new gplx.xowa.xtns.dynamicPageList.Dpl_xnde();} public gplx.xowa.xtns.syntaxHighlight.Xtn_syntaxHighlight_nde Xnde_syntaxHighlight() {return new gplx.xowa.xtns.syntaxHighlight.Xtn_syntaxHighlight_nde();} public gplx.xowa.xtns.templateData.Xtn_templateData_nde Xnde_templateData() {return new gplx.xowa.xtns.templateData.Xtn_templateData_nde();} public gplx.xowa.xtns.rss.Rss_xnde Xnde_rss() {return new gplx.xowa.xtns.rss.Rss_xnde();} diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_type.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_type.java index bb416ed9e..37569c58c 100644 --- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_type.java +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_type.java @@ -19,50 +19,47 @@ package gplx.xowa; import gplx.*; public class Xop_lnki_type { public static final byte Id_null = 0, Id_none = 1, Id_frameless = 2, Id_frame = 4, Id_thumb = 8; public static boolean Id_is_thumbable(byte id) { - switch (id) { - case Id_thumb: case Id_frame: // for purposes of displaying images on page, thumb and frame both create a thumb box - return true; - default: - return false; - } + return ( Enm_.HasInt(id, Id_thumb) // for purposes of displaying images on page, thumb and frame both create a thumb box + || Enm_.HasInt(id, Id_frame) + ); } - public static boolean Id_defaults_to_thumb(byte id) { - switch (id) { // assuming original of 400,200 - case Id_thumb: // [[File:A.png|thumb]] -> 220,-1 - case Id_frameless: // [[File:A.png|frameless]] -> 220,-1 - return true; - case Id_null: // [[File:A.png]] -> 400,200 (default to original size) - case Id_frame: // [[File:A.png|frame]] -> 400,200 (frame is always default size) - case Id_none: // TODO: deprecate - return false; - default: // TODO: deprecate - return Enm_.HasInt(id, Xop_lnki_type.Id_thumb) || Enm_.HasInt(id, Xop_lnki_type.Id_frameless); - } + public static boolean Id_defaults_to_thumb(byte id) { // assuming original of 400,200 + if ( Enm_.HasInt(id, Id_thumb) // [[File:A.png|thumb]] -> 220,-1 + || Enm_.HasInt(id, Id_frameless) // [[File:A.png|frameless]] -> 220,-1 + ) + return true; + else if ( Enm_.HasInt(id, Id_frame) // [[File:A.png|frame]] -> 400,200 (frame is always default size) + || id == Id_null // [[File:A.png]] -> 400,200 (default to original size) + || Enm_.HasInt(id, Id_none) // TODO: deprecate + ) + return false; + else // TODO: throw err; should not happen + return false; } - public static boolean Id_limits_large_size(byte id) {// Linker.php|makeThumbLink2|Do not present an image bigger than the source, for bitmap-style images - switch (id) { // assuming original of 400,200 - case Id_thumb: // [[File:A.png|600px|thumb]] -> 400,200 - case Id_frameless: // [[File:A.png|600px|frameless]] -> 400,200 - case Id_frame: // [[File:A.png|600px|frame]] -> 400,200 (frame is always default size) - return true; - case Id_null: // [[File:A.png|600px]] -> 600,400; uses orig file of 400,200, but tag src_width / src_height set to 600,400 - case Id_none: // TODO: deprecate - return false; - default: // TODO: deprecate - return !Enm_.HasInt(id, Xop_lnki_type.Id_none); - } + public static boolean Id_limits_large_size(byte id) {// Linker.php|makeThumbLink2|Do not present an image bigger than the source, for bitmap-style images; assuming original of 400,200 + if ( Enm_.HasInt(id, Id_thumb) // [[File:A.png|600px|thumb]] -> 400,200 + || Enm_.HasInt(id, Id_frameless) // [[File:A.png|600px|frameless]] -> 400,200 + || Enm_.HasInt(id, Id_frame) // [[File:A.png|600px|frame]] -> 400,200 (frame is always default size) + ) + return true; + else if ( id == Id_null // [[File:A.png|600px]] -> 600,400; uses orig file of 400,200, but tag src_width / src_height set to 600,400 + || Enm_.HasInt(id, Id_none) // TODO: deprecate + ) + return false; + else // TODO: throw err; should not happen; + return true; } public static boolean Id_supports_upright(byte id) {// REF:Linker.php|makeImageLink;if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) DATE:2014-05-22 - switch (id) { - case Id_thumb: - case Id_frame: - case Id_frameless: - return true; - case Id_null: - case Id_none: + if ( Enm_.HasInt(id, Id_thumb) + || Enm_.HasInt(id, Id_frameless) + || Enm_.HasInt(id, Id_frame) + ) + return true; + else if ( id == Id_null + || Enm_.HasInt(id, Id_none) + ) return false; - default: // TODO: deprecate - return Enm_.HasInt(id, Xop_lnki_type.Id_thumb) || Enm_.HasInt(id, Xop_lnki_type.Id_frameless); - } + else // TODO: throw err; should not happen; + return true; } } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java index db35e9738..40fa5407f 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java @@ -634,12 +634,9 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { case Xop_xnde_tag_.Tid_imageMap: xnde_xtn = tkn_mkr.Xnde_imageMap(); break; case Xop_xnde_tag_.Tid_hiero: xnde_xtn = tkn_mkr.Xnde_hiero(); break; case Xop_xnde_tag_.Tid_inputBox: xnde_xtn = tkn_mkr.Xnde_inputbox(); break; - case Xop_xnde_tag_.Tid_dynamicPageList: + case Xop_xnde_tag_.Tid_dynamicPageList: xnde_xtn = tkn_mkr.Xnde_dynamicPageList(); break; case Xop_xnde_tag_.Tid_pages: { - switch (tag_id) { - case Xop_xnde_tag_.Tid_pages: xnde_xtn = tkn_mkr.Xnde_pages(); break; - case Xop_xnde_tag_.Tid_dynamicPageList: xnde_xtn = tkn_mkr.Xnde_dynamicPageList(); break; - } + xnde_xtn = tkn_mkr.Xnde_pages(); boolean enabled = ctx.Wiki().Xtn_mgr().Xtn_proofread().Enabled(); if (!enabled) { // if Page / Index ns does not exist, disable xtn and escape content; DATE:2014-11-28 escaped = true; diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa index 3d493001ea9b718e0085546181e5181b12d06612..4356a6125f0254f6e6c968c6cf152d87bdae9c2b 100644 GIT binary patch delta 286 zcmZozz|^pSX~QvDl|rrDzx@V%ZA&9#LrX(LF6RGAOxz5N;vAZcj2s+{e9k55 c@kT}lhNcE4hEO$=Z{^FfL)n}EH1<_~(Om6cl*