From e4a2af026b204e3d848d3968fec82d6a175afff9 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Sun, 7 Aug 2016 21:36:50 -0400 Subject: [PATCH] 'v3.8.2.1' --- 100_core/src/gplx/Bry_fmt.java | 18 +- 100_core/src/gplx/DateAdp__tst.java | 106 +++--- .../gplx/core/brys/args/Bfr_arg__bry_fmt.java | 38 ++ .../gplx/core/brys/fmts/Bry_fmt_parser_.java | 2 +- .../core/brys/fmts/Bry_keys_parser_tst.java | 3 +- .../langs/htmls/entitys}/Gfh_entity_.java | 4 +- .../langs/htmls/entitys/Gfh_entity_itm.java | 14 +- .../langs/htmls/entitys/Gfh_entity_trie.java | 18 +- .../core/net/emails/Gfo_email_mgr__jre.java | 2 +- 400_xowa/src/gplx/langs/htmls/Gfh_utl.java | 1 + .../langs/htmls/encoders/Gfo_url_encoder.java | 2 +- .../htmls/encoders/Gfo_url_encoder_.java | 37 +- .../htmls/encoders/Gfo_url_encoder_itm.java | 5 +- .../htmls/encoders/Gfo_url_encoder_tst.java | 2 +- 400_xowa/src/gplx/langs/jsons/Json_nde.java | 8 + 400_xowa/src/gplx/xowa/Xoa_app_.java | 2 +- 400_xowa/src/gplx/xowa/Xoa_ttl.java | 11 +- 400_xowa/src/gplx/xowa/Xoae_app.java | 4 +- 400_xowa/src/gplx/xowa/Xop_fxt.java | 3 +- 400_xowa/src/gplx/xowa/Xowa_main.java | 2 +- 400_xowa/src/gplx/xowa/Xowe_wiki.java | 3 + .../src/gplx/xowa/addons/Xoax_addon_mgr.java | 3 +- .../cmds/Xobldr__fsdb_db__create_data.java | 2 +- .../cmds/Xobldr__fsdb_db__create_orig.java | 2 +- .../files/cmds/Xobldr__lnki_temp__create.java | 4 +- .../bldrs/hdumps/diffs/Dumpdiff_log_tbl.java | 4 +- .../mass_parses/makes/Xomp_html_db_rdr.java | 4 +- .../mass_parses/parses/Xomp_parse_mgr.java | 4 +- .../mass_parses/parses/Xomp_parse_wkr.java | 10 +- .../mass_parses/parses/Xow_wiki_utl_.java | 2 + .../wmdumps/imglinks/Db_bulk_cmd_base.java | 77 ++++ .../bldrs/wmdumps/imglinks/Imglnk_addon.java | 29 ++ .../wmdumps/imglinks/Imglnk_bldr_cmd.java | 51 +++ .../wmdumps/imglinks/Imglnk_bldr_mgr.java | 51 +++ .../wmdumps/imglinks/Imglnk_reg_tbl.java | 69 ++++ .../wmdumps/imglinks/Imglnk_tmp_tbl.java | 54 +++ .../imglinks/Xof_orig_wkr__img_links.java | 32 ++ .../imglinks/Xof_orig_wkr__img_links_.java | 63 ++++ .../Xoax_builds_pagelinks_addon.java | 4 +- .../pagelinks/bldrs/Pglnk_bldr_cmd.java | 4 +- .../pagelinks/dbs/Pglnk_page_link_tbl.java | 2 +- .../dbs/Pglnk_page_link_temp_tbl.java | 2 +- .../wikis/searchs/bldrs/Srch_bldr_mgr_.java | 4 +- .../bldrs/cmds/Xobldr__page__page_score.java | 2 +- .../specials/htmls/Srch_html_page_bldr.java | 2 +- .../apis/xowa/bldrs/imports/Xoapi_import.java | 6 +- .../apps/apis/xowa/gui/pages/Xoapi_view.java | 4 +- .../gplx/xowa/apps/urls/Xow_url_parser.java | 3 +- .../wms/apis/Xowmf_api_mgr.java | 3 +- .../wms/apis/origs}/Xoapi_orig_base.java | 2 +- .../wms/apis/origs}/Xoapi_orig_base_tst.java | 3 +- .../wms/apis/origs}/Xoapi_orig_mok.java | 4 +- .../wms/apis/origs}/Xoapi_orig_rslts.java | 2 +- .../wms/apis/origs}/Xoapi_orig_wmf.java | 2 +- .../apis/revisions/Xowm_revision_base.java | 98 +++++ .../wms/apis/revisions/Xowm_revn_data.java | 40 +++ 400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java | 1 + .../xowa/bldrs/cmds/Xob_dump_mgr_base.java | 2 +- .../xowa/bldrs/installs/Xoi_dump_mgr.java | 2 +- .../src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java | 2 +- .../src/gplx/xowa/bldrs/wms/Xowmf_mgr.java | 4 +- .../src/gplx/xowa/files/Xof_file_fxt.java | 4 +- .../src/gplx/xowa/files/Xof_fsdb_mode.java | 20 +- .../src/gplx/xowa/files/Xof_html_elem.java | 2 +- .../src/gplx/xowa/files/Xow_file_mgr.java | 8 +- .../files/caches/Xou_file_itm_finder.java | 2 +- .../xowa/files/fsdb/tsts/Xof_file_fxt.java | 2 +- .../gplx/xowa/files/origs/Xof_orig_itm.java | 26 +- .../gplx/xowa/files/origs/Xof_orig_mgr.java | 19 +- .../gplx/xowa/files/origs/Xof_orig_tbl.java | 2 +- .../xowa/files/origs/Xof_orig_tbl_tst.java | 2 +- .../gplx/xowa/files/origs/Xof_orig_wkr_.java | 5 +- .../files/origs/Xof_orig_wkr__wmf_api.java | 10 +- .../files/origs/Xof_orig_wkr__xo_meta.java | 3 +- .../gplx/xowa/files/repos/Xowe_repo_mgr.java | 7 + .../gplx/xowa/files/xfers/Xof_xfer_mgr.java | 4 +- .../files/xfers/Xof_xfer_queue_base_fxt.java | 5 +- .../src/gplx/xowa/guis/urls/Xog_url_wkr.java | 3 +- .../src/gplx/xowa/guis/views/Xog_tab_itm.java | 4 +- .../xowa/guis/views/boots/Xog_error_win.java | 2 +- 400_xowa/src/gplx/xowa/htmls/Xoh_img_mgr.java | 6 + .../src/gplx/xowa/htmls/Xow_html_mgr.java | 11 +- .../xowa/htmls/core/htmls/Xoh_html_wtr.java | 2 +- .../core/htmls/Xoh_html_wtr_escaper.java | 15 +- .../xowa/htmls/core/hzips/Xoh_hzip_dict_.java | 2 + .../htmls/core/hzips/Xoh_pool_mgr__data.java | 6 +- .../htmls/core/hzips/Xoh_pool_mgr__hzip.java | 8 +- .../htmls/core/wkrs/Xoh_hdoc_wkr__hzip.java | 1 + .../wkrs/addons/medias/Xoh_media_data.java | 126 +++++++ .../wkrs/addons/medias/Xoh_media_hzip.java | 84 +++++ .../addons/medias/Xoh_media_hzip_tst.java | 95 +++++ .../wkrs/addons/medias/Xoh_media_wtr.java | 66 ++++ .../core/wkrs/bfr_args/Bfr_arg__hatr_arg.java | 4 +- .../core/wkrs/bfr_args/Bfr_arg__hatr_id.java | 1 + .../imgs/Xoh_img_hzip__dump__basic__tst.java | 9 - .../htmls/core/wkrs/imgs/Xoh_img_wtr.java | 37 +- .../core/wkrs/imgs/atrs/Xoh_anch_cls_.java | 27 +- .../htmls/core/wkrs/lnkes/Xoh_lnke_html.java | 5 +- ...h_file_img_wkr.java => Xoh_file_fmtr.java} | 4 +- .../lnkis/htmls/Xoh_file_fmtr__basic.java | 141 ++++++++ .../lnkis/htmls/Xoh_file_fmtr__hdump.java | 65 ++++ .../lnkis/htmls/Xoh_file_html_fmtr__base.java | 162 --------- .../htmls/Xoh_file_html_fmtr__hdump.java | 68 ---- .../core/wkrs/lnkis/htmls/Xoh_file_mgr.java | 17 +- .../lnkis/htmls/Xoh_file_wtr__audio__tst.java | 6 +- .../wkrs/lnkis/htmls/Xoh_file_wtr__basic.java | 299 ++++++++------- .../lnkis/htmls/Xoh_file_wtr__image__tst.java | 18 +- .../lnkis/htmls/Xoh_file_wtr__video__tst.java | 80 +++-- .../wkrs/lnkis/htmls/Xoh_lnki_text_fmtr.java | 42 +-- ...tle_fmtr.java => Xoh_lnki_title_bldr.java} | 42 +-- ..._tst.java => Xoh_lnki_title_bldr_tst.java} | 26 +- .../htmls/core/wkrs/tags/Xoh_tag_parser.java | 1 + .../core/wkrs/thms/Xoh_thm_html_tst.java | 4 +- .../wkrs/thms/Xoh_thm_hzip__avo__tst.java | 66 ++++ .../wkrs/thms/Xoh_thm_hzip__basic__tst.java | 109 ++++++ .../wkrs/thms/Xoh_thm_hzip__pseudo__tst.java | 143 ++++++++ .../wkrs/thms/Xoh_thm_hzip__tidy__tst.java | 93 +++++ .../core/wkrs/thms/Xoh_thm_hzip_tst.java | 339 ------------------ .../xowa/htmls/encoders/Xow_encoder_mgr.java | 33 ++ .../gplx/xowa/htmls/js/Xoh_js_cleaner.java | 5 +- .../htmls/ns_files/Xoh_file_page_wtr.java | 4 +- .../htmls/ns_files/Xoh_ns_file_page_mgr.java | 10 +- .../ns_files/Xoh_ns_file_page_mgr_tst.java | 4 +- .../xowa/htmls/portal/Xow_portal_mgr.java | 5 +- .../xowa/htmls/sidebar/Xowh_sidebar_mgr.java | 4 +- .../src/gplx/xowa/langs/msgs/Xol_msg_itm.java | 8 +- .../gplx/xowa/langs/msgs/Xol_msg_mgr_.java | 10 +- .../gplx/xowa/langs/msgs/Xol_msg_mgr_tst.java | 14 +- .../xowa/langs/msgs/Xow_mainpage_finder.java | 4 +- .../src/gplx/xowa/langs/msgs/Xow_msg_mgr.java | 4 +- .../gplx/xowa/langs/parsers/Xol_lang_srl.java | 2 +- .../src/gplx/xowa/parsers/Xop_tkn_mkr.java | 3 +- .../src/gplx/xowa/parsers/Xop_tmp_mgr.java | 5 +- .../gplx/xowa/parsers/amps/Xop_amp_mgr.java | 29 +- .../xowa/parsers/amps/Xop_amp_tkn_ent.java | 7 +- .../gplx/xowa/parsers/lnkis/Xop_lnki_tkn.java | 2 +- .../xowa/parsers/lnkis/Xop_lnki_wkr_.java | 4 +- .../xowa/parsers/tmpls/Nowiki_escape_itm.java | 24 +- .../xowa/parsers/utils/Xop_sanitizer.java | 13 +- .../gplx/xowa/parsers/xndes/Xop_xnde_wkr.java | 8 +- .../xndes/Xop_xnde_wkr__err_misc_tst.java | 5 +- 400_xowa/src/gplx/xowa/wikis/Xowv_wiki.java | 2 +- .../wikis/pages/dbs/Xopg_db_protection.java | 2 +- .../src/gplx/xowa/xtns/cites/Ref_nde.java | 2 +- .../gallery/Gallery_mgr_base__basic__tst.java | 2 +- .../gplx/xowa/xtns/hieros/Hiero_html_wtr.java | 2 +- .../src/gplx/xowa/xtns/imaps/Imap_map.java | 4 +- .../xowa/xtns/imaps/htmls/Imap_img_arg.java | 4 +- .../xowa/xtns/math/Xof_math_html_wtr.java | 6 +- .../xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java | 2 +- .../pfuncs/pages/Pfunc_rev_props_tst.java | 2 +- .../xowa/xtns/pfuncs/ttls/Pfunc_filepath.java | 8 +- .../xtns/pfuncs/ttls/Pfunc_filepath_itm.java | 24 ++ .../xtns/pfuncs/ttls/Pfunc_filepath_tst.java | 2 +- .../src/gplx/xowa/xtns/poems/Poem_nde.java | 3 +- .../xowa/xtns/proofreadPage/Pp_pages_nde.java | 4 +- .../src/gplx/xowa/xtns/scores/Score_xnde.java | 4 +- .../xtns/scribunto/Scrib_invoke_func.java | 2 +- .../scribunto/engines/luaj/Luaj_value_.java | 1 + .../scribunto/libs/Scrib_lib_message.java | 2 +- .../xtns/scribunto/libs/Scrib_lib_text.java | 102 +++--- .../libs/Scrib_lib_text__json_util.java | 17 +- .../libs/Scrib_lib_text_json_tst.java | 40 +-- .../xtns/scribunto/libs/Scrib_lib_title.java | 29 +- .../scribunto/libs/Scrib_lib_title_tst.java | 4 +- 165 files changed, 2534 insertions(+), 1247 deletions(-) create mode 100644 100_core/src/gplx/core/brys/args/Bfr_arg__bry_fmt.java rename {400_xowa/src/gplx/langs/htmls => 100_core/src/gplx/langs/htmls/entitys}/Gfh_entity_.java (90%) rename 400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java => 100_core/src/gplx/langs/htmls/entitys/Gfh_entity_itm.java (83%) rename 400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java => 100_core/src/gplx/langs/htmls/entitys/Gfh_entity_trie.java (93%) create mode 100644 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Db_bulk_cmd_base.java create mode 100644 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_addon.java create mode 100644 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_bldr_cmd.java create mode 100644 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_bldr_mgr.java create mode 100644 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_reg_tbl.java create mode 100644 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_tmp_tbl.java create mode 100644 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Xof_orig_wkr__img_links.java create mode 100644 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Xof_orig_wkr__img_links_.java rename 400_xowa/src/gplx/xowa/addons/bldrs/{ => wmdumps}/pagelinks/Xoax_builds_pagelinks_addon.java (79%) rename 400_xowa/src/gplx/xowa/addons/bldrs/{ => wmdumps}/pagelinks/bldrs/Pglnk_bldr_cmd.java (90%) rename 400_xowa/src/gplx/xowa/addons/bldrs/{ => wmdumps}/pagelinks/dbs/Pglnk_page_link_tbl.java (87%) rename 400_xowa/src/gplx/xowa/addons/bldrs/{ => wmdumps}/pagelinks/dbs/Pglnk_page_link_temp_tbl.java (89%) rename 400_xowa/src/gplx/xowa/{bldrs => apps}/wms/apis/Xowmf_api_mgr.java (84%) rename 400_xowa/src/gplx/xowa/{bldrs/wms/apis => apps/wms/apis/origs}/Xoapi_orig_base.java (90%) rename 400_xowa/src/gplx/xowa/{bldrs/wms/apis => apps/wms/apis/origs}/Xoapi_orig_base_tst.java (91%) rename 400_xowa/src/gplx/xowa/{bldrs/wms/apis => apps/wms/apis/origs}/Xoapi_orig_mok.java (86%) rename 400_xowa/src/gplx/xowa/{bldrs/wms/apis => apps/wms/apis/origs}/Xoapi_orig_rslts.java (87%) rename 400_xowa/src/gplx/xowa/{bldrs/wms/apis => apps/wms/apis/origs}/Xoapi_orig_wmf.java (95%) create mode 100644 400_xowa/src/gplx/xowa/apps/wms/apis/revisions/Xowm_revision_base.java create mode 100644 400_xowa/src/gplx/xowa/apps/wms/apis/revisions/Xowm_revn_data.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_data.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_hzip.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_hzip_tst.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_wtr.java rename 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/{Xoh_file_img_wkr.java => Xoh_file_fmtr.java} (88%) create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr__basic.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr__hdump.java delete mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__base.java delete mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__hdump.java rename 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/{Xoh_lnki_title_fmtr.java => Xoh_lnki_title_bldr.java} (68%) rename 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/{Xoh_lnki_title_fmtr_tst.java => Xoh_lnki_title_bldr_tst.java} (66%) create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__avo__tst.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__basic__tst.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__pseudo__tst.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__tidy__tst.java delete mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java create mode 100644 400_xowa/src/gplx/xowa/htmls/encoders/Xow_encoder_mgr.java create mode 100644 400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_itm.java diff --git a/100_core/src/gplx/Bry_fmt.java b/100_core/src/gplx/Bry_fmt.java index 2840ce9a5..27b15c0cf 100644 --- a/100_core/src/gplx/Bry_fmt.java +++ b/100_core/src/gplx/Bry_fmt.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx; import gplx.core.brys.*; import gplx.core.brys.fmts.*; public class Bry_fmt { + private final Object thread_lock = new Object(); private byte[] src; private Bry_fmt_itm[] itms; private int itms_len; private Bfr_fmt_arg[] args = Bfr_fmt_arg.Ary_empty; @@ -43,6 +44,10 @@ public class Bry_fmt { Bld_many(bfr, vals_ary); return bfr.To_str_and_clear(); } + public byte[] Bld_many_to_bry(Bry_bfr bfr, Object... vals_ary) { + Bld_many(bfr, vals_ary); + return bfr.To_bry_and_clear(); + } public void Bld_many(Bry_bfr bfr, Object... vals_ary) { if (dirty) Compile(); int vals_len = vals_ary.length; @@ -64,15 +69,18 @@ public class Bry_fmt { } public String To_str() {return Bld_many_to_str_auto_bfr(vals);} private void Compile() { - dirty = false; - this.itms = Bry_fmt_parser_.Parse(Byte_ascii.Tilde, Byte_ascii.Curly_bgn, Byte_ascii.Curly_end, args, keys, src); - this.itms_len = itms.length; + synchronized (thread_lock) { + dirty = false; + this.itms = Bry_fmt_parser_.Parse(Byte_ascii.Tilde, Byte_ascii.Curly_bgn, Byte_ascii.Curly_end, args, keys, src); + this.itms_len = itms.length; + } } public static Bry_fmt New(String fmt, String... keys) {return new Bry_fmt(Bry_.new_u8(fmt), Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);} public static Bry_fmt New(byte[] fmt, String... keys) {return new Bry_fmt(fmt , Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);} public static String Make_str(String fmt_str, Object... vals) {return Auto(fmt_str).Vals_(vals).To_str();} - public static Bry_fmt Auto(String fmt_str) { - byte[] fmt_bry = Bry_.new_u8(fmt_str); + public static Bry_fmt Auto_nl_apos(String... lines) {return Auto(Bry_.New_u8_nl_apos(lines));} + public static Bry_fmt Auto(String fmt_str) {return Auto(Bry_.new_u8(fmt_str));} + public static Bry_fmt Auto(byte[] fmt_bry) { byte[][] keys_bry = Bry_fmt_parser_.Parse_keys(fmt_bry); return new Bry_fmt(fmt_bry, keys_bry, Bfr_fmt_arg.Ary_empty); } diff --git a/100_core/src/gplx/DateAdp__tst.java b/100_core/src/gplx/DateAdp__tst.java index 036fcb366..9a9a6e9ac 100644 --- a/100_core/src/gplx/DateAdp__tst.java +++ b/100_core/src/gplx/DateAdp__tst.java @@ -16,53 +16,73 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -import org.junit.*; import gplx.core.times.*; -public class DateAdp__tst { +import org.junit.*; import gplx.core.tests.*; +public class DateAdp__tst { + private final DateAdp__fxt fxt = new DateAdp__fxt(); @Test public void Parse_gplx() { - tst_Parse_gplx("99991231_235959.999", "99991231_235959.999"); - tst_Parse_gplx("20090430_213200.123", "20090430_213200.123"); - tst_Parse_gplx("20090430_213200" , "20090430_213200.000"); - tst_Parse_gplx("20090430" , "20090430_000000.000"); + fxt.Test__parse_gplx("99991231_235959.999" , "99991231_235959.999"); + fxt.Test__parse_gplx("20090430_213200.123" , "20090430_213200.123"); + fxt.Test__parse_gplx("20090430_213200" , "20090430_213200.000"); + fxt.Test__parse_gplx("20090430" , "20090430_000000.000"); } @Test public void Parse_separators() { - tst_Parse_gplx("2009-04-30 21:32:00.123", "20090430_213200.123"); - tst_Parse_gplx("2009-04-30 21:32:00" , "20090430_213200.000"); - tst_Parse_gplx("2009-04-30" , "20090430_000000.000"); + fxt.Test__parse_gplx("2009-04-30 21:32:00.123" , "20090430_213200.123"); + fxt.Test__parse_gplx("2009-04-30 21:32:00" , "20090430_213200.000"); + fxt.Test__parse_gplx("2009-04-30" , "20090430_000000.000"); + } + @Test public void Parse_utc() { + fxt.Test__parse_gplx("2015-12-26T10:03:53Z" , "20151226_100353.000"); } @Test public void DayOfWeek() { - tst_DayOfWeek("2012-01-18", 3); //3=Wed - } void tst_DayOfWeek(String raw, int expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).DayOfWeek());} - @Test public void WeekOfYear() { - tst_WeekOfYear("2006-02-01", 5); // 1-1:Sun;2-1:Wed - tst_WeekOfYear("2007-02-01", 5); // 1-1:Mon;2-1:Thu - tst_WeekOfYear("2008-02-01", 5); // 1-1:Tue;2-1:Fri - tst_WeekOfYear("2009-02-01", 6); // 1-1:Thu;2-1:Sun - tst_WeekOfYear("2010-02-01", 6); // 1-1:Fri;2-1:Mon - tst_WeekOfYear("2011-02-01", 6); // 1-1:Sat;2-1:Tue - } void tst_WeekOfYear(String raw, int expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).WeekOfYear());} - @Test public void DayOfYear() { - tst_DayOfYear("2012-01-01", 1); - tst_DayOfYear("2012-02-29", 60); - tst_DayOfYear("2012-12-31", 366); - } void tst_DayOfYear(String raw, int expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).DayOfYear());} - @Test public void Timestamp_unix() { - tst_Timestamp_unix("1970-01-01 00:00:00", 0); - tst_Timestamp_unix("2012-01-01 00:00:00", 1325376000); - } void tst_Timestamp_unix(String raw, long expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).Timestamp_unix());} - @Test public void DaysInMonth() { - tst_DaysInMonth("2012-01-01", 31); - tst_DaysInMonth("2012-02-01", 29); - tst_DaysInMonth("2012-04-01", 30); - tst_DaysInMonth("2011-02-01", 28); - } void tst_DaysInMonth(String raw, int expd) {Tfds.Eq(expd, DateAdp_.DaysInMonth(DateAdp_.parse_gplx(raw)));} - @Test public void XtoUtc() { - tst_XtoUtc("2012-01-01 00:00", "2012-01-01 05:00"); //4=Wed - } void tst_XtoUtc(String raw, String expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).XtoUtc().XtoStr_fmt_yyyy_MM_dd_HH_mm());} - - void tst_Parse_gplx(String raw, String expd) { - DateAdp date = DateAdp_.parse_gplx(raw); - String actl = date.XtoStr_gplx(); - Tfds.Eq(expd, actl); + fxt.Test__day_of_week("2012-01-18", 3); //3=Wed + } + @Test public void WeekOfYear() { + fxt.Test__week_of_year("2006-02-01", 5); // 1-1:Sun;2-1:Wed + fxt.Test__week_of_year("2007-02-01", 5); // 1-1:Mon;2-1:Thu + fxt.Test__week_of_year("2008-02-01", 5); // 1-1:Tue;2-1:Fri + fxt.Test__week_of_year("2009-02-01", 6); // 1-1:Thu;2-1:Sun + fxt.Test__week_of_year("2010-02-01", 6); // 1-1:Fri;2-1:Mon + fxt.Test__week_of_year("2011-02-01", 6); // 1-1:Sat;2-1:Tue + } + @Test public void DayOfYear() { + fxt.Test__day_of_year("2012-01-01", 1); + fxt.Test__day_of_year("2012-02-29", 60); + fxt.Test__day_of_year("2012-12-31", 366); + } + @Test public void Timestamp_unix() { + fxt.Test__timestamp_unix("1970-01-01 00:00:00", 0); + fxt.Test__timestamp_unix("2012-01-01 00:00:00", 1325376000); + } + @Test public void DaysInMonth() { + fxt.Test__days_in_month("2012-01-01", 31); + fxt.Test__days_in_month("2012-02-01", 29); + fxt.Test__days_in_month("2012-04-01", 30); + fxt.Test__days_in_month("2011-02-01", 28); + } + @Test public void XtoUtc() { + fxt.Test__to_utc("2012-01-01 00:00", "2012-01-01 05:00"); //4=Wed + } +} +class DateAdp__fxt { + public void Test__parse_gplx(String raw, String expd) { + Gftest.Eq__str(expd, DateAdp_.parse_gplx(raw).XtoStr_gplx()); + } + public void Test__day_of_week(String raw, int expd) { + Gftest.Eq__int(expd, DateAdp_.parse_gplx(raw).DayOfWeek()); + } + public void Test__week_of_year(String raw, int expd) { + Gftest.Eq__int(expd, DateAdp_.parse_gplx(raw).WeekOfYear()); + } + public void Test__day_of_year(String raw, int expd) { + Gftest.Eq__int(expd, DateAdp_.parse_gplx(raw).DayOfYear()); + } + public void Test__days_in_month(String raw, int expd) { + Gftest.Eq__int(expd, DateAdp_.DaysInMonth(DateAdp_.parse_gplx(raw))); + } + public void Test__timestamp_unix(String raw, long expd) { + Gftest.Eq__long(expd, DateAdp_.parse_gplx(raw).Timestamp_unix()); + } + public void Test__to_utc(String raw, String expd) { + Tfds.Eq(expd, DateAdp_.parse_gplx(raw).XtoUtc().XtoStr_fmt_yyyy_MM_dd_HH_mm()); } - DateAdp_parser bldr = DateAdp_parser.new_(); } diff --git a/100_core/src/gplx/core/brys/args/Bfr_arg__bry_fmt.java b/100_core/src/gplx/core/brys/args/Bfr_arg__bry_fmt.java new file mode 100644 index 000000000..860a4f756 --- /dev/null +++ b/100_core/src/gplx/core/brys/args/Bfr_arg__bry_fmt.java @@ -0,0 +1,38 @@ +/* +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.core.brys.args; import gplx.*; import gplx.core.*; import gplx.core.brys.*; +import gplx.core.brys.*; +public class Bfr_arg__bry_fmt implements Bfr_arg { + private final Bry_fmt fmt; + private Object[] arg_ary; + public Bfr_arg__bry_fmt(Bry_fmt fmt, Object... arg_ary) { + this.fmt = fmt; + Args_(arg_ary); + } + public void Bfr_arg__clear() {arg_ary = null;} + public boolean Bfr_arg__missing() {return arg_ary == null;} + + public Bfr_arg__bry_fmt Args_(Object... arg_ary) { + this.arg_ary = arg_ary; + return this; + } + public void Bfr_arg__add(Bry_bfr bfr) { + if (Bfr_arg__missing()) return; + fmt.Bld_many(bfr, arg_ary); + } +} diff --git a/100_core/src/gplx/core/brys/fmts/Bry_fmt_parser_.java b/100_core/src/gplx/core/brys/fmts/Bry_fmt_parser_.java index f33b40b90..75e62202b 100644 --- a/100_core/src/gplx/core/brys/fmts/Bry_fmt_parser_.java +++ b/100_core/src/gplx/core/brys/fmts/Bry_fmt_parser_.java @@ -86,7 +86,7 @@ public class Bry_fmt_parser_ { if (rhs_pos - lhs_pos == 0) throw Err_.new_("bry_fmt", "{} will result in empty key", "src", src); byte[] key = Bry_.Mid(src, lhs_pos, rhs_pos); if (!list.Has(key)) list.Add(key, key); - pos = rhs_pos + 1; + pos = rhs_pos; // NOTE: auto-increment done at top of loop } return (byte[][])list.To_ary(byte[].class); } private static final byte[] Bry_arg_lhs = Bry_.new_a7("~{"); diff --git a/100_core/src/gplx/core/brys/fmts/Bry_keys_parser_tst.java b/100_core/src/gplx/core/brys/fmts/Bry_keys_parser_tst.java index 8dd54d946..3c10fa7f4 100644 --- a/100_core/src/gplx/core/brys/fmts/Bry_keys_parser_tst.java +++ b/100_core/src/gplx/core/brys/fmts/Bry_keys_parser_tst.java @@ -18,11 +18,12 @@ along with this program. If not, see . package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*; import org.junit.*; public class Bry_keys_parser_tst { - private final Bry_keys_parser_fxt fxt = new Bry_keys_parser_fxt(); + private final Bry_keys_parser_fxt fxt = new Bry_keys_parser_fxt(); @Test public void None() {fxt.Test("a");} @Test public void One() {fxt.Test("~{a}" , "a");} @Test public void Many() {fxt.Test("~{a}b~{c}d~{e}" , "a", "c", "e");} @Test public void Dupe() {fxt.Test("~{a}b~{a}" , "a");} + @Test public void Bug__space() {fxt.Test("~{a}~{b} ~{c}" , "a", "b", "c");} // DATE:2016-08-02 } class Bry_keys_parser_fxt { public void Test(String fmt, String... expd) { diff --git a/400_xowa/src/gplx/langs/htmls/Gfh_entity_.java b/100_core/src/gplx/langs/htmls/entitys/Gfh_entity_.java similarity index 90% rename from 400_xowa/src/gplx/langs/htmls/Gfh_entity_.java rename to 100_core/src/gplx/langs/htmls/entitys/Gfh_entity_.java index 89c8822cc..83623b678 100644 --- a/400_xowa/src/gplx/langs/htmls/Gfh_entity_.java +++ b/100_core/src/gplx/langs/htmls/entitys/Gfh_entity_.java @@ -15,12 +15,12 @@ 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.langs.htmls; import gplx.*; import gplx.langs.*; +package gplx.langs.htmls.entitys; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; public class Gfh_entity_ { public static final String Nl_str = " " ; - public static final byte[] + public static final byte[] Lt_bry = Bry_.new_a7("<"), Gt_bry = Bry_.new_a7(">") , Amp_bry = Bry_.new_a7("&"), Quote_bry = Bry_.new_a7(""") , Apos_num_bry = Bry_.new_a7("'") diff --git a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java b/100_core/src/gplx/langs/htmls/entitys/Gfh_entity_itm.java similarity index 83% rename from 400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java rename to 100_core/src/gplx/langs/htmls/entitys/Gfh_entity_itm.java index 2ee34eb69..bb1a6fd97 100644 --- a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java +++ b/100_core/src/gplx/langs/htmls/entitys/Gfh_entity_itm.java @@ -15,10 +15,9 @@ 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.parsers.amps; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; -import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; -public class Xop_amp_trie_itm { // TS - public Xop_amp_trie_itm(byte tid, int char_int, byte[] xml_name_bry) { +package gplx.langs.htmls.entitys; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; +public class Gfh_entity_itm { // TS:immutable + public Gfh_entity_itm(byte tid, int char_int, byte[] xml_name_bry) { this.tid = tid; this.char_int = char_int; this.u8_bry = gplx.core.intls.Utf16_.Encode_int_to_bry(char_int); @@ -37,9 +36,9 @@ public class Xop_amp_trie_itm { // TS bfr.Add(xml_name_bry); // NOTE: never write actual char; EX: "<" should be written as "<", not "<" break; default: - bfr.Add(Xoh_lnki_title_fmtr.Escape_bgn); // &# - bfr.Add_int_variable(char_int); // 160 - bfr.Add_byte(Byte_ascii.Semic); // ; + bfr.Add(Escape_bgn); // &# + bfr.Add_int_variable(char_int); // 160 + bfr.Add_byte(Byte_ascii.Semic); // ; break; } } @@ -52,6 +51,7 @@ public class Xop_amp_trie_itm { // TS default: bfr.Add(u8_bry); break; // write literal; EX: "[" not "[" } } + private static final byte[] Escape_bgn = Bry_.new_a7("&#"); public static final byte Tid_name_std = 1, Tid_name_xowa = 2, Tid_num_hex = 3, Tid_num_dec = 4; public static final int Char_int_null = -1; } diff --git a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java b/100_core/src/gplx/langs/htmls/entitys/Gfh_entity_trie.java similarity index 93% rename from 400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java rename to 100_core/src/gplx/langs/htmls/entitys/Gfh_entity_trie.java index a017cf4c8..8bd904731 100644 --- a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java +++ b/100_core/src/gplx/langs/htmls/entitys/Gfh_entity_trie.java @@ -15,9 +15,9 @@ 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.parsers.amps; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +package gplx.langs.htmls.entitys; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; import gplx.core.btries.*; -public class Xop_amp_trie { // TS +public class Gfh_entity_trie { // TS public static final String // NOTE: top_define; entities needed for escaping Str__xowa_lt = "&xowa_lt;" , Str__xowa_brack_bgn = "&xowa_brack_bgn;" @@ -31,7 +31,7 @@ public class Xop_amp_trie { // TS , Str__xowa_nl = "&xowa_nl;" , Str__xowa_dash = "&xowa_dash;" ; - public static final Btrie_slim_mgr Instance = New(); Xop_amp_trie() {} + public static final Btrie_slim_mgr Instance = New(); Gfh_entity_trie() {} private static Btrie_slim_mgr New() {// REF.MW: Sanitizer|$wgHtmlEntities; NOTE:added apos Btrie_slim_mgr rv = Btrie_slim_mgr.cs(); Add_name(rv, Bool_.Y, 60, Str__xowa_lt); @@ -298,20 +298,20 @@ public class Xop_amp_trie { // TS Add_name(rv, Bool_.N, 950, "ζ"); Add_name(rv, Bool_.N, 8205, "‍"); Add_name(rv, Bool_.N, 8204, "‌"); - Add_prefix(rv, Xop_amp_trie_itm.Tid_num_hex, "#x"); - Add_prefix(rv, Xop_amp_trie_itm.Tid_num_hex, "#X"); - Add_prefix(rv, Xop_amp_trie_itm.Tid_num_dec, "#"); + Add_prefix(rv, Gfh_entity_itm.Tid_num_hex, "#x"); + Add_prefix(rv, Gfh_entity_itm.Tid_num_hex, "#X"); + Add_prefix(rv, Gfh_entity_itm.Tid_num_dec, "#"); return rv; } private static void Add_name(Btrie_slim_mgr trie, boolean tid_is_xowa, int char_int, String xml_name_str) { - byte itm_tid = tid_is_xowa ? Xop_amp_trie_itm.Tid_name_xowa : Xop_amp_trie_itm.Tid_name_std; + byte itm_tid = tid_is_xowa ? Gfh_entity_itm.Tid_name_xowa : Gfh_entity_itm.Tid_name_std; byte[] xml_name_bry = Bry_.new_a7(xml_name_str); byte[] key = Bry_.Mid(xml_name_bry, 1, xml_name_bry.length); // ignore & for purpose of trie; EX: "amp;"; NOTE: must keep trailing ";" else "& " will be valid; - trie.Add_obj(key, new Xop_amp_trie_itm(itm_tid, char_int, xml_name_bry)); + trie.Add_obj(key, new Gfh_entity_itm(itm_tid, char_int, xml_name_bry)); } private static void Add_prefix(Btrie_slim_mgr trie, byte prefix_type, String prefix) { byte[] prefix_ary = Bry_.new_u8(prefix); - Xop_amp_trie_itm itm = new Xop_amp_trie_itm(prefix_type, Xop_amp_trie_itm.Char_int_null, prefix_ary); + Gfh_entity_itm itm = new Gfh_entity_itm(prefix_type, Gfh_entity_itm.Char_int_null, prefix_ary); trie.Add_obj(prefix_ary, itm); } } diff --git a/400_xowa/src/gplx/core/net/emails/Gfo_email_mgr__jre.java b/400_xowa/src/gplx/core/net/emails/Gfo_email_mgr__jre.java index f105eba20..4f016386f 100644 --- a/400_xowa/src/gplx/core/net/emails/Gfo_email_mgr__jre.java +++ b/400_xowa/src/gplx/core/net/emails/Gfo_email_mgr__jre.java @@ -24,7 +24,7 @@ import java.net.URLEncoder; class Gfo_email_mgr__jre implements Gfo_email_mgr { public void Send(String to, String subject, String body) { try { - Gfo_url_encoder url_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_wnt; + Gfo_url_encoder url_encoder = Gfo_url_encoder_.New__fsys_wnt().Make(); subject = url_encoder.Encode_str(subject); body = url_encoder.Encode_str(body); body = String_.Replace(body, "`", "%60"); diff --git a/400_xowa/src/gplx/langs/htmls/Gfh_utl.java b/400_xowa/src/gplx/langs/htmls/Gfh_utl.java index e2d04d72e..e6425c2cc 100644 --- a/400_xowa/src/gplx/langs/htmls/Gfh_utl.java +++ b/400_xowa/src/gplx/langs/htmls/Gfh_utl.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.langs.htmls; import gplx.*; import gplx.langs.*; import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.langs.htmls.encoders.*; +import gplx.langs.htmls.entitys.*; public class Gfh_utl { private static final Gfo_url_encoder encoder_id = Gfo_url_encoder_.Id; public static String Encode_id_as_str(byte[] key) {return String_.new_u8(Encode_id_as_bry(key));} diff --git a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder.java b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder.java index 76ff8366b..a863229f6 100644 --- a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder.java +++ b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.langs.htmls.encoders; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; -import gplx.core.btries.*; import gplx.xowa.parsers.amps.*; +import gplx.core.btries.*; import gplx.langs.htmls.*; public class Gfo_url_encoder implements Url_encoder_interface { private final Gfo_url_encoder_itm[] encode_ary, decode_ary; private final Gfo_url_encoder anchor_encoder; diff --git a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java index aa3236c50..8710a503c 100644 --- a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java +++ b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java @@ -17,28 +17,14 @@ along with this program. If not, see . */ package gplx.langs.htmls.encoders; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; import gplx.core.btries.*; -import gplx.xowa.parsers.amps.*; +import gplx.langs.htmls.entitys.*; public class Gfo_url_encoder_ { public static Gfo_url_encoder New__id() {return Gfo_url_encoder_.New__html_id().Make();} - public static final Gfo_url_encoder - Id = Gfo_url_encoder_.New__html_id().Make() - , Href = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Make() - , Href_wo_anchor = Gfo_url_encoder_.New__html_href_mw(Bool_.N).Make() - , Href_quotes = Gfo_url_encoder_.New__html_href_quotes().Make() - , Href_quotes_v2 = Gfo_url_encoder_.New__html_href_quotes_v2().Make() - , Href_qarg = Gfo_url_encoder_.New__html_href_qarg().Make() - , Xourl = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Init__same__many(Byte_ascii.Underline).Make() - , Http_url = Gfo_url_encoder_.New__http_url().Make() - , Http_url_ttl = Gfo_url_encoder_.New__http_url_ttl().Make() - , Fsys_lnx = Gfo_url_encoder_.New__fsys_lnx().Make() - , Fsys_wnt = Gfo_url_encoder_.New__fsys_wnt().Make() - , Gfs = Gfo_url_encoder_.New__gfs().Make() - ; - private static Gfo_url_encoder_mkr New__html_id() { // EX: "" -> "" + public static Gfo_url_encoder_mkr New__html_id() { // EX: "" -> "" return new Gfo_url_encoder_mkr().Init(Byte_ascii.Dot).Init_common(Bool_.Y) .Init__decode_mark(Byte_ascii.Dot) .Init__diff__one(Byte_ascii.Space, Byte_ascii.Underline) - .Init__html_ent(Byte_ascii.Amp, Xop_amp_trie.Instance); + .Init__html_ent(Byte_ascii.Amp, Gfh_entity_trie.Instance); } public static Gfo_url_encoder_mkr New__html_href_mw(boolean use_anchor_encoder) { // EX: "" -> ""; REF.MW: ";:@$!*(),/" return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y) @@ -79,12 +65,12 @@ public class Gfo_url_encoder_ { private static Gfo_url_encoder_mkr New__http_url_ttl() { return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y); } - private static Gfo_url_encoder_mkr New__fsys_lnx() { + public static Gfo_url_encoder_mkr New__fsys_lnx() { return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y) .Init__same__many(Byte_ascii.Slash) .Init__diff__one(Byte_ascii.Backslash, Byte_ascii.Slash); } - private static Gfo_url_encoder_mkr New__fsys_wnt() { + public static Gfo_url_encoder_mkr New__fsys_wnt() { return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent) .Init__same__rng(Byte_ascii.Num_0, Byte_ascii.Num_9) .Init__same__rng(Byte_ascii.Ltr_A, Byte_ascii.Ltr_Z) @@ -95,8 +81,19 @@ public class Gfo_url_encoder_ { , Byte_ascii.Dot, Byte_ascii.Comma , Byte_ascii.Tick, Byte_ascii.Tilde, Byte_ascii.Brack_bgn, Byte_ascii.Brack_end, Byte_ascii.Curly_bgn, Byte_ascii.Curly_end); } - private static Gfo_url_encoder_mkr New__gfs() { + public static Gfo_url_encoder_mkr New__gfs() { return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y) .Init__same__many(Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Apos, Byte_ascii.Semic); } + public static final Gfo_url_encoder + Id = Gfo_url_encoder_.New__html_id().Make() + , Href = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Make() + , Href_wo_anchor = Gfo_url_encoder_.New__html_href_mw(Bool_.N).Make() + , Href_quotes = Gfo_url_encoder_.New__html_href_quotes().Make() + , Href_quotes_v2 = Gfo_url_encoder_.New__html_href_quotes_v2().Make() + , Href_qarg = Gfo_url_encoder_.New__html_href_qarg().Make() + , Xourl = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Init__same__many(Byte_ascii.Underline).Make() + , Http_url = Gfo_url_encoder_.New__http_url().Make() + , Http_url_ttl = Gfo_url_encoder_.New__http_url_ttl().Make() + ; } diff --git a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_itm.java b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_itm.java index 0fca8d30d..a6c67e942 100644 --- a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_itm.java +++ b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_itm.java @@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.langs.htmls.encoders; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; -import gplx.core.btries.*; import gplx.xowa.parsers.amps.*; +import gplx.core.btries.*; +import gplx.langs.htmls.entitys.*; public interface Gfo_url_encoder_itm { int Encode(Bry_bfr bfr, byte[] src, int end, int idx, byte b); int Decode(Bry_bfr bfr, byte[] src, int end, int idx, byte b, boolean fail_when_invalid); @@ -91,7 +92,7 @@ class Gfo_url_encoder_itm_html_ent implements Gfo_url_encoder_itm { return 0; } else { - Xop_amp_trie_itm itm = (Xop_amp_trie_itm)o; + Gfh_entity_itm itm = (Gfh_entity_itm)o; byte[] bry_u8 = itm.U8_bry(); // NOTE: must utf8 encode val; EX:   is 160 but must become 192,160 for (int i = 0; i < bry_u8.length; i++) Gfo_url_encoder_itm_hex.Encode_byte(bry_u8[i], bfr, Byte_ascii.Dot); diff --git a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java index a98639c33..f6f15615b 100644 --- a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java +++ b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java @@ -54,7 +54,7 @@ class Gfo_url_encoder_fxt { public Gfo_url_encoder_fxt Encoder_id() {encoder = Gfo_url_encoder_.Id; return this;} public Gfo_url_encoder_fxt Encoder_href() {encoder = Gfo_url_encoder_.Href; return this;} public Gfo_url_encoder_fxt Encoder_url() {encoder = Gfo_url_encoder_.Http_url; return this;} - public Gfo_url_encoder_fxt Encoder_fsys_safe() {encoder = Gfo_url_encoder_.Fsys_wnt; return this;} + public Gfo_url_encoder_fxt Encoder_fsys_safe() {encoder = Gfo_url_encoder_.New__fsys_wnt().Make(); return this;} public void Test__bicode(String raw, String encoded) { Test__encode(raw, encoded); Test__decode(encoded, raw); diff --git a/400_xowa/src/gplx/langs/jsons/Json_nde.java b/400_xowa/src/gplx/langs/jsons/Json_nde.java index 64f69c15a..5575afa5b 100644 --- a/400_xowa/src/gplx/langs/jsons/Json_nde.java +++ b/400_xowa/src/gplx/langs/jsons/Json_nde.java @@ -36,6 +36,10 @@ public class Json_nde extends Json_itm_base implements Json_grp { Json_itm rv = Get_as_itm_or_null(key); if (rv == null) throw Err_.new_("json", "key missing", "key", key); return Json_ary.cast(rv); } + public byte[] Get_as_bry(String key) { + byte[] rv = Get_as_bry_or(Bry_.new_u8(key), null); if (rv == null) throw Err_.new_("json", "key missing", "key", key); + return rv; + } public byte[] Get_as_bry_or(byte[] key, byte[] or) { Json_itm rv = Get_as_itm_or_null(key); return rv == null ? or : rv.Data_bry(); @@ -72,6 +76,10 @@ public class Json_nde extends Json_itm_base implements Json_grp { byte[] rv = Get_as_bry_or(key, null); return rv == null ? or : Bry_.Eq(rv, Bool_.True_bry); } + public DateAdp Get_as_date_by_utc(String key) { + byte[] rv = Get_as_bry_or(Bry_.new_u8(key), null); if (rv == null) throw Err_.new_("json", "key missing", "key", key); + return DateAdp_.parse_gplx(String_.new_u8(rv)); + } // to convert public boolean Has(byte[] key) {return Get_bry(key, null) != null;} diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index dc3a8ec4b..f2e7bb619 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -32,7 +32,7 @@ public class Xoa_app_ { } } public static final String Name = "xowa"; - public static final String Version = "3.8.1.1"; + public static final String Version = "3.8.2.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys_str; public static String User_agent = ""; diff --git a/400_xowa/src/gplx/xowa/Xoa_ttl.java b/400_xowa/src/gplx/xowa/Xoa_ttl.java index a2ae9ffb9..dbebb121d 100644 --- a/400_xowa/src/gplx/xowa/Xoa_ttl.java +++ b/400_xowa/src/gplx/xowa/Xoa_ttl.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.core.primitives.*; import gplx.core.btries.*; +import gplx.langs.htmls.entitys.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.miscs.*; import gplx.xowa.apps.urls.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.langs.cases.*; @@ -68,7 +69,7 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. public byte[] Subj_txt() {return ns.Id_is_subj() ? Full_txt_w_ttl_case() : Bry_.Add(tors_txt, Page_txt());} public byte[] Full_url() { synchronized (href_encoder) { // LOCK:static-obj - return Gfo_url_encoder_.Href.Encode(full_txt); + return href_encoder.Encode(full_txt); } } public String Full_db_as_str() {return String_.new_u8(Full_db());} @@ -259,9 +260,9 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. if (trv == null) trv = new Btrie_rv(); Object html_ent_obj = amp_trie.Match_at(trv, src, cur2, end); if (html_ent_obj != null) { - Xop_amp_trie_itm amp_itm = (Xop_amp_trie_itm)html_ent_obj; + Gfh_entity_itm amp_itm = (Gfh_entity_itm)html_ent_obj; match_pos = trv.Pos(); - if (amp_itm.Tid() == Xop_amp_trie_itm.Tid_name_std) { + if (amp_itm.Tid() == Gfh_entity_itm.Tid_name_std) { switch (amp_itm.Char_int()) { case 160: // NOTE:   must convert to space; EX:w:United States [[Image:Dust Bowl - Dallas, South Dakota 1936.jpg|220px|alt=]] if (ltr_bgn != -1) add_ws = true; // apply same ws rules as Space, NewLine; needed for converting multiple ws into one; EX:"   " -> " " x> " "; PAGEen.w:Greek_government-debt_crisis; DATE:2014-09-25 @@ -275,7 +276,7 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. case Byte_ascii.Gt: b_ary = amp_itm.Xml_name_bry(); break; - case Xop_amp_trie_itm.Char_int_null: // &#xx; + case Gfh_entity_itm.Char_int_null: // &#xx; int end_pos = Bry_find_.Find_fwd(src, Byte_ascii.Semic, match_pos, end); if (end_pos == Bry_find_.Not_found) {} // &# but no terminating ";" noop: defaults to current_byte which will be added below; else { @@ -290,7 +291,7 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. } else { Xop_amp_mgr_rslt amp_rv = new Xop_amp_mgr_rslt(); - amp_mgr.Parse_ncr(amp_rv, amp_itm.Tid() == Xop_amp_trie_itm.Tid_num_hex, src, end, cur2, match_pos); + amp_mgr.Parse_ncr(amp_rv, amp_itm.Tid() == Gfh_entity_itm.Tid_num_hex, src, end, cur2, match_pos); if (amp_rv.Pass()) { b_ary = gplx.core.intls.Utf16_.Encode_int_to_bry(amp_rv.Val()); if (b_ary.length == 1 && b_ary[0] == Byte_ascii.Hash) // NOTE: A#B should be interpreted as A#b; PAGE:en.s:The_English_Constitution_(1894) DATE:2014-09-07 diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java index 15440f25c..ae2955f0f 100644 --- a/400_xowa/src/gplx/xowa/Xoae_app.java +++ b/400_xowa/src/gplx/xowa/Xoae_app.java @@ -35,7 +35,7 @@ public class Xoae_app implements Xoa_app, Gfo_invk { public Xoae_app(Gfo_usr_dlg usr_dlg, Xoa_app_mode mode, Io_url root_dir, Io_url wiki_dir, Io_url file_dir, Io_url user_dir, Io_url css_dir, String bin_dir_name) { Xoa_app_.Usr_dlg_(usr_dlg); this.mode = mode; - Io_url.Http_file_str_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx; + Io_url.Http_file_str_encoder = Gfo_url_encoder_.New__fsys_lnx().Make(); fsys_mgr = new Xoa_fsys_mgr(bin_dir_name, root_dir, wiki_dir, file_dir, css_dir, root_dir); log_wtr = usr_dlg.Log_wkr(); cfg_mgr = new Xoa_cfg_mgr(this); @@ -52,7 +52,6 @@ public class Xoae_app implements Xoa_app, Gfo_invk { this.gui__tab_mgr = new Xog_tab_mgr__swt(gui_mgr); bldr = new Xob_bldr(this); file_mgr.Ctor_by_app(this); - sanitizer = new Xop_sanitizer(parser_amp_mgr, msg_log); user_mgr = new Xou_user_mgr(this, user); sys_cfg = new Xoa_sys_cfg(this); cur_redirect = new Xoa_cur(this); @@ -119,7 +118,6 @@ public class Xoae_app implements Xoa_app, Gfo_invk { public Xoa_shell Shell() {return shell;} private Xoa_shell shell; public Xoa_thread_mgr Thread_mgr_old() {return thread_mgr_old;} private Xoa_thread_mgr thread_mgr_old = new Xoa_thread_mgr(); public Xoa_hive_mgr Hive_mgr() {return hive_mgr;} private Xoa_hive_mgr hive_mgr; - public Xop_sanitizer Sanitizer() {return sanitizer;} private Xop_sanitizer sanitizer; public Xof_math_subst_regy Math_subst_regy() {return math_subst_regy;} private Xof_math_subst_regy math_subst_regy = new Xof_math_subst_regy(); public Xoa_prog_mgr Prog_mgr() {return prog_mgr;} private final Xoa_prog_mgr prog_mgr = new Xoa_prog_mgr(); public Gfo_async_mgr Async_mgr() {return async_mgr;} private Gfo_async_mgr async_mgr = new Gfo_async_mgr(); diff --git a/400_xowa/src/gplx/xowa/Xop_fxt.java b/400_xowa/src/gplx/xowa/Xop_fxt.java index 8b438e562..86ac8c735 100644 --- a/400_xowa/src/gplx/xowa/Xop_fxt.java +++ b/400_xowa/src/gplx/xowa/Xop_fxt.java @@ -306,7 +306,8 @@ public class Xop_fxt { } public Xop_fxt Test_parse_page_wiki_str__esc(String raw, String expd) {return Test_parse_page_wiki_str(raw, Xoh_consts.Escape_apos(expd));} public Xop_fxt Test_parse_page_wiki_str(String raw, String expd) { - Tfds.Eq_str_lines(expd, Exec_parse_page_wiki_as_str(raw), raw); + String actl = Exec_parse_page_wiki_as_str(raw); + Tfds.Eq_str_lines(expd, actl, raw); return this; } public void Log_clear() {ctx.App().Msg_log().Clear();} diff --git a/400_xowa/src/gplx/xowa/Xowa_main.java b/400_xowa/src/gplx/xowa/Xowa_main.java index 45fdc752c..5090a7bbe 100644 --- a/400_xowa/src/gplx/xowa/Xowa_main.java +++ b/400_xowa/src/gplx/xowa/Xowa_main.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; public class Xowa_main { - public static void main(String[] args) { + public static void main(String[] args) { gplx.xowa.Xoa_app_.Run(args); } } diff --git a/400_xowa/src/gplx/xowa/Xowe_wiki.java b/400_xowa/src/gplx/xowa/Xowe_wiki.java index 87e9203eb..af85c5f23 100644 --- a/400_xowa/src/gplx/xowa/Xowe_wiki.java +++ b/400_xowa/src/gplx/xowa/Xowe_wiki.java @@ -42,6 +42,7 @@ public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm { this.html__hdump_mgr = new Xow_hdump_mgr(this); this.html_mgr = new Xow_html_mgr(this); this.page_mgr = new Xowe_page_mgr(this); + this.sanitizer = new Xop_sanitizer(app.Parser_amp_mgr(), app.Msg_log()); tdb_fsys_mgr = new Xotdb_fsys_mgr(wiki_dir, ns_mgr); redirect_mgr = new Xop_redirect_mgr(this); @@ -112,6 +113,8 @@ public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm { public Xoax_addon_mgr Addon_mgr() {return addon_mgr;} private final Xoax_addon_mgr addon_mgr = new Xoax_addon_mgr(); public Xog_cbk_mgr Gui__cbk_mgr() {return gui__cbk_mgr;} private final Xog_cbk_mgr gui__cbk_mgr = new Xog_cbk_mgr(); public Xowe_page_mgr Page_mgr() {return page_mgr;} private final Xowe_page_mgr page_mgr; + public Xop_sanitizer Sanitizer() {return sanitizer;} private final Xop_sanitizer sanitizer; + public Xow_hdump_mgr Html__hdump_mgr() {return html__hdump_mgr;} private final Xow_hdump_mgr html__hdump_mgr; public Xoae_app Appe() {return app;} private Xoae_app app; diff --git a/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java b/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java index edf92d369..52fbc7eef 100644 --- a/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java @@ -37,7 +37,8 @@ public class Xoax_addon_mgr { app.Addon_mgr().Itms__add_many // bldrs ( new gplx.xowa.addons.bldrs.files .Xoax_builds_files_addon() - , new gplx.xowa.addons.bldrs.pagelinks .Xoax_builds_pagelinks_addon() + , new gplx.xowa.addons.bldrs.wmdumps.pagelinks .Xoax_builds_pagelinks_addon() + , new gplx.xowa.addons.bldrs.wmdumps.imglinks .Imglnk_addon() , new gplx.xowa.addons.bldrs.utils_rankings .Xoax_builds_utils_rankings_addon() , new gplx.xowa.addons.wikis.searchs .Xoax_builds_search_addon() , new gplx.xowa.addons.bldrs.updates.files .Xoax_updates_files_addon() diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__fsdb_db__create_data.java b/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__fsdb_db__create_data.java index f6dcc10b5..aab4777f3 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__fsdb_db__create_data.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__fsdb_db__create_data.java @@ -37,7 +37,7 @@ public class Xobldr__fsdb_db__create_data extends Xob_cmd__base implements Xob_c public Xobldr__fsdb_db__create_data(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki); if (bldr != null) { this.poll_mgr = new Xobu_poll_mgr(bldr.App()); - wiki.File__fsdb_mode().Tid_v2_bld_y_(); + wiki.File__fsdb_mode().Tid__v2__bld__y_(); this.src_bin_mgr = new Xof_bin_mgr(new Fsm_mnt_mgr(), wiki.File__repo_mgr(), app.File__img_mgr().Wkr_resize_img(), app.Wmf_mgr().Download_wkr().Download_xrg().Download_fmt()); } } diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__fsdb_db__create_orig.java b/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__fsdb_db__create_orig.java index 15519fad3..b121ac794 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__fsdb_db__create_orig.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__fsdb_db__create_orig.java @@ -24,7 +24,7 @@ public class Xobldr__fsdb_db__create_orig extends Xob_cmd__base { public Xobldr__fsdb_db__create_orig(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} @Override public void Cmd_bgn(Xob_bldr bldr) { Xof_fsdb_mode fsdb_mode = wiki.File__fsdb_mode(); - fsdb_mode.Tid_v2_bld_y_(); + fsdb_mode.Tid__v2__bld__y_(); wiki.Init_assert(); Fsdb_db_mgr db_core_mgr = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); this.schema_1 = db_core_mgr.File__schema_is_1(); diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__lnki_temp__create.java b/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__lnki_temp__create.java index 779286ea0..d354b4fe4 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__lnki_temp__create.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/files/cmds/Xobldr__lnki_temp__create.java @@ -81,13 +81,13 @@ public class Xobldr__lnki_temp__create extends Xob_dump_mgr_base implements gplx // init fsdb Xof_fsdb_mgr__sql trg_fsdb_mgr = new Xof_fsdb_mgr__sql(); - wiki.File__fsdb_mode().Tid_v2_bld_y_(); + wiki.File__fsdb_mode().Tid__v2__bld__y_(); Fsdb_db_mgr__v2 fsdb_core = Fsdb_db_mgr__v2_bldr.Get_or_make(wiki, Bool_.Y); trg_fsdb_mgr.Init_by_wiki(wiki); Fsm_mnt_mgr trg_mnt_mgr = trg_fsdb_mgr.Mnt_mgr(); wiki.File_mgr().Init_file_mgr_by_load(wiki); // must happen after fsdb.make wiki.File__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // must happen after init_file_mgr_by_load; remove wmf wkr, else will try to download images during parsing - wiki.File__orig_mgr().Wkrs_del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api); + wiki.File__orig_mgr().Wkrs__del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api); trg_mnt_mgr = new Fsm_mnt_mgr(); trg_mnt_mgr.Ctor_by_load(fsdb_core); trg_mnt_mgr.Mnts__get_insert_idx_(Fsm_mnt_mgr.Mnt_idx_main); diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/hdumps/diffs/Dumpdiff_log_tbl.java b/400_xowa/src/gplx/xowa/addons/bldrs/hdumps/diffs/Dumpdiff_log_tbl.java index 8dd2b4eb3..2e355c68b 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/hdumps/diffs/Dumpdiff_log_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/hdumps/diffs/Dumpdiff_log_tbl.java @@ -45,7 +45,9 @@ class Dumpdiff_log_tbl implements Db_tbl { conn.Txn_end(); stmt__insert.Rls(); } - public void Rls() {} + public void Rls() { + stmt__insert = Db_stmt_.Rls(stmt__insert); + } public static Dumpdiff_log_tbl New(Xowe_wiki wiki) { Db_conn conn = Db_conn_bldr.Instance.Get_or_autocreate(true, wiki.Fsys_mgr().Root_dir().GenSubFil("xowa.diff.sqlite3")); diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/makes/Xomp_html_db_rdr.java b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/makes/Xomp_html_db_rdr.java index fdf09c60a..48c5222ce 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/makes/Xomp_html_db_rdr.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/makes/Xomp_html_db_rdr.java @@ -35,7 +35,9 @@ class Xomp_html_db_rdr { src_tbl.Select_as_row(rv, page_id); } public void Rls() { - for (Xowd_html_tbl src_tbl : src_tbls) + for (Xowd_html_tbl src_tbl : src_tbls) { + if (src_tbl == null) continue; // can be null if fsys has dirs, but db does not have any wkr_ids src_tbl.Conn().Rls_conn(); + } } } diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xomp_parse_mgr.java b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xomp_parse_mgr.java index ff803f0fd..e9e4c20cf 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xomp_parse_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xomp_parse_mgr.java @@ -20,6 +20,7 @@ import gplx.core.threads.*; import gplx.core.threads.utils.*; import gplx.core.c import gplx.xowa.langs.*; import gplx.xowa.langs.cases.*; import gplx.xowa.addons.bldrs.mass_parses.dbs.*; import gplx.xowa.wikis.caches.*; +import gplx.xowa.addons.bldrs.wmdumps.imglinks.*; class Xomp_parse_mgr { private Gfo_countdown_latch latch; public Xomp_parse_mgr_cfg Cfg() {return cfg;} private final Xomp_parse_mgr_cfg cfg = new Xomp_parse_mgr_cfg(); @@ -37,6 +38,7 @@ class Xomp_parse_mgr { Xow_page_cache page_cache = Xomp_tmpl_cache_bldr.New(wiki, cfg.Load_all_templates()); Gfo_cache_mgr commons_cache = new Gfo_cache_mgr().Max_size_(Int_.Max_value).Reduce_by_(Int_.Max_value); Gfo_cache_mgr ifexist_cache = new Gfo_cache_mgr().Max_size_(Int_.Max_value).Reduce_by_(Int_.Max_value); + Xof_orig_wkr__img_links orig_wkr = Xof_orig_wkr__img_links_.Load_all(wiki); // load_wkr: init and start // Xomp_load_wkr load_wkr = new Xomp_load_wkr(wiki, db_core.Mgr_db().Conn(), cfg.Num_pages_in_pool(), cfg.Num_wkrs()); @@ -48,7 +50,7 @@ class Xomp_parse_mgr { Xomp_parse_wkr[] wkrs = new Xomp_parse_wkr[wkr_len]; for (int i = 0; i < wkr_len; ++i) { Xowe_wiki wkr_wiki = Xow_wiki_utl_.Clone_wiki(wiki, wiki.Fsys_mgr().Root_dir()); - Xomp_parse_wkr wkr = new Xomp_parse_wkr(this, wkr_wiki, page_pool, i, cfg, cfg.Cleanup_interval(), cfg.Progress_interval(), cfg.Log_file_lnkis()); + Xomp_parse_wkr wkr = new Xomp_parse_wkr(this, wkr_wiki, orig_wkr, page_pool, i, cfg, cfg.Cleanup_interval(), cfg.Progress_interval(), cfg.Log_file_lnkis()); wkr_wiki.Cache_mgr().Page_cache_(page_cache).Commons_cache_(commons_cache).Ifexist_cache_(ifexist_cache); // remove wmf wkr, else will try to download images during parsing if (wkr_wiki.File__bin_mgr() != null) diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xomp_parse_wkr.java b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xomp_parse_wkr.java index b0cd79159..62c3228ef 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xomp_parse_wkr.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xomp_parse_wkr.java @@ -17,19 +17,21 @@ along with this program. If not, see . */ package gplx.xowa.addons.bldrs.mass_parses.parses; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.mass_parses.*; import gplx.dbs.*; import gplx.xowa.addons.bldrs.mass_parses.dbs.*; +import gplx.xowa.files.origs.*; import gplx.xowa.htmls.core.bldrs.*; import gplx.xowa.parsers.*; class Xomp_parse_wkr implements Gfo_invk { private final Xomp_parse_mgr mgr; private final Xomp_page_pool page_pool; + private final Xof_orig_wkr orig_wkr; private final int idx; private final List_adp list = List_adp_.New(); private int list_idx = 0, list_len = 0; private final Xomp_parse_mgr_cfg cfg; private int done_count; private long done_time; private Xomp_wkr_db wkr_db; private int cleanup_interval, commit_interval; private boolean log_file_lnkis; - public Xomp_parse_wkr(Xomp_parse_mgr mgr, Xowe_wiki wiki, Xomp_page_pool page_pool, int idx, Xomp_parse_mgr_cfg cfg, int cleanup_interval, int commit_interval, boolean log_file_lnkis) { - this.mgr = mgr; this.wiki = wiki; + public Xomp_parse_wkr(Xomp_parse_mgr mgr, Xowe_wiki wiki, Xof_orig_wkr orig_wkr, Xomp_page_pool page_pool, int idx, Xomp_parse_mgr_cfg cfg, int cleanup_interval, int commit_interval, boolean log_file_lnkis) { + this.mgr = mgr; this.wiki = wiki; this.orig_wkr = orig_wkr; this.page_pool = page_pool; this.idx = idx; this.wkr_db = mgr.Db_core().Wkr_db(Bool_.Y, idx); // NOTE: must go in ctor, or else thread issues @@ -39,7 +41,7 @@ class Xomp_parse_wkr implements Gfo_invk { this.log_file_lnkis = log_file_lnkis; } public Xowe_wiki Wiki() {return wiki;} private final Xowe_wiki wiki; - public Xob_hdump_bldr Hdump_bldr() {return hdump_bldr;} private final Xob_hdump_bldr hdump_bldr = new Xob_hdump_bldr(); + public Xob_hdump_bldr Hdump_bldr() {return hdump_bldr;} private final Xob_hdump_bldr hdump_bldr = new Xob_hdump_bldr(); public void Exec() { // init Xow_parser_mgr parser_mgr = wiki.Parser_mgr(); @@ -47,7 +49,7 @@ class Xomp_parse_wkr implements Gfo_invk { // disable file download wiki.File_mgr().Init_file_mgr_by_load(wiki); // must happen after fsdb.make wiki.File__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // must happen after init_file_mgr_by_load; remove wmf wkr, else will try to download images during parsing - wiki.File__orig_mgr().Wkrs_del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api); + wiki.File__orig_mgr().Wkrs__set(orig_wkr); // disable categories else progress messages written (also for PERF) wiki.Html_mgr().Page_wtr_mgr().Wkr(gplx.xowa.wikis.pages.Xopg_page_.Tid_read).Ctgs_enabled_(false); diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xow_wiki_utl_.java b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xow_wiki_utl_.java index 95ac8653f..ce49210d7 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xow_wiki_utl_.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/Xow_wiki_utl_.java @@ -23,6 +23,8 @@ public class Xow_wiki_utl_ { Xol_lang_itm_.Lang_init(lang); Xowe_wiki rv = new Xowe_wiki(wiki.Appe(), lang, gplx.xowa.wikis.nss.Xow_ns_mgr_.default_(lang.Case_mgr()), wiki.Domain_itm(), wiki_dir); rv.Init_by_wiki(); + rv.File_mgr().Repo_mgr().Clone(wiki.File_mgr().Repo_mgr()); + rv.File__fsdb_mode().Tid__v2__bld__y_(); return rv; } } diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Db_bulk_cmd_base.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Db_bulk_cmd_base.java new file mode 100644 index 000000000..7db7db63f --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Db_bulk_cmd_base.java @@ -0,0 +1,77 @@ +/* +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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; +import gplx.dbs.*; +public abstract class Db_bulk_cmd_base { + public void Exec() { + int uid_max = Get_uid_max(); + int uid_rng = Get_uid_rng(); + int uid_bgn = -1, uid_end = uid_rng; + this.Bulk_bgn(); + while (uid_bgn <= uid_max) { + Bulk_run(uid_bgn, uid_end); + uid_bgn += uid_rng; + uid_end += uid_rng; + } + this.Bulk_end(); + } + protected abstract int Get_uid_max(); + protected abstract int Get_uid_rng(); + protected abstract void Bulk_bgn(); + protected abstract void Bulk_end(); + protected abstract void Bulk_run(int uid_bgn, int uid_end); +} +class Imglnk_bulk_cmd__img_id extends Db_bulk_cmd_base { + private final Db_conn conn; + private final Db_attach_mgr attach_mgr; + private final int img_wiki; + private String sql; + public Imglnk_bulk_cmd__img_id(Db_conn conn, boolean wiki_is_local, Xowe_wiki wiki) { + this.conn = conn; + this.attach_mgr = new Db_attach_mgr(conn, new Db_attach_itm("page_db", wiki.Data__core_mgr().Db__core().Tbl__page().Conn())); + this.img_wiki = wiki_is_local ? 0 : 1; + // xowa.wiki.image.sqlite3 + // INSERT INTO img_link (img_name, img_wiki) SELECT img_name, Count(img_name) FROM img_link_tmp GROUP BY img_name + } + @Override protected int Get_uid_max() { + return conn.Exec_select_as_int("SELECT Max(img_uid) FROM img_link_tmp", -1); + } + @Override protected int Get_uid_rng() {return 10000;} + @Override protected void Bulk_bgn() { + sql = String_.Concat_lines_nl_skip_last // ANSI.Y + ( "UPDATE img_link_tmp" + , "SET img_wiki = {0}" + , ", img_id = (SELECT p.page_id FROM page p WHERE p.page_namespace = 6 AND p.page_title = img_link_tmp.img_name)" + , "WHERE img_uid > {1} AND img_uid <= {2}" + , "AND img_name IN (SELECT p.page_title FROM page p WHERE p.page_namespace = 6 AND p.page_title = img_link_tmp.img_name)" + ); + sql = attach_mgr.Resolve_sql(sql); + attach_mgr.Attach(); + conn.Txn_bgn("imglnk.bulk"); + } + @Override protected void Bulk_end() { + conn.Txn_end(); + attach_mgr.Detach(); + } + @Override protected void Bulk_run(int uid_bgn, int uid_end) { + conn.Exec_sql(String_.Format("updating img_link_tmp; wiki={0} uid={1}", img_wiki, uid_bgn), String_.Format(sql, img_wiki, uid_bgn, uid_end)); + } + public static void Bulk_exec(Db_conn conn, boolean wiki_is_local, Xowe_wiki wiki) { + new Imglnk_bulk_cmd__img_id(conn, wiki_is_local, wiki).Exec(); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_addon.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_addon.java new file mode 100644 index 000000000..86e99ffef --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_addon.java @@ -0,0 +1,29 @@ +/* +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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; +import gplx.xowa.bldrs.wkrs.*; +import gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs.*; +public class Imglnk_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr { + public Xob_cmd[] Bldr_cmds() { + return new Xob_cmd[] + { Imglnk_bldr_cmd.Prototype + }; + } + + public String Addon__key() {return "xowa.builds.imglinks";} +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_bldr_cmd.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_bldr_cmd.java new file mode 100644 index 000000000..af120ba2d --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_bldr_cmd.java @@ -0,0 +1,51 @@ +/* +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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; +import gplx.dbs.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.sqls.*; +public class Imglnk_bldr_cmd extends Xob_sql_dump_base implements Sql_file_parser_cmd { + private Imglnk_bldr_mgr mgr; + private int tmp_page_id; + private int rows = 0; + + public Imglnk_bldr_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); this.make_fil_len = Io_mgr.Len_mb;} + @Override public String Sql_file_name() {return "imagelinks";} + + @Override public void Cmd_bgn_hook(Xob_bldr bldr, Sql_file_parser parser) { + parser.Fld_cmd_(this).Flds_req_idx_(3, 0, 1); + mgr = new Imglnk_bldr_mgr(wiki); + } + public void Exec(byte[] src, byte[] fld_key, int fld_idx, int fld_bgn, int fld_end, Bry_bfr file_bfr, Sql_file_parser_data data) { + switch (fld_idx) { + case Fld__il_from: this.tmp_page_id = Bry_.To_int_or(src, fld_bgn, fld_end, -1); break; + case Fld__il_to: + mgr.Tmp_tbl().Insert_by_batch(tmp_page_id, Bry_.Mid(src, fld_bgn, fld_end)); + if (++rows % 100000 == 0) usr_dlg.Prog_many("", "", "reading row ~{0}", Int_.To_str_fmt(rows, "#,##0")); + break; + } + } private static final byte Fld__il_from = 0, Fld__il_to = 1; + @Override public void Cmd_end() { + if (fail) return; + mgr.On_cmd_end(); + } + + public static final String BLDR_CMD_KEY = "wiki.imagelinks"; + @Override public String Cmd_key() {return BLDR_CMD_KEY;} + public static final Xob_cmd Prototype = new Imglnk_bldr_cmd(null, null); + @Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Imglnk_bldr_cmd(bldr, wiki);} +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_bldr_mgr.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_bldr_mgr.java new file mode 100644 index 000000000..7f27e4db3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_bldr_mgr.java @@ -0,0 +1,51 @@ +/* +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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; +import gplx.dbs.*; +import gplx.xowa.bldrs.*; +import gplx.xowa.files.repos.*; +class Imglnk_bldr_mgr { + private final Db_conn conn; + private final Xowe_wiki wiki; + public Imglnk_tmp_tbl Tmp_tbl() {return tmp_tbl;} private Imglnk_tmp_tbl tmp_tbl; + public Imglnk_bldr_mgr(Xowe_wiki wiki) { + wiki.Init_assert(); + this.wiki = wiki; + this.conn = Xob_db_file.New__img_link(wiki).Conn(); + this.tmp_tbl = new Imglnk_tmp_tbl(conn); + conn.Meta_tbl_remake(tmp_tbl); + tmp_tbl.Create_tbl(); + tmp_tbl.Insert_bgn(); + } + public void On_cmd_end() { + // finalize txn; create idx + tmp_tbl.Insert_end(); + tmp_tbl.Create_idx__img_ttl(); + + // create reg_tbl + Imglnk_reg_tbl reg_tbl = new Imglnk_reg_tbl(conn); + conn.Meta_tbl_remake(reg_tbl); + reg_tbl.Create_idx__src_ttl(); + reg_tbl.Insert(conn, Xof_repo_itm_.Repo_local , wiki); + reg_tbl.Insert(conn, Xof_repo_itm_.Repo_remote, wiki.Appe().Wiki_mgr().Wiki_commons()); + reg_tbl.Create_idx__trg_ttl(); + +// Imglnk_bulk_cmd__img_id.Bulk_exec(conn, Bool_.Y, wiki); +// Imglnk_bulk_cmd__img_id.Bulk_exec(conn, Bool_.N, wiki.Appe().Wiki_mgr().Wiki_commons()); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_reg_tbl.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_reg_tbl.java new file mode 100644 index 000000000..f8de5de10 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_reg_tbl.java @@ -0,0 +1,69 @@ +/* +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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; +import gplx.dbs.*; +import gplx.xowa.bldrs.*; +public class Imglnk_reg_tbl implements Db_tbl { + private final String tbl_name = "imglnk_reg"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); + private final String fld__img_src, fld__img_trg, fld__img_repo; + private final Db_conn conn; + public Imglnk_reg_tbl(Db_conn conn) { + this.conn = conn; + fld__img_src = flds.Add_str("img_src", 255); + fld__img_trg = flds.Add_str("img_trg", 255); + fld__img_repo = flds.Add_byte("img_repo"); + flds.Add_int("img_count"); + conn.Rls_reg(this); + } + public Db_conn Conn() {return conn;} + public String Tbl_name() {return tbl_name;} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_idx__src_ttl() {conn.Meta_idx_create(tbl_name, fld__img_src, fld__img_src, fld__img_repo);} + public void Create_idx__trg_ttl() {conn.Meta_idx_create(tbl_name, fld__img_trg, fld__img_trg, fld__img_repo);} + public void Insert(Db_conn conn, byte repo_id, Xowe_wiki wiki) { + String repo_id_str = Byte_.To_str(repo_id); + Db_attach_mgr attach_mgr = new Db_attach_mgr(conn); + String sql = ""; + + Xob_db_file redirect_db = Xob_db_file.New__wiki_redirect(wiki.Fsys_mgr().Root_dir()); + attach_mgr.Conn_links_(new Db_attach_itm("redirect_db", redirect_db.Conn())); + sql = String_.Concat_lines_nl_skip_last // ANSI.Y + ( "INSERT INTO imglnk_reg (img_src, img_trg, img_repo, img_count)" + , "SELECT ilt.img_name, r.trg_ttl, " + repo_id_str + ", Count(ilt.img_name)" + , "FROM imglnk_tmp ilt" + , " JOIN redirect r ON ilt.img_name = r.src_ttl" + , " LEFT JOIN imglnk_reg il ON il.img_src = ilt.img_name" + , "WHERE il.img_src IS NULL" + , "GROUP BY ilt.img_name" + ); + attach_mgr.Exec_sql_w_msg("imglnk_reg.insert.redirect: repo=" + repo_id_str, sql); + + attach_mgr.Conn_links_(new Db_attach_itm("page_db", wiki.Data__core_mgr().Db__core().Tbl__page().Conn())); + sql = String_.Concat_lines_nl_skip_last // ANSI.Y + ( "INSERT INTO imglnk_reg (img_src, img_trg, img_repo, img_count)" + , "SELECT ilt.img_name, ilt.img_name, " + repo_id_str + ", Count(ilt.img_name)" + , "FROM imglnk_tmp ilt" + , " JOIN page p ON p.page_namespace = 6 AND p.page_title = ilt.img_name" + , " LEFT JOIN imglnk_reg il ON il.img_src = ilt.img_name" + , "WHERE il.img_src IS NULL" + , "GROUP BY ilt.img_name" + ); + attach_mgr.Exec_sql_w_msg("imglnk_reg.insert.direct: repo=" + repo_id_str, sql); + } + public void Rls() {} +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_tmp_tbl.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_tmp_tbl.java new file mode 100644 index 000000000..875611d17 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Imglnk_tmp_tbl.java @@ -0,0 +1,54 @@ +/* +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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; +import gplx.dbs.*; +public class Imglnk_tmp_tbl implements Db_tbl { + private final String tbl_name = "imglnk_tmp"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); + private final String fld__page_id, fld__img_name; + private final Db_conn conn; + private Db_stmt stmt__insert; + public Imglnk_tmp_tbl(Db_conn conn) { + this.conn = conn; + flds.Add_int_pkey_autonum("img_uid"); + this.fld__page_id = flds.Add_int("page_id"); + this.fld__img_name = flds.Add_str("img_name", 255); + flds.Add_int_dflt("img_wiki", -1); + flds.Add_int_dflt("img_id", -1); + conn.Rls_reg(this); + } + public Db_conn Conn() {return conn;} + public String Tbl_name() {return tbl_name;} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Insert_bgn() { + stmt__insert = conn.Stmt_insert(tbl_name, fld__page_id, fld__img_name); + conn.Txn_bgn(tbl_name); + } + public void Insert_by_batch(int page_id, byte[] img_name) { + stmt__insert.Clear().Val_int(fld__page_id, page_id).Val_bry_as_str(fld__img_name, img_name).Exec_insert(); + } + public void Insert_end() { + conn.Txn_end(); + stmt__insert.Rls(); + } + public void Create_idx__img_ttl() { + conn.Meta_idx_create(tbl_name, fld__img_name, fld__img_name); + } + public void Rls() { + stmt__insert = Db_stmt_.Rls(stmt__insert); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Xof_orig_wkr__img_links.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Xof_orig_wkr__img_links.java new file mode 100644 index 000000000..c865adecf --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Xof_orig_wkr__img_links.java @@ -0,0 +1,32 @@ +/* +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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; +import gplx.xowa.files.origs.*; +public class Xof_orig_wkr__img_links implements Xof_orig_wkr { + private final Ordered_hash hash = Ordered_hash_.New_bry(); + public byte Tid() {return Xof_orig_wkr_.Tid_xowa_img_links;} + public Xof_orig_itm Find_as_itm(byte[] ttl, int list_idx, int list_len) {return (Xof_orig_itm)hash.Get_by(ttl);} + public void Find_by_list(Ordered_hash rv, List_adp itms) {throw Err_.new_unimplemented();} + public boolean Add_orig(byte repo, byte[] page, int ext_id, int w, int h, byte[] redirect) {return false;} + public void Db_txn_save() {} + public void Db_rls() {} + + public void Add_by_db(Xof_orig_itm itm) { + hash.Add(itm.Ttl(), itm); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Xof_orig_wkr__img_links_.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Xof_orig_wkr__img_links_.java new file mode 100644 index 000000000..43990fcd1 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/imglinks/Xof_orig_wkr__img_links_.java @@ -0,0 +1,63 @@ +/* +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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; +import gplx.dbs.*; +import gplx.xowa.bldrs.*; +import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; +public class Xof_orig_wkr__img_links_ { + public static Xof_orig_wkr__img_links Load_all(Xowe_wiki wiki) { + Xof_orig_wkr__img_links rv = new Xof_orig_wkr__img_links(); + + Db_conn conn = Xob_db_file.New__img_link(wiki).Conn(); + Load_by_wiki(rv, conn, Xof_repo_itm_.Repo_local , wiki); + Load_by_wiki(rv, conn, Xof_repo_itm_.Repo_remote, wiki.Appe().Wiki_mgr().Wiki_commons()); + + return rv; + } + private static void Load_by_wiki(Xof_orig_wkr__img_links rv, Db_conn conn, byte repo_id, Xowe_wiki wiki) { + String sql = String_.Concat_lines_nl_skip_last // ANSI.Y + ( "SELECT ilr.img_repo, ilr.img_src, i.img_media_type, i.img_minor_mime, i.img_size, i.img_width, i.img_height, i.img_bits, i.img_ext_id, i.img_timestamp, ilr.img_trg AS img_redirect" + , "FROM imglnk_reg ilr" + , " JOIN image i ON ilr.img_trg = i.img_name" + , "WHERE ilr.img_repo = " + repo_id + ); + + Xob_db_file img_db = Xob_db_file.New__wiki_image(wiki.Fsys_mgr().Root_dir()); + Db_attach_mgr attach_mgr = new Db_attach_mgr(conn, new Db_attach_itm("img_db", img_db.Conn())); + sql = attach_mgr.Resolve_sql(sql); + attach_mgr.Attach(); + + int count = 0; + Db_rdr rdr = conn.Stmt_sql(sql).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + rv.Add_by_db(new Xof_orig_itm + ( rdr.Read_byte("img_repo") + , rdr.Read_bry_by_str("img_src") + , rdr.Read_int("img_ext_id") + , rdr.Read_int("img_width") + , rdr.Read_int("img_height") + , rdr.Read_bry_by_str("img_redirect") + )); + if ((++count % 10000) == 0) + Gfo_usr_dlg_.Instance.Prog_many("", "", "loading img_links.orig: rows=~{0}", count); + } + } finally {rdr.Rls();} + attach_mgr.Detach(); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/Xoax_builds_pagelinks_addon.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/Xoax_builds_pagelinks_addon.java similarity index 79% rename from 400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/Xoax_builds_pagelinks_addon.java rename to 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/Xoax_builds_pagelinks_addon.java index ebb65bf08..c55852374 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/Xoax_builds_pagelinks_addon.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/Xoax_builds_pagelinks_addon.java @@ -15,9 +15,9 @@ 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.addons.bldrs.pagelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; +package gplx.xowa.addons.bldrs.wmdumps.pagelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; import gplx.xowa.bldrs.wkrs.*; -import gplx.xowa.addons.bldrs.pagelinks.bldrs.*; +import gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs.*; public class Xoax_builds_pagelinks_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr { public Xob_cmd[] Bldr_cmds() { return new Xob_cmd[] diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/bldrs/Pglnk_bldr_cmd.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/bldrs/Pglnk_bldr_cmd.java similarity index 90% rename from 400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/bldrs/Pglnk_bldr_cmd.java rename to 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/bldrs/Pglnk_bldr_cmd.java index 392e53de3..e012c542c 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/bldrs/Pglnk_bldr_cmd.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/bldrs/Pglnk_bldr_cmd.java @@ -15,9 +15,9 @@ 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.addons.bldrs.pagelinks.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.pagelinks.*; +package gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.sqls.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.data.*; import gplx.xowa.addons.bldrs.pagelinks.dbs.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.data.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.dbs.*; public class Pglnk_bldr_cmd extends Xob_sql_dump_base implements Sql_file_parser_cmd { private Db_conn conn; private Pglnk_page_link_temp_tbl temp_tbl; diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/dbs/Pglnk_page_link_tbl.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/dbs/Pglnk_page_link_tbl.java similarity index 87% rename from 400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/dbs/Pglnk_page_link_tbl.java rename to 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/dbs/Pglnk_page_link_tbl.java index cb5babf69..ce347b861 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/dbs/Pglnk_page_link_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/dbs/Pglnk_page_link_tbl.java @@ -15,7 +15,7 @@ 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.addons.bldrs.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.pagelinks.*; +package gplx.xowa.addons.bldrs.wmdumps.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.*; import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.dbs.cfgs.*; public class Pglnk_page_link_tbl implements Rls_able { private final String tbl_name = "page_link"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/dbs/Pglnk_page_link_temp_tbl.java b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/dbs/Pglnk_page_link_temp_tbl.java similarity index 89% rename from 400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/dbs/Pglnk_page_link_temp_tbl.java rename to 400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/dbs/Pglnk_page_link_temp_tbl.java index ddbdc81d0..f976b5e3a 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/pagelinks/dbs/Pglnk_page_link_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/wmdumps/pagelinks/dbs/Pglnk_page_link_temp_tbl.java @@ -15,7 +15,7 @@ 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.addons.bldrs.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.pagelinks.*; +package gplx.xowa.addons.bldrs.wmdumps.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.*; import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.dbs.cfgs.*; public class Pglnk_page_link_temp_tbl implements Rls_able { private final String tbl_name = "page_link_temp"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/bldrs/Srch_bldr_mgr_.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/bldrs/Srch_bldr_mgr_.java index caaf0dddd..119d8ef3e 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/bldrs/Srch_bldr_mgr_.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/bldrs/Srch_bldr_mgr_.java @@ -27,8 +27,8 @@ public class Srch_bldr_mgr_ { int page_rank_iterations = app.Api_root().Bldr().Wiki().Import().Page_rank().Iteration_max(); boolean page_rank_enabled = page_rank_iterations > 0; if (page_rank_enabled) { - bldr.Cmd_mgr().Add(new gplx.xowa.bldrs.cmds.utils.Xob_download_cmd(bldr, wiki).Dump_type_(gplx.xowa.addons.bldrs.pagelinks.bldrs.Pglnk_bldr_cmd.Dump_type_key)); - bldr.Cmd_mgr().Add_many(wiki, gplx.xowa.addons.bldrs.pagelinks.bldrs.Pglnk_bldr_cmd.BLDR_CMD_KEY); + bldr.Cmd_mgr().Add(new gplx.xowa.bldrs.cmds.utils.Xob_download_cmd(bldr, wiki).Dump_type_(gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs.Pglnk_bldr_cmd.Dump_type_key)); + bldr.Cmd_mgr().Add_many(wiki, gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs.Pglnk_bldr_cmd.BLDR_CMD_KEY); } bldr.Cmd_mgr().Add(new Xobldr__page__page_score(bldr, wiki).Iteration_max_(page_rank_iterations)); bldr.Cmd_mgr().Add(new Xobldr__link__link_score(bldr, wiki).Page_rank_enabled_(page_rank_enabled).Delete_plink_db_(Bool_.Y)); diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/bldrs/cmds/Xobldr__page__page_score.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/bldrs/cmds/Xobldr__page__page_score.java index a14f6bea6..cf758cca0 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/bldrs/cmds/Xobldr__page__page_score.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/bldrs/cmds/Xobldr__page__page_score.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.addons.wikis.searchs.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.addons.wikis.searchs.bldrs.*; import gplx.dbs.*; import gplx.dbs.qrys.*; -import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.bldrs.pagelinks.dbs.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; public class Xobldr__page__page_score extends Xob_cmd__base implements Xob_cmd { // create page_rank in page_db; drop and vaccuum later; avoid cross db for now private double damping_factor = .85; diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/htmls/Srch_html_page_bldr.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/htmls/Srch_html_page_bldr.java index bbb91865e..60f23b990 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/htmls/Srch_html_page_bldr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/htmls/Srch_html_page_bldr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.addons.wikis.searchs.specials.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.addons.wikis.searchs.specials.*; import gplx.core.brys.fmtrs.*; -import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.langs.numbers.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.langs.numbers.*; import gplx.langs.htmls.entitys.*; import gplx.xowa.addons.wikis.searchs.specials.*; import gplx.xowa.addons.wikis.searchs.searchers.*; import gplx.xowa.addons.wikis.searchs.searchers.rslts.*; public class Srch_html_page_bldr { private final Bry_bfr tmp_bfr = Bry_bfr_.New_w_size(255); diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java index 09370360e..de7e0a16c 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java @@ -21,9 +21,9 @@ import gplx.xowa.wikis.data.*; import gplx.xowa.apps.apis.xowa.bldrs.imports.pag public class Xoapi_import implements Gfo_invk { public Xoapi_page_rank Page_rank() {return page_rank;} private final Xoapi_page_rank page_rank = new Xoapi_page_rank(); public long Layout_all_max() {return layout_all_max;} private long layout_all_max = 0; // disable by default; may set to 200 MB in future - public long Layout_text_max() {return layout_text_max;} private long layout_text_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB - public long Layout_html_max() {return layout_html_max;} private long layout_html_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB - public long Layout_file_max() {return layout_file_max;} private long layout_file_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB + public long Layout_text_max() {return layout_text_max;} private long layout_text_max = Io_size_.To_long_by_int_mb(1500); // 1.0 GB + public long Layout_html_max() {return layout_html_max;} private long layout_html_max = Io_size_.To_long_by_int_mb(1500); // 1.0 GB + public long Layout_file_max() {return layout_file_max;} private long layout_file_max = Io_size_.To_long_by_int_mb(1500); // 1.0 GB public long Cat_link_db_max() {return cat_link_db_max;} private long cat_link_db_max = Io_size_.To_long_by_int_mb(1500); // 3.6 GB; v1 public long Text_db_max() {return text_db_max;} private long text_db_max = Io_size_.To_long_by_int_mb(1500); // 3.0 GB; v1 public long Html_db_max() {return html_db_max;} private long html_db_max = Io_size_.To_long_by_int_mb(1500); // 3.0 GB; v2; use same as text diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/pages/Xoapi_view.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/pages/Xoapi_view.java index f7a81dcfb..6c0f0949f 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/pages/Xoapi_view.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/pages/Xoapi_view.java @@ -17,8 +17,10 @@ along with this program. If not, see . */ package gplx.xowa.apps.apis.xowa.gui.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; import gplx.xowa.apps.apis.xowa.gui.*; import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.xowa.guis.*; import gplx.xowa.guis.views.*; import gplx.xowa.wikis.pages.*; +import gplx.langs.htmls.encoders.*; public class Xoapi_view implements Gfo_invk { private Xoae_app app; private Xog_win_itm win; + private final Gfo_url_encoder fsys_encoder = Gfo_url_encoder_.New__fsys_wnt().Make(); public void Init_by_kit(Xoae_app app) { this.app = app; this.win = app.Gui_mgr().Browser_win(); } @@ -36,7 +38,7 @@ public class Xoapi_view implements Gfo_invk { public void Save_as() { if (this.Active_tab_is_null()) return; Xog_tab_itm tab = win.Tab_mgr().Active_tab(); - String file_name = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_wnt.Encode_str(String_.new_u8(tab.Page().Ttl().Full_url())) + ".html"; + String file_name = fsys_encoder.Encode_str(String_.new_u8(tab.Page().Ttl().Full_url())) + ".html"; String file_url = app.Gui_mgr().Kit().New_dlg_file(Gfui_kit_.File_dlg_type_save, "Select file to save to:").Init_file_(file_name).Ask(); if (String_.Len_eq_0(file_url)) return; Io_mgr.Instance.SaveFilStr(file_url, tab.Html_box().Text()); diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java index 29ac4d0f3..ed32efbb2 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java @@ -26,6 +26,7 @@ public class Xow_url_parser { private final Gfo_url_encoder encoder; private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255); private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url gfo_url = new Gfo_url(); + private final Gfo_url_encoder gfs_encoder = Gfo_url_encoder_.New__gfs().Make(); private final Xoa_app app; private final Xow_wiki wiki; private final byte[] domain_bry; private byte tmp_protocol_tid; private int tmp_tid; @@ -146,7 +147,7 @@ public class Xow_url_parser { private void Bld_xowa() { tmp_tid = Xoa_url_.Tid_xcmd; tmp_page = Bry_.Mid(tmp_raw, Gfo_protocol_itm.Len_xcmd); // NOTE: just get String after protocol; anchor (#) or query params (?) must not be parsed - tmp_page = gplx.langs.htmls.encoders.Gfo_url_encoder_.Gfs.Decode(tmp_page); // NOTE: should be decoded; EX: %20 -> " " + tmp_page = gfs_encoder.Decode(tmp_page); // NOTE: should be decoded; EX: %20 -> " " } private void Bld_page_by_file_ns() { tmp_tid = Xoa_url_.Tid_page; diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xowmf_api_mgr.java b/400_xowa/src/gplx/xowa/apps/wms/apis/Xowmf_api_mgr.java similarity index 84% rename from 400_xowa/src/gplx/xowa/bldrs/wms/apis/Xowmf_api_mgr.java rename to 400_xowa/src/gplx/xowa/apps/wms/apis/Xowmf_api_mgr.java index 7f983e1a9..1b26fab3d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xowmf_api_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/wms/apis/Xowmf_api_mgr.java @@ -15,7 +15,8 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; +package gplx.xowa.apps.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; +import gplx.xowa.apps.wms.apis.origs.*; public class Xowmf_api_mgr { public Xoapi_orig_base Api_orig() {return api_orig;} public void Api_orig_(Xoapi_orig_base v) {api_orig = v;} private Xoapi_orig_base api_orig = new Xoapi_orig_wmf(); } diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base.java b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_base.java similarity index 90% rename from 400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base.java rename to 400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_base.java index 0637cb76f..db2de82e1 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base.java +++ b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_base.java @@ -15,7 +15,7 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; +package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*; import gplx.core.ios.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.downloads.*; public abstract class Xoapi_orig_base { public boolean Api_query_size(Xoapi_orig_rslts rv, Xof_download_wkr download_wkr, Xow_repo_mgr repo_mgr, byte[] ttl, int width, int height) { diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base_tst.java b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_base_tst.java similarity index 91% rename from 400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base_tst.java rename to 400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_base_tst.java index 5487037f2..64cabf0ac 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base_tst.java +++ b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_base_tst.java @@ -15,8 +15,9 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; +package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*; import org.junit.*; +// https://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Main Page&rvprop=timestamp|content public class Xoapi_orig_base_tst { Xoapi_orig_base_fxt fxt = new Xoapi_orig_base_fxt(); @Before public void init() {fxt.Clear();} diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_mok.java b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_mok.java similarity index 86% rename from 400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_mok.java rename to 400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_mok.java index c719b1120..466055f19 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_mok.java +++ b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_mok.java @@ -15,7 +15,7 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; +package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*; import gplx.xowa.files.downloads.*; public class Xoapi_orig_mok extends Xoapi_orig_base { private String wiki_str = "", ttl_str = "", redirect_str = ""; private int orig_w, orig_h; private boolean fail = false; @@ -32,5 +32,5 @@ public class Xoapi_orig_mok extends Xoapi_orig_base { rv.Init_all(repo_wiki_key, orig_page, orig_w, orig_h); return true; } - public static final Xoapi_orig_mok Instance = new Xoapi_orig_mok(); Xoapi_orig_mok() {} + public static final Xoapi_orig_mok Instance = new Xoapi_orig_mok(); Xoapi_orig_mok() {} } \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_rslts.java b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_rslts.java similarity index 87% rename from 400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_rslts.java rename to 400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_rslts.java index 40b88ce29..5540add50 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_rslts.java +++ b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_rslts.java @@ -15,7 +15,7 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; +package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*; public class Xoapi_orig_rslts { public byte[] Orig_wiki() {return orig_wiki;} private byte[] orig_wiki; public byte[] Orig_page() {return orig_page;} private byte[] orig_page; diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_wmf.java b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java similarity index 95% rename from 400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_wmf.java rename to 400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java index 463daa5c5..5bed2850d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_wmf.java +++ b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java @@ -15,7 +15,7 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; +package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*; import gplx.core.primitives.*; import gplx.core.net.*; import gplx.core.envs.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.files.downloads.*; diff --git a/400_xowa/src/gplx/xowa/apps/wms/apis/revisions/Xowm_revision_base.java b/400_xowa/src/gplx/xowa/apps/wms/apis/revisions/Xowm_revision_base.java new file mode 100644 index 000000000..0e4d782d8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/wms/apis/revisions/Xowm_revision_base.java @@ -0,0 +1,98 @@ +/* +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.apps.wms.apis.revisions; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*; +import gplx.langs.jsons.*; +import gplx.xowa.files.downloads.*; +public abstract class Xowm_revision_base { +} +class Xowm_revision_wmf extends Xowm_revision_base { + private final Bry_bfr bfr = Bry_bfr_.New(); + private final Json_parser json_parser = new Json_parser(); + public Xowm_revn_data Get_revn_or_null(Xof_download_wkr download_wkr, Xow_wiki wiki, Xoa_ttl page_ttl) { + if (!gplx.core.ios.IoEngine_system.Web_access_enabled) return null; + // create a ctx Object + return Get_revn_by_page(download_wkr, wiki.Domain_bry(), page_ttl.Full_db()); + } + private Xowm_revn_data Get_revn_by_page(Xof_download_wkr download_wkr, byte[] wiki_domain, byte[] ttl_full_db) { + byte[] json = Download(bfr, download_wkr, wiki_domain, ttl_full_db); + Xowm_revn_data rv = Parse_json(wiki_domain, json); + // Parse_wtxt(rv, download_wkr, wiki_domain); + return rv; + } + public void Parse_wtxt(Xowe_wiki wiki, byte[] ttl_full_db, byte[] wtxt) { +// Xoae_page page = Xoae_page.New(wiki, wiki.Ttl_parse(ttl_full_db)); +// page.Db().Text().Text_bry_(wtxt); +// page.Page_fetcher_(this); +// wiki.Parser_mgr().Parse(page, true); + } + private byte[] Download(Bry_bfr bfr, Xof_download_wkr download_wkr, byte[] wiki_domain, byte[] ttl_full_db) { + // build api; EX: "https://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=ids|timestamp|content&titles=Main%20Page + Xowm_api_bldr.Bld_bgn(bfr, wiki_domain); + bfr.Add_str_a7("action=query&prop=revisions&rvprop=ids|timestamp|content&titles="); + bfr.Add(ttl_full_db); + + // download bry + return download_wkr.Download_xrg().Exec_as_bry(bfr.To_str_and_clear()); + } + private Xowm_revn_data Parse_json(byte[] wiki_domain, byte[] json) { + Json_doc jdoc = json_parser.Parse(json); + + // get page_data; note that nde has key of page_id; EX: query:{pages:{1234:{}}} + Json_nde page_nde = (Json_nde)jdoc.Get_grp_many(Path__query, Path__pages); // /query/pages/ + page_nde = page_nde.Get_as_nde(0); // {page_id}/ + int page_id = page_nde.Get_as_int("pageid"); + int page_ns = page_nde.Get_as_int("ns"); + byte[] page_ttl = page_nde.Get_as_bry("title"); + + // get revn_data + Json_nde revn_nde = page_nde.Get_as_nde("revisions"); + int revn_id = revn_nde.Get_as_int("revid"); + DateAdp revn_time = revn_nde.Get_as_date_by_utc("timestamp"); + byte[] revn_text = revn_nde.Get_as_bry("*"); + return new Xowm_revn_data(wiki_domain, page_id, page_ns, page_ttl, revn_id, revn_time, revn_text); + } + private final byte[] Path__query = Bry_.new_a7("query"), Path__pages = Bry_.new_a7("pages"); +} +/* +{ + "batchcomplete": "", + "query": { + "pages": { + "15580374": { + "pageid": 15580374, + "ns": 0, + "title": "Main Page", + "revisions": [ + { + "timestamp": "2015-12-26T10:03:53Z", + "contentformat": "text/x-wiki", + "contentmodel": "wikitext", + "*": "[[A]]" + } + ] + } + } + } +*/ +class Xowm_api_bldr { + public static void Bld_bgn(Bry_bfr bfr, byte[] wiki) { + bfr.Add_str_a7("https://"); + bfr.Add(wiki); + bfr.Add_str_a7("/w/api.php?"); + } +} diff --git a/400_xowa/src/gplx/xowa/apps/wms/apis/revisions/Xowm_revn_data.java b/400_xowa/src/gplx/xowa/apps/wms/apis/revisions/Xowm_revn_data.java new file mode 100644 index 000000000..32855bb71 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/wms/apis/revisions/Xowm_revn_data.java @@ -0,0 +1,40 @@ +/* +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.apps.wms.apis.revisions; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*; +public class Xowm_revn_data { + public Xowm_revn_data(byte[] wiki_domain + , int page_id, int page_ns, byte[] page_ttl + , int revn_id, DateAdp revn_time, byte[] revn_text) { + this.wiki_domain = wiki_domain; + this.page_id = page_id; + this.page_ns = page_ns; + this.page_ttl = page_ttl; + this.revn_id = revn_id; + this.revn_time = revn_time; + this.revn_text = revn_text; + } + public byte[] Wiki_domain() {return wiki_domain;} private final byte[] wiki_domain; + + public int Page_id() {return page_id;} private final int page_id; + public int Page_ns() {return page_ns;} private final int page_ns; + public byte[] Page_ttl() {return page_ttl;} private final byte[] page_ttl; + + public int Revn_id() {return revn_id;} private final int revn_id; + public DateAdp Revn_time() {return revn_time;} private final DateAdp revn_time; + public byte[] Revn_text() {return revn_text;} private final byte[] revn_text; +} diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java b/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java index 6f66d49a7..99fb4a871 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java @@ -32,6 +32,7 @@ public class Xob_db_file { public static Xob_db_file New__temp_log(Io_url dir) {return New(dir, Name__temp_log);} public static Xob_db_file New__redlink(Io_url dir) {return New(dir, Name__redlink);} public static Xob_db_file New__page_link(Xow_wiki wiki) {return New(wiki.Fsys_mgr().Root_dir(), Name__page_link);} + public static Xob_db_file New__img_link(Xow_wiki wiki) {return New(wiki.Fsys_mgr().Root_dir(), "xowa.wiki.imglinks.sqlite3");} public static Xob_db_file New__page_file_map(Xow_wiki wiki) {return New(wiki.Fsys_mgr().Root_dir(), wiki.Domain_str() + "-file-page_map.xowa");} public static Xob_db_file New__deletion_db(Xow_wiki wiki) { String name = String_.Format("{0}-file-core-deletion_db-{1}.xowa", wiki.Domain_str(), Datetime_now.Get().XtoStr_fmt("yyyy.MM")); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java index e43d6ac92..fac877485 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java @@ -46,7 +46,7 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo root = ctx.Tkn_mkr().Root(Bry_.Empty); wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql wiki.Db_mgr_as_sql().Core_data_mgr().Init_by_load(gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil(wiki)); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable conn which is closed) - wiki.File__orig_mgr().Wkrs_del(Xof_orig_wkr_.Tid_wmf_api); + wiki.File__orig_mgr().Wkrs__del(Xof_orig_wkr_.Tid_wmf_api); db_fsys_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); db_ary = Xob_dump_mgr_base_.Init_text_files_ary(db_fsys_mgr); poll_interval = poll_mgr.Poll_interval(); diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java index c3fe62189..1dca99e6c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java @@ -19,7 +19,7 @@ package gplx.xowa.bldrs.installs; import gplx.*; import gplx.xowa.*; import gplx import gplx.core.ios.*; import gplx.core.ios.streams.*; import gplx.xowa.bldrs.wms.dumps.*; public class Xoi_dump_mgr implements Gfo_invk { - public String[] Server_urls() {return server_urls;} private String[] server_urls = String_.Ary(Xowm_dump_file_.Server_wmf_https, Xowm_dump_file_.Server_your_org, Xowm_dump_file_.Server_c3sl, Xowm_dump_file_.Server_masaryk); + public String[] Server_urls() {return server_urls;} private String[] server_urls = String_.Ary(Xowm_dump_file_.Server_your_org, Xowm_dump_file_.Server_wmf_https, Xowm_dump_file_.Server_c3sl, Xowm_dump_file_.Server_masaryk); // promote your.org to primary url; DATE:2016-08-07 public String[] Custom_cmds() {return custom_cmds;} private String[] custom_cmds = String_.Ary(Xoi_cmd_wiki_download.Key_wiki_download, Xoi_cmd_wiki_import.KEY); public byte Data_storage_format() {return data_storage_format;} public Xoi_dump_mgr Data_storage_format_(byte v) {data_storage_format = v; return this;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_.Tid_gzip; public long Db_text_max() {return db_text_max;} private long db_text_max = (long)3000 * Io_mgr.Len_mb; diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java b/400_xowa/src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java index 9eda882d3..8864443b8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs.wms; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.wikis.*; +import gplx.xowa.apps.wms.apis.*; import gplx.xowa.wikis.*; public class Xoa_wmf_mgr implements Gfo_invk { private final Xoae_wiki_mgr wiki_mgr; public Xoa_wmf_mgr(Gfo_usr_dlg usr_dlg, Xoae_wiki_mgr wiki_mgr) { diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/Xowmf_mgr.java b/400_xowa/src/gplx/xowa/bldrs/wms/Xowmf_mgr.java index 318fb09c6..354c9da2f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/Xowmf_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/Xowmf_mgr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.bldrs.wms; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.core.net.*; -import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.downloads.*; +import gplx.xowa.apps.wms.apis.*; import gplx.xowa.files.downloads.*; public class Xowmf_mgr { public Xowmf_mgr() { download_wkr.Download_xrg().User_agent_(Xoa_app_.User_agent); @@ -26,5 +26,5 @@ public class Xowmf_mgr { download_wkr.Download_xrg().Prog_dlg_(Xoa_app_.Usr_dlg()); } public Xowmf_api_mgr Api_mgr() {return api_mgr;} private Xowmf_api_mgr api_mgr = new Xowmf_api_mgr(); - public Xof_download_wkr Download_wkr() {return download_wkr;} private final Xof_download_wkr download_wkr = new Xof_download_wkr_io(); + public Xof_download_wkr Download_wkr() {return download_wkr;} private final Xof_download_wkr download_wkr = new Xof_download_wkr_io(); } diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_fxt.java b/400_xowa/src/gplx/xowa/files/Xof_file_fxt.java index 54b89286e..3bee5c0f7 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_fxt.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_fxt.java @@ -19,7 +19,7 @@ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; import gplx.dbs.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.repos.*; public class Xof_file_fxt { - private final Xowe_wiki wiki; + private final Xowe_wiki wiki; Xof_file_fxt(Xowe_wiki wiki) { this.wiki = wiki; Io_mgr.Instance.InitEngine_mem(); @@ -40,7 +40,7 @@ public class Xof_file_fxt { Db_conn conn = Db_conn_bldr.Instance.Get_or_new(Io_url_.mem_fil_("mem/xowa/wiki/" + wiki.Domain_str() + "/orig.xowa")).Conn(); Xof_orig_tbl orig_tbl = new Xof_orig_tbl(conn, Bool_.Y); orig_tbl.Create_tbl(); - wiki.File_mgr().Orig_mgr().Init_by_wiki(wiki, Xof_fsdb_mode.new_v2_gui(), new Xof_orig_tbl[] {orig_tbl}, Xof_url_bldr.new_v2()); + wiki.File_mgr().Orig_mgr().Init_by_wiki(wiki, Xof_fsdb_mode.New__v2__gui(), new Xof_orig_tbl[] {orig_tbl}, Xof_url_bldr.new_v2()); return this; } public void Exec_orig_add(boolean repo_is_commons, String orig_ttl, int orig_ext_id, int orig_w, int orig_h, String orig_redirect) { diff --git a/400_xowa/src/gplx/xowa/files/Xof_fsdb_mode.java b/400_xowa/src/gplx/xowa/files/Xof_fsdb_mode.java index 0efbfd6f4..1905e1dc5 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_fsdb_mode.java +++ b/400_xowa/src/gplx/xowa/files/Xof_fsdb_mode.java @@ -19,15 +19,17 @@ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; public class Xof_fsdb_mode { private int tid; Xof_fsdb_mode(int tid) {this.tid = tid;} -// public boolean Tid_v0() {return tid == Tid_int_v0;} - public boolean Tid_v2_gui() {return tid == Tid_int_v2_gui;} - public boolean Tid_v2_bld() {return tid == Tid_int_v2_bld;} - public void Tid_v2_bld_y_() {tid = Tid_int_v2_bld;} + public boolean Tid__v2__bld() {return tid == TID__v2__bld;} + public void Tid__v2__bld__y_() {tid = TID__v2__bld;} + public boolean Tid__v2__mp() {return tid == TID__v2__mp;} + public void Tid__v2__mp__y_() {tid = TID__v2__mp;} + public boolean Tid__bld() {return tid > TID__v2__gui;} private static final int - Tid_int_v0 = 1 - , Tid_int_v2_gui = 2 - , Tid_int_v2_bld = 3 + TID__v0 = 1 + , TID__v2__gui = 2 + , TID__v2__bld = 3 + , TID__v2__mp = 4 ; - public static Xof_fsdb_mode new_v0() {return new Xof_fsdb_mode(Tid_int_v0);} - public static Xof_fsdb_mode new_v2_gui() {return new Xof_fsdb_mode(Tid_int_v2_gui);} + public static Xof_fsdb_mode New__v0() {return new Xof_fsdb_mode(TID__v0);} + public static Xof_fsdb_mode New__v2__gui() {return new Xof_fsdb_mode(TID__v2__gui);} } diff --git a/400_xowa/src/gplx/xowa/files/Xof_html_elem.java b/400_xowa/src/gplx/xowa/files/Xof_html_elem.java index 2875423cc..ef0f840e4 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_html_elem.java +++ b/400_xowa/src/gplx/xowa/files/Xof_html_elem.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; public class Xof_html_elem { - public static final byte Tid_none = 0, Tid_img = 1, Tid_vid = 2, Tid_gallery = 3, Tid_gallery_v2 = 4, Tid_imap = 5; + public static final byte Tid_none = 0, Tid_img = 1, Tid_vid = 2, Tid_gallery = 3, Tid_gallery_v2 = 4, Tid_imap = 5, Tid_aud = 6; public static boolean Tid_is_file(byte tid) { switch (tid) { case Tid_img: case Tid_vid: return true; 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 a600cb757..9377f1576 100644 --- a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java @@ -42,11 +42,11 @@ public class Xow_file_mgr implements Gfo_invk { Io_url file_dir = wiki.Fsys_mgr().File_dir(); if (!Io_mgr.Instance.ExistsFil(file_dir.GenSubFil(Fsdb_db_mgr__v1.Mnt_name))) { version = Version_1; - fsdb_mode = Xof_fsdb_mode.new_v0(); + fsdb_mode = Xof_fsdb_mode.New__v0(); } else { version = Version_2; - fsdb_mode = Xof_fsdb_mode.new_v2_gui(); + fsdb_mode = Xof_fsdb_mode.New__v2__gui(); } } return version; @@ -54,7 +54,7 @@ public class Xow_file_mgr implements Gfo_invk { public boolean Version_1_y() {return this.Version() == Version_1;} public boolean Version_2_y() {return this.Version() == Version_2;} public void Version_1_y_() {version = Version_1;} // TEST: - public void Version_2_y_() {version = Version_2;} // TEST: + public void Version_2_y_() {version = Version_2; fsdb_mode = Xof_fsdb_mode.New__v2__gui();} // TEST: public void Fsdb_mgr_(Xof_fsdb_mgr fsdb_mgr) { this.fsdb_mgr = fsdb_mgr; version = Version_2; @@ -127,7 +127,7 @@ public class Xow_file_mgr implements Gfo_invk { ) db_core = Fsdb_db_mgr__v2_bldr.Get_or_make(wiki, false); // make it this.version = Version_2; - this.fsdb_mode = Xof_fsdb_mode.new_v2_gui(); + this.fsdb_mode = Xof_fsdb_mode.New__v2__gui(); orig_mgr.Init_by_wiki(wiki, fsdb_mode, db_core.File__orig_tbl_ary(), Xof_url_bldr.new_v2()); fsdb_mgr.Init_by_wiki(wiki); } diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_file_itm_finder.java b/400_xowa/src/gplx/xowa/files/caches/Xou_file_itm_finder.java index 21e67f297..2829c94c8 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xou_file_itm_finder.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_file_itm_finder.java @@ -25,7 +25,7 @@ public class Xou_file_itm_finder { byte[] lnki_ttl = xfer.Lnki_ttl(); Xof_url_bldr url_bldr = wiki.Parser_mgr().Url_bldr(); try { - if (wiki.File__fsdb_mode().Tid_v2_bld()) return false; // disable during build + if (wiki.File__fsdb_mode().Tid__bld()) return false; // disable during build Xou_cache_itm cache_itm = cache_mgr.Get_or_null(wiki.Domain_itm().Abrv_xo(), lnki_ttl, xfer.Lnki_type(), xfer.Lnki_upright(), xfer.Lnki_w(), xfer.Lnki_h(), xfer.Lnki_time(), xfer.Lnki_page(), Xof_img_size.Thumb_width_img); Xof_repo_itm repo = null; if (cache_itm == null) {// itm not in cache; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java index 1d69ff54b..166870a31 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java @@ -32,7 +32,7 @@ class Xof_file_fxt { Xoa_test_.Db_init(root_url); app = Xoa_app_fxt.Make__app__edit(Op_sys.Cur().Os_name(), root_url); wiki = Xoa_app_fxt.Make__wiki__edit(app); - wiki.File__fsdb_mode().Tid_v2_bld_y_(); + wiki.File__fsdb_mode().Tid__v2__bld__y_(); this.fsdb_mgr = (Xof_fsdb_mgr__sql)wiki.File_mgr().Fsdb_mgr(); this.orig_mgr = wiki.File__orig_mgr(); Xof_repo_fxt.Repos_init(app.File_mgr(), true, wiki); diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_itm.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_itm.java index bcfff4bfa..1c947c278 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_itm.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_itm.java @@ -18,26 +18,18 @@ along with this program. If not, see . package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.wikis.*; import gplx.xowa.files.*; public class Xof_orig_itm { - public byte Repo() {return repo;} private byte repo; - public byte[] Ttl() {return ttl;} private byte[] ttl; // without file ns; EX: "A.png" not "File:A.png" - public int Ext_id() {return ext_id;} private int ext_id; - public Xof_ext Ext() {if (ext == null) ext = Xof_ext_.new_by_id_(ext_id); return ext;} private Xof_ext ext; - public int W() {return w;} private int w; - public int H() {return h;} private int h; - public byte[] Redirect() {return redirect;} private byte[] redirect; // redirect trg; EX: A.png is redirected to B.jpg; record will have A.png|jpg|220|200|B.jpg where jpg|220|200 are the attributes of B.jpg - public boolean Insert_new() {return insert_new;} public void Insert_new_y_() {insert_new = Bool_.Y;} private boolean insert_new; - public void Clear() { - this.repo = Repo_null; - this.ttl = this.redirect = null; - this.ext_id = Xof_ext_.Id_unknown; - this.w = this.h = Xof_img_size.Null; - this.ext = null; - } - public Xof_orig_itm Init(byte repo, byte[] ttl, int ext_id, int w, int h, byte[] redirect) { + public Xof_orig_itm(byte repo, byte[] ttl, int ext_id, int w, int h, byte[] redirect) { this.repo = repo; this.ttl = ttl; this.ext_id = ext_id; this.w = w; this.h = h; this.redirect = redirect; - return this; } + public byte Repo() {return repo;} private final byte repo; + public byte[] Ttl() {return ttl;} private final byte[] ttl; // without file ns; EX: "A.png" not "File:A.png" + public int Ext_id() {return ext_id;} private final int ext_id; + public Xof_ext Ext() {if (ext == null) ext = Xof_ext_.new_by_id_(ext_id); return ext;} private Xof_ext ext; + public int W() {return w;} private final int w; + public int H() {return h;} private final int h; + public byte[] Redirect() {return redirect;} private final byte[] redirect; // redirect trg; EX: A.png is redirected to B.jpg; record will have A.png|jpg|220|200|B.jpg where jpg|220|200 are the attributes of B.jpg + public boolean Insert_new() {return insert_new;} public void Insert_new_y_() {insert_new = Bool_.Y;} private boolean insert_new; public int Db_row_size() {return Db_row_size_fixed + redirect.length + ttl.length;} private static final int Db_row_size_fixed = (5 * 4); // 3 ints; 2 bytes 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 e86c8aea1..3629a4245 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 @@ -17,7 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.core.primitives.*; import gplx.dbs.*; -import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.downloads.*; +import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.downloads.*; +import gplx.xowa.apps.wms.apis.*; import gplx.xowa.apps.wms.apis.origs.*; public class Xof_orig_mgr { private Xof_orig_wkr[] wkrs; private int wkrs_len; private Xof_url_bldr url_bldr; private Xow_repo_mgr repo_mgr; private final Xof_img_size img_size = new Xof_img_size(); @@ -28,16 +29,16 @@ public class Xof_orig_mgr { int orig_tbls_len = orig_tbls.length; for (int i = 0; i < orig_tbls_len; ++i) { Xof_orig_tbl orig_tbl = orig_tbls[i]; - this.Wkrs__add_many(new Xof_orig_wkr__orig_db(orig_tbl, i == orig_tbls_len - 1)); + this.Wkrs__add(new Xof_orig_wkr__orig_db(orig_tbl, i == orig_tbls_len - 1)); } // } - if (!fsdb_mode.Tid_v2_bld()) { // add if gui, but not if bld + if (!fsdb_mode.Tid__v2__bld()) { // add if gui, but not if bld Io_url wiki_meta_dir = wiki.App().Fsys_mgr().File_dir().GenSubDir_nest("#meta", wiki.Domain_str()); if (Io_mgr.Instance.ExistsDir(wiki_meta_dir)) { Xof_orig_wkr__xo_meta xo_meta = new Xof_orig_wkr__xo_meta(wiki_meta_dir); - this.Wkrs__add_many(xo_meta); + this.Wkrs__add(xo_meta); } - this.Wkrs__add_many(new Xof_orig_wkr__wmf_api(new Xoapi_orig_wmf(), wiki.App().Wmf_mgr().Download_wkr(), repo_mgr, wiki.Domain_bry())); + this.Wkrs__add(new Xof_orig_wkr__wmf_api(new Xoapi_orig_wmf(), wiki.App().Wmf_mgr().Download_wkr(), repo_mgr, wiki.Domain_bry())); } } public Xof_orig_itm Find_by_ttl_or_null(byte[] ttl) {return Find_by_ttl_or_null(ttl, 0, 1);} @@ -77,11 +78,15 @@ public class Xof_orig_mgr { } } private void Wkrs__clear() {wkrs = Xof_orig_wkr_.Ary_empty; wkrs_len = 0;} - private void Wkrs__add_many(Xof_orig_wkr... v) { + public void Wkrs__add(Xof_orig_wkr... v) { wkrs = (Xof_orig_wkr[])Array_.Resize_add(wkrs, v); wkrs_len += v.length; } - public void Wkrs_del(byte tid) { + public void Wkrs__set(Xof_orig_wkr... v) { + wkrs = v; + wkrs_len = v.length; + } + public void Wkrs__del(byte tid) { List_adp list = List_adp_.New(); for (int i = 0; i < wkrs_len; ++i) { Xof_orig_wkr wkr = wkrs[i]; diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java index b911ebb41..56b424677 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java @@ -77,7 +77,7 @@ public class Xof_orig_tbl implements Rls_able { } public Xof_orig_itm Load_by_rdr(Db_rdr rdr) { byte repo = rdr.Read_byte(fld_repo); - Xof_orig_itm rv = new Xof_orig_itm().Init + Xof_orig_itm rv = new Xof_orig_itm ( repo , rdr.Read_bry_by_str(fld_ttl) , rdr.Read_int(fld_ext) diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl_tst.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl_tst.java index 573307350..8ea374ef6 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl_tst.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl_tst.java @@ -40,7 +40,7 @@ class Xof_orig_tbl_fxt { } public Xof_orig_itm Exec_insert(String ttl, int w, int h) { byte[] ttl_bry = Bry_.new_u8(ttl); - Xof_orig_itm rv = new Xof_orig_itm().Init(Xof_orig_itm.Repo_comm, ttl_bry, Xof_ext_.new_by_ttl_(ttl_bry).Id(), w, h, Bry_.Empty); + Xof_orig_itm rv = new Xof_orig_itm(Xof_orig_itm.Repo_comm, ttl_bry, Xof_ext_.new_by_ttl_(ttl_bry).Id(), w, h, Bry_.Empty); tbl.Insert(rv.Repo(), rv.Ttl(), rv.Ext_id(), rv.W(), rv.H(), rv.Redirect()); return rv; } diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java index 92024f4b2..46389455f 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java @@ -16,9 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.fsdb.*; +import gplx.xowa.apps.wms.apis.*; import gplx.xowa.files.fsdb.*; public class Xof_orig_wkr_ { - public static final Xof_orig_wkr[] Ary_empty = new Xof_orig_wkr[0]; + public static final Xof_orig_wkr[] Ary_empty = new Xof_orig_wkr[0]; public static void Find_by_list(Xof_orig_wkr wkr, Ordered_hash rv, List_adp itms) { int len = itms.Count(); for (int i = 0; i < len; ++i) { @@ -34,5 +34,6 @@ public class Xof_orig_wkr_ { Tid_xowa_db = 1 , Tid_wmf_api = 2 , Tid_xowa_meta = 3 + , Tid_xowa_img_links = 4 ; } diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__wmf_api.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__wmf_api.java index ea834635a..675c21d84 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__wmf_api.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__wmf_api.java @@ -16,10 +16,11 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.downloads.*; +import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.apps.wms.apis.*; import gplx.xowa.files.downloads.*; +import gplx.xowa.apps.wms.apis.origs.*; public class Xof_orig_wkr__wmf_api implements Xof_orig_wkr { - private final Xoapi_orig_base orig_api; private final Xof_download_wkr download_wkr; private final Xow_repo_mgr repo_mgr; private final byte[] wiki_domain; - private final Xoapi_orig_rslts api_rv = new Xoapi_orig_rslts(); + private final Xoapi_orig_base orig_api; private final Xof_download_wkr download_wkr; private final Xow_repo_mgr repo_mgr; private final byte[] wiki_domain; + private final Xoapi_orig_rslts api_rv = new Xoapi_orig_rslts(); public Xof_orig_wkr__wmf_api(Xoapi_orig_base orig_api, Xof_download_wkr download_wkr, Xow_repo_mgr repo_mgr, byte[] wiki_domain) { this.orig_api = orig_api; this.download_wkr = download_wkr; this.repo_mgr = repo_mgr; this.wiki_domain = wiki_domain; } @@ -35,8 +36,7 @@ public class Xof_orig_wkr__wmf_api implements Xof_orig_wkr { int api_w = api_rv.Orig_w(), api_h = api_rv.Orig_h(); Xof_ext api_ext = Xof_ext_.new_by_ttl_(api_page); api_ext = Ext__handle_ogg(api_ext, api_w, api_h); byte[] api_redirect = Bry_.Eq(api_page, ttl) ? Bry_.Empty : api_page; // ttl is different; must be redirect - Xof_orig_itm rv = new Xof_orig_itm(); - rv.Init(api_repo, api_page, api_ext.Id(), api_w, api_h, api_redirect); + Xof_orig_itm rv = new Xof_orig_itm(api_repo, api_page, api_ext.Id(), api_w, api_h, api_redirect); rv.Insert_new_y_(); return rv; } diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__xo_meta.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__xo_meta.java index bd1042903..a248ef2d8 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__xo_meta.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__xo_meta.java @@ -38,8 +38,7 @@ public class Xof_orig_wkr__xo_meta implements Xof_orig_wkr { Xof_meta_fil meta_fil = new Xof_meta_fil(null, md5); // NOTE: need to register file before loading it; defect wherein 2 files with same hash prefix would skip one b/c Loaded file was not registered; EX.WS: en.wikiquote.org/The Hitchhiker's Guide to the Galaxy; NMMP_dolphin_with_locator.jpeg, da6f95736ed249f371f30bf5f1205fbd; Hoags_object.jpg, daed4a54e48e4266bd2f2763b7c4018c meta_fil.Load(meta_rdr, parser); Xof_meta_itm meta_itm = meta_fil.Get_or_null(ttl); if (meta_itm == null) return Xof_orig_itm.Null; - Xof_orig_itm rv = new Xof_orig_itm(); - rv.Init((byte)meta_itm.Vrtl_repo(), ttl, Xof_ext_.new_by_ttl_(ttl).Id(), meta_itm.Orig_w(), meta_itm.Orig_h(), meta_itm.Ptr_ttl()); + Xof_orig_itm rv = new Xof_orig_itm((byte)meta_itm.Vrtl_repo(), ttl, Xof_ext_.new_by_ttl_(ttl).Id(), meta_itm.Orig_w(), meta_itm.Orig_h(), meta_itm.Ptr_ttl()); rv.Insert_new_y_(); return rv; } diff --git a/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java b/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java index f290ef675..0060ec84b 100644 --- a/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java +++ b/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java @@ -41,6 +41,13 @@ public class Xowe_repo_mgr implements Xow_repo_mgr, Gfo_invk { } return null; } + public void Clone(Xowe_repo_mgr src) { + int len = src.Repos_len(); + for (int i = 0; i < len; ++i) { + Xof_repo_pair repo_pair = src.Repos_get_at(i); + this.Add_repo(repo_pair.Src().Key(), repo_pair.Trg().Key()); + } + } public Xof_repo_pair Repos_get_at(int i) {return (Xof_repo_pair)repos.Get_at(i);} private Xof_repo_pair Repos_get_by_id(int id) { int len = repos.Count(); diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java index 05c3582b6..db667a1cb 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java @@ -18,10 +18,10 @@ along with this program. If not, see . package gplx.xowa.files.xfers; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.core.primitives.*; import gplx.gfui.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.exts.*; import gplx.xowa.files.downloads.*; -import gplx.xowa.bldrs.wms.*; import gplx.xowa.bldrs.wms.apis.*; +import gplx.xowa.bldrs.wms.*; import gplx.xowa.apps.wms.apis.*; import gplx.xowa.apps.wms.apis.origs.*; import gplx.xowa.wikis.tdbs.metas.*; public class Xof_xfer_mgr { - public Xof_xfer_mgr(Xof_file_mgr file_mgr, Xowmf_mgr wmf_mgr) {this.file_mgr = file_mgr; this.wmf_mgr = wmf_mgr;} private final Xof_file_mgr file_mgr; private final Xowmf_mgr wmf_mgr; + public Xof_xfer_mgr(Xof_file_mgr file_mgr, Xowmf_mgr wmf_mgr) {this.file_mgr = file_mgr; this.wmf_mgr = wmf_mgr;} private final Xof_file_mgr file_mgr; private final Xowmf_mgr wmf_mgr; public Xof_xfer_rslt Rslt() {return rslt;} private Xof_xfer_rslt rslt = new Xof_xfer_rslt(); public boolean Force_orig() {return force_orig;} public Xof_xfer_mgr Force_orig_(boolean v) {force_orig = v; return this;} private boolean force_orig; public Xof_xfer_mgr Force_orig_y_() {return Force_orig_(Bool_.Y);} public Xof_xfer_mgr Force_orig_n_() {return Force_orig_(Bool_.N);} diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_base_fxt.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_base_fxt.java index c5d87ab5d..ceb0201f8 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_base_fxt.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_base_fxt.java @@ -17,8 +17,9 @@ along with this program. If not, see . */ package gplx.xowa.files.xfers; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.core.ios.*; -import gplx.xowa.wikis.domains.*; import gplx.xowa.files.cnvs.*; import gplx.xowa.files.repos.*; -import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.exts.*; import gplx.xowa.files.imgs.*; +import gplx.xowa.wikis.domains.*; +import gplx.xowa.files.cnvs.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.exts.*; import gplx.xowa.files.imgs.*; +import gplx.xowa.apps.wms.apis.*; import gplx.xowa.apps.wms.apis.origs.*; public class Xof_xfer_queue_base_fxt { public Xoapi_orig_mok Api_size() {return api_size;} private Xoapi_orig_mok api_size = Xoapi_orig_mok.Instance; public Xof_repo_itm Src_commons_repo() {return src_commons_repo;} private Xof_repo_itm src_commons_repo; diff --git a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java index 46f874547..e2af6ca53 100644 --- a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java +++ b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java @@ -25,6 +25,7 @@ public class Xog_url_wkr { private final Xoa_url tmp_url = Xoa_url.blank(); private Xoae_app app; private Xog_win_itm win; private Xowe_wiki wiki; private Xoae_page page; private final Xof_img_size img_size = new Xof_img_size(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); + private final Gfo_url_encoder fsys_lnx_encoder = Gfo_url_encoder_.New__fsys_lnx().Make(); public Xog_url_wkr Parse(Xog_win_itm win, String href_str) { if (href_str == null) return this; // text is not link; return; byte[] href_bry = Bry_.new_u8(href_str); @@ -63,7 +64,7 @@ public class Xog_url_wkr { Xowe_wiki wiki = (Xowe_wiki)page.Commons_mgr().Source_wiki_or(cur_wiki); Io_url href_url = Io_url_.http_any_(String_.new_u8(Gfo_url_encoder_.Http_url.Decode(href_bry)), Op_sys.Cur().Tid_is_wnt()); Gfui_html html_box = win.Active_html_box(); - byte[] href_bry_encoded = Gfo_url_encoder_.Fsys_lnx.Encode(href_bry); // encode to href_bry; note must encode to same href_bry as Xof_url_bldr, which uses Gfo_url_encoder_.Fsys_lnx; PAGE:en.w:File:Volc�n_Chimborazo,_"El_Taita_Chimborazo".jpg DATE:2015-12-06 + byte[] href_bry_encoded = fsys_lnx_encoder.Encode(href_bry); // encode to href_bry; note must encode to same href_bry as Xof_url_bldr, which uses Gfo_url_encoder_.Fsys_lnx; PAGE:en.w:File:Volc�n_Chimborazo,_"El_Taita_Chimborazo".jpg DATE:2015-12-06 String xowa_ttl = wiki.Gui_mgr().Cfg_browser().Content_editable() ? html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_for_editable_mode, gplx.xowa.htmls.Xoh_consts.Atr_xowa_title_str, null) : Xoh_dom_.Title_by_href(href_bry_encoded, Bry_.new_u8(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__root_html_get))); diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java index da7c6b2d2..fa5ecebe8 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java @@ -109,7 +109,8 @@ public class Xog_tab_itm implements Gfo_invk { Xoae_app app = win.App(); Gfo_usr_dlg usr_dlg = app.Usr_dlg(); // get new_tab_name - if (url.Page_is_main()) url.Page_bry_(wiki.Props().Main_page()); // NOTE: must go before ttl.Make; DATE:2016-07-31 + this.wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(url.Wiki_bry()); // NOTE: must go before wiki.Props().Main_page(); DATE:2016-08-02; NOTE: must load wiki; DATE:2015-07-22 + if (url.Page_is_main()) url.Page_bry_(wiki.Props().Main_page()); // NOTE: must go before ttl.Make; DATE:2016-07-31 Xoa_ttl ttl = wiki.Ttl_parse(url.Page_bry()); if (ttl == null) {usr_dlg.Prog_one("", "", "title is invalid: ~{0}", String_.new_u8(url.Raw())); return;} String new_tab_name = String_.new_u8(ttl.Full_txt_w_ttl_case()); @@ -127,7 +128,6 @@ public class Xog_tab_itm implements Gfo_invk { if (page != null) page.Tab_data().Close_mgr().When_close(this, url); // cancel any current search cmds app.Log_wtr().Queue_enabled_(true); usr_dlg.Gui_wkr().Clear(); - this.wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(url.Wiki_bry()); // NOTE: must update wiki variable; DATE:????-??-??; NOTE: must load wiki; DATE:2015-07-22 if (url.Vnt_bry() != null) Cur_vnt_(wiki, url.Vnt_bry()); Tab_name_(new_tab_name); usr_dlg.Prog_one("", "", "loading: ~{0}", String_.new_u8(ttl.Raw())); diff --git a/400_xowa/src/gplx/xowa/guis/views/boots/Xog_error_win.java b/400_xowa/src/gplx/xowa/guis/views/boots/Xog_error_win.java index 6ea94a896..0c7414e4b 100644 --- a/400_xowa/src/gplx/xowa/guis/views/boots/Xog_error_win.java +++ b/400_xowa/src/gplx/xowa/guis/views/boots/Xog_error_win.java @@ -77,7 +77,7 @@ public class Xog_error_win extends JFrame implements Gfo_invk { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_send_mail)) { try { - Gfo_url_encoder url_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_wnt; + Gfo_url_encoder url_encoder = Gfo_url_encoder_.New__fsys_wnt().Make(); String subject = url_encoder.Encode_str("XOWA boot error: " + error_data.Err_msg()); String body = url_encoder.Encode_str(error_data.Err_details()); Desktop.getDesktop().mail(new URI("mailto:gnosygnu+xowa_error_boot@gmail.com?subject=" + subject + "&body=" + body)); diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_img_mgr.java b/400_xowa/src/gplx/xowa/htmls/Xoh_img_mgr.java index 74c02603f..334755cb6 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_img_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_img_mgr.java @@ -26,6 +26,12 @@ public class Xoh_img_mgr { } public int Len() {return list.Count();} public Xof_fsdb_itm Get_at(int i) {return (Xof_fsdb_itm)list.Get_at(i);} + public Xof_fsdb_itm Make_aud() { + Xof_fsdb_itm itm = new Xof_fsdb_itm(); + itm.Init_at_hdoc(++uid_nxt, Xof_html_elem.Tid_aud); + list.Add(itm); + return itm; + } public Xof_fsdb_itm Make_img(boolean img_is_gallery) { Xof_fsdb_itm itm = new Xof_fsdb_itm(); itm.Init_at_hdoc(++uid_nxt, img_is_gallery ? Xof_html_elem.Tid_gallery : Xof_html_elem.Tid_img); diff --git a/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java b/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java index bde3a49b8..38bef8c19 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java @@ -21,17 +21,15 @@ import gplx.xowa.langs.*; import gplx.xowa.wikis.ctgs.*; import gplx.xowa.xtns.gallery.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.htmls.portal.*; import gplx.xowa.addons.htmls.tocs.*; import gplx.xowa.wikis.modules.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.htmls.tidy.*; import gplx.xowa.htmls.js.*; +import gplx.langs.htmls.encoders.*; public class Xow_html_mgr implements Gfo_invk { + private final Gfo_url_encoder fsys_lnx_encoder = Gfo_url_encoder_.New__fsys_lnx().Make(); public Xow_html_mgr(Xowe_wiki wiki) { this.wiki = wiki; html_wtr = new Xoh_html_wtr(wiki, this); Xoae_app app = wiki.Appe(); page_wtr_mgr = new Xoh_page_wtr_mgr(app.Gui_mgr().Kit().Tid() != Gfui_kit_.Swing_tid); // reverse logic to handle swt,drd but not mem - Io_url file_dir = app.Fsys_mgr().Bin_xowa_file_dir().GenSubDir_nest("mediawiki.file"); - img_media_play_btn = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx.Encode_to_file_protocol(file_dir.GenSubFil("play.png")); - img_media_info_btn = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx.Encode_to_file_protocol(file_dir.GenSubFil("info.png")); - img_thumb_magnify = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx.Encode_to_file_protocol(file_dir.GenSubFil("magnify-clip.png")); - img_xowa_protocol = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx.Encode_to_file_protocol(app.Fsys_mgr().Bin_xowa_file_dir().GenSubFil_nest("app.general", "xowa_exec.png")); + img_xowa_protocol = fsys_lnx_encoder.Encode_to_file_protocol(app.Fsys_mgr().Bin_xowa_file_dir().GenSubFil_nest("app.general", "xowa_exec.png")); portal_mgr = new Xow_portal_mgr(wiki); imgs_mgr = new Xoh_imgs_mgr(this); module_mgr = new Xow_module_mgr(wiki); @@ -55,9 +53,6 @@ public class Xow_html_mgr implements Gfo_invk { public Xow_module_mgr Head_mgr() {return module_mgr;} private Xow_module_mgr module_mgr; public boolean Importing_ctgs() {return importing_ctgs;} public void Importing_ctgs_(boolean v) {importing_ctgs = v;} private boolean importing_ctgs; public int Img_thumb_width() {return img_thumb_width;} private int img_thumb_width = 220; - public byte[] Img_media_play_btn() {return img_media_play_btn;} private byte[] img_media_play_btn; - public byte[] Img_media_info_btn() {return img_media_info_btn;} private byte[] img_media_info_btn; - public byte[] Img_thumb_magnify() {return img_thumb_magnify;} private byte[] img_thumb_magnify; public byte[] Img_xowa_protocol() {return img_xowa_protocol;} private byte[] img_xowa_protocol; public boolean Img_suppress_missing_src() {return img_suppress_missing_src;} public Xow_html_mgr Img_suppress_missing_src_(boolean v) {img_suppress_missing_src = v; return this;} private boolean img_suppress_missing_src = true; public Xohp_ctg_grp_mgr Ctg_mgr() {return ctg_mgr;} private Xohp_ctg_grp_mgr ctg_mgr = new Xohp_ctg_grp_mgr(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java index fda55c9a7..0952d0f5f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.core.btries.*; -import gplx.langs.htmls.*; import gplx.xowa.langs.kwds.*; +import gplx.langs.htmls.*; import gplx.xowa.langs.kwds.*; import gplx.langs.htmls.entitys.*; import gplx.xowa.htmls.core.wkrs.hdrs.*; import gplx.xowa.htmls.core.wkrs.lnkes.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.parsers.paras.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.miscs.*; import gplx.xowa.parsers.htmls.*; diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_escaper.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_escaper.java index 91a874e44..ed0b793f2 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_escaper.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_escaper.java @@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; -import gplx.core.btries.*; import gplx.langs.htmls.*; +import gplx.core.btries.*; +import gplx.langs.htmls.*; import gplx.langs.htmls.entitys.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.xndes.*; public class Xoh_html_wtr_escaper { public static byte[] Escape(Xop_amp_mgr amp_mgr, Bry_bfr tmp_bfr, byte[] src) { @@ -53,19 +54,19 @@ public class Xoh_html_wtr_escaper { if (o == null) // invalid; EX: "a&b"; "&bad;"; "&#letters;"; bfr.Add(Gfh_entity_.Amp_bry); // escape & and continue else { // is either (1) a name or (2) an ncr (hex/dec) - Xop_amp_trie_itm itm = (Xop_amp_trie_itm)o; + Gfh_entity_itm itm = (Gfh_entity_itm)o; int match_pos = trv.Pos(); int itm_tid = itm.Tid(); switch (itm_tid) { - case Xop_amp_trie_itm.Tid_name_std: - case Xop_amp_trie_itm.Tid_name_xowa: // name + case Gfh_entity_itm.Tid_name_std: + case Gfh_entity_itm.Tid_name_xowa: // name bfr.Add_mid(src, i, match_pos); // embed entire name i = match_pos - 1; break; - case Xop_amp_trie_itm.Tid_num_dec: - case Xop_amp_trie_itm.Tid_num_hex: // ncr: dec/hex; escape if invalid + case Gfh_entity_itm.Tid_num_dec: + case Gfh_entity_itm.Tid_num_hex: // ncr: dec/hex; escape if invalid Xop_amp_mgr_rslt rslt = new Xop_amp_mgr_rslt(); - boolean pass = amp_mgr.Parse_ncr(rslt, itm_tid == Xop_amp_trie_itm.Tid_num_hex, src, end, i, match_pos); + boolean pass = amp_mgr.Parse_ncr(rslt, itm_tid == Gfh_entity_itm.Tid_num_hex, src, end, i, match_pos); if (pass) { // parse worked; embed entire ncr; EX: "{" int end_pos = rslt.Pos(); bfr.Add_mid(src, i, end_pos); diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict_.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict_.java index 2e19d222d..aee749d6f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict_.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict_.java @@ -35,6 +35,7 @@ public class Xoh_hzip_dict_ { , Tid__img_bare = 9 , Tid__toc = 10 , Tid__pgbnr = 11 + , Tid__media = 12 ; public static final String Key__timeline = "timeline" @@ -50,6 +51,7 @@ public class Xoh_hzip_dict_ { , Key__img_bare = "img_bare" , Key__toc = "toc" , Key__pgbnr = "pgbnr" + , Key__media = "media" ; public static final int Hzip__none = 0, Hzip__v1 = 1; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_pool_mgr__data.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_pool_mgr__data.java index 8fce0b754..24758c1cd 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_pool_mgr__data.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_pool_mgr__data.java @@ -20,9 +20,9 @@ import gplx.core.btries.*; import gplx.core.threads.poolables.*; import gplx.xowa.htmls.core.wkrs.escapes.*; import gplx.xowa.htmls.core.wkrs.hdrs.*; import gplx.xowa.htmls.core.wkrs.lnkes.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import gplx.xowa.htmls.core.wkrs.xndes.*; import gplx.xowa.htmls.core.wkrs.imgs.*; import gplx.xowa.htmls.core.wkrs.thms.*; import gplx.xowa.htmls.core.wkrs.tocs.*; -import gplx.xowa.htmls.core.wkrs.addons.timelines.*; import gplx.xowa.htmls.core.wkrs.addons.gallerys.*; +import gplx.xowa.htmls.core.wkrs.addons.timelines.*; import gplx.xowa.htmls.core.wkrs.addons.gallerys.*; import gplx.xowa.htmls.core.wkrs.addons.medias.*; public class Xoh_pool_mgr__data { - private final Gfo_poolable_mgr pool__hdr, pool__lnke, pool__img, pool__img_bare, pool__toc, pool__timeline, pool__gallery; + private final Gfo_poolable_mgr pool__hdr, pool__lnke, pool__img, pool__img_bare, pool__toc, pool__timeline, pool__gallery, pool__media; public Xoh_pool_mgr__data() { pool__hdr = New_pool(new Xoh_hdr_data()); pool__lnke = New_pool(new Xoh_lnke_data()); @@ -31,6 +31,7 @@ public class Xoh_pool_mgr__data { pool__toc = New_pool(new Xoh_toc_data()); pool__timeline = New_pool(new Xoh_timeline_data()); pool__gallery = New_pool(new Xoh_gallery_data()); + pool__media = New_pool(new Xoh_media_data()); } public Xoh_data_itm Get_by_tid(int tid) { Gfo_poolable_mgr pool = null; @@ -42,6 +43,7 @@ public class Xoh_pool_mgr__data { case Xoh_hzip_dict_.Tid__toc: pool = pool__toc; break; case Xoh_hzip_dict_.Tid__timeline: pool = pool__timeline; break; case Xoh_hzip_dict_.Tid__gallery: pool = pool__gallery; break; + case Xoh_hzip_dict_.Tid__media: pool = pool__media; break; default: return null; } return (Xoh_data_itm)pool.Get_fast(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_pool_mgr__hzip.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_pool_mgr__hzip.java index b2f7992e6..3f6d39116 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_pool_mgr__hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_pool_mgr__hzip.java @@ -20,10 +20,10 @@ import gplx.core.btries.*; import gplx.core.threads.poolables.*; import gplx.xowa.htmls.core.wkrs.escapes.*; import gplx.xowa.htmls.core.wkrs.hdrs.*; import gplx.xowa.htmls.core.wkrs.lnkes.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import gplx.xowa.htmls.core.wkrs.xndes.*; import gplx.xowa.htmls.core.wkrs.imgs.*; import gplx.xowa.htmls.core.wkrs.thms.*; import gplx.xowa.htmls.core.wkrs.glys.*; import gplx.xowa.htmls.core.wkrs.tocs.*; -import gplx.xowa.htmls.core.wkrs.addons.timelines.*; import gplx.xowa.htmls.core.wkrs.addons.gallerys.*; +import gplx.xowa.htmls.core.wkrs.addons.timelines.*; import gplx.xowa.htmls.core.wkrs.addons.gallerys.*; import gplx.xowa.htmls.core.wkrs.addons.medias.*; public class Xoh_pool_mgr__hzip { private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); - private Gfo_poolable_mgr mkr__escape, mkr__xnde, mkr__lnke, mkr__lnki, mkr__hdr, mkr__img, mkr__thm, mkr__gly, mkr__img_bare, mkr__gallery, mkr__timeline, mkr__toc; + private Gfo_poolable_mgr mkr__escape, mkr__xnde, mkr__lnke, mkr__lnki, mkr__hdr, mkr__img, mkr__thm, mkr__gly, mkr__img_bare, mkr__gallery, mkr__timeline, mkr__toc, mkr__media; public Xoh_escape_hzip Mw__escape() {return (Xoh_escape_hzip) mkr__escape.Get_fast();} public Xoh_xnde_hzip Mw__xnde() {return (Xoh_xnde_hzip) mkr__xnde.Get_fast();} public Xoh_hdr_hzip Mw__hdr() {return (Xoh_hdr_hzip) mkr__hdr.Get_fast();} @@ -36,6 +36,7 @@ public class Xoh_pool_mgr__hzip { public Xoh_toc_hzip Mw__toc() {return (Xoh_toc_hzip) mkr__toc.Get_fast();} public Xoh_gallery_hzip Mw__gallery() {return (Xoh_gallery_hzip) mkr__gallery.Get_fast();} public Xoh_timeline_hzip Mw__timeline() {return (Xoh_timeline_hzip) mkr__timeline.Get_fast();} + public Xoh_media_hzip Mw__media() {return (Xoh_media_hzip) mkr__media.Get_fast();} public void Init() { this.Reg_all(false, Hook__core, Hook__html, Hook__mw); } @@ -44,7 +45,7 @@ public class Xoh_pool_mgr__hzip { Gfo_poolable_mgr mgr = (Gfo_poolable_mgr)mgr_obj; return (Xoh_hzip_wkr)mgr.Get_fast(); } - private void Reg_all(boolean mode_is_b256, int hook__core, int hook__html, int hook__mw) { + private void Reg_all(boolean mode_is_b256, int hook__core, int hook__html, int hook__mw) { // SERIALIZED mkr__escape = Reg(New_hook_len2(mode_is_b256, hook__core, 0) , new Xoh_escape_hzip()); mkr__xnde = Reg(New_hook_len1(mode_is_b256, hook__html) , new Xoh_xnde_hzip()); mkr__hdr = Reg(New_hook_len2(mode_is_b256, hook__mw , 1) , new Xoh_hdr_hzip()); @@ -55,6 +56,7 @@ public class Xoh_pool_mgr__hzip { mkr__gly = Reg(New_hook_len2(mode_is_b256, hook__mw , 6) , new Xoh_gly_hzip()); mkr__img_bare = Reg(New_hook_len2(mode_is_b256, hook__mw , 7) , new Xoh_img_bare_hzip()); mkr__toc = Reg(New_hook_len2(mode_is_b256, hook__mw , 8) , new Xoh_toc_hzip()); + mkr__media = Reg(New_hook_len2(mode_is_b256, hook__mw , 9) , new Xoh_media_hzip()); mkr__gallery = Reg(Xoh_gallery_data.Hook_bry , new Xoh_gallery_hzip()); mkr__timeline = Reg(Xoh_timeline_data.Hook_bry , new Xoh_timeline_hzip()); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__hzip.java index d1c99198b..02660ac20 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__hzip.java @@ -40,6 +40,7 @@ public class Xoh_hdoc_wkr__hzip implements Xoh_hdoc_wkr { case Xoh_hzip_dict_.Tid__img: wkr = hctx.Pool_mgr__hzip().Mw__img(); break; case Xoh_hzip_dict_.Tid__img_bare: wkr = hctx.Pool_mgr__hzip().Mw__img_bare(); break; case Xoh_hzip_dict_.Tid__toc: wkr = hctx.Pool_mgr__hzip().Mw__toc(); break; + case Xoh_hzip_dict_.Tid__media: wkr = hctx.Pool_mgr__hzip().Mw__media(); break; default: throw Err_.new_unhandled(data.Tid()); } wkr.Encode1(bfr, this, hctx, hpg, Bool_.Y, src, data).Pool__rls(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_data.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_data.java new file mode 100644 index 000000000..b2af9e053 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_data.java @@ -0,0 +1,126 @@ +/* +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.htmls.core.wkrs.addons.medias; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.addons.*; +import gplx.core.threads.poolables.*; +import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*; import gplx.langs.htmls.styles.*; +import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*; import gplx.xowa.htmls.core.wkrs.imgs.*; +public class Xoh_media_data implements Xoh_data_itm, Gfh_style_wkr { + public int Tid() {return Xoh_hzip_dict_.Tid__media;} + public int Src_bgn() {return src_bgn;} private int src_bgn; + public int Src_end() {return src_end;} private int src_end; + public boolean Rng_valid() {return rng_valid;} private boolean rng_valid; + public boolean Is_audio() {return is_audio;} private boolean is_audio; + public boolean Aud_noicon() {return aud_noicon;} private boolean aud_noicon; + public int Aud_width() {return aud_width;} private int aud_width; + public int Lnki_ttl_bgn() {return lnki_ttl_bgn;} private int lnki_ttl_bgn; + public int Lnki_ttl_end() {return lnki_ttl_end;} private int lnki_ttl_end; + public Xoh_img_data Img_data() {return img_data;} private final Xoh_img_data img_data = new Xoh_img_data(); + public void Clear() { + this.src_bgn = this.src_end = this.lnki_ttl_bgn = this.lnki_ttl_end = aud_width = -1; + this.rng_valid = true; + this.is_audio = this.aud_noicon = false; + img_data.Clear(); + } + public boolean Init_by_parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Gfh_tag_rdr tag_rdr, byte[] src, Gfh_tag media_div_head, Gfh_tag unused) { + this.Clear(); + this.src_bgn = media_div_head.Src_bgn(); + + // peek media_div_tail; needed b/c audio div may have 1 or 2 divs + Gfh_tag media_div_tail = tag_rdr.Tag__peek_fwd_tail(Gfh_tag_.Id__div); + this.src_end = media_div_tail.Src_end(); + + // move div_0_head and get anch_0_head; EX:
...
+ Gfh_tag div_0_head = tag_rdr.Tag__move_fwd_head(); if (div_0_head.Name_id() != Gfh_tag_.Id__div) return Log_failure(tag_rdr, "hzip.media:missing.div_0"); + Gfh_tag anch_0_head = tag_rdr.Tag__move_fwd_head(); if (anch_0_head.Name_id() != Gfh_tag_.Id__a) return Log_failure(tag_rdr, "hzip.media:missing.anch_0"); + + // check cls; if "xowa_media_play", then audio; else video + if (anch_0_head.Atrs__cls_eq(Xoh_anch_cls_.Bry__media_play)) { + if (!Parse_aud(tag_rdr, src, anch_0_head)) return false; + } + else { + if (!Parse_vid(hdoc_wkr, hctx, tag_rdr, src, anch_0_head)) return false; + } + + return true; + } + private boolean Parse_aud(Gfh_tag_rdr tag_rdr, byte[] src, Gfh_tag anch_0_head) { + this.is_audio = true; + + // get lnki_ttl from xowa_title; EX: xowa_title="A.png" + Gfh_atr xowa_title_atr = anch_0_head.Atrs__get_by_or_fail(Xoh_img_data.Bry__atr__xowa_title); + this.lnki_ttl_bgn = xowa_title_atr.Val_bgn(); + this.lnki_ttl_end = xowa_title_atr.Val_end(); + + // get width from style='max-width:' + Gfh_atr style_atr = anch_0_head.Atrs__get_by_or_empty(Gfh_atr_.Bry__style); + Gfh_style_parser_.Parse(src, style_atr.Val_bgn(), style_atr.Val_end(), this); // parse for width; note width only appears if items_per_row is specified + + // move to div_0_tail + tag_rdr.Tag__move_fwd_tail(Gfh_tag_.Id__div); + + // check if div_1 exists (info icon) + Gfh_tag div_1_head = tag_rdr.Tag__peek_fwd_head(Gfh_tag_.Id__div); + if ( div_1_head.Name_id() == Gfh_tag_.Id__eos //
not found + || div_1_head.Src_bgn() > src_end //
is after + ) { + aud_noicon = true; + } + + // move rdr to media_div_tail.end + tag_rdr.Pos_(src_end); + return true; + } + private boolean Parse_vid(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Gfh_tag_rdr tag_rdr, byte[] src, Gfh_tag anch_0_head) { + this.is_audio = false; + + // get lnki_ttl from xowa_title; EX: xowa_title="A.png" + img_data.Init_by_parse(hdoc_wkr, hctx, tag_rdr, src, anch_0_head, null); + + // move to div_0_tail + tag_rdr.Tag__move_fwd_tail(Gfh_tag_.Id__div); + + // check if div_1 exists (info icon) + tag_rdr.Tag__move_fwd_head(Gfh_tag_.Id__div); + // move rdr to media_div_tail.end + tag_rdr.Pos_(src_end); + return true; + } + public void Init_by_decode(boolean is_audio, int aud_width, boolean aud_noicon, int lnki_ttl_bgn, int lnki_ttl_end) { + this.is_audio = is_audio; this.aud_width = aud_width; this.aud_noicon = aud_noicon; + this.lnki_ttl_bgn = lnki_ttl_bgn; this.lnki_ttl_end = lnki_ttl_end; + } + public boolean On_atr(byte[] src, int atr_idx, int atr_val_bgn, int atr_val_end, int itm_bgn, int itm_end, int key_bgn, int key_end, int val_bgn, int val_end) { + if (Bry_.Match(src, key_bgn, key_end, Style__max_width)) { // 'max-width' + if (aud_width == -1) { + aud_width = Bry_.To_int_or__lax(src, val_bgn, val_end, -1); + return true; + } // else if already set, fall-thru to below + } + return true; + } + + private boolean Log_failure(Gfh_tag_rdr tag_rdr, String msg, Object... args) { + tag_rdr.Err_wkr().Warn(msg, args); + return false; + } + public static final byte[] Hook_bry = Bry_.new_a7(" class=\"media mw-media"); + private static final byte[] Style__max_width = Bry_.new_a7("max-width"); + + public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx; + public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_media_data rv = new Xoh_media_data(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;} +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_hzip.java new file mode 100644 index 000000000..448b9f479 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_hzip.java @@ -0,0 +1,84 @@ +/* +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.htmls.core.wkrs.addons.medias; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.addons.*; +import gplx.core.brys.*; import gplx.core.encoders.*; import gplx.core.threads.poolables.*; +import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.imgs.*; +public class Xoh_media_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { + private final Xoh_img_hzip img_hzip = new Xoh_img_hzip(); + private final Xoh_media_wtr wtr = new Xoh_media_wtr(); + public int Tid() {return Xoh_hzip_dict_.Tid__media;} + public String Key() {return Xoh_hzip_dict_.Key__media;} + public byte[] Hook() {return hook;} private byte[] hook; + public Gfo_poolable_itm Encode1(Xoh_hzip_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, byte[] src, Object data_obj) { + Xoh_media_data data = (Xoh_media_data)data_obj; + if (!data.Rng_valid()) { + bfr.Add_mid(src, data.Src_bgn(), data.Src_end()); + return this; + } + + // flags + boolean is_audio = flag_bldr.Set_as_bool(Flag__is_audio, data.Is_audio()); + flag_bldr.Set(Flag__noicon, data.Aud_noicon()); + + // hzip + bfr.Add(hook); + Gfo_hzip_int_.Encode(1, bfr, flag_bldr.Encode()); + + if (is_audio) { + bfr.Add_hzip_int(2, data.Aud_width()); + bfr.Add_hzip_mid(src, data.Lnki_ttl_bgn(), data.Lnki_ttl_end()); + } + else { + img_hzip.Encode1(bfr, hdoc_wkr, hctx, hpg, Bool_.N, src, data.Img_data()); + } + return this; + } + public void Decode1(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int src_bgn, int src_end, Xoh_data_itm data_itm) { + // flags + int flag = rdr.Read_hzip_int(1); flag_bldr.Decode(flag); + boolean is_audio = flag_bldr.Get_as_bool(Flag__is_audio); + boolean aud_noicon = flag_bldr.Get_as_bool(Flag__noicon); + + // lnki_ttl + int aud_width = -1; + int lnki_ttl_bgn = -1, lnki_ttl_end = -1; + if (is_audio) { + aud_width = rdr.Read_hzip_int(2); + lnki_ttl_bgn = rdr.Pos(); lnki_ttl_end = rdr.Find_fwd_lr(); + } + + // write + Xoh_media_data data = (Xoh_media_data)data_itm; + data.Init_by_decode(is_audio, aud_width, aud_noicon, lnki_ttl_bgn, lnki_ttl_end); + if (!is_audio) { + img_hzip.Decode1(bfr, hdoc_wkr, hctx, hpg, rdr, src, rdr.Pos(), src_end, data.Img_data()); + img_hzip.Wtr().Init_by_decode(hpg, hctx, src, data.Img_data()); + } + + wtr.Write(bfr, hpg, hctx, src, data, img_hzip.Wtr()); + } + + public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx; + public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_media_hzip rv = new Xoh_media_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; rv.hook = (byte[])args[0]; return rv;} + + private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_(1, 1); + private static final int // SERIALIZED + Flag__is_audio = 0 + , Flag__noicon = 1 + ; +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_hzip_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_hzip_tst.java new file mode 100644 index 000000000..4aa52b77d --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_hzip_tst.java @@ -0,0 +1,95 @@ +/* +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 . +*/ +//namespace gplx.xowa.htmls.core.wkrs.addons.medias { +// import org.junit.*; using gplx.core.tests; +// using gplx.langs.htmls; using gplx.xowa.htmls.core.makes.tests; +// public class Xoh_media_hzip_tst { +// private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); +// @Test public void Video__full__ogv__width_y() { // EX: [[File:A.ogv|320px|bcd|alt=efg]]; DATE:2016-08-05 +// fxt.Test__bicode // NOTE: caption not rendered; may need to reconsider; +// ( "*!!aA.ogv~)$bA.ogv~efg~", String_.Concat_lines_nl_skip_last +// ( "
" +// , "" +// , "
" +// + "" +// + "" +// + "
" +// , "
" +// )); +// } +// @Test public void Video__full__ogv__width_n() { // EX: [[File:A.ogv]]; DATE:2016-08-05 +// fxt.Test__bicode +// ( "*!!aA.ogv~!A.ogv~efg~", String_.Concat_lines_nl_skip_last +// ( "
" +// , "
" +// + "" +// + "efg" +// + "" +// + "
" +// , "" +// , "
" +// )); +// } +// @Test public void Audio__thumb() { +// String html = Gfh_utl.Replace_apos(String_.Concat_lines_nl +// ( "
" +// , "
" +// , "
" +// , "
" +// , "
" +// , "
" +// , "
" +// , "
b" +// , "
" +// , "
" +// , "
" +// )); +// +// String hzip = String_.Concat_lines_nl +// ( "
" +// , "
" +// , " ~*#$bA.oga" +// , "
" +// , "
$|%%,)A.ogaEnlarge
b" +// , "
" +// , "
" +// , "
" +// ); +// fxt.Test__bicode(hzip, html); +// } +// @Test public void Audio__noicon() { +// String html = Gfh_utl.Replace_apos(String_.Concat_lines_nl +// ( "
" +// , "
" +// , "
" +// )); +// +// String hzip = String_.Concat_lines_nl +// ( " ~*$$bA.oga" +// ); +// fxt.Test__bicode(hzip, html); +// } +// } +//} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_wtr.java new file mode 100644 index 000000000..74a82f382 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/addons/medias/Xoh_media_wtr.java @@ -0,0 +1,66 @@ +/* +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.htmls.core.wkrs.addons.medias; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.addons.*; +import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.brys.fmtrs.*; import gplx.core.threads.poolables.*; import gplx.core.brys.args.*; +import gplx.xowa.files.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.imgs.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; +import gplx.xowa.htmls.sections.*; import gplx.xowa.htmls.core.hzips.*; +public class Xoh_media_wtr { + private final Bfr_arg__bry lnki_ttl = Bfr_arg__bry.New_empty(); + public void Write(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_data_itm data_itm, Xoh_img_wtr img_wtr) { + // make fsdb_itm + hpg.Img_mgr().Make_aud(); + + // set props and write + Xoh_media_data data = (Xoh_media_data)data_itm; + if (data.Is_audio()) { + lnki_ttl.Set_by_mid(src, data.Lnki_ttl_bgn(), data.Lnki_ttl_end()); + if (data.Aud_noicon()) + fmt__noicon.Bfr_arg__clear(); + else + fmt__noicon.Args_(lnki_ttl); + + int aud_width = data.Aud_width(); + fmt__audio.Bld_many(bfr, lnki_ttl, aud_width - 2, aud_width, fmt__noicon); + } + else { + Xoh_img_data img_data = data.Img_data(); + lnki_ttl.Set_by_val(img_data.Img_src().File_ttl_bry()); + + // lnki_w + int lnki_w = img_data.Img_xoimg().Lnki_w(); + if (lnki_w == -1) lnki_w = Xof_img_size.Thumb_width_ogv; // no width; default to 220; EX: [[File:A.ogv]] + + fmt__video.Bld_many(bfr, img_wtr, lnki_ttl, lnki_w - 2, lnki_w); + } + } + + private final Bfr_arg__bry_fmt fmt__noicon = new Bfr_arg__bry_fmt(Bry_fmt.Auto_nl_apos("\n
")); + private final Bry_fmt + fmt__audio = Bry_fmt.Auto_nl_apos + ( "
" + , "
~{noicon}" + , "
" + ) + , fmt__video = Bry_fmt.Auto_nl_apos + ( "
" + , "
~{div1_img}
" + , "
" + , "
" + ); +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_arg.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_arg.java index 23b237d59..52af918e2 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_arg.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_arg.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs.bfr_args; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.core.brys.*; public class Bfr_arg__hatr_arg implements Bfr_arg_clearable { - private final byte[] atr_bgn; + private final byte[] atr_bgn; private Bfr_arg_clearable val_as_arg; public Bfr_arg__hatr_arg(byte[] key) {this.atr_bgn = Bfr_arg__hatr_.Bld_atr_bgn(key);} public Bfr_arg__hatr_arg Set_by_arg(Bfr_arg_clearable v) {val_as_arg = v; return this;} @@ -36,5 +36,5 @@ class Bfr_arg__html_atr__empty implements Bfr_arg_clearable { public void Bfr_arg__clear() {} public boolean Bfr_arg__missing() {return false;} public void Bfr_arg__add(Bry_bfr bfr) {} - public static final Bfr_arg__html_atr__empty Instance = new Bfr_arg__html_atr__empty(); Bfr_arg__html_atr__empty() {} + public static final Bfr_arg__html_atr__empty Instance = new Bfr_arg__html_atr__empty(); Bfr_arg__html_atr__empty() {} } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_id.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_id.java index acb860778..b5c32e5da 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_id.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_id.java @@ -34,4 +34,5 @@ public class Bfr_arg__hatr_id implements Bfr_arg_clearable { } public static Bfr_arg__hatr_id New_id(String v) {return new Bfr_arg__hatr_id(gplx.langs.htmls.Gfh_atr_.Bry__id, Bry_.new_u8(v));} public static Bfr_arg__hatr_id New_id(byte[] v) {return new Bfr_arg__hatr_id(gplx.langs.htmls.Gfh_atr_.Bry__id, v);} + public static final int Id__ignore = -1; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip__dump__basic__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip__dump__basic__tst.java index 47de0e7a4..b61b87f33 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip__dump__basic__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip__dump__basic__tst.java @@ -95,15 +95,6 @@ public class Xoh_img_hzip__dump__basic__tst { , "abc" ); } - @Test public void Video() { // [[File:A.ogv]] - fxt.Test__bicode - ( "%|E9eA.ogv~!A.ogv~~", String_.Concat_lines_nl_skip_last - ( "
" - , "
" - , "
" - , "
" - )); - } @Test public void Imap() { fxt.Test__bicode ( "~%}#Pa$A.png~#:#S#+\"" diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java index fdf5f3995..35f4b870b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java @@ -16,10 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.imgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; -import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.brys.args.*; import gplx.core.brys.fmtrs.*; import gplx.core.threads.poolables.*; -import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*; import gplx.langs.htmls.encoders.*; +import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; import gplx.core.threads.poolables.*; +import gplx.langs.htmls.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; -import gplx.xowa.files.*; import gplx.xowa.xtns.imaps.*; import gplx.xowa.xtns.pagebanners.*; import gplx.xowa.parsers.lnkis.*; +import gplx.xowa.files.*; import gplx.xowa.xtns.imaps.*; import gplx.xowa.parsers.lnkis.*; public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm { private final Bfr_arg_clearable[] arg_ary; private final Bfr_arg__hatr_arg img_xowa_image = new Bfr_arg__hatr_arg(Xoh_img_xoimg_data.Bry__data_xowa_image); @@ -38,7 +38,7 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm { ; private final Bfr_arg__pgbnr img_pgbnr_atrs = new Bfr_arg__pgbnr(); private boolean img_is_vid; private boolean img_wo_anch; - private byte[] xowa_root_dir; + private int div_w; public Xoh_img_wtr() { arg_ary = new Bfr_arg_clearable[] { anch_href, anch_rel, anch_cls, anch_title, anch_xowa_title @@ -47,33 +47,35 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm { }; } public Xof_fsdb_itm Fsdb_itm() {return fsdb_itm;} private Xof_fsdb_itm fsdb_itm; - public Xoh_img_wtr Anch_cls_(byte[] v) {anch_cls.Set_by_bry(v); return this;} - public Xoh_img_wtr Img_id_(int uid) {img_id.Set(uid); return this;} public Xoh_img_wtr Clear() { for (Bfr_arg_clearable arg : arg_ary) arg.Bfr_arg__clear(); vid_play_id.Bfr_arg__clear(); img_imap_usemap.Bfr_arg__clear(); img_is_vid = false; img_wo_anch = false; + div_w = -1; return this; } + public Xoh_img_wtr Anch_cls_(byte[] v) {anch_cls.Set_by_bry(v); return this;} + public Xoh_img_wtr Img_id_(int uid) {img_id.Set(uid); return this;} public void Init_by_parse(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_img_data data) { Init_by_decode(hpg, hctx, src, data); this.Bfr_arg__add(bfr); } - private static final byte[] Bry__qarg__esc = Bry_.new_a7("%3F"); public void Init_html(int html_w, int html_h, byte[] src_bry) { img_w.Set_by_int(html_w); img_h.Set_by_int(html_h); if (gplx.core.envs.Op_sys.Cur().Tid_is_drd()) src_bry = Bry_.Replace(src_bry, Byte_ascii.Question_bry, Bry__qarg__esc); // NOTE: if drd, always escape "?" as "%3F" PAGE:en.w:Cleopatra en.w:Cave_painting; DATE:2016-01-31 img_src.Set_by_bry(src_bry); + this.div_w = html_w; } private void Init_xoimg(Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] lnki_ttl, Xoh_img_xoimg_data img_xowa_image) { fsdb_itm.Init_at_lnki(Xof_exec_tid.Tid_wiki_page, hpg.Wiki().Domain_itm().Abrv_xo(), lnki_ttl, Xop_lnki_type.To_flag(img_xowa_image.Lnki_type()), img_xowa_image.Lnki_upright(), img_xowa_image.Lnki_w(), img_xowa_image.Lnki_h(), img_xowa_image.Lnki_time(), img_xowa_image.Lnki_page(), Xof_patch_upright_tid_.Tid_all); hctx.File__mgr().Find(hpg.Wiki(), hpg.Url_bry_safe(), fsdb_itm); this.img_xowa_image.Set_by_arg(img_xowa_image.Clone()); // NOTE: must clone b/c img_xowa_image is member of Xoh_img_data which is poolable (and cleared); PAGE:en.w:Almagest; DATE:2016-01-05 this.Init_html(fsdb_itm.Html_w(), fsdb_itm.Html_h(), fsdb_itm.Html_view_url().To_http_file_bry()); + this.div_w = fsdb_itm.Lnki_w(); } public boolean Init_by_decode(Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_data_itm data_itm) { Xoh_img_data data = (Xoh_img_data)data_itm; @@ -109,7 +111,6 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm { || Bry_.Len_gt_0(file_ttl_bry)) // regular anch with image anch_xowa_title.Set_by_bry(file_ttl_bry); img_xowa_title.Set_by_bry(file_ttl_bry); - xowa_root_dir = hctx.Fsys__root(); img_alt.Set_by_mid_or_empty(src, data.Img_alt_bgn(), data.Img_alt_end()); img_cls.Set_by_arg(data.Img_cls()); if (data.Img_imap_idx() != -1) img_imap_usemap.Set(data.Img_imap_idx()); @@ -124,10 +125,14 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm { if (img_wo_anch) img_wo_anch_fmtr.Bld_bfr_many(bfr, img_id, img_xowa_title, img_xowa_image, img_src, img_w, img_h, img_cls, img_alt, img_imap_usemap); else { - if (img_is_vid) bfr.Add(Vid__bry__bgn); + if (img_is_vid) { + bfr.Add(Vid__bry__bgn); + } img_fmtr.Bld_bfr_many(bfr, (Object[])arg_ary); - if (img_is_vid) - vid_fmtr.Bld_bfr_many(bfr, vid_play_id, anch_xowa_title, xowa_root_dir, 218, 220); // TODO_OLD: hardcode widths; need to update via js from fsdb + if (img_is_vid) { + if (div_w <= 0) div_w = Xof_img_size.Thumb_width_img; // if no div_w, default to 220; + vid_fmt.Bld_many(bfr, vid_play_id, anch_xowa_title, div_w - 2, div_w); + } } } public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx; @@ -140,8 +145,12 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm { , img_wo_anch_fmtr = Bry_fmtr.new_ ( "" , "img_id", "img_xowa_title", "img_xowa_image", "img_src", "img_w", "img_h", "img_cls", "img_alt", "img_imap_usemap") - , vid_fmtr = Bry_fmtr.new_ - ( "
\n
\n
" - , "vid_play_id", "xowa_title", "xowa_root_dir", "width_neg_2", "width") // NOTE: default to href='file:///'; will be filled in dynamically ; + private final Bry_fmt + vid_fmt = Bry_fmt.Auto_nl_apos + ( "
" + , "
" + , "
" + ); + private static final byte[] Bry__qarg__esc = Bry_.new_a7("%3F"); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_anch_cls_.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_anch_cls_.java index 740f9fb72..b1985e7b8 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_anch_cls_.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_anch_cls_.java @@ -22,31 +22,38 @@ public class Xoh_anch_cls_ { public static final byte // SERIALIZED Tid__image = 0 // EX: [[File:A.png]] -> "" , Tid__none = 1 // EX: [[File:A.png|link=A]] -> "" +// , Tid__xowa_media_play = 2 // EX: [[File:A.ogg]] -> "" ; public static final String Str__image = "image" +// , Str__xowa_media_play = "xowa_media_play" ; - public static final byte[] + public static final byte[] Bry__image = Bry_.new_a7(Str__image) +// , Bry__xowa_media_play = Bry_.new_a7(Str__xowa_media_play) ; - private static final byte[] + private static final byte[] Html__image = Bry_.Add(Gfh_bldr_.Bry__cls__nth, Bry__image) +// , Html__xowa_media_play = Bry_.Add(Gfh_bldr_.Bry__cls__nth, Bry__xowa_media_play) ; - public static final Btrie_slim_mgr Trie = Btrie_slim_mgr.cs() - .Add_bry_byte(Bry__image , Tid__image) + public static final Btrie_slim_mgr Trie = Btrie_slim_mgr.cs() + .Add_bry_byte(Bry__image , Tid__image) +// .Add_bry_byte(Bry__xowa_media_play , Tid__xowa_media_play) ; public static byte[] To_html(int tid) { switch (tid) { - case Xoh_anch_cls_.Tid__none: return Bry_.Empty; - case Xoh_anch_cls_.Tid__image: return Html__image; - default: throw Err_.new_unhandled(tid); + case Xoh_anch_cls_.Tid__none: return Bry_.Empty; + case Xoh_anch_cls_.Tid__image: return Html__image; +// case Xoh_anch_cls_.Tid__xowa_media_play: return Html__xowa_media_play; + default: throw Err_.new_unhandled(tid); } } public static byte[] To_val(int tid) { switch (tid) { - case Xoh_anch_cls_.Tid__none: return Bry_.Empty; - case Xoh_anch_cls_.Tid__image: return Bry__image; - default: throw Err_.new_unhandled(tid); + case Xoh_anch_cls_.Tid__none: return Bry_.Empty; + case Xoh_anch_cls_.Tid__image: return Bry__image; +// case Xoh_anch_cls_.Tid__xowa_media_play: return Bry__xowa_media_play; + default: throw Err_.new_unhandled(tid); } } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html.java index 2fc6d526b..703c05ebf 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html.java @@ -17,12 +17,13 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.core.btries.*; import gplx.core.net.*; import gplx.core.net.qargs.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.apps.urls.*; -import gplx.langs.htmls.*; import gplx.xowa.htmls.hrefs.*; +import gplx.langs.htmls.*; import gplx.langs.htmls.entitys.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.htmls.core.htmls.*; public class Xoh_lnke_html { private static final byte[] Disabled_button = Bry_.new_a7("⊗"); private final Gfo_url_encoder href_encoder = Gfo_url_encoder_.New__html_href_quotes().Make(); + private final Gfo_url_encoder gfs_encoder = Gfo_url_encoder_.New__gfs().Make(); public void Write_html(Bry_bfr bfr, Xow_html_mgr html_mgr, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke) { int href_bgn = lnke.Lnke_href_bgn(), href_end = lnke.Lnke_href_end(); boolean proto_is_xowa = lnke.Proto_tid() == Gfo_protocol_itm.Tid_xowa; byte lnke_type = Calc_type(lnke); @@ -59,7 +60,7 @@ public class Xoh_lnke_html { else { // xowa or regular; EX: http://a.org if (proto_is_xowa) { bfr.Add(Xop_lnke_wkr.Bry_xowa_protocol); - gplx.langs.htmls.encoders.Gfo_url_encoder_.Gfs.Encode(bfr, src, href_bgn, href_end); + gfs_encoder.Encode(bfr, src, href_bgn, href_end); return false; } else { // regular; add href diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_img_wkr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr.java similarity index 88% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_img_wkr.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr.java index 5d35f55c3..c49b1def7 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_img_wkr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import gplx.xowa.files.*; import gplx.xowa.htmls.core.htmls.*; -public interface Xoh_file_img_wkr { - void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid +public interface Xoh_file_fmtr { + void Add_full_img(Bry_bfr bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid , byte[] a_href, boolean a_href_is_file, byte a_cls, byte a_rel, byte[] a_title, byte[] a_xowa_title , int img_w, int img_h, byte[] img_src, byte[] img_alt, byte img_cls, byte[] img_cls_other ); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr__basic.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr__basic.java new file mode 100644 index 000000000..8b1387939 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr__basic.java @@ -0,0 +1,141 @@ +/* +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.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; +import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; import gplx.xowa.htmls.core.makes.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; import gplx.xowa.htmls.core.htmls.*; +import gplx.xowa.files.*; +import gplx.xowa.parsers.lnkis.*; +public class Xoh_file_fmtr__basic implements Xoh_file_fmtr { + private final Xoh_arg_img_core img_atrs = new Xoh_arg_img_core__basic(); + private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(128); + private final Bfr_arg__hatr_id div2_id_atr = Bfr_arg__hatr_id.New_id("xowa_file_div_"), play_id_atr = Bfr_arg__hatr_id.New_id("xowa_file_play_"); + + public void Add_media(Bry_bfr bfr, boolean mode_is_hdump, byte[] a_href, byte[] a_title, byte[] a_html) { + if (mode_is_hdump) a_href = Bry_.Empty; + fmtr_full_media.Bld_many(bfr, a_href, a_title, a_html); + } + private final Bry_fmt fmtr_full_media = Bry_fmt.Auto("~{html}\n"); + + @gplx.Virtual public void Add_full_img(Bry_bfr bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid + , byte[] a_href, boolean a_href_is_file, byte a_cls, byte a_rel, byte[] a_title, byte[] a_xowa_title + , int img_w, int img_h, byte[] img_src, byte[] img_alt, byte img_cls, byte[] img_cls_other + ) { + // init atrs + img_atrs.Init(uid, img_src, img_w, img_h); + byte[] img_cls_atr = Xoh_img_cls_.To_html(img_cls, img_cls_other); + + // fmt + if (Bry_.Len_eq_0(a_href)) // empty link should not create anchor; EX:[[File:A.png|link=|abc]]; PAGE:en.w:List_of_counties_in_New_York; DATE:2016-01-10 + fmtr_full_img__anch_n.Bld_many(bfr + , uid, img_alt, img_atrs, img_cls_atr); + else + fmtr_full_img__anch_y.Bld_many(bfr + , a_href, Xoh_lnki_consts.A_cls_to_bry(a_cls), Xoh_lnki_consts.A_rel_to_bry(a_rel), a_title, a_xowa_title + , uid, img_alt, img_atrs, img_cls_atr); + } + private final Bry_fmt fmtr_full_img__anch_y = Bry_fmt.Auto + ( "" + + "\"~{img_alt}\"~{img_core}~{img_class}" + ); + private final Bry_fmt fmtr_full_img__anch_n = Bry_fmt.Auto + ( "\"~{img_alt}\"~{img_core}~{img_class}"); + + public byte[] Bld_thumb_part_img(Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid, byte[] lnki_ttl, byte[] a_href, byte[] img_src, byte[] img_alt) { + byte[] a_title_atr = Gfh_atr_.Make(tmp_bfr, Gfh_atr_.Bry__title, xfer_itm.Lnki_ttl()); + Add_full_img(tmp_bfr, hctx, page, src, xfer_itm, uid, a_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image + , Xoh_lnki_consts.Tid_a_rel_none, a_title_atr + , Xoh_file_fmtr__basic.Escape_xowa_title(lnki_ttl) // NOTE: must use lnki_ttl, not xfer_itm.Lnki_ttl(); 1st observes case-sensitivity; EX:"a.ogv"; PAGE:de.d:fappieren DATE:2016-06-23 + , xfer_itm.Html_w(), xfer_itm.Html_h(), img_src, img_alt, Xoh_img_cls_.Tid__none, null); + return tmp_bfr.To_bry_and_clear(); + } + public void Add_thumb_core(Bry_bfr bfr, boolean mode_is_hdump, byte[] div1_halign, int div2_id, int div2_width, byte[] div2_content) { + div2_id_atr.Set(mode_is_hdump ? Bfr_arg__hatr_id.Id__ignore : div2_id); + fmtr_thumb_core.Bld_many(bfr, div1_halign, div2_id_atr, div2_width, div2_content); + } + private final Bry_fmt fmtr_thumb_core = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last // REF.MW: Linker.php|makeImageLink2 + ( "
" + , " " + , "~{div3_content}" + , "
" + , "" + , "" + )); + public byte[] Bld_thumb_part_caption(byte[] magnify_btn, byte[] caption) {return fmtr_thumb_part_caption.Bld_many_to_bry(tmp_bfr, magnify_btn, caption);} + private final Bry_fmt fmtr_thumb_part_caption = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last + ( "" + , "
~{magnify_btn}~{caption}" + , "
" + )); + + public byte[] Bld_thumb_file_image(byte[] thumb_image, byte[] caption, byte[] alt) {return fmtr_thumb_file_image.Bld_many_to_bry(tmp_bfr, thumb_image, caption, alt);} + private final Bry_fmt fmtr_thumb_file_image = Bry_fmt.Auto(" ~{thumb_image}~{caption}~{alt}"); + + @gplx.Virtual public byte[] Bld_thumb_file_audio(byte[] caption, byte[] alt, byte[] play_btn, byte[] info_btn) {return fmtr_thumb_file_audio.Bld_many_to_bry(tmp_bfr, play_btn, info_btn, caption, alt);} + private Bry_fmt fmtr_thumb_file_audio = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last + ( "
~{play_btn}~{info_btn}" + , "
~{caption}~{alt}" + )); + + @gplx.Virtual public byte[] Bld_thumb_file_video(byte[] caption, byte[] alt, byte[] play_btn, byte[] vid_img) {return fmtr_thumb_file_video.Bld_many_to_bry(tmp_bfr, vid_img, play_btn, caption, alt);} + private final Bry_fmt fmtr_thumb_file_video = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last + ( "
" + , "
~{vid_img}" + , "
~{play_btn}" + , "
~{caption}~{alt}" + )); + + public Bry_fmt Fmt_thumb_part_alt() {return fmt__thumb_part_alt;} private final Bry_fmt fmt__thumb_part_alt = Bry_fmt.Auto + (String_.Concat_lines_nl_skip_last + ( "" + , "
" + , "
~{html}" + , "
" + )); + + public byte[] Bld_thumb_part_magnify(byte[] a_href, byte[] a_title) { + return fmtr_thumb_part_magnify.Bld_many_to_bry(tmp_bfr, a_href, a_title); + } + private final Bry_fmt fmtr_thumb_part_magnify = Bry_fmt.Auto("\n
"); + + public byte[] Bld_thumb_part_info(byte[] a_href) { + return fmtr_thumb_part_info.Bld_many_to_bry(tmp_bfr, a_href); + } + private final Bry_fmt fmtr_thumb_part_info = Bry_fmt.Auto("\n
"); + + public byte[] Bld_thumb_part_play(boolean mode_is_hdump, int uid, byte[] a_href, byte[] a_xowa_title, int a_width, int a_max_width) { + if (mode_is_hdump) { + play_id_atr.Set(Bfr_arg__hatr_id.Id__ignore); + a_href = Bry_.Empty; + if (a_max_width == -1) { + a_width = 218; a_max_width = 220; // NOTE: hardcode widths; hdump will get actual file with from fsdb + } + } + else + play_id_atr.Set(uid); + return fmtr_thumb_part_play.Bld_many_to_bry(tmp_bfr, play_id_atr, a_href, a_xowa_title, a_width, a_max_width); + } + private final Bry_fmt fmtr_thumb_part_play = Bry_fmt.Auto + ("\n
"); + + public static byte[] Escape_xowa_title(byte[] lnki_ttl) { + return Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_quotes.Encode(lnki_ttl)); // must encode xowa_title, particularly quotes; EX: xowa_title="A"b.png"; PAGE:en.w:Earth DATE:2015-11-27 + } + public static byte[] Escape_xowa_title_v2(byte[] lnki_ttl) { + return Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_quotes_v2.Encode(lnki_ttl)); // must encode xowa_title, particularly quotes; EX: xowa_title="A"b.png"; PAGE:en.w:Earth DATE:2015-11-27 + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr__hdump.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr__hdump.java new file mode 100644 index 000000000..07cc63459 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_fmtr__hdump.java @@ -0,0 +1,65 @@ +/* +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.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; +import gplx.core.brys.fmtrs.*; +import gplx.xowa.files.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.makes.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; +import gplx.xowa.parsers.lnkis.*; +public class Xoh_file_fmtr__hdump extends Xoh_file_fmtr__basic { private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(128); + @Override public void Add_full_img(Bry_bfr bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm + , int uid, byte[] a_href, boolean a_href_is_file, byte a_cls, byte a_rel, byte[] a_title, byte[] a_xowa_title + , int img_w, int img_h, byte[] img_src, byte[] img_alt, byte img_cls, byte[] img_cls_other) { + + // init data_xowa_title / data_xowa_image; EX: "xowa_title='A.png'"; "xowa_image='1|220|440|-1|-1|-1'" + byte[] data_xowa_title = Gfh_atr_.Make(tmp_bfr, Xoh_img_xoimg_data.Bry__data_xowa_title, a_xowa_title); + byte[] data_xowa_image = Bld_xowa_image_data(tmp_bfr, xfer_itm.Lnki_type(), xfer_itm.Lnki_w(), xfer_itm.Lnki_h(), xfer_itm.Lnki_upright(), xfer_itm.Lnki_time(), xfer_itm.Lnki_page()); + + // bld bfr + if (Bry_.Len_eq_0(a_href)) + Add_anch_n(bfr, data_xowa_title, data_xowa_image, img_cls, img_cls_other, img_alt, Bry_.Empty); + else { + if (a_href_is_file) a_href = Bry_.Empty; + fmt__anch_y.Bld_many(bfr + , a_href, Xoh_lnki_consts.A_cls_to_bry(a_cls), Xoh_lnki_consts.A_rel_to_bry(a_rel), a_title, a_xowa_title + , data_xowa_title, data_xowa_image, Xoh_img_cls_.To_html(img_cls, img_cls_other), Gfh_utl.Escape_html_as_bry(img_alt) + ); + } + } + public static void Add_anch_n(Bry_bfr bfr, byte[] data_xowa_title, byte[] data_xowa_image, byte img_cls, byte[] img_cls_other, byte[] img_alt, byte[] img_xtra_atrs) { + fmt__anch_n.Bld_many(bfr, data_xowa_title, data_xowa_image, Xoh_img_cls_.To_html(img_cls, img_cls_other), Gfh_utl.Escape_html_as_bry(img_alt), img_xtra_atrs); + } + public static byte[] Bld_xowa_image_data(Bry_bfr bfr, byte tid, int w, int h, double upright, double time, int page) { + bfr.Add_byte_space().Add(Xoh_img_xoimg_data.Bry__data_xowa_image).Add_byte_eq().Add_byte_quote(); + bfr.Add_int_digits(1, Xop_lnki_type.To_tid(tid)).Add_byte_pipe(); + bfr.Add_int_variable(w).Add_byte_pipe(); + bfr.Add_int_variable(h).Add_byte_pipe(); + bfr.Add_double(upright).Add_byte_pipe(); + bfr.Add_double(time).Add_byte_pipe(); + bfr.Add_int_variable(page).Add_byte_quote(); + return bfr.To_bry_and_clear(); + } + private static final Bry_fmt + fmt__anch_n = Bry_fmt.Auto + ( "" + ) + , fmt__anch_y = Bry_fmt.Auto + ( "" + + "" + + "" + ); +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__base.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__base.java deleted file mode 100644 index af07b8c33..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__base.java +++ /dev/null @@ -1,162 +0,0 @@ -/* -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.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; -import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; -import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; -import gplx.xowa.files.*; import gplx.xowa.htmls.core.makes.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; -import gplx.xowa.htmls.core.htmls.*; -import gplx.xowa.parsers.lnkis.*; -public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr { - protected final Xoh_arg_img_core arg_img_core; - private Bry_bfr scratch_bfr = Bry_bfr_.Reset(128); - private final Bfr_arg__hatr_id thm_file_id = Bfr_arg__hatr_id.New_id("xowa_file_div_"), thm_play_id = Bfr_arg__hatr_id.New_id("xowa_file_play_"); - public Xoh_file_html_fmtr__base() { - arg_img_core = New_arg_img_core(); - } - @gplx.Internal @gplx.Virtual protected Xoh_arg_img_core New_arg_img_core() {return new Xoh_arg_img_core__basic();} - @gplx.Virtual public void Html_full_media(Bry_bfr tmp_bfr, boolean mode_is_hdump, byte[] a_href, byte[] a_title, Bfr_arg html) { - if (mode_is_hdump) a_href = Bry_.Empty; - fmtr_full_media.Bld_bfr_many(tmp_bfr, a_href, a_title, html); - } - private final Bry_fmtr fmtr_full_media = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "~{html}" - , "" - ), "a_href", "a_xowa_title", "html" - ); - @gplx.Virtual public void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid - , byte[] a_href, boolean a_href_is_file, byte a_cls, byte a_rel, byte[] a_title, byte[] a_xowa_title - , int img_w, int img_h, byte[] img_src, byte[] img_alt, byte img_cls, byte[] img_cls_other - ) { - if (Bry_.Len_eq_0(a_href)) // empty link should not create anchor; EX:[[File:A.png|link=|abc]]; PAGE:en.w:List_of_counties_in_New_York; DATE:2016-01-10 - fmtr_full_img_wo_link.Bld_bfr_many(tmp_bfr, uid, arg_img_core.Init(uid, img_src, img_w, img_h), img_alt, Xoh_img_cls_.To_html(img_cls, img_cls_other)); - else - fmtr_full_img.Bld_bfr_many(tmp_bfr, uid - , a_href, Xoh_lnki_consts.A_cls_to_bry(a_cls), Xoh_lnki_consts.A_rel_to_bry(a_rel), a_title, a_xowa_title - , arg_img_core.Init(uid, img_src, img_w, img_h), img_alt, Xoh_img_cls_.To_html(img_cls, img_cls_other)); - } - private Bry_fmtr fmtr_full_img = Bry_fmtr.new_ - ( "" - + "\"~{img_alt}\"~{img_core}~{img_class}" - , "uid", "a_href", "a_class", "a_rel", "a_title", "a_xowa_title", "img_core", "img_alt", "img_class" - ); - private Bry_fmtr fmtr_full_img_wo_link = Bry_fmtr.new_ - ( "\"~{img_alt}\"~{img_core}~{img_class}" - , "uid", "img_core", "img_alt", "img_class" - ); - public byte[] Html_thumb_part_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid, byte[] lnki_ttl, byte[] a_href, byte[] img_src, byte[] img_alt) { - byte[] a_title_atr = Gfh_atr_.Make(tmp_bfr, Gfh_atr_.Bry__title, xfer_itm.Lnki_ttl()); - Html_full_img(tmp_bfr, hctx, page, src, xfer_itm, uid, a_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image - , Xoh_lnki_consts.Tid_a_rel_none, a_title_atr - , Xoh_file_html_fmtr__base.Escape_xowa_title(lnki_ttl) // NOTE: must use lnki_ttl, not xfer_itm.Lnki_ttl(); 1st observes case-sensitivity; EX:"a.ogv"; PAGE:de.d:fappieren DATE:2016-06-23 - , xfer_itm.Html_w(), xfer_itm.Html_h(), img_src, img_alt, Xoh_img_cls_.Tid__none, null); - return tmp_bfr.To_bry_and_clear(); - } - @gplx.Virtual public void Html_thumb_core(Bry_bfr tmp_bfr, boolean mode_is_hdump, int uid, byte[] div1_halign, int div2_width, byte[] div2_content) { - scratch_bfr.Add(Bry_style_bgn); - scratch_bfr.Add_int_variable(div2_width); - scratch_bfr.Add(Bry_style_end); - thm_file_id.Bfr_arg__clear(); - if (mode_is_hdump) - thm_file_id.Bfr_arg__clear(); - else - thm_file_id.Set(uid); - fmtr_thumb_core.Bld_bfr_many(tmp_bfr, thm_file_id, div1_halign, scratch_bfr.To_bry_and_clear(), div2_content); - } - private static final byte[] Bry_style_bgn = Bry_.new_a7("style=\"width:"), Bry_style_end = Bry_.new_a7("px;\""); - protected Bry_fmtr fmtr_thumb_core = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last // REF.MW: Linker.php|makeImageLink2 - ( "
" - , " " - , "~{div2_content}" - , "
" - , "" - , "" - ), "div_id", "div1_halign", "style", "div2_content" - ); - public void Html_thumb_part_caption(Bry_bfr tmp_bfr, byte[] magnify_btn, Bfr_arg caption) {fmtr_thumb_part_caption.Bld_bfr_many(tmp_bfr, magnify_btn, caption);} - private Bry_fmtr fmtr_thumb_part_caption = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
~{magnify_btn}~{caption}" - , "
" - ), "magnify_btn", "caption"); - - public void Html_thumb_file_image(Bry_bfr tmp_bfr, byte[] thumb_image, byte[] caption, byte[] alt) {fmtr_thumb_file_image.Bld_bfr_many(tmp_bfr, thumb_image, caption, alt);} - private final Bry_fmtr fmtr_thumb_file_image = Bry_fmtr.new_(" ~{thumb_image}~{caption}~{alt}", "thumb_image", "caption", "alt"); - - public void Html_thumb_file_audio(Bry_bfr tmp_bfr, byte[] caption, byte[] alt, byte[] play_btn, byte[] audio_info) {fmtr_thumb_file_audio.Bld_bfr_many(tmp_bfr, caption, alt, play_btn, audio_info);} - private Bry_fmtr fmtr_thumb_file_audio = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "
~{play_btn}~{audio_info}" - , "
~{caption}~{alt}" - ), "caption", "alt", "play_btn", "audio_info"); - - public void Html_thumb_file_video(Bry_bfr tmp_bfr, byte[] play_btn, byte[] video_thumb, byte[] caption, byte[] alt) {fmtr_thumb_file_video.Bld_bfr_many(tmp_bfr, caption, alt, play_btn, video_thumb);} - private final Bry_fmtr fmtr_thumb_file_video = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "
" - , "
~{video_thumb}" - , "
~{play_btn}" - , "
~{caption}~{alt}" - ), "caption", "alt", "play_btn", "video_thumb"); - - public void Html_thumb_part_alt(Bry_bfr tmp_bfr, byte[] alt_html) {fmtr_thumb_part_alt.Bld_bfr_many(tmp_bfr, alt_html);} - public Bry_fmtr Html_thumb_part_alt_fmtr() {return fmtr_thumb_part_alt;} private Bry_fmtr fmtr_thumb_part_alt = Bry_fmtr.new_ - (String_.Concat_lines_nl_skip_last - ( "" - , "
" - , "
~{html}" - , "
" - ), "html"); - - @gplx.Virtual public void Html_thumb_part_magnify(Bry_bfr tmp_bfr, int uid, byte[] a_href, byte[] a_title, byte[] img_src) { - fmtr_thumb_part_magnify.Bld_bfr_many(tmp_bfr, a_href, a_title); - } - private final Bry_fmtr fmtr_thumb_part_magnify = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
" - ), "a_href", "a_title"); - - @gplx.Virtual public void Html_thumb_part_info(Bry_bfr tmp_bfr, int uid, boolean mode_is_hdump, byte[] a_href, byte[] img_src) { - if (mode_is_hdump) - img_src = Bry_.Empty; - fmtr_thumb_part_info.Bld_bfr_many(tmp_bfr, a_href, img_src); - } - private final Bry_fmtr fmtr_thumb_part_info = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
" - ), "a_href", "img_src"); - - public void Html_thumb_part_play(Bry_bfr tmp_bfr, int uid, boolean mode_is_hdump, int a_width, int a_max_width, byte[] a_href, byte[] a_xowa_title, byte[] img_src) { - if (mode_is_hdump) { - thm_play_id.Bfr_arg__clear(); - a_href = Bry_.Empty; - a_width = 218; a_max_width = 220; // NOTE: hardcode widths; hdump will get actual file with from fsdb - } - else - thm_play_id.Set(uid); - fmtr_thumb_part_play.Bld_bfr_many(tmp_bfr, thm_play_id, a_width, a_max_width, a_href, a_xowa_title); - } - private final Bry_fmtr fmtr_thumb_part_play = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
" - ), "id", "a_width", "a_max_width", "a_href", "a_xowa_title"); - - public static byte[] Escape_xowa_title(byte[] lnki_ttl) { - return Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_quotes.Encode(lnki_ttl)); // must encode xowa_title, particularly quotes; EX: xowa_title="A"b.png"; PAGE:en.w:Earth DATE:2015-11-27 - } - public static byte[] Escape_xowa_title_v2(byte[] lnki_ttl) { - return Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_quotes_v2.Encode(lnki_ttl)); // must encode xowa_title, particularly quotes; EX: xowa_title="A"b.png"; PAGE:en.w:Earth DATE:2015-11-27 - } -} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__hdump.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__hdump.java deleted file mode 100644 index d9be3d003..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__hdump.java +++ /dev/null @@ -1,68 +0,0 @@ -/* -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.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; -import gplx.core.brys.fmtrs.*; -import gplx.langs.htmls.*; -import gplx.xowa.files.*; import gplx.xowa.htmls.core.makes.*; -import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; -import gplx.xowa.parsers.lnkis.*; -public class Xoh_file_html_fmtr__hdump extends Xoh_file_html_fmtr__base { - private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(128); - @Override public void Html_full_img(Bry_bfr bfr, gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm - , int uid, byte[] a_href, boolean a_href_is_file, byte a_cls, byte a_rel, byte[] a_title, byte[] a_xowa_title - , int img_w, int img_h, byte[] img_src, byte[] img_alt, byte img_cls, byte[] img_cls_other) { - boolean link_is_empty = Bry_.Len_eq_0(a_href); // NOTE: set link_is_empty before blanking a_href below - if (a_href_is_file) a_href = Bry_.Empty; - byte[] data_xowa_title = Gfh_atr_.Make(tmp_bfr, Xoh_img_xoimg_data.Bry__data_xowa_title, a_xowa_title); - byte[] data_xowa_image = Bld_xowa_image_data(tmp_bfr, xfer_itm.Lnki_type(), xfer_itm.Lnki_w(), xfer_itm.Lnki_h(), xfer_itm.Lnki_upright(), xfer_itm.Lnki_time(), xfer_itm.Lnki_page()); - if (link_is_empty) - Bld_anch_n(bfr, data_xowa_title, data_xowa_image, img_cls, img_cls_other, img_alt, Bry_.Empty); - else - fmtr_anch_y.Bld_bfr_many(bfr - , a_href, Xoh_lnki_consts.A_cls_to_bry(a_cls), Xoh_lnki_consts.A_rel_to_bry(a_rel), a_title, a_xowa_title - , Gfh_utl.Escape_html_as_bry(img_alt), data_xowa_title, data_xowa_image, arg_img_core.Init(uid, Bry_.Empty, 0, 0), Xoh_img_cls_.To_html(img_cls, img_cls_other)); - } - public static void Bld_anch_n(Bry_bfr bfr, byte[] data_xowa_title, byte[] data_xowa_image, byte img_cls, byte[] img_cls_other, byte[] img_alt, byte[] img_xtra_atrs) { - fmtr_anch_n.Bld_many(bfr, data_xowa_title, data_xowa_image, Xoh_img_cls_.To_html(img_cls, img_cls_other), Gfh_utl.Escape_html_as_bry(img_alt), img_xtra_atrs); - } - public static byte[] Bld_xowa_image_data(Bry_bfr tmp_bfr, byte tid, int w, int h, double upright, double time, int page) { - tmp_bfr.Add_byte_space().Add(Xoh_img_xoimg_data.Bry__data_xowa_image).Add_byte_eq().Add_byte_quote(); - tmp_bfr.Add_int_digits(1, Xop_lnki_type.To_tid(tid)).Add_byte_pipe(); - tmp_bfr.Add_int_variable(w).Add_byte_pipe(); - tmp_bfr.Add_int_variable(h).Add_byte_pipe(); - tmp_bfr.Add_double(upright).Add_byte_pipe(); - tmp_bfr.Add_double(time).Add_byte_pipe(); - tmp_bfr.Add_int_variable(page).Add_byte_quote(); - return tmp_bfr.To_bry_and_clear(); - } - private - Bry_fmtr fmtr_anch_y = Bry_fmtr.new_ - ( "" - + "" - + "" - , "a_href", "a_class", "a_rel", "a_title", "a_xowa_title", "img_alt", "img_xoimg", "data_xowa_title", "data_xowa_image", "img_class" - ) - ; - private static final Bry_fmt fmtr_anch_n = Bry_fmt.New - ( "" - , "data_xowa_title", "data_xowa_image", "img_class", "img_alt", "img_xtra_atrs" - ); -// public override void Html_full_media(Bry_bfr tmp_bfr, byte[] a_href, byte[] a_title, Bfr_arg html) { -// fmtr_full_media.Bld_bfr_many(tmp_bfr, a_href, a_title, html); -// } -} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_mgr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_mgr.java index e64633145..d13a419bd 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_mgr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import gplx.core.primitives.*; -import gplx.xowa.files.*; import gplx.xowa.files.xfers.*; import gplx.xowa.parsers.lnkis.*; +import gplx.xowa.files.*; import gplx.xowa.files.xfers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.files.origs.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.parsers.*; import gplx.xowa.wikis.tdbs.metas.*; @@ -29,7 +29,7 @@ public class Xoh_file_mgr { } public Xoh_file_wtr__basic File_wtr() {return file_wtr;} private final Xoh_file_wtr__basic file_wtr; public void Init_by_page(Xoh_wtr_ctx hctx, Xoae_page page) {file_wtr.Init_by_page(hctx, page);} - public void Write_or_queue(Bry_bfr bfr, Xoae_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki) {Write_or_queue(bfr, page, ctx, hctx, src, lnki, file_wtr.Arg_alt_text(ctx, src, lnki));} + public void Write_or_queue(Bry_bfr bfr, Xoae_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki) {Write_or_queue(bfr, page, ctx, hctx, src, lnki, file_wtr.Bld_alt(Bool_.N, ctx, Xoh_wtr_ctx.Alt, src, lnki));} public void Write_or_queue(Bry_bfr bfr, Xoae_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, byte[] alt_text) { file_wtr.Write_file(bfr, ctx, hctx, src, lnki, this.Lnki_eval(Xof_exec_tid.Tid_wiki_page, ctx, page, lnki), alt_text); } @@ -49,8 +49,19 @@ public class Xoh_file_mgr { return xfer; } private boolean Find_file(Xop_ctx ctx, Xowe_wiki source_wiki, Xof_xfer_itm xfer) { + if (source_wiki.File__fsdb_mode().Tid__v2__mp()) { + Xof_orig_itm itm = source_wiki.File__orig_mgr().Find_by_ttl_or_null(xfer.Lnki_ttl()); + if (itm == null) + return false; + else { + byte repo_id = itm.Repo(); + byte[] repo_name = source_wiki.File_mgr().Repo_mgr().Repos_get_at(repo_id).Wiki_domain(); + xfer.Init_at_orig(itm.Repo(), repo_name, itm.Ttl(), itm.Ext(), itm.W(), itm.H(), itm.Redirect()); + return true; + } + } if ( source_wiki.File__fsdb_mode() == null // ignore if null; occurs during some tests; also null-ref check for next - || source_wiki.File__fsdb_mode().Tid_v2_bld() // ignore builds + || source_wiki.File__fsdb_mode().Tid__v2__bld() // ignore builds ) return false; if (source_wiki.File_mgr().Version() == Xow_file_mgr.Version_2) diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__audio__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__audio__tst.java index b41c99d1a..8bceba043 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__audio__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__audio__tst.java @@ -23,7 +23,7 @@ public class Xoh_file_wtr__audio__tst { fxt.Test_parse_page_wiki_str ( "[[File:A.oga|noicon]]", String_.Concat_lines_nl_skip_last ( "
" - , "
" + , "
" , "
" , "
" , "
" @@ -50,7 +50,7 @@ public class Xoh_file_wtr__audio__tst { ( "
" , "
" , "
" - , "
" + , "
" , "
" , "
" , "
" @@ -74,7 +74,7 @@ public class Xoh_file_wtr__audio__tst { fxt.Test_parse_page_wiki_str ( "[[File:A.oga|thumb|noicon|a|alt=b]]", String_.Concat_lines_nl_skip_last ( "
" - , "
" + , "
" , "
" , "
a" , "
" diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java index a3489cb40..609a0edc8 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java @@ -21,48 +21,55 @@ import gplx.langs.htmls.*; import gplx.langs.htmls.encoders.*; import gplx.xowa. import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.files.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*; -public class Xoh_file_wtr__basic { - private final Xowe_wiki wiki; private final Xow_html_mgr html_mgr; private final Xoh_html_wtr html_wtr; private final Bry_bfr_mkr bfr_mkr; private final Bry_bfr scratch_bfr = Bry_bfr_.Reset(Io_mgr.Len_kb); - private final Xoh_lnki_text_fmtr media_alt_fmtr, caption_fmtr; - private final Xop_link_parser tmp_link_parser = new Xop_link_parser(); private Xoa_url tmp_url = Xoa_url.blank(); private final Xoh_lnki_title_fmtr anchor_title_wkr = new Xoh_lnki_title_fmtr(); - private Xoae_page page; private boolean cfg_alt_defaults_to_caption; - private Xoh_file_html_fmtr__base html_fmtr; - private final Xoh_file_html_fmtr__hdump fmtr__hdump = new Xoh_file_html_fmtr__hdump(); - private final Xoh_file_html_fmtr__base fmtr__base = new Xoh_file_html_fmtr__base(); +public class Xoh_file_wtr__basic { + private final Xowe_wiki wiki; private final Xow_html_mgr html_mgr; private final Xoh_html_wtr html_wtr; + private final Xoh_file_fmtr__basic fmtr__basic = new Xoh_file_fmtr__basic(), fmtr__hdump = new Xoh_file_fmtr__hdump(); + private final Xoh_lnki_text_fmtr alt_fmtr, caption_fmtr; + private final Xop_link_parser tmp_link_parser = new Xop_link_parser(); private Xoa_url tmp_url = Xoa_url.blank(); + private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(32); + private Xoae_page page; private boolean cfg_alt_defaults_to_caption; private byte[] msg_file_enlarge; + private Xoh_file_fmtr__basic html_fmtr; public Xoh_file_wtr__basic(Xowe_wiki wiki, Xow_html_mgr html_mgr, Xoh_html_wtr html_wtr) { - this.wiki = wiki; this.html_mgr = html_mgr; this.html_wtr = html_wtr; this.bfr_mkr = wiki.Utl__bfr_mkr(); - this.media_alt_fmtr = new Xoh_lnki_text_fmtr(bfr_mkr, html_wtr); - this.caption_fmtr = new Xoh_lnki_text_fmtr(bfr_mkr, html_wtr); - this.html_fmtr = fmtr__base; + this.wiki = wiki; this.html_mgr = html_mgr; this.html_wtr = html_wtr; + this.alt_fmtr = new Xoh_lnki_text_fmtr(wiki.Utl__bfr_mkr(), html_wtr); + this.caption_fmtr = new Xoh_lnki_text_fmtr(wiki.Utl__bfr_mkr(), html_wtr); + this.html_fmtr = fmtr__basic; } - public Xoh_file_html_fmtr__base Html_fmtr() {return html_fmtr;} public void Init_by_page(Xoh_wtr_ctx hctx, Xoae_page page) { this.page = page; this.cfg_alt_defaults_to_caption = wiki.Appe().Usere().Wiki().Html_mgr().Imgs_mgr().Alt_defaults_to_caption().Val(); - html_fmtr = hctx.Mode_is_hdump() ? fmtr__hdump : fmtr__base; + this.html_fmtr = hctx.Mode_is_hdump() ? fmtr__hdump : fmtr__basic; + if (msg_file_enlarge == null) this.msg_file_enlarge = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_file_enlarge); } public void Write_file(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xof_file_itm xfer_itm, byte[] img_alt) { + // init int uid = xfer_itm.Html_uid(); + byte[] lnki_ttl = lnki.Ttl().Page_txt(); + Xof_ext orig_ext = xfer_itm.Orig_ext(); + byte[] lnki_href = wiki.Html__href_wtr().Build_to_bry(wiki, lnki.Ttl()); + + // get div_width int div_width = xfer_itm.Html_w(); if (div_width < 1 && wiki.File_mgr().Version_2_y()) // NOTE: html_w is -1 for v2 and missing files; use lnki_w if available; primarily affects audio files with specified width; [[File:A.oga|30px]]; DATE:2014-05-03 div_width = xfer_itm.Lnki_w(); if (div_width < 1) // && hctx.Mode_is_hdump() // TODO: should manually insert? div_width = wiki.Html_mgr().Img_thumb_width(); - int lnki_halign = lnki.Align_h(); - if (lnki_halign == Xop_lnki_align_h_.Null) - lnki_halign = wiki.Lang().Img_thumb_halign_default(); // if halign is not supplied, then default to align for language - byte[] lnki_halign_bry = Xop_lnki_align_h_.Html_names[lnki_halign]; - byte[] lnki_href = wiki.Html__href_wtr().Build_to_bry(wiki, lnki.Ttl()); - byte[] img_view_src = xfer_itm.Html_view_url().To_http_file_bry(); - byte[] img_orig_src = xfer_itm.Html_orig_url().To_http_file_bry(); - byte[] lnki_ttl = lnki.Ttl().Page_txt(); - Xof_ext orig_ext = xfer_itm.Orig_ext(); boolean lnki_is_thumbable = Xop_lnki_type.Id_is_thumbable(lnki.Lnki_type()); if ( lnki_is_thumbable && ( !xfer_itm.File_exists() // "non-found" thumbs should default to 220; otherwise large "non-found" thumbs will create large boxes; PAGE:en.w:Wikipedia:Featured_picture_candidates/September_Morn "|1000000x260px"; DATE:2014-09-24 && !hctx.Mode_is_hdump()) // ignore for hdump mode b/c all images are "non-found"; DATE:2016-05-30 ) div_width = Xof_img_size.Thumb_width_img; + + // get halign + int lnki_halign = lnki.Align_h(); + if (lnki_halign == Xop_lnki_align_h_.Null) + lnki_halign = wiki.Lang().Img_thumb_halign_default(); // if halign is not supplied, then default to align for language + byte[] lnki_halign_bry = Xop_lnki_align_h_.Html_names[lnki_halign]; + + // img_view_src, img_orig_src + byte[] img_view_src = xfer_itm.Html_view_url().To_http_file_bry(); + byte[] img_orig_src = xfer_itm.Html_orig_url().To_http_file_bry(); if ( html_mgr.Img_suppress_missing_src() // option to suppress src when file is missing && !xfer_itm.File_exists() // file is missing; wipe values and wait for "correct" info before regenerating; mostly to handle unknown redirects && !orig_ext.Id_is_media() // file is media; never suppress; src needs to be available for "click" on play; note that most media will be missing (not downloaded) @@ -70,78 +77,138 @@ public class Xoh_file_wtr__basic { ) { img_orig_src = img_view_src = Bry_.Empty; // null out src } + + // main html build if (lnki.Ns_id() == Xow_ns_.Tid__media) // NOTE: regardless of ext (ogg vs jpeg) and literal status (Media vs :Media), [[Media]] links are always rendered the same way; REF.MW:Linker.php|makeMediaLinkObj; PAGE:en.w:Beethoven; EX: [[:Media:De-Ludwig_van_Beethoven.ogg|listen]]); [[File:Beethoven 3.jpg|The [[Media:BeethovenWithLyreGuitar( W. J. Mahler - 1804).jpg|complete painting]]...]] - this.Write_file_ns_media(bfr, ctx, hctx, src, lnki, img_orig_src); + html_fmtr.Add_media(bfr, hctx.Mode_is_hdump(), img_orig_src, lnki_ttl, Bld_caption(ctx, Xoh_wtr_ctx.Basic, src, lnki)); // NOTE: use orig_src not view_src; DATE:2014-01-19 else { - if ( Xof_ext_.Id_is_video_strict(orig_ext.Id()) // id is .ogv or .webm - || ( orig_ext.Id_is_ogg() // id is ogg - && wiki.File_mgr().Version_1_y() // version is v1 (v2 always marks ogg as aud); DATE:2014-02-01 + // identify if video; note that this is complicated b/c .ogg is used for both audio and video files + boolean orig_is_video = Xof_ext_.Id_is_video_strict(orig_ext.Id()); + if (orig_ext.Id_is_ogg()) { + if ( wiki.File_mgr().Version_1_y() // version is v1 (v2 always marks ogg as aud if from fsdb); DATE:2014-02-01 && ( xfer_itm.File_exists() // NOTE: xfer_itm.Html_pass() checks for video .ogg files (ext = .ogg and thumb is available); EX: WWI; || xfer_itm.Dbmeta_is_new() // NOTE: State_new() will always assume that ogg is video; needed for 1st load and dynamic updates ) - ) - ) { + ) + orig_is_video = true; + else if ( wiki.File_mgr().Version_2_y() // version is v2 + && ( lnki.Lnki_type() != Xop_lnki_type.Id_null // any one of w, h, time, upright, type is present + || lnki.W() > 0 + || lnki.H() > 0 + || lnki.Time() != Xof_lnki_time.Null + || lnki.Upright() != Xop_lnki_tkn.Upright_null + )) { + orig_is_video = true; // ASSUME: .ogg is video b/c of supplied values; DATE:2016-08-05 + } + } + if (orig_is_video) { xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_vid); - this.Write_file_video(bfr, ctx, hctx, src, lnki, uid, div_width, lnki_halign_bry, lnki_ttl, lnki_href, img_view_src, img_orig_src, img_alt, xfer_itm); + int vid_lnki_w = lnki.W(); if (vid_lnki_w == -1) vid_lnki_w = 0; if (vid_lnki_w == 0 && xfer_itm.Html_w() != 0) vid_lnki_w = xfer_itm.Html_w(); + int vid_lnki_h = lnki.H(); if (vid_lnki_h == -1) vid_lnki_h = 0; if (vid_lnki_h == 0 && xfer_itm.Html_h() != 0) vid_lnki_h = xfer_itm.Html_h(); + xfer_itm.Init_at_gallery_bgn(vid_lnki_w, vid_lnki_h, vid_lnki_w); // HACK: force html_w to be lnki_w; needed b/c play_btn uses html_w; DATE:2016-08-05 + this.Write_file_video(bfr, ctx, hctx, src, lnki, img_orig_src, uid, div_width, lnki_halign_bry, lnki_href, img_alt, lnki_ttl, img_view_src, xfer_itm); } else if (orig_ext.Id_is_audio()) // audio - this.Write_file_audio(bfr, ctx, hctx, src, lnki, uid, div_width, lnki_halign_bry, lnki_href, img_orig_src, img_alt); + this.Write_file_audio(bfr, ctx, hctx, src, lnki, img_orig_src, uid, div_width, lnki_halign_bry, lnki_href, img_alt, lnki_ttl); else // image - this.Write_file_image(bfr, ctx, hctx, src, lnki, xfer_itm, uid, lnki_is_thumbable, div_width, lnki_halign, lnki_halign_bry, lnki_ttl, orig_ext, lnki_href, img_view_src, img_orig_src, img_alt); + this.Write_file_image(bfr, ctx, hctx, src, lnki, img_orig_src, uid, div_width, lnki_halign_bry, lnki_href, img_alt, lnki_ttl, img_view_src, xfer_itm, lnki_is_thumbable, lnki_halign, orig_ext); } } - private void Write_file_ns_media(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src) { - html_fmtr.Html_full_media(bfr, hctx.Mode_is_hdump(), img_orig_src, lnki.Ttl().Page_txt(), Arg_caption(ctx, src, Xoh_wtr_ctx.Basic, lnki)); // NOTE: use orig_src not view_src; DATE:2014-01-19 - } - private void Write_file_audio(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_href, byte[] img_orig_src, byte[] alt) { - byte[] content = Arg_content_audio(lnki, ctx, hctx, src, uid, lnki_href, img_orig_src, alt); + private void Write_file_audio(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_href, byte[] alt, byte[] lnki_ttl) { + // init + int play_btn_width = Get_play_btn_width(lnki.W()); + byte[] info_btn = lnki.Media_icon() ? html_fmtr.Bld_thumb_part_info(lnki_href) : Bry_.Empty; + + // bld audio_div + byte[] audio_div = html_fmtr.Bld_thumb_file_audio + ( Bld_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href) + , Bld_alt(Bool_.Y, ctx, hctx, src, lnki) + , Bld_play_btn(hctx, uid, img_orig_src, lnki_ttl, play_btn_width, play_btn_width) // NOTE: changed max_width from 1024: DATE:2016-08-05 + , info_btn); + + // if "media" flag, add as thumb; else, add directly if (lnki.Media_icon()) - html_fmtr.Html_thumb_core(bfr, hctx.Mode_is_hdump(), uid, lnki_halign_bry, div_width, content); + html_fmtr.Add_thumb_core(bfr, hctx.Mode_is_hdump(), lnki_halign_bry, uid, div_width, audio_div); else - bfr.Add(content); + bfr.Add(audio_div); } - private void Write_file_video(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_ttl, byte[] lnki_href, byte[] img_view_src, byte[] img_orig_src, byte[] alt, Xof_file_itm xfer_itm) { - xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_vid); + private void Write_file_video(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_href, byte[] alt, byte[] lnki_ttl, byte[] img_view_src, Xof_file_itm xfer_itm) { + // init + int play_btn_width = Get_play_btn_width(xfer_itm.Html_w()); boolean video_is_thumb = Xop_lnki_type.Id_defaults_to_thumb(lnki.Lnki_type()); - byte[] content = Arg_content_video(ctx, hctx, src, lnki, xfer_itm, uid, video_is_thumb, lnki_ttl, lnki_href, img_view_src, img_orig_src, alt); + xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_vid); + + // bld caption / alt + byte[] caption_html = Bry_.Empty, alt_html = Bry_.Empty; + if (video_is_thumb) { + caption_html = Bld_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href); + alt_html = Bld_alt(Bool_.Y, ctx, hctx, src, lnki); + } + + // bld video_div + byte[] video_div = html_fmtr.Bld_thumb_file_video(caption_html, alt_html + , Bld_play_btn(hctx, uid, img_orig_src, lnki_ttl, play_btn_width, play_btn_width) + , html_fmtr.Bld_thumb_part_img(hctx, page, src, xfer_itm, uid, lnki_ttl, lnki_href, img_view_src, alt)); + + // if "thumbable", add as thumb; else, add directly if (video_is_thumb) - html_fmtr.Html_thumb_core(bfr, hctx.Mode_is_hdump(), uid, lnki_halign_bry, div_width, content); + html_fmtr.Add_thumb_core(bfr, hctx.Mode_is_hdump(), lnki_halign_bry, uid, div_width, video_div); else - bfr.Add(content); + bfr.Add(video_div); } - private void Write_file_image(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xof_file_itm xfer_itm, int uid, boolean lnki_is_thumbable, int div_width, int lnki_halign, byte[] lnki_halign_bry - , byte[] lnki_ttl, Xof_ext orig_ext, byte[] lnki_href, byte[] img_view_src, byte[] img_orig_src, byte[] alt) { + private void Write_file_image(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_href, byte[] alt, byte[] lnki_ttl, byte[] img_view_src, Xof_file_itm xfer_itm + , boolean lnki_is_thumbable, int lnki_halign, Xof_ext orig_ext) { + // if centered, add
; applies to both thumb and full if (lnki_halign == Xop_lnki_align_h_.Center) bfr.Add(Div_center_bgn); - Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); - byte[] anchor_title = html_wtr.Cfg().Lnki__title() - ? Arg_anchor_title(tmp_bfr, src, lnki, lnki_ttl, anchor_title_wkr) // NOTE: Arg_anchor_title should only be called if there is no caption, else refs may not show; DATE:2014-03-05 - : Bry_.Empty; - Xoh_file_img_wkr lnki_file_wkr = lnki.Lnki_file_wkr(); if (lnki_file_wkr == null) lnki_file_wkr = html_fmtr; + + // bld anch_ttl; EX: title="A.png" + byte[] anch_ttl = html_wtr.Cfg().Lnki__title() + ? Bld_anch_title(tmp_bfr, src, lnki, lnki_ttl) // NOTE: Bld_anch_title should only be called if there is no caption, else refs may not show; DATE:2014-03-05 + : Bry_.Empty; + + // get fmtr; note conditional is for imap, which has its own img_fmtr to put in 'imagemap=""' + Xoh_file_fmtr img_fmtr = lnki.Lnki_file_wkr(); if (img_fmtr == null) img_fmtr = html_fmtr; + + // main image build if (lnki_is_thumbable) { // is "thumb" if (bfr.Len() > 0) bfr.Add_byte_nl(); - byte[] content = Arg_content_thumb(lnki_file_wkr, ctx, hctx, src, lnki, xfer_itm, uid, lnki_href, img_view_src, img_orig_src, alt, lnki_ttl, anchor_title); - html_fmtr.Html_thumb_core(bfr, hctx.Mode_is_hdump(), uid, lnki_halign_bry, div_width, content); + + // write image_div + byte[] alt_html = wiki.Html_mgr().Imgs_mgr().Alt_in_caption().Val() ? Bld_alt(Bool_.Y, ctx, hctx, src, lnki) : Bry_.Empty; + img_fmtr.Add_full_img(tmp_bfr, hctx, page, src, xfer_itm, uid, lnki_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anch_ttl + , Xoh_file_fmtr__basic.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt + , xfer_itm.File_exists() ? Xoh_img_cls_.Tid__thumbimage : Xoh_img_cls_.Tid__none + , Xoh_img_cls_.Bry__none); + byte[] thumb = tmp_bfr.To_bry_and_clear(); + html_fmtr.Add_thumb_core(bfr, hctx.Mode_is_hdump(), lnki_halign_bry, uid, div_width + , html_fmtr.Bld_thumb_file_image(thumb, Bld_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href), alt_html) + ); } - else { + else { // is full if ( cfg_alt_defaults_to_caption - && Bry_.Len_eq_0(alt) // NOTE: if no alt, always use caption; DATE:2013-07-22 + && Bry_.Len_eq_0(alt) // NOTE: if no alt, always use caption for alt; DATE:2013-07-22 && !lnki.Alt_exists() // unless blank alt exists; EX: [[File:A.png|a|alt=]] should have alt of "", not "a" ) { - Arg_caption(ctx, src, Xoh_wtr_ctx.Alt, lnki).Bfr_arg__add(tmp_bfr); - alt = tmp_bfr.To_bry_and_clear(); + alt = Bld_caption(ctx, Xoh_wtr_ctx.Alt, src, lnki); } + + // open "
" boolean div_align_exists = false; switch (lnki.Align_h()) { case Xop_lnki_align_h_.Left: bfr.Add(Div_float_left) .Add_byte_nl(); div_align_exists = true; break; case Xop_lnki_align_h_.Right: bfr.Add(Div_float_right).Add_byte_nl(); div_align_exists = true; break; case Xop_lnki_align_h_.None: bfr.Add(Div_float_none) .Add_byte_nl(); div_align_exists = true; break; } + + // init vars byte img_cls_tid = lnki.Border() == Bool_.Y_byte ? Xoh_img_cls_.Tid__thumbborder : Xoh_img_cls_.Tid__none; byte[] img_cls_other = lnki.Lnki_cls(); // PAGE:en.s:Page:Notes_on_Osteology_of_Baptanodon._With_a_Description_of_a_New_Species.pdf/3; DATE:2014-09-06 + Arg_nde_tkn lnki_link_tkn = lnki.Link_tkn(); - if (lnki_link_tkn == Arg_nde_tkn.Null) // full - lnki_file_wkr.Html_full_img(bfr, hctx, page, src, xfer_itm, uid, lnki_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other); - else { // thumb + if (lnki_link_tkn == Arg_nde_tkn.Null) // link absent; just write it + img_fmtr.Add_full_img(bfr, hctx, page, src, xfer_itm, uid, lnki_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anch_ttl, Xoh_file_fmtr__basic.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other); + else { // link exists; more logic; EX: [[File:A.png|thumb|link=B]] + // over-ride other vars based on link arg; below should be cleaned up Arg_itm_tkn link_tkn = lnki_link_tkn.Val_tkn(); byte[] link_arg = Xoa_ttl.Replace_spaces(link_tkn.Dat_to_bry(src)); // replace spaces with unders, else "/wiki/File:A b.ogg" instead of "A_b.ogg"; DATE:2015-11-27 if (Bry_.Has_at_bgn(link_arg, Xop_tkn_.Anchor_byte)) link_arg = Bry_.Add(ctx.Page().Ttl().Page_db(), link_arg); @@ -152,93 +219,55 @@ public class Xoh_file_wtr__basic { link_arg = link_arg_html == null ? lnki_href : link_arg_html; // if parse fails, then assign to lnki_href; EX:link={{{1}}} link_arg = Gfo_url_encoder_.Href_qarg.Encode(link_arg); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16 // if (Bry_.Len_gt_0(tmp_link_parser.Html_xowa_ttl())) lnki_ttl = tmp_link_parser.Html_xowa_ttl(); // DELETE: not sure why this is here; breaks test; DATE:2015-11-28 - lnki_file_wkr.Html_full_img(bfr, hctx, page, src, xfer_itm, uid, link_arg, a_href_is_file, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(xowa_title_bry), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other); + img_fmtr.Add_full_img(bfr, hctx, page, src, xfer_itm, uid, link_arg, a_href_is_file, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anch_ttl, Xoh_file_fmtr__basic.Escape_xowa_title(xowa_title_bry), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other); } - if (div_align_exists) bfr.Add(Gfh_tag_.Div_rhs); // close div from above + + // close "
" + if (div_align_exists) bfr.Add(Gfh_tag_.Div_rhs); } + + // close
if (lnki_halign == Xop_lnki_align_h_.Center) bfr.Add(Gfh_tag_.Div_rhs); - tmp_bfr.Mkr_rls(); } - private byte[] Arg_content_thumb(Xoh_file_img_wkr lnki_file_wkr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xof_file_itm xfer_itm, int uid, byte[] lnki_href, byte[] view_src, byte[] img_orig_src, byte[] lnki_alt_text, byte[] lnki_ttl, byte[] anchor_title) { - byte[] lnki_alt_html = wiki.Html_mgr().Imgs_mgr().Alt_in_caption().Val() ? Arg_alt_html(ctx, hctx, src, lnki) : Bry_.Empty; - byte img_cls_tid = xfer_itm.File_exists() ? Xoh_img_cls_.Tid__thumbimage : Xoh_img_cls_.Tid__none; - Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); - lnki_file_wkr.Html_full_img(tmp_bfr, hctx, page, src, xfer_itm, uid, lnki_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), view_src, lnki_alt_text, img_cls_tid, Xoh_img_cls_.Bry__none); - byte[] thumb = tmp_bfr.To_bry_and_clear(); - html_fmtr.Html_thumb_file_image(tmp_bfr, thumb, Arg_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href), lnki_alt_html); - return tmp_bfr.To_bry_and_rls(); + private byte[] Bld_caption_div(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, int uid, byte[] img_orig_src, byte[] lnki_href) { + byte[] caption = Bld_caption(ctx, hctx, src, lnki); + byte[] magnify_btn = lnki.Media_icon() ? html_fmtr.Bld_thumb_part_magnify(lnki_href, msg_file_enlarge) : Bry_.Empty; + return html_fmtr.Bld_thumb_part_caption(magnify_btn, caption); } - private byte[] Arg_content_audio(Xop_lnki_tkn lnki, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, int uid, byte[] lnki_href, byte[] img_orig_src, byte[] alt) { - byte[] info_btn = Bry_.Empty; - if (lnki.Media_icon()) { - html_fmtr.Html_thumb_part_info(scratch_bfr, uid, hctx.Mode_is_hdump(), lnki_href, html_mgr.Img_media_info_btn()); - info_btn = scratch_bfr.To_bry_and_clear(); - } - int play_btn_width = lnki.W(); if (play_btn_width < 1) play_btn_width = html_mgr.Img_thumb_width(); // if no width set width to default img width - html_fmtr.Html_thumb_file_audio(scratch_bfr, Arg_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href), Arg_alt_html(ctx, hctx, src, lnki), Arg_play_btn(hctx.Mode_is_hdump(), uid, play_btn_width, Play_btn_max_width, img_orig_src, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki.Ttl().Page_txt())), info_btn); - return scratch_bfr.To_bry_and_clear(); + private byte[] Bld_caption(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki) { + return lnki.Caption_exists() + ? caption_fmtr.To_bry(ctx, hctx, src, lnki.Caption_val_tkn(), Bool_.N, Xoh_lnki_text_fmtr.Null__fmt) + : Bry_.Empty; } - private byte[] Arg_content_video(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xof_file_itm xfer_itm, int uid, boolean lnki_thumb, byte[] lnki_ttl, byte[] a_href, byte[] view_src, byte[] orig_src, byte[] img_alt) { - int thumb_w = xfer_itm.Html_w(); - int play_btn_width = thumb_w; if (play_btn_width < 1) play_btn_width = wiki.Html_mgr().Img_thumb_width(); - byte[] caption_html = Bry_.Empty, alt_html = Bry_.Empty; - if (lnki_thumb) { - caption_html = Arg_caption_div(ctx, hctx, src, lnki, uid, orig_src, a_href); - alt_html = Arg_alt_html(ctx, hctx, src, lnki); - } - html_fmtr.Html_thumb_file_video(scratch_bfr - , Arg_play_btn(hctx.Mode_is_hdump(), uid, play_btn_width, play_btn_width, orig_src, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki.Ttl().Page_txt())) - , html_fmtr.Html_thumb_part_img(scratch_bfr, hctx, page, src, xfer_itm, uid, lnki_ttl, a_href, view_src, img_alt) - , caption_html, alt_html); - return scratch_bfr.To_bry_and_clear(); - } - private byte[] Arg_caption_div(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, int uid, byte[] img_orig_src, byte[] lnki_href) { - Bfr_arg caption = Arg_caption(ctx, src, hctx, lnki); - byte[] magnify_btn = Bry_.Empty; - if (lnki.Media_icon()) { - if (msg_file_enlarge == null) msg_file_enlarge = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_file_enlarge); - html_fmtr.Html_thumb_part_magnify(scratch_bfr, uid, lnki_href, msg_file_enlarge, html_mgr.Img_thumb_magnify()); - magnify_btn = scratch_bfr.To_bry_and_clear(); - } - html_fmtr.Html_thumb_part_caption(scratch_bfr, magnify_btn, caption); - return scratch_bfr.To_bry_and_clear(); - } private byte[] msg_file_enlarge; - private Bfr_arg Arg_caption(Xop_ctx ctx, byte[] src, Xoh_wtr_ctx hctx_for_caption, Xop_lnki_tkn lnki) { - return lnki.Caption_exists() ? caption_fmtr.Set(ctx, hctx_for_caption, src, lnki.Caption_val_tkn(), Xoh_lnki_text_fmtr.Null_fmtr, Bool_.N) : Bfr_arg_.Noop; - } - public byte[] Arg_alt_text(Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki) { - if (!lnki.Alt_exists()) return Bry_.Empty; - media_alt_fmtr.Set(ctx, Xoh_wtr_ctx.Alt, src, lnki.Alt_tkn().Val_tkn(), Xoh_lnki_text_fmtr.Null_fmtr, Bool_.N); - Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); - media_alt_fmtr.Bfr_arg__add(tmp_bfr); - return tmp_bfr.To_bry_and_rls(); - } - private byte[] Arg_alt_html(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] alt_src, Xop_lnki_tkn lnki) { - if (!lnki.Alt_exists()) return Bry_.Empty; - media_alt_fmtr.Set(ctx, hctx, alt_src, lnki.Alt_tkn().Val_tkn(), html_fmtr.Html_thumb_part_alt_fmtr(), Bool_.Y); - Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); - media_alt_fmtr.Bfr_arg__add(tmp_bfr); - return tmp_bfr.To_bry_and_rls(); - } - private byte[] Arg_play_btn(boolean mode_is_hdump, int uid, int width, int max_width, byte[] a_href, byte[] a_xowa_title) { - html_fmtr.Html_thumb_part_play(scratch_bfr, uid, mode_is_hdump, width - 2, max_width, a_href, a_xowa_title, html_mgr.Img_media_play_btn()); // NOTE: -2 is fudge factor else play btn will jut out over video thumb; see Earth and ISS video - return scratch_bfr.To_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) { + private byte[] Bld_anch_title(Bry_bfr bfr, byte[] src, Xop_lnki_tkn lnki, byte[] lnki_ttl) { if ( Bitmask_.Has_int(lnki.Lnki_type(), Xop_lnki_type.Id_thumb) || Bitmask_.Has_int(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; + return Bry_.Empty; else if ( Bitmask_.Has_int(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 - tmp_bfr.Add(Atr_title); - anchor_title_wkr.Set(src, anchor_title_tkn).Bfr_arg__add(tmp_bfr); - tmp_bfr.Add_byte(Byte_ascii.Quote); - return tmp_bfr.To_bry_and_clear(); + Xop_tkn_itm capt_tkn = lnki.Caption_tkn(); + if (capt_tkn == Xop_tkn_null.Null_tkn) return Bry_.Empty; // no caption; return empty; NOTE: do not use lnki as caption; DATE:2013-12-31 + + // build title="text" + bfr.Add(Atr_title); + Xoh_lnki_title_bldr.Add(bfr, src, capt_tkn); + bfr.Add_byte(Byte_ascii.Quote); + return bfr.To_bry_and_clear(); } - public static final int Play_btn_max_width = 1024; + public byte[] Bld_alt(boolean html, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki) { + if (!lnki.Alt_exists()) return Bry_.Empty; + return html + ? alt_fmtr.To_bry(ctx, hctx, src, lnki.Alt_tkn().Val_tkn(), Bool_.Y, html_fmtr.Fmt_thumb_part_alt()) + : alt_fmtr.To_bry(ctx, hctx, src, lnki.Alt_tkn().Val_tkn(), Bool_.N, Xoh_lnki_text_fmtr.Null__fmt); + } + private byte[] Bld_play_btn(Xoh_wtr_ctx hctx, int uid, byte[] a_href, byte[] lnki_href, int width, int max_width) { + return html_fmtr.Bld_thumb_part_play(hctx.Mode_is_hdump(), uid, a_href, Xoh_file_fmtr__basic.Escape_xowa_title(lnki_href) + , width - 2, max_width); // NOTE: -2 is fudge factor else play btn will jut out over video thumb; see Earth and ISS video + } + private int Get_play_btn_width(int w) {return w > 0 ? w : html_mgr.Img_thumb_width();} // if no width set width to default img width + + // private static final int Play_btn_max_width = 1024; private static final byte[] Div_center_bgn = Bry_.new_a7("
") , Div_float_none = Bry_.new_a7("
") diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java index b39b4d62c..361f2fdc4 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import org.junit.*; public class Xoh_file_wtr__image__tst { - private final Xop_fxt fxt = new Xop_fxt(); + private final Xop_fxt fxt = new Xop_fxt(); @Before public void init() {fxt.Reset();} @Test public void Img__full() { // PURPOSE: full with title was outputting invalid html; DATE:2013-12-31 fxt.Wtr_cfg().Lnki__title_(true); @@ -39,6 +39,22 @@ public class Xoh_file_wtr__image__tst { @Test public void Img__embed() { fxt.Test_parse_page_wiki_str("[[File:A.png|9x8px|alt=abc]]", Xop_fxt.html_img_none("File:A.png", "abc", "file:///mem/wiki/repo/trg/thumb/7/0/A.png/9px.png", "A.png")); } + @Test public void Embed_audio() { + fxt.Test_parse_page_wiki_str("[[File:A.jpg|thumb|b[[File:C.ogg|right|140x140px]]d]]", String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , " \"\"" + , "
" + , "
b
" + , "
\"\"" + , "
" + , "
" + , "
d" + , "
" + , "
" + , "
" + )); + } @Test public void Img__none() { // NOTE: floatnone is WP behavior; MW omits div tag fxt.Test_parse_page_wiki_str ( "[[File:A.png|none|20x30px|b]]" diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__video__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__video__tst.java index 7cee22c77..1e15f1461 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__video__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__video__tst.java @@ -18,30 +18,64 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import org.junit.*; import gplx.xowa.files.*; public class Xoh_file_wtr__video__tst { - @Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt(); - @Test public void Video__full() { + @Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt(); + @Test public void Video__full__ogv__width_y() {// EX: [[File:A.ogv|320px|bcd|alt=efg]]; DATE:2016-08-05 fxt.Test_parse_page_wiki_str - ( "[[File:A.ogv|400px|a|alt=b]]", String_.Concat_lines_nl_skip_last + ( "[[File:A.ogv|320px|bcd|alt=efg]]", String_.Concat_lines_nl_skip_last ( "
" , " " - , "
" + , "
" , "
" )); } - @Test public void Video__full_ogg() {// PURPOSE: ogg should default to video on first load; otherwise dynamic-update won't be able to put in thumb; DATE:2015-05-21 - Xof_file_fxt file_fxt = Xof_file_fxt.new_all(fxt.Wiki()); - file_fxt.Exec_orig_add(Bool_.Y, "A.ogg", Xof_ext_.Id_ogv, 400, 400, ""); + @Test public void Video__full__ogv__width_n() {// EX: [[File:A.ogv]]; DATE:2016-08-05 fxt.Test_parse_page_wiki_str - ( "[[File:A.ogg|400px|a|alt=b]]", String_.Concat_lines_nl_skip_last + ( "[[File:A.ogv]]", String_.Concat_lines_nl_skip_last + ( "
" + , " " + , "
" + , "
" + )); + } + @Test public void Video__full_ogg() {// PURPOSE: ogg w/ width should default to video; otherwise dynamic-update won't be able to convert audio-button to thumb; DATE:2016-08-05 + // NOTE: simulates app w/ fsdb + Xof_file_fxt file_fxt = Xof_file_fxt.new_all(fxt.Wiki()); + file_fxt.Exec_orig_add(Bool_.Y, "A.ogg", Xof_ext_.Id_ogv, 320, 300, ""); + + fxt.Test_parse_page_wiki_str + ( "[[File:A.ogg|320px|bcd|alt=efg]]", String_.Concat_lines_nl_skip_last + ( "
" + , "
\"efg\"" + , "
" + , "
" + , "
" + )); + } + @Test public void Video__thumb_ogg() { // PURPOSE: w/ width should default to video; DATE:2016-08-05 + // NOTE: simulates hdump w/ no fsdb + fxt.Wiki().File_mgr().Version_2_y_(); + fxt.Wiki().File__fsdb_mode().Tid__v2__bld__y_(); + fxt.Hctx_(gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Hdump); + + fxt.Test_parse_page_wiki_str + ( "[[File:A.ogg|thumb|320px|a|alt=b]]", String_.Concat_lines_nl_skip_last ( "
" - , "
" + , "
" // NOTE:220px is default w for "non-found" thumb; DATE:2014-09-24 , "
" - , "
" - , "
" + , "
" + + "" + + "\"b\"/" + + "" + , "
" + , "
" , "
" , "
" , "
a" @@ -51,26 +85,30 @@ public class Xoh_file_wtr__video__tst { , "
" , "
" , "
" + , "" )); + + fxt.Wiki().File_mgr().Version_1_y_(); + fxt.Hctx_(gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Basic); } @Test public void Video__thumb() { fxt.Test_parse_page_wiki_str - ( "[[File:A.ogv|thumb|400px|a|alt=b]]", String_.Concat_lines_nl_skip_last + ( "[[File:A.ogv|thumb|320px|bcd|alt=efg]]", String_.Concat_lines_nl_skip_last ( "
" , "
" // NOTE:220px is default w for "non-found" thumb; DATE:2014-09-24 , "
" , " " - , "
" + , "
" , "
" , "
" - , "
a" + , "
bcd" , "
" , "
" - , "
b" + , "
efg" , "
" , "
" , "
" @@ -79,16 +117,16 @@ public class Xoh_file_wtr__video__tst { } @Test public void Video__thumb_webm() { // PURPOSE: webm thumb wasn't being shown; DATE:2014-01-25 fxt.Test_parse_page_wiki_str - ( "[[File:A.webm|thumb|400px|a|alt=b]]", String_.Concat_lines_nl_skip_last + ( "[[File:A.webm|thumb|320px|a|alt=b]]", String_.Concat_lines_nl_skip_last ( "
" , "
" // NOTE:220px is default w for "non-found" thumb; DATE:2014-09-24 , "
" , " " - , "
" + , "
" , "
" , "
" , "
a" @@ -99,6 +137,6 @@ public class Xoh_file_wtr__video__tst { , "
" , "
" , "" - )); + )); } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_text_fmtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_text_fmtr.java index 56c96903f..3af127be4 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_text_fmtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_text_fmtr.java @@ -19,27 +19,27 @@ package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.* import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; import gplx.xowa.parsers.*; import gplx.xowa.htmls.core.htmls.*; -public class Xoh_lnki_text_fmtr implements gplx.core.brys.Bfr_arg { // formats alt or caption - private final Bry_bfr_mkr bfr_mkr; private final Xoh_html_wtr html_wtr; - private Xop_ctx ctx; private Xoh_wtr_ctx hctx; private byte[] src; private Xop_tkn_itm text_tkn; private Bry_fmtr fmtr; - private boolean called_by_alt_as_caption; - public Xoh_lnki_text_fmtr(Bry_bfr_mkr bfr_mkr, Xoh_html_wtr html_wtr) {this.bfr_mkr = bfr_mkr; this.html_wtr = html_wtr;} - public Xoh_lnki_text_fmtr Set(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_tkn_itm text_tkn, Bry_fmtr fmtr, boolean called_by_alt_as_caption) { - this.ctx = ctx; this.hctx = hctx; this.src = src; this.text_tkn = text_tkn; this.fmtr = fmtr; this.called_by_alt_as_caption = called_by_alt_as_caption; - return this; +public class Xoh_lnki_text_fmtr { // formats alt or caption + private final Bry_bfr_mkr bfr_mkr; private final Xoh_html_wtr html_wtr; + private final Bry_bfr fmt_bfr = Bry_bfr_.Reset(32); + public Xoh_lnki_text_fmtr(Bry_bfr_mkr bfr_mkr, Xoh_html_wtr html_wtr) { + this.bfr_mkr = bfr_mkr; this.html_wtr = html_wtr; } - public void Bfr_arg__add(Bry_bfr bfr) { - Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); - html_wtr.Write_tkn_to_html(tmp_bfr, ctx, hctx, src, null, Xoh_html_wtr.Sub_idx_null, text_tkn); - tmp_bfr.Mkr_rls(); - byte[] bry = called_by_alt_as_caption - ? tmp_bfr.To_bry_and_clear_and_trim() // NOTE: Trim to handle ws-only alt; EX:[[File:A.png|thumb|alt= ]]; en.w:Bird; DATE:2015-12-28 - : tmp_bfr.To_bry(); - if (bry.length == 0) return; - if (fmtr == Null_fmtr) - bfr.Add(bry); - else - fmtr.Bld_bfr_many(bfr, bry); + + public byte[] To_bry(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_tkn_itm text_tkn, boolean called_by_alt_as_caption, Bry_fmt fmt) { + // write lnki_text using tkn and html_wtr + Bry_bfr html_bfr = bfr_mkr.Get_k004(); // NOTE: do not make bfr member-variable; possible for captions to be nested, especially during call to Write_tkn_to_html + html_wtr.Write_tkn_to_html(html_bfr, ctx, hctx, src, null, Xoh_html_wtr.Sub_idx_null, text_tkn); + byte[] rv = called_by_alt_as_caption + ? html_bfr.To_bry_and_clear_and_trim() // NOTE: Trim to handle ws-only alt; EX:[[File:A.png|thumb|alt= ]]; en.w:Bird; DATE:2015-12-28 + : html_bfr.To_bry_and_clear(); + html_bfr.Mkr_rls(); + if (rv.length == 0) return Bry_.Empty; // NOTE: if no text, exit now; else, empty text will generate empty thumb div + + // return value; fmt if necessary + return fmt == Null__fmt + ? rv + : fmt.Bld_many_to_bry(fmt_bfr, rv); } - public static final Bry_fmtr Null_fmtr = null; + public static final Bry_fmt Null__fmt = null; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr.java similarity index 68% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr.java index 7ebcc1462..e4bf7be35 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr.java @@ -16,26 +16,22 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; -import gplx.langs.htmls.*; -import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*; -public class Xoh_lnki_title_fmtr implements gplx.core.brys.Bfr_arg { - public Xoh_lnki_title_fmtr Set(byte[] src, Xop_tkn_itm tkn) {this.src = src; this.tkn = tkn; return this;} - public void Bfr_arg__add(Bry_bfr bfr) { - Bld_recurse(bfr, tkn); - } - public void Bld_recurse(Bry_bfr bfr, Xop_tkn_itm tkn) { - switch (tkn.Tkn_tid()) { - case Xop_tkn_itm_.Tid_newLine: case Xop_tkn_itm_.Tid_space: case Xop_tkn_itm_.Tid_txt: // leaf tkns which will have no subs +import gplx.langs.htmls.entitys.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.xtns.cites.*; +public class Xoh_lnki_title_bldr { + public static void Add(Bry_bfr bfr, byte[] src, Xop_tkn_itm tkn) {Add_recurse(bfr, src, tkn);} + private static void Add_recurse(Bry_bfr bfr, byte[] src, Xop_tkn_itm tkn) { + switch (tkn.Tkn_tid()) { + case Xop_tkn_itm_.Tid_newLine: case Xop_tkn_itm_.Tid_space: case Xop_tkn_itm_.Tid_txt: // leaf tkns have no subs Write_atr_text(bfr, src, tkn.Src_bgn(), tkn.Src_end()); - break; - case Xop_tkn_itm_.Tid_arg_nde: // caption tkns have no subs; just a key and a val; recurse val - Arg_nde_tkn arg_nde = (Arg_nde_tkn)tkn; - Bld_recurse(bfr, arg_nde.Val_tkn()); + break; + case Xop_tkn_itm_.Tid_arg_nde: // caption tkns have no subs; just a key and a val; recurse val + Add_recurse(bfr, src, ((Arg_nde_tkn)tkn).Val_tkn()); break; case Xop_tkn_itm_.Tid_lnki: Xop_lnki_tkn tkn_as_lnki = (Xop_lnki_tkn)tkn; if (tkn_as_lnki.Caption_exists()) - Bld_recurse(bfr, tkn_as_lnki.Caption_tkn()); + Add_recurse(bfr, src, tkn_as_lnki.Caption_tkn()); else { if (tkn_as_lnki.Ttl() != null) { // guard against invalid ttls byte[] ttl_bry = tkn_as_lnki.Ttl().Page_txt(); @@ -44,24 +40,22 @@ public class Xoh_lnki_title_fmtr implements gplx.core.brys.Bfr_arg { } if (tkn_as_lnki.Tail_bgn() != -1) bfr.Add_mid(src, tkn_as_lnki.Tail_bgn(), tkn_as_lnki.Tail_end()); - break; - default: // all other tkns, just iterate over subs for txt tkns + break; + default: // all other tkns, just iterate over subs for txt tkns if (tkn.Tkn_tid() == Xop_tkn_itm_.Tid_xnde) { Xop_xnde_tkn xnde = (Xop_xnde_tkn)tkn; if (xnde.Tag().Id() == Xop_xnde_tag_.Tid__ref) { // if ref, disable tkn - gplx.xowa.xtns.cites.Ref_nde ref_xnde = (gplx.xowa.xtns.cites.Ref_nde)xnde.Xnde_xtn(); + Ref_nde ref_xnde = (Ref_nde)xnde.Xnde_xtn(); ref_xnde.Exists_in_lnki_title_(true); // ref found during html_title_wkr's generation; mark ref; will be ignored by references_html_wtr later; DATE:2014-03-05 } } int len = tkn.Subs_len(); - for (int i = 0; i < len; i++) { - Xop_tkn_itm sub = tkn.Subs_get(i); - Bld_recurse(bfr, sub); - } + for (int i = 0; i < len; i++) + Add_recurse(bfr, src, tkn.Subs_get(i)); break; } } - public static void Write_atr_text(Bry_bfr bfr, byte[] src, int bgn, int end) { + private static void Write_atr_text(Bry_bfr bfr, byte[] src, int bgn, int end) { for (int i = bgn; i < end; i++) { byte b = src[i]; switch (b) { @@ -76,6 +70,4 @@ public class Xoh_lnki_title_fmtr implements gplx.core.brys.Bfr_arg { } } } - byte[] src; Xop_tkn_itm tkn; - public static final byte[] Escape_bgn = Bry_.new_a7("&#"); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr_tst.java similarity index 66% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr_tst.java index f479b3fd4..d40d3104e 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr_tst.java @@ -17,29 +17,27 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import org.junit.*; import gplx.xowa.parsers.*; -public class Xoh_lnki_title_fmtr_tst { - @Before public void init() {fxt.Clear();} private Xoh_lnki_title_fmtr_fxt fxt = new Xoh_lnki_title_fmtr_fxt(); +public class Xoh_lnki_title_bldr_tst { + private final Xoh_lnki_title_bldr_fxt fxt = new Xoh_lnki_title_bldr_fxt(); @Test public void Basic() { - fxt.Test_parse("a b c", "a b c"); - fxt.Test_parse("a ''b'' c", "a b c"); - fxt.Test_parse("a b c", "a b c"); - fxt.Test_parse("a\nb", "a b"); - fxt.Test_parse("a\"b", "a"b"); + fxt.Test__parse("a b c", "a b c"); + fxt.Test__parse("a ''b'' c", "a b c"); + fxt.Test__parse("a b c", "a b c"); + fxt.Test__parse("a\nb", "a b"); + fxt.Test__parse("a\"b", "a"b"); } @Test public void Lnki__quotes() { // PURPOSE: handle titles with quotes; PAGE:s.w:Styx_(band) DATE:2015-11-29 - fxt.Test_parse("[[A\"B]]", "A"B"); + fxt.Test__parse("[[A\"B]]", "A"B"); } } -class Xoh_lnki_title_fmtr_fxt { +class Xoh_lnki_title_bldr_fxt { private final Xop_fxt fxt = new Xop_fxt(); - Bry_bfr bfr = Bry_bfr_.New(); - Xoh_lnki_title_fmtr title_wkr = new Xoh_lnki_title_fmtr(); - public Xoh_lnki_title_fmtr_fxt Clear() {return this;} - public void Test_parse(String raw, String expd) { + private final Bry_bfr bfr = Bry_bfr_.New(); + public void Test__parse(String raw, String expd) { byte[] raw_bry = Bry_.new_u8(raw); Xop_root_tkn root = fxt.Ctx().Tkn_mkr().Root(raw_bry); fxt.Parser().Parse_page_all_clear(root, fxt.Ctx(), fxt.Ctx().Tkn_mkr(), raw_bry); - title_wkr.Set(raw_bry, root).Bld_recurse(bfr, root); + Xoh_lnki_title_bldr.Add(bfr, raw_bry, root); Tfds.Eq(expd, bfr.To_str_and_clear()); } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java index db2d042f8..540a0bb47 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java @@ -76,6 +76,7 @@ public class Xoh_tag_parser implements Gfh_doc_wkr { if (wkr__thm.Parse1(hdoc_wkr, hctx, src, tag_rdr, cur)) return wkr__thm.Src_end(); } else if (cur.Atrs__cls_has(Xoh_thm_data.Atr__id__xowa_media_div)) + // rv = Parse_by_data(hdoc_wkr, hctx, tag_rdr, src, cur, null, Xoh_hzip_dict_.Tid__media); rv = Parse_by_data(hdoc_wkr, hctx, tag_rdr, src, cur, null, Xoh_hzip_dict_.Tid__img); else if (cur.Atrs__cls_has(Xoh_toc_wtr.Atr__class__toc)) rv = Parse_by_data(hdoc_wkr, hctx, tag_rdr, src, cur, null, Xoh_hzip_dict_.Tid__toc); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java index cd9a5df23..db1f2be8c 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import org.junit.*; import gplx.xowa.htmls.core.makes.tests.*; public class Xoh_thm_html_tst { - private final Xoh_make_fxt fxt = new Xoh_make_fxt(); + private final Xoh_make_fxt fxt = new Xoh_make_fxt(); @Test public void Image() { fxt.Test__html("[[File:A.png|thumb|test_caption]]", String_.Concat_lines_nl_skip_last ( "
" @@ -36,7 +36,7 @@ public class Xoh_thm_html_tst { ( "
" , "
" , "
" - , "
" + , "
" , "
" , "
" , "
" diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__avo__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__avo__tst.java new file mode 100644 index 000000000..9990bb551 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__avo__tst.java @@ -0,0 +1,66 @@ +/* +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.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import org.junit.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*; +import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.parsers.lnkis.*; +public class Xoh_thm_hzip__avo__tst { + private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); + @Before public void setup() {fxt.Clear();} + @Test public void Video() { + fxt.Test__bicode("~&%test_caption~|E9eA.ogv~%A.ogv~~", Gfh_utl.Replace_apos(String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "
" + , "
" + , "
" + , "
" + , "
" + , "test_caption
" + , "
" + , "
" + ))); + } + @Test public void Audio() { + fxt.Test__bicode(Gfh_utl.Replace_apos(String_.Concat_lines_nl + ( "
" + , "
" + , "
" + , "
" + , "
$|#na)A.ogaAbout this file
" + , "
" + , "
" + , "
~$|%%,)~A.oga~Enlarge~
b" + , "
" + , "
" + , "
" + )), String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "
" + , "
" + , "
" + , "
" + , "
b" + , "
" + , "
" + , "
" + )); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__basic__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__basic__tst.java new file mode 100644 index 000000000..c33b7469a --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__basic__tst.java @@ -0,0 +1,109 @@ +/* +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.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import org.junit.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*; +import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.parsers.lnkis.*; +public class Xoh_thm_hzip__basic__tst { + private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); + @Before public void setup() {fxt.Clear();} + @Test public void Image() { + fxt.Test__bicode("~&3abc~abc~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last + ( "
" + , "
abc " + , "
" + , "
" + , "abc
" + , "
" + , "
abc
" + , "
" + , "
" + )); + } + @Test public void Capt_is_missing() { // [[File:A.png|thumb]] + fxt.Test__bicode("~&#~!%A.png~)#S~", String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "
" + , "
" + , "
" + , "
" + )); + } + @Test public void Fix__omitted_table_tail() { // PURPOSE.hdiff: handle omitted ; PAGE:en.w:Alphabet; DATE:2016-01-06 + fxt.Test__bicode(String_.Concat_lines_nl_skip_last + ( "~&]&D~" + , "" + , "" + , "" + , "" + , "
" + , "abc" + , "
" + , "~!5A.png~-&D" + ), String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "
" + , "
" + , "" + , "" + , "" + , "" + , "
" + , "abc" + , "
" + , "
" + , "
" + )); + } + @Test public void Div_width_uses_img_width() { + Xof_fsdb_itm itm = new Xof_fsdb_itm(); + itm.Init_at_lnki(Xof_exec_tid.Tid_wiki_page, Bry_.new_a7("en.w"), Bry_.new_a7("A.png"), Xop_lnki_type.Id_null, -1, 220, -1, -1, -1, 0); + itm.Init_at_cache(true, 400, 440, Io_url_.mem_fil_("mem/A.png")); + Xou_cache_finder_mem finder = fxt.Init_file_mgr__mem(); + finder.Add(itm); + + fxt.Test__decode("~&3abc~abc~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last + ( "
" + , "
abc " + , "
" + , "
" + , "abc
" + , "
" + , "
abc
" + , "
" + , "
" + )); + + fxt.Init_file_mgr__noop(); + } +// @Test public void Dump() { +// Xowe_wiki en_d = fxt.Init_wiki_alias("wikt", "en.wiktionary.org"); +// gplx.xowa.wikis.nss.Xow_ns_mgr ns_mgr = en_d.Ns_mgr(); +// ns_mgr.Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); +// +// fxt.Wiki().Ns_mgr().Aliases_add(gplx.xowa.wikis.nss.Xow_ns_.Tid__portal, "WP"); +// fxt.Wiki().Ns_mgr().Init(); +// +// fxt.Init_mode_is_b256_(Bool_.N); +// fxt.Exec_write_to_fsys(Io_url_.new_dir_("C:\\xowa\\debug\\html\\"), "hzip.html"); +// fxt.Init_mode_is_b256_(Bool_.N); +// } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__pseudo__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__pseudo__tst.java new file mode 100644 index 000000000..bc6e5a8d0 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__pseudo__tst.java @@ -0,0 +1,143 @@ +/* +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.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import org.junit.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*; +import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.parsers.lnkis.*; +public class Xoh_thm_hzip__pseudo__tst { + private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); + @Before public void setup() {fxt.Clear();} + @Test public void Fake__div_1__next_nde() { // PURPOSE: handle fake-thumbs with pseudo thumbimage class; PAGE:s.w:Mars + fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "
~%-eA.jpg~Image~)#?A.jpg~abc~
" + , "
abc
" + , "
" + , "
" + , "
" + ), "'", "\""), String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "
abc
" + , "
abc
" + , "
" + , "
" + , "
" + )); + } + @Test public void Fake__div_1__style() { // PURPOSE.hdiff: handle fake-thumbs with bad style; PAGE:en.w:Carlisle_United_F.C. + fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "~%-eA.jpg~Image~)#?A.jpg~abc~
" + , "
" + , "
~${#7)A.jpg~
" + , "abc" + , "
" + , "
" + , "
" + ), "'", "\""), String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "abc
" + , "
" + , "" + , "abc" + , "
" + , "
" + , "
" + )); + } + @Test public void Fake__div_1__width_w_space() { // PURPOSE.hdiff: handle fake-thumbs with style of "width "; PAGE:en.w:Abraham_Lincoln + fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "~%-eA.jpg~Image~)#?A.jpg~abc~
" + , "
" + , "
~${#7)A.jpg~
" + , "abc" + , "
" + , "
" + , "
" + ), "'", "\""), String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "abc
" + , "
" + , "" + , "abc" + , "
" + , "
" + , "
" + )); + } + @Test public void Fake__div_1__thumbimage() { // PURPOSE.hdiff: handle fake-thumbs with image-map style; PAGE:en.w:UK + String html = String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "
" + , "
" + , "{0}" + , "
" + , "
abc
" + , "
" + , "
" + , "
" + , "
" + , "
def
" + , "
" + , "
" + ); + fxt.Test__bicode(String_.Replace(String_.Format(html, "
~%!!A.svg~)#q~
"), "'", "\""), String_.Format(html, "
")); + } + @Test public void Fake__div_1__extra_attribs() {// PURPOSE.hdiff: handle fake thumbs with extra attribs; PAGE:en.w:Wikipedia:New_CSS_framework; DATE:2016-01-11 + String html = String_.Concat_lines_nl_skip_last + ( "
" + , "
{0}" // "color:blue;" is invalid attribs + , "
abc" + , "abc
" + , "
" + , "
" + ); + fxt.Test__bicode(String_.Replace(String_.Format(html, "~%!!A.png~)#g~"), "'", "\""), String_.Format(html, "")); + } + @Test public void Fake__div_2__not_media() { // PURPOSE.hdiff: handle fake-thumbs created through en.w:Template:Image_label_begin; PAGE:en.w:Blackburnshire; DATE:2016-01-04 + String html = String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "{0}" + , "
abc" + , "
" + , "
" + , "
" + , "{1}" + , "bcd
" + , "
" + , "
" + ); + fxt.Test__bicode(String_.Replace(String_.Format(html, "
~%!!A.png~)#g~
", "
~$a)A.png~
"), "'", "\""), String_.Format(html, "
", "")); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__tidy__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__tidy__tst.java new file mode 100644 index 000000000..ae904a8e1 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__tidy__tst.java @@ -0,0 +1,93 @@ +/* +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.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import org.junit.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*; +import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.parsers.lnkis.*; +public class Xoh_thm_hzip__tidy__tst { + private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); + @Before public void setup() {fxt.Clear();} + @Test public void Tidy__moved_capt() { + fxt.Test__bicode("~&S~abc\n~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last + ( "
" + , "
abc " + , "
" + , "
" + , "
abc" + , "
" + , "
" + )); + } + @Test public void Tidy__extra_closing_div() {// handle extra closing div in caption; PAGE:en.w:Damask; DATE:2016-01-05 + fxt.Test__bicode(String_.Concat_lines_nl_skip_last + ( "~&U
A
" + , "B~" + , "C~!1A.png~-\"b"), String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , "
" + , "
A
" + , "B
" + , "C
" + , "
" + )); + } + @Test public void Tidy__ul() { // tidy will move
on to different lines depending on
    ; PAGE:en.w:Chimney_sweep; DATE:2016-01-05 + fxt.Test__bicode(String_.Concat_lines_nl_skip_last + ( "~&=$b* ABC~" + , "
      " + , "
    • ABC
    • " + , "
    " + , "~!uA.png~-$bABC~"), String_.Concat_lines_nl_skip_last + ( "
    " + , "
    ABC " + , "
    " + , "
    " + , "* ABC
    " + , "
    " + , "
    " + , "
      " + , "
    • ABC
    • " + , "
    " + , "
    " + , "
    " + , "
    " + )); + } + @Test public void Tidy__video() { // tidy may relocate xowa-alt-div to last div; PAGE:en.w:Non-helical_models_of_DNA_structure; DATE:2016-01-11 + fxt.Test__bicode(String_.Concat_lines_nl_skip_last + ( "~&eabc~" + , "
    " + , "
    bcd
    " + , "~|E9eA.ogv~%A.ogv~~"), Gfh_utl.Replace_apos(String_.Concat_lines_nl_skip_last + ( "
    " + , "
    " + , "
    " + , "
    " + , "
    " + , "
    " + , "
    " + , "
    " + , "abc
    " + , "
    " + , "
    " + , "
    bcd
    " + , "
    " + ))); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java deleted file mode 100644 index deec0ace9..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java +++ /dev/null @@ -1,339 +0,0 @@ -/* -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.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; -import org.junit.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*; -import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.parsers.lnkis.*; -public class Xoh_thm_hzip_tst { - private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); - @Before public void setup() {fxt.Clear();} - @Test public void Image() { - fxt.Test__bicode("~&3abc~abc~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last - ( "
    " - , "
    abc " - , "
    " - , "
    " - , "abc
    " - , "
    " - , "
    abc
    " - , "
    " - , "
    " - )); - } - @Test public void Video() { - fxt.Test__bicode("~&%test_caption~|E9eA.ogv~%A.ogv~~", Gfh_utl.Replace_apos(String_.Concat_lines_nl_skip_last - ( "
    " - , "
    " - , "
    " - , "
    " - , "
    " - , "
    " - , "
    " - , "
    " - , "test_caption
    " - , "
    " - , "
    " - ))); - } - @Test public void Audio() { - fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl - ( "" - ), "'", "\""), String_.Concat_lines_nl_skip_last - ( "
    " - , "
    " - , " " - , "
    " - , "
    b" - , "
    " - , "
    " - , "
    " - )); - } - @Test public void Capt_is_missing() { // [[File:A.png|thumb]] - fxt.Test__bicode("~&#~!%A.png~)#S~", String_.Concat_lines_nl_skip_last - ( "
    " - , "
    " - , "
    " - , "
    " - , "
    " - , "
    " - , "
    " - )); - } - @Test public void Tidy__moved_capt() { - fxt.Test__bicode("~&S~abc\n~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last - ( "
    " - , "
    abc " - , "
    " - , "
    " - , "
    abc" - , "
    " - , "
    " - )); - } - @Test public void Tidy__extra_closing_div() {// handle extra closing div in caption; PAGE:en.w:Damask; DATE:2016-01-05 - fxt.Test__bicode(String_.Concat_lines_nl_skip_last - ( "~&U
    A
    " - , "B~" - , "C~!1A.png~-\"b"), String_.Concat_lines_nl_skip_last - ( "
    " - , "
    " - , "
    " - , "
    " - , "
    A
    " - , "B
    " - , "C
    " - , "
    " - )); - } - @Test public void Tidy__ul() { // tidy will move
    on to different lines depending on
      ; PAGE:en.w:Chimney_sweep; DATE:2016-01-05 - fxt.Test__bicode(String_.Concat_lines_nl_skip_last - ( "~&=$b* ABC~" - , "
        " - , "
      • ABC
      • " - , "
      " - , "~!uA.png~-$bABC~"), String_.Concat_lines_nl_skip_last - ( "
      " - , "
      ABC " - , "
      " - , "
      " - , "* ABC
      " - , "
      " - , "
      " - , "
        " - , "
      • ABC
      • " - , "
      " - , "
      " - , "
      " - , "
      " - )); - } - @Test public void Tidy__video() { // tidy may relocate xowa-alt-div to last div; PAGE:en.w:Non-helical_models_of_DNA_structure; DATE:2016-01-11 - fxt.Test__bicode(String_.Concat_lines_nl_skip_last - ( "~&eabc~" - , "
      " - , "
      bcd
      " - , "~|E9eA.ogv~%A.ogv~~"), Gfh_utl.Replace_apos(String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "
      " - , "
      " - , "
      " - , "
      " - , "
      " - , "abc
      " - , "
      " - , "
      " - , "
      bcd
      " - , "
      " - ))); - } - @Test public void Fake__div_1__next_nde() { // PURPOSE: handle fake-thumbs with pseudo thumbimage class; PAGE:s.w:Mars - fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "
      ~%-eA.jpg~Image~)#?A.jpg~abc~
      " - , "
      abc
      " - , "
      " - , "
      " - , "
      " - ), "'", "\""), String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "
      abc
      " - , "
      abc
      " - , "
      " - , "
      " - , "
      " - )); - } - @Test public void Fake__div_1__style() { // PURPOSE.hdiff: handle fake-thumbs with bad style; PAGE:en.w:Carlisle_United_F.C. - fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "~%-eA.jpg~Image~)#?A.jpg~abc~
      " - , "
      " - , "
      ~${#7)A.jpg~
      " - , "abc" - , "
      " - , "
      " - , "
      " - ), "'", "\""), String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "abc
      " - , "
      " - , "" - , "abc" - , "
      " - , "
      " - , "
      " - )); - } - @Test public void Fake__div_1__width_w_space() { // PURPOSE.hdiff: handle fake-thumbs with style of "width "; PAGE:en.w:Abraham_Lincoln - fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "~%-eA.jpg~Image~)#?A.jpg~abc~
      " - , "
      " - , "
      ~${#7)A.jpg~
      " - , "abc" - , "
      " - , "
      " - , "
      " - ), "'", "\""), String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "abc
      " - , "
      " - , "" - , "abc" - , "
      " - , "
      " - , "
      " - )); - } - @Test public void Fake__div_1__thumbimage() { // PURPOSE.hdiff: handle fake-thumbs with image-map style; PAGE:en.w:UK - String html = String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "
      " - , "
      " - , "{0}" - , "
      " - , "
      abc
      " - , "
      " - , "
      " - , "
      " - , "
      " - , "
      def
      " - , "
      " - , "
      " - ); - fxt.Test__bicode(String_.Replace(String_.Format(html, "
      ~%!!A.svg~)#q~
      "), "'", "\""), String_.Format(html, "
      ")); - } - @Test public void Fake__div_1__extra_attribs() {// PURPOSE.hdiff: handle fake thumbs with extra attribs; PAGE:en.w:Wikipedia:New_CSS_framework; DATE:2016-01-11 - String html = String_.Concat_lines_nl_skip_last - ( "
      " - , "
      {0}" // "color:blue;" is invalid attribs - , "
      abc" - , "abc
      " - , "
      " - , "
      " - ); - fxt.Test__bicode(String_.Replace(String_.Format(html, "~%!!A.png~)#g~"), "'", "\""), String_.Format(html, "")); - } - @Test public void Fake__div_2__not_media() { // PURPOSE.hdiff: handle fake-thumbs created through en.w:Template:Image_label_begin; PAGE:en.w:Blackburnshire; DATE:2016-01-04 - String html = String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "{0}" - , "
      abc" - , "
      " - , "
      " - , "
      " - , "{1}" - , "bcd
      " - , "
      " - , "
      " - ); - fxt.Test__bicode(String_.Replace(String_.Format(html, "
      ~%!!A.png~)#g~
      ", "
      ~$a)A.png~
      "), "'", "\""), String_.Format(html, "
      ", "")); - } - @Test public void Fix__omitted_table_tail() { // PURPOSE.hdiff: handle omitted ; PAGE:en.w:Alphabet; DATE:2016-01-06 - fxt.Test__bicode(String_.Concat_lines_nl_skip_last - ( "~&]&D~" - , "" - , "" - , "" - , "" - , "
      " - , "abc" - , "
      " - , "~!5A.png~-&D" - ), String_.Concat_lines_nl_skip_last - ( "
      " - , "
      " - , "
      " - , "
      " - , "
      " - , "" - , "" - , "" - , "" - , "
      " - , "abc" - , "
      " - , "
      " - , "
      " - )); - } - @Test public void Div_width_uses_img_width() { - Xof_fsdb_itm itm = new Xof_fsdb_itm(); - itm.Init_at_lnki(Xof_exec_tid.Tid_wiki_page, Bry_.new_a7("en.w"), Bry_.new_a7("A.png"), Xop_lnki_type.Id_null, -1, 220, -1, -1, -1, 0); - itm.Init_at_cache(true, 400, 440, Io_url_.mem_fil_("mem/A.png")); - Xou_cache_finder_mem finder = fxt.Init_file_mgr__mem(); - finder.Add(itm); - - fxt.Test__decode("~&3abc~abc~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last - ( "
      " - , "
      abc " - , "
      " - , "
      " - , "abc
      " - , "
      " - , "
      abc
      " - , "
      " - , "
      " - )); - - fxt.Init_file_mgr__noop(); - } -// @Test public void Dump() { -// Xowe_wiki en_d = fxt.Init_wiki_alias("wikt", "en.wiktionary.org"); -// gplx.xowa.wikis.nss.Xow_ns_mgr ns_mgr = en_d.Ns_mgr(); -// ns_mgr.Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); -// -// fxt.Wiki().Ns_mgr().Aliases_add(gplx.xowa.wikis.nss.Xow_ns_.Tid__portal, "WP"); -// fxt.Wiki().Ns_mgr().Init(); -// -// fxt.Init_mode_is_b256_(Bool_.N); -// fxt.Exec_write_to_fsys(Io_url_.new_dir_("C:\\xowa\\debug\\html\\"), "hzip.html"); -// fxt.Init_mode_is_b256_(Bool_.N); -// } -} diff --git a/400_xowa/src/gplx/xowa/htmls/encoders/Xow_encoder_mgr.java b/400_xowa/src/gplx/xowa/htmls/encoders/Xow_encoder_mgr.java new file mode 100644 index 000000000..8fa212537 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/encoders/Xow_encoder_mgr.java @@ -0,0 +1,33 @@ +/* +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.htmls.encoders; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; +import gplx.langs.htmls.encoders.*; +public class Xow_encoder_mgr { + public Gfo_url_encoder Id() {return id;} private final Gfo_url_encoder id = Gfo_url_encoder_.New__html_id().Make(); + public Gfo_url_encoder Href() {return href;} private final Gfo_url_encoder href = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Make(); + public Gfo_url_encoder Href_wo_anch() {return href_wo_anch;} private final Gfo_url_encoder href_wo_anch = Gfo_url_encoder_.New__html_href_mw(Bool_.N).Make(); +// , Href_quotes = Gfo_url_encoder_.New__html_href_quotes().Make() +// , Href_quotes_v2 = Gfo_url_encoder_.New__html_href_quotes_v2().Make() +// , Href_qarg = Gfo_url_encoder_.New__html_href_qarg().Make() +// , Xourl = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Init__same__many(Byte_ascii.Underline).Make() +// , Http_url = Gfo_url_encoder_.New__http_url().Make() +// , Http_url_ttl = Gfo_url_encoder_.New__http_url_ttl().Make() +// , Fsys_lnx = Gfo_url_encoder_.New__fsys_lnx().Make() +// , Fsys_wnt = Gfo_url_encoder_.New__fsys_wnt().Make() +// , Gfs = Gfo_url_encoder_.New__gfs().Make() +} diff --git a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner.java b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner.java index f5a32d121..04d89c036 100644 --- a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner.java +++ b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.htmls.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.core.btries.*; +import gplx.langs.htmls.entitys.*; public class Xoh_js_cleaner { private Xoae_app app; private boolean ctor = true; public Xoh_js_cleaner(Xoae_app app) {this.app = app;} @@ -49,7 +50,7 @@ public class Xoh_js_cleaner { int frag_len = frag.length; if (frag[0] == Byte_ascii.Lt) { // jscript node; EX: