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 46389455f..29f4f209f 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 @@ -35,5 +35,6 @@ public class Xof_orig_wkr_ { , Tid_wmf_api = 2 , Tid_xowa_meta = 3 , Tid_xowa_img_links = 4 + , Tid_mock = 5 ; } diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__mock.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__mock.java new file mode 100644 index 000000000..91da47b9a --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__mock.java @@ -0,0 +1,36 @@ +/* +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.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import gplx.core.flds.*; +import gplx.dbs.*; import gplx.xowa.files.fsdb.*; +import gplx.xowa.wikis.tdbs.metas.*; +public class Xof_orig_wkr__mock implements Xof_orig_wkr { + private final Ordered_hash hash = Ordered_hash_.New_bry(); + public byte Tid() {return Xof_orig_wkr_.Tid_mock;} + public void Find_by_list(Ordered_hash rv, List_adp itms) {Xof_orig_wkr_.Find_by_list(this, rv, itms);} + public Xof_orig_itm Find_as_itm(byte[] ttl, int list_idx, int list_len) { + return (Xof_orig_itm)hash.Get_by(ttl); // 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()); + } + public boolean Add_orig(byte repo, byte[] page, int ext_id, int w, int h, byte[] redirect) { + Xof_orig_itm itm = new Xof_orig_itm(repo, page, ext_id, w, h, redirect); + hash.Add(page, itm); + return false; + } + public void Db_txn_save() {} + public void Db_rls() {} +} diff --git a/400_xowa/src/gplx/xowa/guis/urls/Xof_orig_file_downloader.java b/400_xowa/src/gplx/xowa/guis/urls/Xof_orig_file_downloader.java deleted file mode 100644 index 314784f07..000000000 --- a/400_xowa/src/gplx/xowa/guis/urls/Xof_orig_file_downloader.java +++ /dev/null @@ -1,34 +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.guis.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; -import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; -import gplx.xowa.parsers.lnkis.*; -public class Xof_orig_file_downloader { - public static Xof_fsdb_itm Make_fsdb(Xowe_wiki wiki, byte[] lnki_ttl, Xof_img_size img_size, Xof_url_bldr url_bldr) { - Xof_fsdb_itm fsdb = new Xof_fsdb_itm(); - lnki_ttl = Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(lnki_ttl)); - fsdb.Init_at_lnki(Xof_exec_tid.Tid_viewer_app, wiki.Domain_itm().Abrv_xo(), lnki_ttl, Xop_lnki_type.Id_none, Xop_lnki_tkn.Upright_null, Xof_img_size.Size__neg1, Xof_img_size.Size__neg1, Xof_lnki_time.Null, Xof_lnki_page.Null, Xof_patch_upright_tid_.Tid_all); - fsdb.Init_at_hdoc(Int_.Max_value, Xof_html_elem.Tid_img);// NOTE: set elem_id to "impossible" number, otherwise it will auto-update an image on the page with a super-large size; [[File:Alfred Sisley 062.jpg]] - Xof_orig_itm orig = wiki.File__orig_mgr().Find_by_ttl_or_null(lnki_ttl); if (orig == Xof_orig_itm.Null) return null; // orig not found; need orig in order to get repo - Xof_repo_itm repo = wiki.File__repo_mgr().Get_trg_by_id_or_null(orig.Repo(), lnki_ttl, Bry_.Empty); if (repo == null) return null; // repo not found - fsdb.Init_at_orig(orig.Repo(), repo.Wiki_domain(), orig.Ttl(), orig.Ext(), orig.W(), orig.H(), orig.Redirect()); - fsdb.Init_at_html(Xof_exec_tid.Tid_viewer_app, img_size, repo, url_bldr); - fsdb.File_is_orig_(true); - return fsdb; - } -} 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 5368e27e6..e5e09d243 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 @@ -24,8 +24,6 @@ import gplx.xowa.guis.views.*; 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 Xoa_url Parse(Xog_win_itm win, String href_str) { if (href_str == null) return tmp_url; // text is not link; return; byte[] href_bry = Bry_.new_u8(href_str); @@ -38,7 +36,7 @@ public class Xog_url_wkr { public void Init(Xowe_wiki wiki) { // TEST: this.wiki = wiki; } - public Xoa_url Exec(Xoa_url url) { + public Xoa_url Exec_url(Xoa_url url) { switch (url.Tid()) { case Xoa_url_.Tid_unknown: return Xoa_url.Null; // unknown; return null which will become a noop case Xoa_url_.Tid_inet: return Exec_url_http(app); // http://site.org @@ -64,33 +62,9 @@ public class Xog_url_wkr { return Rslt_handled; } private Xoa_url Exec_url_file(Xoae_app app, Xowe_wiki cur_wiki, Xoae_page page, Xog_win_itm win, byte[] href_bry) { // EX: file:///xowa/A.png - Xowe_wiki wiki = (Xowe_wiki)page.Commons_mgr().Source_wiki_or(cur_wiki); - Io_url href_url = Io_url_.New__http_or_fail(String_.new_u8(Gfo_url_encoder_.Http_url.Decode(href_bry))); - Gfui_html html_box = win.Active_html_box(); - 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))); - if (xowa_ttl == null) { - app.Gui_mgr().Kit().Ask_ok("", "", "could not find anchor with href in html: href=~{0}", href_bry); - return Rslt_handled; - } - byte[] lnki_ttl = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(Xoa_ttl.Replace_spaces(Bry_.new_u8(xowa_ttl))); - Xof_fsdb_itm fsdb = Xof_orig_file_downloader.Make_fsdb(wiki, lnki_ttl, img_size, url_bldr); - if (!Io_mgr.Instance.ExistsFil(href_url)) { -// if (!Xof_orig_file_downloader.Get_to_url(fsdb, href_url, wiki, lnki_ttl, url_bldr)) - if (!Xof_file_wkr.Show_img(fsdb, Xoa_app_.Usr_dlg(), wiki.File__bin_mgr(), wiki.File__mnt_mgr(), wiki.App().User().User_db_mgr().Cache_mgr(), wiki.File__repo_mgr(), gplx.xowa.guis.cbks.js.Xog_js_wkr_.Noop, img_size, url_bldr, page)) - return Rslt_handled; - } - gplx.core.ios.IoItmFil fil = Io_mgr.Instance.QueryFil(href_url); - if (fil.Exists()) { - Process_adp media_player = app.Prog_mgr().App_by_ext(href_url.Ext()); - media_player.Run(href_url); - fsdb.File_size_(fil.Size()); - gplx.xowa.files.caches.Xou_cache_mgr cache_mgr = wiki.Appe().User().User_db_mgr().Cache_mgr(); - cache_mgr.Update(fsdb); - cache_mgr.Db_save(); - } + Xog_url_wkr__file wkr = new Xog_url_wkr__file(app, cur_wiki, page); + wkr.Extract_data(win.Active_html_box().Html_js_eval_proc_as_str(Xog_js_procs.Doc__root_html_get), href_bry); + wkr.Download_and_run(); return Rslt_handled; } private Xoa_url Exec_url_page(Xowe_wiki wiki, byte[] href_bry) { // EX: "Page"; "/wiki/Page"; // rewritten; DATE:2014-01-19 @@ -100,6 +74,8 @@ public class Xog_url_wkr { public static Xoa_url Exec_url(Xog_win_itm win, String href_str) { Xog_url_wkr url_wkr = new Xog_url_wkr(); Xoa_url url = url_wkr.Parse(win, href_str); - return url_wkr.Exec(url); + return url_wkr.Exec_url(url); + } + public static void Get_href_url() { } } diff --git a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__file.java b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__file.java new file mode 100644 index 000000000..53b5d0e21 --- /dev/null +++ b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__file.java @@ -0,0 +1,83 @@ +/* +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.guis.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; +import gplx.xowa.files.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.repos.*; +import gplx.xowa.htmls.doms.*; +import gplx.xowa.parsers.lnkis.*; +class Xog_url_wkr__file { + private final Xoae_app app; + private final Xowe_wiki page_wiki; + private final 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(); + public Xog_url_wkr__file(Xoae_app app, Xowe_wiki page_wiki, Xoae_page page) { + this.app = app; + this.page_wiki = page_wiki; + this.page = page; + } + public byte[] File_page_db() {return file_page_db;} private byte[] file_page_db; + public Io_url File_url() {return file_url;} private Io_url file_url; + public Xof_fsdb_itm Fsdb() {return fsdb;} private Xof_fsdb_itm fsdb; + public Xowe_wiki File_wiki() {return file_wiki;} private Xowe_wiki file_wiki; + public void Extract_data(String html_doc, byte[] href_bry) { // EX: file:///xowa/A.png + // find xowa_ttl from html_doc for given file; EX: file:///xowa/A.png -> xowa_ttl = "A.png" + String xowa_ttl = Xoh_dom_.Title_by_href(href_bry, Bry_.new_u8(html_doc)); + if (xowa_ttl == null) { + app.Gui_mgr().Kit().Ask_ok("", "", "could not find anchor with href in html: href=~{0}", href_bry); + return; + } + + // get fsdb itm + this.file_page_db = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(Xoa_ttl.Replace_spaces(Bry_.new_u8(xowa_ttl))); + this.file_wiki = (Xowe_wiki)page.Commons_mgr().Source_wiki_or(page_wiki); + this.fsdb = Xog_url_wkr__file.Make_fsdb(file_wiki, file_page_db, img_size, url_bldr); + + this.file_url = Io_url_.New__http_or_fail(String_.new_u8(gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(href_bry))); + } + public void Download_and_run() { + // download file if it doesn't exist + if (!Io_mgr.Instance.ExistsFil(file_url)) { + if (!Xof_file_wkr.Show_img(fsdb, Xoa_app_.Usr_dlg(), file_wiki.File__bin_mgr(), file_wiki.File__mnt_mgr(), file_wiki.App().User().User_db_mgr().Cache_mgr(), file_wiki.File__repo_mgr(), gplx.xowa.guis.cbks.js.Xog_js_wkr_.Noop, img_size, url_bldr, page)) + return; + } + + // try to launch file + gplx.core.ios.IoItmFil fil = Io_mgr.Instance.QueryFil(file_url); + if (fil.Exists()) { + gplx.core.envs.Process_adp media_player = app.Prog_mgr().App_by_ext(file_url.Ext()); + media_player.Run(file_url); + + fsdb.File_size_(fil.Size()); + gplx.xowa.files.caches.Xou_cache_mgr cache_mgr = file_wiki.Appe().User().User_db_mgr().Cache_mgr(); + cache_mgr.Update(fsdb); + cache_mgr.Db_save(); + } + } + public static Xof_fsdb_itm Make_fsdb(Xowe_wiki wiki, byte[] lnki_ttl, Xof_img_size img_size, Xof_url_bldr url_bldr) { + Xof_fsdb_itm fsdb = new Xof_fsdb_itm(); + lnki_ttl = Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(lnki_ttl)); + fsdb.Init_at_lnki(Xof_exec_tid.Tid_viewer_app, wiki.Domain_itm().Abrv_xo(), lnki_ttl, Xop_lnki_type.Id_none, Xop_lnki_tkn.Upright_null, Xof_img_size.Size__neg1, Xof_img_size.Size__neg1, Xof_lnki_time.Null, Xof_lnki_page.Null, Xof_patch_upright_tid_.Tid_all); + fsdb.Init_at_hdoc(Int_.Max_value, Xof_html_elem.Tid_img);// NOTE: set elem_id to "impossible" number, otherwise it will auto-update an image on the page with a super-large size; [[File:Alfred Sisley 062.jpg]] + Xof_orig_itm orig = wiki.File__orig_mgr().Find_by_ttl_or_null(lnki_ttl); if (orig == Xof_orig_itm.Null) return null; // orig not found; need orig in order to get repo + Xof_repo_itm repo = wiki.File__repo_mgr().Get_trg_by_id_or_null(orig.Repo(), lnki_ttl, Bry_.Empty); if (repo == null) return null; // repo not found + fsdb.Init_at_orig(orig.Repo(), repo.Wiki_domain(), orig.Ttl(), orig.Ext(), orig.W(), orig.H(), orig.Redirect()); + fsdb.Init_at_html(Xof_exec_tid.Tid_viewer_app, img_size, repo, url_bldr); + fsdb.File_is_orig_(true); + return fsdb; + } +} diff --git a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__file__tst.java b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__file__tst.java new file mode 100644 index 000000000..d6fd4c11e --- /dev/null +++ b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__file__tst.java @@ -0,0 +1,68 @@ +/* +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.guis.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; +import org.junit.*; import gplx.core.tests.*; +import gplx.xowa.files.origs.*; +public class Xog_url_wkr__file__tst { + private final Xog_url_wkr__file__fxt fxt = new Xog_url_wkr__file__fxt(); + @Test public void Basic() { + fxt.Test__extract("A.png", "file:///mem/xowa/file/commons.wikimedia.org/orig/7/0/A.png", 300, 200); + } + @Test public void Url_encoded() { + fxt.Test__extract("A,b.png", "file:///mem/xowa/file/commons.wikimedia.org/orig/d/6/A%2Cb.png", 300, 200); + } + @Test public void Utf8() { + fxt.Test__extract("Volcán_Chimborazo,_\"El_Taita_Chimborazo\".jpg", "file:///mem/xowa/file/commons.wikimedia.org/orig/3/c/Volc%C3%A1n_Chimborazo%2C_%22El_Taita_Chimborazo%22.jpg", 300, 200); + } +} +class Xog_url_wkr__file__fxt { + private final Xowe_wiki wiki; + private final Bry_bfr bfr = Bry_bfr_.New(); + private final Xog_url_wkr__file wkr; + private final Xof_orig_wkr__mock orig_wkr = new Xof_orig_wkr__mock(); + public Xog_url_wkr__file__fxt() { + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); + Xoa_app_fxt.repo2_(app, wiki); + wiki.File__orig_mgr().Wkrs__add(orig_wkr); + this.wkr = new Xog_url_wkr__file(app, wiki, Xoae_page.New_edit(wiki, wiki.Ttl_parse(Bry_.new_a7("Test_page")))); + } + public String Make__html(byte[] href_bry, byte[] xowa_ttl) { + bfr.Add_str_u8_fmt("Full resolution", href_bry, xowa_ttl); + return bfr.To_str_and_clear(); + } + public void Make__orig(byte repo, byte[] page, int w, int h, byte[] redirect) { + orig_wkr.Add_orig(repo, page, gplx.xowa.files.Xof_ext_.new_by_ttl_(page).Id(), w, h, redirect); + } + public void Exec__extract_data(byte[] href_bry, String html_doc) { + wkr.Extract_data(html_doc, href_bry); + } + public void Test__extract(String file_page_db, String a_href_str, int orig_w, int orig_h) { + byte[] a_href = Bry_.new_u8(a_href_str); + this.Make__orig(Xof_orig_itm.Repo_wiki, Bry_.new_u8(file_page_db), orig_w, orig_h, Bry_.Empty); + + byte[] xowa_title_bry = gplx.xowa.htmls.core.wkrs.lnkis.htmls.Xoh_file_fmtr__basic.Escape_xowa_title(Bry_.new_u8(file_page_db)); + this.Exec__extract_data(a_href, this.Make__html(a_href, xowa_title_bry)); + + Gftest.Eq__str(file_page_db , wkr.File_page_db() , "file_page_db"); + Gftest.Eq__bry(a_href , wkr.File_url().To_http_file_bry() , "file_url"); + Gftest.Eq__bry(a_href , wkr.Fsdb().Html_view_url().To_http_file_bry() , "fsdb.view_url"); + Gftest.Eq__int(orig_w , wkr.Fsdb().Orig_w() , "fsdb.orig_w"); + Gftest.Eq__int(orig_h , wkr.Fsdb().Orig_h() , "fsdb.orig_h"); + } +} diff --git a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java index b494a1080..9b8ecd2b9 100644 --- a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java +++ b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java @@ -40,7 +40,7 @@ class Xog_url_wkr__fxt { } public void Exec__parse(String href) { this.url = wiki.Utl__url_parser().Parse(Bry_.new_u8(href)); - this.url = wkr.Exec(url); + this.url = wkr.Exec_url(url); } public void Test__raw(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Raw()));} public void Test__qarg(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Qargs_mgr().To_bry()));}